我使用魔术方法_set,_get:
public function __set($name, $value)
{
array_push($this->groups, $value);
}
public function __get($name)
{
return $this->$name;
}
使用它像:
// Set
$menu->groupName = 'Регистрация';
// Get
echo $menu->groupName
为什么echo $menu->groupName
不起作用?什么也没有回报。它应该返回文本'Регистрация'
。
我尝试回到_get
:
return $name;
答案 0 :(得分:2)
在__set
中,您处理分配给不存在的属性,因为将其值添加到数组$this->groups
。此代码不会为您创建属性。
如果要访问不存在的属性__get
,则可以使用。但是在其中你想要访问groupName
属性,但你没有创建它。
要调试代码,请添加一行
echo'<pre>',print_r($this),'</pre>';
给你__get
方法:
public function __get($name)
{
echo'<pre>',print_r($this),'</pre>'; // TODO
return $this->groups[0];
}
你会看到“Регистрация”在那里,但它在$groups
属性中。
因此,您可以将__get
修改为
public function __get($name)
{
return $this->groups[0];
}
因为$groups
中没有其他值。
或修改完整代码:
public function __set($name, $value)
{
$this->groups[$name] = $value;
}
public function __get($name)
{
return isset($this->groups[$name]) ? $this->groups[$name] : 'NO VALUE';
}
答案 1 :(得分:0)
来自PHP Documentation重载:
在与尚未声明或在当前作用域中不可见的属性或方法交互时,将调用重载方法。本节的其余部分将使用术语“不可访问的属性”和“不可访问的方法”来引用声明和可见性的这种组合。
简而言之,您希望由重载方法处理的属性必须是私有的,受保护的或未定义的。
此外,PHP中不常使用重载本身。在大多数情况下,最好创建自己的get()
和set()
方法,而不是继承与重载魔术方法相关的复杂性。即使这样,自定义get / set方法只有在不仅仅存储数据时才是实用的。
重载过程具有意义:
重载非常适合安全性,验证和数据转换,因为它允许您控制应用程序中信息的可见性。
通过重载,您可以创建以下变量: