5

Loggerとりわけメソッドを持つクラスがありLogます。インスタンスの最も一般的な使用法として
、私は電話するように配線しましたLogLogger__invokeLog

別のクラス「Site」には、Loggerのインスタンスであるメンバー「Log」が含まれています。

なぜこれが機能するのでしょうか。

$Log = $this->Log;  
$Log("Message");  

しかし、これではありません:

$this->Log("Message");

前者は「PHP致命的エラー:未定義のメソッドSite :: Log()の呼び出し」で失敗します
これは呼び出し可能なオブジェクトの実装の制限ですか、それとも私は何かを誤解していますか?

4

4 に答える 4

7

残念ながら、これは(まだ)PHPの制限ですが、クラスには名前を共有するプロパティとメソッドを含めることができるため、考えてみると理にかなっています。例えば:

<?php
class Test {
    public $log;

    public function __construct() {
        $this->log = function() {
            echo 'In Test::log property';
        };
    }

    public function log() {
        echo 'In Test::log() method';
    }
}

$test = new Test;
$test->log(); // In Test::log() method
call_user_func($test->log); // In Test::log property
?>

PHPが希望の構文を許可する場合、どの関数が呼び出されますか?残念ながら、それは私たちにcall_user_func[_array]()(または別の変数にコピー$this->logしてそれを呼び出す)だけを残します。

ただし、次の構文が受け入れられると便利です。

<?php
{$test->log}();
?>

しかし、残念ながら、そうではありません。

于 2012-05-25T00:19:30.843 に答える
1

これができないのと同じ理由:

$value = $this->getArray()["key"];

またはこれさえ

$value = getArray()["key"];

PHP構文は速記ではうまく機能しないためです。

于 2009-11-01T02:19:20.020 に答える
1

これはうまくいくかもしれません:

${this->Log}("Message");

しかし、おそらく完全な呼び出しを使用する方が簡単で優れていますか?一行でやりたいことを手に入れる方法はないようです。

あなたの質問のエラーは、存在しないクラスで定義された関数を探していることを示しています。呼び出し可能なオブジェクトは関数ではなく、この場合は関数として扱うことができないようです。

于 2009-11-01T02:08:38.730 に答える
0

php7.4の時点で、次のコードが機能します

($this->Log)("Message");
于 2021-08-30T13:31:38.273 に答える