我想知道这是否可行:
我已成功使用__set()魔术方法将值设置为类的属性:
class View
{
private $data;
public function __set( $key, $value )
{
$this->data[$key] = $value;
}
}
所以我能够:
$view = new View();
$view->whatever = 1234;
当我想连接一个字符串时,问题出现了。似乎没有调用__set()(事实上它没有被调用)。
$view = new View();
$view->a_string = 'hello everybody'; //Value is set correctly
$view->a_string.= '<br>Bye bye!'; //Nothing happens...
echo $view->a_string;
这输出“大家好”。我无法在第二次分配中执行__set()。 阅读php.net它说:
__set() is run when writing data to inaccessible properties.
因为 a_string 已经存在,所以不会调用__set。 我的问题最终是......我怎么能实现这种连接操作?
注意: 好的......墨菲来了,一发布这个就给我答案了......
答案(据我所知),PHP无法决定 a_string 是否可用,因为我没有定义__get()方法。
定义__get()允许php找到 a_string 的当前值,然后使用__set()来连接值。
答案 0 :(得分:4)
您应该添加一个__get()方法,该方法允许您像访问__set()一样访问不可访问的属性。然后,您可以执行以下操作:
$view->myvar = $view->myvar.'Added text.';
__get()方法将是:
public function __get($var) {
return (isset($this->data[$var])) ? $this->data[$var]: '';
}
答案 1 :(得分:1)
仅供参考,对于简单的作业,甚至不需要魔法。
class A {
}
$a = new A();
$a->str = '1';
$a->str .= '2';
echo $a->str; // outputs 12
这将正常工作,因为PHP将通过赋值创建新属性。当需要对值运行额外的检查/代码时,通常使用__set / get。
答案 2 :(得分:0)
这是因为__set()是一个方法,而不是一个字符串。如果您希望它像字符串一样“行动”,您可以将其更改为此。
class View
{
private $data;
public function __set( $key, $value )
{
if (empty($this->data[$key])) {
$this->data[$key] = $value;
} else {
$this->data[$key] .= $value;
}
}
}