2009-11-01 13 views
5

私はクラスLoggerを持っています。とりわけ、メソッドLogを持っています。 Logとして
Loggerインスタンスの最も一般的な用途である、私はLogオブジェクトメンバーとしてPHP呼び出し可能オブジェクト

別のクラスを呼び出すために__invokeを有線している、「サイト」メンバー「ログ」、ロガーのインスタンスが含まれています。

なぜこの仕事になります。

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

ではなく、この:

$this->Log("Message"); 

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

答えて

1

同じ理由。

+0

ほとんどの場合、タイピングが緩いためです。実際に何をするのかを実際に推測する方法はないため、初期設定でエラーが発生することがデフォルトになります。 –

+0

私はそのような式を書くことを可能にする奇妙なprepserを書いています:http://code.google.com/p/php-preparser/ :)(私は自分のオープンソースのソリューションをここに広告することはできますか?) –

+5

この例は、もはや意味をなさないものです。この構文は現在動作しています。 –

1

これは動作可能性があります

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

しかし、おそらくそれは完全なコールを使用するだけで簡単に、より良いのか?あなたは1行で作業したいものを得る方法はないようです。

あなたの質問のエラーは、存在しないクラスで定義された関数を探していることを示しています。呼び出し可能なオブジェクトは関数ではなく、この場合は1つとして扱うことはできないようです。 PHPの構文は非常によく短い手をしませんので

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

かさえ、この

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

:あなたがこれを行うことはできません

+0

は動作しません(少なくとも私にとってはPHP 5.3ではありません)»予期しないT_OBJECT_OPERATOR ...« – knittl

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}(); 
?> 

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

+0

これは確かに奇妙な変わったものです。何か($ test-> log)()のようなものは、言語そのものではなく、パーサの制限になっているようです。 –

関連する問題