0

動的連想配列値ルックアップ関数 (クラス内) を構築しようとしています:

class Family
{
    public static $members = array(
        'one' => array(
            'child' => 0,
            'children' => 5
            ),
        'two' => array(
            'child' => 2,
            'children' => null
            )
    );

    public static function resolveMemberValue()
    {
        $chain = func_get_args();
        $lookup = 'members' . '[\'' . implode('\'][\'', $chain) . '\']';

        var_dump( $lookup );

        return static::$$lookup;
    }
}

Family::resolveMemberValue('one', 'child');

しかし、これは次の結果になります。

string(23) "members['one']['child']"
致命的なエラー: 宣言されていない静的プロパティへのアクセス: Family::$members['one']['child'] /family.php 行 23
PHP致命的なエラー: 宣言されていない静的プロパティへのアクセス: Family::$members['one']['child'] /family.php の 23 行目

ただし、ダンプされた値をコピーし、スクリプト内に貼り付けてドル記号を追加すると、期待どおりの結果が返されます。

var_dump( Family::$members['one']['child'] );

int(0)

これが必要な理由は、複数の変数で使用され、ジェネレーター関数から呼び出されるためです。

スニペットの何が問題になっていますか?

4

2 に答える 2

0

変数変数は、変数の名前を文字列で置き換えるだけです。その文字列 (この場合は string members['one']['child'])の内容を評価できません。

$members['one']['child']あなたのコードは、静的配列の要素ではなく、名前付きの静的プロパティを文字通り探しています$members

代わりにこれを試してください:

$member = static::$members[$chain[0]];
return $member[$chain[1]];

また、 を使用するfunc_get_args()のではなく、メソッド宣言でパラメーターに明示的に名前を付けることをお勧めします。PHP のいくつかの機能は、取り残されるのが最善です....

于 2012-10-11T17:21:45.050 に答える
0

ああ、少しいじくり回す必要がありました - ヘルパー関数を作ることができました。

implode()この関数は、明示的なキー定義を置き換えます。

function array_lookup()
{
    $chain = func_get_args();
    $array = array_shift($chain);

    foreach ($chain as $key) $array = $array[$key];

    return $array;
}

$test = array(
    'one' => array(
        'child' => 0,
        'children' => 5
        ),
    'two' => array(
        'child' => 2,
        'children' => null
        )
    );

var_dump($test, 'one', 'child'); // int(0)

この例では、あらゆる種類のエラー チェックを省略しましたが、探していた機能は実行されます。

そして、はい、私の例では、それはそれを釘付けにします.

于 2012-10-11T17:59:30.827 に答える