2

バグだと思うことを経験しましたが、よくわかりません。だから私はここに来て、私よりもこれについてよく知っている人に尋ねます.これはPHPのバグですか? 次の行を見てください。

<h1>Tests</h1>

<?php
class Foo
  {
  public function __invoke()
    {
    return 'Called correctly';
    }
  }

class Boo
  {
  public function __construct()
    {
    $this->Foo = new Foo();
    }
  }

$Foo = new Foo();
echo $Foo();

echo "<br><br><hr><br><br>";

$Boo = new Boo();
echo $Boo->Foo();

仕様によると、のでThe __invoke() method is called when a script tries to call an object as a function、私はこれを取得する必要があります:

正しく呼び出されました


正しく呼び出されました

ただし、最後のエコーは実行されません。代わりに、これを取得します:

PHP 致命的なエラー: 26 行目の [...]/index.php で未定義のメソッド Boo::Foo() を呼び出します

これはバグですか、それとも予想される動作ですか? バグの場合は、送信方法についてのヘルプをいただければ幸いです。

ジョンの回答に基づいて編集して、醜い動作をさらに示します

class Doo
  {
  public function __construct()
    {
    // The Foo class is the same as the one defined before

    $Test = new Foo();
    echo $Test();      // Echos correctly

    echo "<br><br><hr><br><br>";

    $this->Foo = $Test;
    echo $this->Foo();  // Error. Heisenbehaviour?
    }
  }

$Boo = new Doo();
4

2 に答える 2

1

クラス変数関数も参照

まったく同じ問題があります。PHP lexer は、常に構文variable T_OBJECT_OPERATOR T_STRING function_call_parameter_listをメソッド呼び出しとして認識します。

于 2013-04-08T21:29:06.813 に答える
1

これはバグではなく、Fooを定義するオブジェクトに限定されません__invoke。どの呼び出し可能オブジェクトでも同じエラーが発生します。

class Foo
{
    private $bar = 'rand';

    public function __construct()
    {
        $this->bar(); // won't work
    }  
}

これを 2 行で記述するか、以下を使用する必要がありますcall_user_func

// #1
$Boo = new Boo();
$Foo = $Boo->Foo;
$Foo();

// #2
$Boo = new Boo();
call_user_func($Boo->Foo);
于 2013-04-08T21:10:41.763 に答える