これはバグかノーマルか不思議です。そして、それをテストオブジェクトプロパティからトリガーされたときにPHP `__invoke`が動作しない理由
$object = (object) [
'foo' => 'bar',
'baz' => new Foo
];
を:それはある
echo $object->baz;
echo $object->baz->qux;
echo $object->baz('%'); // :(
class Foo {
public function __toString() {
return '`__toString` called.';
}
public function __get($key) {
return '`__get(' . $key . ')` called.';
}
public function __invoke($x = "") {
return '`__invoke(' . $x . ')` called.';
}
}
そして、このようなオブジェクトのプロパティでインスタンスを作成しますのは、私はいくつかの魔法の機能を持つクラスを持っているとしましょう最後のエコーで壊れました:Call to undefined method stdClass::baz()
現在、私が行うことができる唯一の解決策sが一時変数に__invoke
一部を保存して、このような関数としてその変数を呼び出すには:によって
$array = [
'baz' => new Foo
];
echo $array['baz'];
echo $array['baz']->qux;
echo $array['baz']('%'); // :)
:私は配列プロパティでクラスをインスタンス化するときには正常に動作します
$x = $object->baz;
echo $x('%'); // :)
$foo = (object) ['bar' => new MyClass];
- :ところで、私はAPIに関連する何かのために私のオブジェクトにこの能力を必要とします→は
echo $foo->bar->baz;
__toString
は→echo $foo->bar();
__get
は→echo $foo->bar->baz();
__invoke
は→__call
は、それらのすべての文字列を返す必要がトリガーするトリガーするトリガーするトリガーします。
これはPHPで完全に行うことができますか?ありがとう。
興味深い質問ですが、[ドキュメント](http://php.net/manual/en/language.oop5.magic.php#object.invoke)に示唆されているように、PHPの欠点があるのだろうかと思いますクラス内でクラスを呼び出すとエラーが発生します。 –
待って、実際にはどこかに一時的に置く必要はありませんでした。 'echo($ object-> baz)( '%')'は動作します。 –
@Bagus TesaどのPHPバージョンを使用していますか?私はちょうどエラーを受け取りました: 'Parse error:構文エラー、予期しない '('、 'expecting'、 ';'、I:\ server \ www \ test.php、22行目 ')、** 5.6.18 ** –