PHP中的接口是否具有属性,还是只有方法?
答案 0 :(得分:32)
这取决于你所说的“属性”。如果你的意思是实际的字段,那么不,他们不是。如果您指的是C#中的属性,那么它们可以(因为属性访问器无论如何都是访问器方法的严格语法糖)。事件也是如此(当然,在每种情况下,都没有为get
/ set
或add
/ remove
访问者指定实现。
更新:由于PHP没有get
/ set
访问者意义上的属性,因此您的问题的答案是否定的。接口不能携带自己的数据/状态。
答案 1 :(得分:19)
PHP中的接口可能只包含没有方法体的公共方法签名。它们也可能包含常量。但就是这样。没别了。
请参阅http://www.php.net/manual/en/language.oop5.interfaces.php
使用interface关键字定义接口,与标准类相同,但没有任何定义其内容的方法。 [...]接口中声明的所有方法都必须是公共的,这是接口的本质。 [...]接口可能有常量。接口常量的工作方式与类常量完全相同,只是它们不能被继承它的类/接口覆盖。
答案 2 :(得分:13)
PHP接口可以有常量,但不能有属性(实例变量)。如果您不需要修改“属性”,则可以使用常量。
答案 3 :(得分:8)
您可以在DocBlock中为接口声明属性。然后,IDE会提示接口的这些属性(PhpStorm会这样做),但这不会强制在实现类中实际实现这些字段。 E. g。
/**
* @property string $password
* @property string $username
*/
interface IUserDocument
{
}
答案 4 :(得分:-2)
在接口中需要属性的[有效]原因是指定DTO类具有某个方面,例如IOrderable {OrderDate,OrderStatus},IDeliverable {DeliveryAddress,Route,...}等。该方面可用于许多DTO,例如销售订单,工作订单,销售发票等.DTO类可以支持多个方面,即数据类(但不是代码类)中需要的多重继承。此后,DTO的客户确保它可以通过该方面查看DTO(接口合同)。这种模式遵循所有5种SOLID原则。
在PHP中,离接口属性最近的是特征http://php.net/manual/en/language.oop5.traits.php。与接口类似,traits无法实例化,但可以直接在类中使用而不实现它们。