“无法访问受保护的属性”错误

时间:2013-01-14 16:16:30

标签: php class composition

我有两个涉及组合而不是继承的类。,类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;
}

1 个答案:

答案 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;
   }
}