【发布时间】:2012-12-28 15:18:08
【问题描述】:
我有两个涉及组合而不是继承的类,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;
}
【问题讨论】:
-
声明一个私有属性然后提供一个公开该值的方法似乎毫无意义。您还没有将 A::getName() 声明为静态的。静态方法没有
$this。 -
@MarcB 但这不是设置器/获取器的目的,以控制对属性的操作吗?
标签: php class composition