0

我想知道这是否可能:

我已成功使用 __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。我的问题最后是......我怎样才能实现连接操作?

注意: 好的... Murphy 在我发布此消息后立即给了我答案...

答案(据我所知)是 PHP 无法确定a_string是否可用,因为我没有定义 __get() 方法。

定义 __get() 允许 php 找到 a_string 的当前值然后使用 __set() 连接该值。

4

3 回答 3

4

您应该添加一个 __get() 方法,该方法允许您访问不可访问的属性,就像使用 __set() 一样。然后,您可以执行以下操作:

$view->myvar = $view->myvar.'Added text.';

__get() 方法是:

public function __get($var) {
  return (isset($this->data[$var])) ? $this->data[$var]: '';
}
于 2010-09-13T21:23:21.223 回答
1

仅供参考,对于简单的分配,甚至不需要魔术方法。

class A {

}

$a = new A();

$a->str = '1';
$a->str .= '2';
echo $a->str;  // outputs 12

这可以正常工作,因为 PHP 将通过赋值创建新属性。__set/get 通常在需要对值运行其他检查/代码时使用。

于 2010-09-13T22:22:33.417 回答
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;
        }
    }
}
于 2010-09-13T21:24:50.620 回答