Question

Est-il possible d'exiger des objets de PHP 5.3 pour contenir certaines constantes ou propriétés? J'ai lu un peu sur le modèle d'interface de PHP et il semble que cela ne fonctionne que pour des méthodes publiques abstraites, ce qui est tout de suite sorti. Donc, ce que je demande, c'est s'il existe un moyen d'avoir deux objets objets A et objet B. Si l'objet B veut étendre l'objet A, il doit contenir une constante ou une variable particulière. Comment concevriez-vous ce type d'architecture? Merci.

Était-ce utile?

La solution

http://php.net/manual/en/language.oop5.interfaces.php#language.oop5.interfaces.constants

Il est possible pour les interfaces d'avoir des constantes. Les constantes d'interface fonctionnent exactement comme les constantes de classe, sauf qu'elles ne peuvent pas être remplacées par une classe / interface qui hérite.

Les constantes d'interface ne peuvent pas être remplacées par des classes héritées. Les constantes de classe peuvent être remplacées, mais ne sont pas obligatoire être (même s'il est déclaré dans une classe abstraite). Les classes abstraites sont conçues pour appliquer interface, ne pas la mise en oeuvre. Les constantes relèvent de la mise en œuvre, tandis que les méthodes définissent l'interface. Ainsi, bien que les constantes puissent être déclarées avec une valeur par défaut dans une classe abstraite, il appartient à l'enfant de décider de les utiliser ou de les redéfinir ou non.

Votre meilleure alternative est d'utiliser des méthodes "Getter", par exemple:

abstract class MyAbstract
{
    abstract public function getPropertyA();
    abstract public function getPropertyB();
}

Maintenant, toute classe utilisant extend MyAbstract sera tenu de définir getPropertyA() et getPropertyB(), qui garantit que les valeurs seront toujours accessibles.

Autres conseils

Oui et non.

Non, car les propriétés sont un détail de mise en œuvre. Il ne fait pas du tout partie de l'interface (les méthodes définissent l'interface). Vous pouvez définir les propriétés (dans les classes) et les constantes (dans les classes ou les interfaces), mais vous ne pouvez pas les marquer abstraites et les obliger à être "implémentées" par des classes dérivées.

Oui, car l'interface vous permet de définir des constantes que toutes les classes dérivées auront également (soyez prudent avec cela, Voir la question de @ Gordon). Cela «applique» des classes pour avoir ces constantes. Vous pouvez également «appliquer» les propriétés à transmettre à des classes dérivées en utilisant des classes abstraites ou l'héritage régulier:

abstract class Foo {
   public $foo = 'bar';
   protected $bar = 'baz';
}

class Bar extends Foo {
   public funciton getBar() {
      return $this->bar;
   }
}

$bar = new Bar;
echo $bar->foo;      // bar
echo $bar->getBar(); // baz

L'objet A et l'objet B doivent être des classes, les objets sont des instances (des classes) qui ne peuvent pas être étendues (je pourrais être erronée mais ...).

Dans cet esprit, vous pouvez dire que la classe B étend la classe A, alors si votre classe B de Whant B pour avoir une constante particulière définie, la classe A doit implémenter une interface. En savoir plus sur interfaces PHP .

Hmm, si l'objet B étend l'objet A et que l'objet A contient une constante ou une variable, alors l'objet B les contiendra également si la variable est protected ou public. Donc, si vous définissez la variable dans l'objet A, même si sa valeur est NULL, L'objet b B par définition le définira également.

Vous ne pouvez pas forcer l'objet B à implémenter une constante qui n'est pas héritée de l'objet A. Idem avec une interface - si B implémente l'interface C, qui contient des constantes, elle les hérite. Cependant, B peut définir différentes valeurs constantes de sa classe ou une interface parent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top