我有两个相似的类,但成员变量的作用域不同。我会将其最小化为
class LimitedADAData{
private $member;
public function mapMember($map){
//use $this->member with $map
}
}
class ADAData{
public $member;
public function mapMember($map){
//use $this->member with $map
}
}
特征、接口和抽象类必须声明作用域对吗?那么,当重用的方法不关心变量的作用域是什么,而类的其余部分关心时,你会怎么做呢?
例如,这样做...
interface DataMethods{
public $member;
public function mapMember($map);
}
。不适合拥有私人$member的LimitedADAData
但省略变量
interface DataMethods{
public function mapMember($map);
}
很糟糕,因为 mapMember 函数会寻找一个$member变量,所以我实际上省略了一个依赖项。
从手册:
接口中声明的所有方法都必须是公共的;这是接口的本质。
甚至不可能在接口中声明属性,这不是它们的目的。
如果你这样做,你会得到:
Fatal error: Interfaces may not include member variables
我建议阅读上面链接的手册页上的顶部评论:http://php.net/manual/en/language.oop5.interfaces.php#107364
该接口根本不关心方法的实现,它只是一个约定,指定实现类应该如何处理其面向公众的方法。类使用哪些公共或私有方法或属性来完成协定对接口无关紧要。
您不会通过省略接口中的属性来省略依赖项,而是在加强抽象。