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