__set()返回不能分配给新变量

时间:2014-01-23 12:38:24

标签: php oop magic-methods

在以下代码中,我想将“新值”分配给$o。所以var_dump的预期输出为新值。但是,我的var_dump正在输出 Stackoverflow

我知道PHP有多个变量赋值,但有没有办法使它按预期工作?

编辑:有没有办法“绕过”__set() void return的默认行为?

<?php

class MyTable {

    private $name;

    public function __set($p, $v) {
        # $this->{$p} = $v;

        return $this->$p();
    }

    private function name() {
        var_dump("I'm executing!");

        return "New Value!";
    }

}

    $oMyTable = new MyTable();

    $o = $oMyTable->name = 'StackOverflow';
    var_dump($o);

?>

你可以在这里看到它:http://3v4l.org/b5DuF

3 个答案:

答案 0 :(得分:0)

manual读取..

  

由于PHP处理赋值运算符的方式,忽略__set()的返回值。类似地,在将分配链接在一起时,永远不会调用__get():

$a = $obj->b = 8;

您可能会尝试使用实验函数runkit_method_redefine()覆盖__set()方法,看看是否设法替换返回的void

查看所需结果的方法是使用call_user_func()调用__set()方法。

$oMyTable = new MyTable();
$o = call_user_func(array($oMyTable, '__set'), 'name', 'StackOverflow');
var_dump($o);

// string(14) "I'm executing!" string(10) "New Value!"

答案 1 :(得分:0)

如果您查看__set()魔术方法,您会看到它返回void(没有返回)。

您所看到的是为两个变量分配'StackOverflow'。可能set和get的组合可以帮助您更好地实现这一目标。如果你想看到解释的话,我会问第二个问题。

答案 2 :(得分:0)

根据您的评论:

  

谢谢,但正如我在我的问题中所说:我确实知道PHP有多个变量赋值。我正试图绕过这种默认行为。

您可以使用不同的魔术方法来实现此目的:__call()

查看以下代码是否有意义:

<?php
class MyTable
{
    private $name;

    public function __call($name, $argument)
    {
        return $this->$name();
    }

    private function name()
    {
        var_dump('Im executing!');
        return 'New Value';
    }
}
$oMyTalbe = new MyTable();
$o = $oMyTable->name('StackOverflow');
var_dump($o);

为了便于阅读,我试图尽可能简洁地复制你的风格。