0

我有两个涉及组合而不是继承的类。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()?有什么办法可以解决或解决这个问题?


使固定:

我意识到我正在静态调用 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;
}
4

1 回答 1

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;
   }
}
于 2013-01-14T16:40:43.940 回答