__set和字符串连接

时间:2010-09-13 21:20:09

标签: php magic-methods

我想知道这是否可行:

我已成功使用__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()来连接值。

3 个答案:

答案 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;
        }
    }
}