2017-01-04 11 views
3

これはバグかノーマルか不思議です。そして、それをテストオブジェクトプロパティからトリガーされたときに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で完全に行うことができますか?ありがとう。

+1

興味深い質問ですが、[ドキュメント](http://php.net/manual/en/language.oop5.magic.php#object.invoke)に示唆されているように、PHPの欠点があるのだろうかと思いますクラス内でクラスを呼び出すとエラーが発生します。 –

+2

待って、実際にはどこかに一時的に置く必要はありませんでした。 'echo($ object-> baz)( '%')'は動作します。 –

+0

@Bagus TesaどのPHPバージョンを使用していますか?私はちょうどエラーを受け取りました: 'Parse error:構文エラー、予期しない '('、 'expecting'、 ';'、I:\ server \ www \ test.php、22行目 ')、** 5.6.18 ** –

答えて

2

できません。

問題の行は単にあいまいで、エラーメッセージにはどのように表示されますか... $objectオブジェクトのbaz()メソッドにアクセスするのがより論理的です。
それはすでにコメントで述べた$object->baz()

Asを見たとき、あなたは$object->bazが最初に実行する必要のある表現そのものであるということを伝えることで、パーサーを助け、その曖昧さを取り除くことができパーサによって与えられただけでコンテキストです。

($object->baz)('arg'); 

PHPもそれ自体がプログラムであり、実行前に何かを実行する方法を知っている必要があります。盲目的に、$foo->bar->baz->quxチェーン内のすべてのオブジェクトで可能なすべての "マジック"メソッドを試すことができれば、エラーが発生したときに何が起きているかは分かりません。

+0

括弧の構文は今後有望です。 –

+2

さて、 '$ var = $ object-> baz; $ var( 'arg');'の略語です。PHP 7以前は動作しませんでしたが、とにかくその速さに移行する必要があります。 – Narf

関連する問題