我有两个类涉及组合而不是继承。类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()?有办法解决这个问题吗?
修复:
我意识到我正在静态地调用类A的方法,尽管我需要单独处理每个对象,因为每个对象都有一个唯一的名称。为了解决我的问题,我为类B提供了一个唯一名称的公共set函数,并在类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;
}
这是因为您正在尝试静态调用它,并且在该方法中您正在访问实例变量。
它可以这样工作:
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;
}
}