Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php &引用;无法访问受保护的属性“;错误_Php_Class_Composition - Fatal编程技术网

Php &引用;无法访问受保护的属性“;错误

Php &引用;无法访问受保护的属性“;错误,php,class,composition,Php,Class,Composition,我有两个涉及组合而非继承的类:类A和类B。类A的属性之一是类B对象的数组。类A有一个公共方法A::getName()。类B还有一个同名的公共方法。A类的方法如下: public function getName() { return $this->_name; } 我的问题是,当我在B类中并且我试图访问A类的这个公共方法时,我得到了“无法访问受保护的属性”错误$\u name是每个类中的私有属性。例如,类A将是表单的名称,而对于B,则是字段的名称 这是生成错误的代码(类B的构造函

我有两个涉及组合而非继承的类:类A和类B。类A的属性之一是类B对象的数组。类A有一个公共方法
A::getName()
。类B还有一个同名的公共方法。A类的方法如下:

public function getName()
{
    return $this->_name;
}
我的问题是,当我在B类中并且我试图访问A类的这个公共方法时,我得到了“无法访问受保护的属性”错误
$\u name
是每个类中的私有属性。例如,类A将是表单的名称,而对于B,则是字段的名称

这是生成错误的代码(类B的构造函数):

为什么它不允许我访问类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;
}

这是因为您试图静态地调用它,并且在该方法中您正在访问实例变量

它可以这样工作:

class A {
   private static $_name = "A";
   public static function getName() {
        return self::$_name;
   }
}

class B {
   public function __construct($name) {
        $this->foo = A::getName() .'-'. $name;
   }
}
或者这样(这就是你的处境)


声明一个私有属性然后提供一个公开该值的方法似乎是毫无意义的。您还没有将::getName()声明为静态。静态方法没有
$this
@MarcB,但是setter/getter的目的不是控制属性的操作吗?谢谢。你的回答帮助我认识到我的错误。我需要分别处理类A的每个单独对象(每个对象都有一个唯一的名称)。我没有意识到我正在静态调用A的方法之一,即A::getName()。我是OOP PHP新手,但在学习的过程中,我很快就学会了。
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;
   }
}