Есть ли у интерфейсов PHP свойства? - PullRequest
56 голосов
/ 03 мая 2010

Есть ли у интерфейсов в PHP свойства или только методы?

Ответы [ 5 ]

32 голосов
/ 03 мая 2010

Это зависит от того, что вы подразумеваете под «свойствами». Если вы имеете в виду реальные поля, то нет, они не имеют. Если вы имеете в виду такие свойства, как в C #, то да, они могут (поскольку методы доступа к свойствам в любом случае являются строго синтаксическим сахаром для методов доступа). То же самое касается событий (хотя, конечно, в каждом случае реализация не указана для методов доступа get / set или add / remove).

Обновление : поскольку PHP не имеет свойств в смысле get / set методов доступа, ответ на ваш вопрос - нет. Интерфейсы не могут переносить свои собственные данные / состояние.

19 голосов
/ 03 мая 2010

Интерфейсы в PHP могут содержать только открытый метод подписи без тела метода. Они также могут содержать константы. Но это все. Ничего другого.

См. http://www.php.net/manual/en/language.oop5.interfaces.php

Интерфейсы определяются с помощью ключевого слова interface так же, как и стандартный класс, но без определения методов, в которых содержится их содержимое. […] Все методы, объявленные в интерфейсе, должны быть открытыми, такова природа интерфейса. […] Интерфейсы могут иметь константы. Константы интерфейса работают точно так же, как константы класса, за исключением того, что они не могут быть переопределены классом / интерфейсом, который его наследует.

13 голосов
/ 03 мая 2010

Интерфейсы PHP могут иметь константы, но не свойства (переменные экземпляра). Если вам не нужно изменять свое «свойство», вместо этого вы можете использовать константу.

8 голосов
/ 30 апреля 2018

Вы можете объявить свойства в DocBlock для интерфейса. Затем IDE будут подсказывать эти свойства для интерфейса (PhpStorm делает), но это не приведет к фактической реализации этих полей в реализующем классе. Например,

/**
 * @property string $password
 * @property string $username
 */
interface IUserDocument
{


}
0 голосов
/ 03 октября 2017

[действительной] причиной необходимости свойств в интерфейсе является указание, что класс DTO имеет определенный аспект, например IOrderable {OrderDate, OrderStatus}, IDeliverable {DeliveryAddress, Route, ...} и т. Д. Этот аспект может использоваться в ряде DTO, например, Заказ на продажу, Заказ на работу, Счета на продажу и т. Д. Класс DTO может поддерживать несколько аспектов, то есть множественное наследование, которое желательно в классах данных (но не в классах кода). После этого клиент DTO уверен, что он может просматривать DTO через этот аспект (интерфейсный контракт). Этот шаблон соответствует всем 5 принципам SOLID.

В PHP наиболее близкими к свойствам интерфейса являются черты http://php.net/manual/en/language.oop5.traits.php. Как и в интерфейсах, черты не могут быть созданы, но могут использоваться непосредственно в классах без их реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...