在以下代码中,我想将“新值”分配给$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
答案 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);
为了便于阅读,我试图尽可能简洁地复制你的风格。