Php &引用;无法访问受保护的属性“;错误
我有两个涉及组合而非继承的类:类A和类B。类A的属性之一是类B对象的数组。类A有一个公共方法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::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;
}
}