1

私は 5.3.10 を使用しており、次の方法でクロージャーを作成しようとしていますが、解析エラーが発生します。解析エラーが発生する理由を誰か教えてもらえますか?

class ABC {
    public static $funcs = array(
        'world' => function() {
            echo "Hello,";
            echo "World!\n";
        },
        'universe' => function() {
            echo "Hello,";
            echo "Universe!\n";
        },
    ); 
}
4

2 に答える 2

4

これが機能しない理由は、PHP ではクロージャーを (静的) クラス変数初期化子に直接割り当てることが許可されていないためです。

したがって、コードを機能させるには、次の回避策を使用する必要があります。

<?php

class ABC {
    public static $funcs;
}

ABC::$funcs  = array(
        'world' => function() {
            echo "Hello,";
            echo "World!\n";
        },
        'universe' => function() {
            echo "Hello,";
            echo "Universe!\n";
        },
);

$func = ABC::$funcs['world'];
$func();

回避策は、スタック オーバーフローに関するこの質問への回答から取得されます: PHP: 静的変数を初期化する方法

ところで、関数を 経由で直接呼び出すこともできないことに注意してABC::$funcs['world']()ください。これが機能するには、関数配列の逆参照を導入した PHP >= 5.4 を使用する必要があります。

于 2012-06-05T19:06:07.650 に答える
0

静的プロパティは、リテラルまたは定数を使用してのみ初期化できます。http://php.net/manual/en/language.oop5.static.phpの PHP マニュアルから:

他の PHP 静的変数と同様に、静的プロパティはリテラルまたは定数を使用してのみ初期化できます。式は使用できません。したがって、静的プロパティを整数または配列 (たとえば) に初期化することはできますが、別の変数、関数の戻り値、またはオブジェクトに初期化することはできません。

于 2012-06-05T19:00:14.287 に答える