无法访问受保护的财产"错误


"Cannot access protected property" Error

我有两个类涉及组合而不是继承。类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;
   }
}
相关文章: