2011-07-19 19 views
0

PHPの__callStatic()に関する簡単な質問。PHP __callStatic&無効なメソッド名の文字

class Test{ 
    public static function __callStatic($method, $arguments){ 
     echo $method . PHP_EOL; 
    } 
    public function __call($method, $arguments){ 
     echo $method . PHP_EOL; 
    } 
} 

$test = new Test(); 

$test->foo(); 
$test->{'hello-world'}(); 

Test::bar(); 
Test::{'goodbye-universe'}(); 

予想される出力:

foo 
hello-world 
bar 
goodbye-universe 

実際の出力:

foo 
hello-world 
bar 
PHP Parse error: syntax error, unexpected '{', expecting T_STRING or T_VARIABLE or '$' in - on line 18 

はこの構文が許可されていない、また__callStatic()で達成可能な機能?

なし一時変数。次は動作します:

$goodbyeUniverse = 'goodbye-universe'; 
Test::$goodbyeUniverse(); 

しかし、私はそれを避けようとしています。

答えて

0

これはPHP 5.4

04 Aug 2011, PHP 5.4.0 Alpha 3
- Added features:
 . Short array syntax, see UPGRADING guide for full details
   (rsky0711 at gmail . com, sebastian.deutsch at 9elements . com, Pierre)
 . Binary numbers format (0b001010). (Jonah dot Harris at gmail dot com)
 . Support for Class::{expr}() syntax (Pierrick)

で解決されました

https://svn.php.net/repository/php/php-src/tags/php_5_4_0RC8/NEWS

1

私はPHPパーサーが現在それを処理できるとは思いません。今はそれを証明することはできませんが、関数呼び出し後の配列逆参照問題(callme()['arraykey'])のような問題だと思います。

+0

ありがとう@Stefan Gehrig - これは私が残念なことに考え始めたことです。私はたくさんの異なる文字列解析のテクニックを試しましたが、それはすべて予期しないブレース '{'に戻ってきます。スコープ内のインスタンスを使わずに '__call()'を使ってこの機能を実装するには、シングルトンに頼らざるを得ないので、これは非常に残念です。 – Dan

1

call_user_func()で静的関数を呼び出すことができます。

+0

ありがとう@ Raffael1984 - それはオプションですが、私が望んでいたよりも少し汚れていますが、今度は 'call_user_func()'と '__callStatic()'のためにメソッドルックアップが発生しています。 。今のところ実行可能なオプションのみ。 – Dan