1

我有一个名为 $obj 的对象。我已经覆盖了__call该类的函数,因此当我调用时$obj->setVariableName($value)会发生这种情况:$obj->variableName = $value. 我不知道$obj->setVariableName($value)项目中何时以及如何调用。因此,在运行应用程序期间会发生这种情况:

setVariable1($value) : works!
setVariable2($value) : works!
setVariable3($value) : It won't trigger __call()
setVariable4($value) : works!

当我编写额外的函数setVariable3时,它就可以工作了。不知道setVariable3是怎么调用的,是直接$obj->setVariable3调用还是用类似的函数调用call_user_func_array

什么问题可能__call不起作用setVariable3

更新:现在我知道这setVariable3是从 a$form->bind($user)和正在运行的$user->setVariable3('foo')作品中调用的。(这是一个 ZF2+Doctrine 项目)

4

1 回答 1

0

听起来很奇怪,但对我有用。

class test {
    public function __call($method, $args)
    {
        printf("Called %s->%s(%s)\n", __CLASS__, __FUNCTION__, json_encode($args));
    }
}
$test = new test();
$value = 'test';
$test->setVariable1($value);
$test->setVariable2($value);
$test->setVariable3($value);
$test->setVariable4($value);

将输出:

Called test->__call(["test"])
Called test->__call(["test"]) 
Called test->__call(["test"]) 
Called test->__call(["test"])

并且 __set 只有在您尝试访问不可访问的属性时才会被调用。例如

class test {
    public function __set($var, $value) {
        printf("Called %s->%s(%s)\n", __CLASS__, __FUNCTION__, json_encode(func_get_args()));
    }
}
$test = new test();
$value = 'test';
$test->callMagicSet = $value;

将导致:

Called test->__set(["callMagicSet","test"])
于 2014-03-05T10:26:55.897 回答