1

次の PHP コードはエラーになります: "say" で始まる行に予期しない T_FUNCTION があります。PHP バージョン 5.3.6 を使用しているため、ラムダをサポートする必要がありますが、機能していません。「use」句がこのコンテキストでも有効かどうかはわかりませんが、それを削除しても問題は解決しません。構文に何か問題がありますか? 注: $this->backend は、コンストラクターで $this->backend = fopen("bar.txt","w+"); として定義されます。

class Foo
{
  private $backend;
  private $commands = array(
        0 => array(
            "say" => function($msg) use($this->backend) { fwrite($this->backend,$msg); }
            )
        );
}
4

3 に答える 3

4

PHP 5.3.x に固有

まず、ラムダを既定のプロパティ値として割り当てることはできません (ラムダは定数式とは見なされません)。したがって、その割り当てを直接行うことはできません。コンストラクター内で行う必要があります。

次に、PHP 5.3.x ではラムダ内で使用できません$this。典型的な回避策は、次のようにコピーを作成し$thisてキャプチャすることです。

$that = $this;
$func = function() use($that) { ... };

ただし、この方法では、ラムダ内からの非公開メンバーにアクセスする$thatことはまったくできないため、この手法を直接使用することはできません。

おそらく行うべきことは$this->backend、コンストラクター内のローカル変数とuseラムダ内のその変数に格納することです。$this->backend変更をラムダの外部に伝播するかどうか、およびラムダが呼び出される前にの値が変更される可能性に応じて、ストアとキャプチャの両方を値または参照によって行うことができます。

 public function __construct() {
    $backend = $this->backend;
    $this->commands = array(
        'say' => function($msg) use($backend) { fwrite($backend, $msg); }
    );
 }

それ以降の PHP バージョン

PHP 5.4.0 以降$thisでは、クラス メソッド内で定義されたラムダ内で暗黙的に使用できます。

 public function __construct() {
    $this->commands = array(
        'say' => function($msg) { fwrite($this->backend, $msg); }
    );
 }

既定のプロパティ値としてラムダを割り当てることができないという制限は依然として有効です。

于 2013-02-03T13:25:31.337 に答える
0

クラスのプロパティを変数から直接、またはラムダとして定義することはできません。

// these are incorrect
private $foo = $bar
private $callback = function() ...

// correct
define("BAR", "The bar!");

class A {
    private $foo = BAR;
    private $commands = array();
    ...
    public function __construct() {
        $this->commands[0] = function() ...
于 2013-02-03T13:34:08.013 に答える
0

問題は

  use($this->backend)

$thisクラスの設計図にはまだ存在しないため、この時点で指定することは絶対にできません。

あなたがしようとしていることは、無名関数内では実行できない可能性があります。これは、それ自体がクラスのメンバーではないため、$this 変数を取得できないためです。

の適切なメンバー関数でこれを行うFooか、パラメーターとして渡す必要がある場合が$thisあります。

于 2013-02-03T12:58:41.983 に答える