我有两个涉及组合而不是继承的类。,类A和类B.类A的属性之一是B类对象的数组。 A类有一个公共方法A::getName()
。 B类也有一个同名的公共方法。 A类的方法如下:
public function getName()
{
return $this->_name;
}
我的问题是当我在B类并且我尝试访问A类的这个公共方法时,我得到“无法访问受保护的属性”错误。 $_name
是每个班级的私有财产。例如,A类将是表格的名称,而B则是该字段的名称。
这是生成错误的代码(B类的构造函数):
public function __construct($name)
{
$this->foo = A::getName() .'-'. $name;
}
为什么不允许我访问A类的公共方法getName()?有什么方法可以解决这个问题吗?
FIX:
我意识到我静态地调用了A类的方法,尽管我需要单独处理每个对象,因为每个对象都有一个唯一的名称。为了解决我的问题,我为B类提供了一个唯一名称的公共集合函数,并在A类中调用它:
class A
{
...
$this->list[$B_name] = new B($B_name);
$this->list[$B_name]->setID($this->_name, $B_name);
}
class B
{
...
public function setID($name, $subName)
{
$this->foo = $name .'-'. $subName;
}
答案 0 :(得分:1)
这是因为你试图静态地调用它,并且在那个方法中你正在访问实例变量。
它可以像这样工作:
class A {
private static $_name = "A";
public static function getName() {
return self::$_name;
}
}
class B {
public function __construct($name) {
$this->foo = A::getName() .'-'. $name;
}
}
或者这种方式(这是你的情况)
class A {
private $_name;
public function __construct($name) {
$this->_name = $name;
}
public function getName() {
return $this->_name;
}
}
class B {
public function __construct($name, A $parent) {
$this->foo = $parent->getName() .'-'. $name;
}
}