2012-02-01 5 views
0

Possible Duplicate:
Workaround for basic syntax not being parsed
Why don't PHP attributes allow functions?PHPで配列に匿名関数を入れることはできますか?

私はこのコードから

Parse error: syntax error, unexpected T_FUNCTION in /home/codemonkey/dev/broadnet/bito.api2/broadnet/resources/broadmapresource.php on line 87

を取得しています:

private $debugFunctions = array(
    "testing" => function() // Line 87 
    { 
     return "I'm a test function!"; 
    }, 
    "foo" => function() 
    { 
     return "bar"; 
    } 
); 

私はどこでも私は$variablesを使用することができ、匿名のPHPの関数を使用することができた印象の下にありました。これは例外ですか、何か間違っていますか?私はあなたがクラスのプロパティでこれを行うことはできませんPHP 5.3.9

+0

、およびこれに関連:[PHP属性が機能を許可していないのはなぜ?](http://stackoverflow.com/q/3960323)これはクラス外の通常の配列で機能しますか? PHPの設計上の脆弱性が浮かび上がってきます...しかし、関数は実際にはPHPのファーストクラスの市民ではありません。 –

+0

クラス定義ではなくコンストラクタでこの代入を試みましたか? – Czechnology

+0

通常通り:実行時情報を実行時にプロパティに割り当てることはできません。 LambdasはClosureクラスのインスタンスです。宣言でもインスタンスをプロパティとして持つことはできません。ラムダをそこに入れたいのであれば、ctorからラムダを追加する必要があります。 – Gordon

答えて

3

を使用してい

、プロパティの初期化には一定の値でなければなりません。

The initialization must be a constant value--that is, it must be able to be evaluated at compile time and must not depend on run-time information in order to be evaluated.

0

create_functionをご覧ください。 現在のスコープに新しい関数を作成し、関数名を返します。

private $debugFunctions = array(
    "testing" => create_function('', 'return "I\'m a test function!";'), 
    "foo" => create_function('', 'return "bar";'); 
); 

上記の例が機能しているかどうかはわかりませんが、私はそれをテストする時間がなかった。

create_functionを使用すると、アプリケーションの使用頻度に応じてアプリケーションの速度が大幅に低下することにも注意してください。

class TestClass { 
    private $debugFunctions; 

    public function __construct() { 
     $this->debugFunctions = array(
      "testing" => function() 
      { 
       return "I'm a test function!"; 
      }, 
      "foo" => function() 
      { 
       return "bar"; 
      } 
     ); 
    } 
} 
1

は、コンストラクタを使用してください。

だけcostructorでそれを初期化:私はそれはクラスでだからだと推測

function __construct() { 
    $debugFunctions = array(
     "testing" => function() // Line 87 
     { 
      return "I'm a test function!"; 
     }, 
     "foo" => function() 
     { 
      return "bar"; 
     } 
    ); 
} 
0

あなたはそれを行うことができます。

関連する問題