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->setVariable3call_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 に答える