Les interfaces dans PHP ont-elles des propriétés, ou ont-elles seulement des méthodes?
Cela dépend de ce que vous entendez par "propriétés". Si vous voulez dire des champs réels, alors non, ils ne le font pas. Si vous faites référence à des propriétés telles que celles en C #, alors oui, elles le peuvent (car les accesseurs de propriété sont de toute façon strictement syntaxiques pour les méthodes d'accesseur). Il en va de même pour les événements (bien sûr, dans chaque cas, aucune implémentation n'est spécifiée pour les accesseurs get
/set
ou add
/remove
).
pdate: Puisque PHP n'a pas de propriétés dans le sens d'accesseurs get
/set
, alors la réponse à votre question est Les interfaces ne peuvent pas transporter leurs propres données/états.
Les interfaces dans PHP ne peuvent contenir que des signatures de méthode publique sans corps de méthode. Elles peuvent également contenir des constantes. Mais c'est tout . Rien d'autre.
Voir http://www.php.net/manual/en/language.oop5.interfaces.php
Les interfaces sont définies à l'aide du mot-clé interface, de la même manière qu'une classe standard, mais sans qu'aucune des méthodes n'ait défini son contenu. […] Toutes les méthodes déclarées dans une interface doivent être publiques, c'est la nature d'une interface. […] Il est possible que les interfaces aient 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 en hérite.
Les interfaces PHP peuvent avoir des constantes, mais pas des propriétés (variables d'instance). Si vous n'avez pas besoin de modifier votre "propriété", vous pouvez utiliser une constante à la place.
Vous pouvez déclarer des propriétés dans DocBlock pour l'interface. Les IDE suggéreront alors ces propriétés pour l'interface (PhpStorm le fait) mais cela ne forcera pas l'implémentation réelle de ces champs dans la classe d'implémentation. Par exemple.
/**
* @property string $password
* @property string $username
*/
interface IUserDocument
{
}