我有一个名为$ 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项目)
答案 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"])