__call()魔术函数如何在PHP中正常工作?

时间:2014-03-05 10:09:16

标签: php magic-function

我有一个名为$ 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已从$form->bind($user)调用并正在运行$user->setVariable3('foo')。 (这是ZF2 + Doctrine项目)

1 个答案:

答案 0 :(得分: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。 e.g。

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"])