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'] in /family.php on line 23
PHP致命错误:访问未声明的静态属性:第 23 行 /family.php 中的 Family::$members['one']['child']

但是,复制转储值并粘贴到脚本中+附加美元符号,它会返回预期的内容:

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

整数(0)

我需要这个的原因是,因为它将与多个变量一起使用,并从生成器函数中调用。

片段有什么问题?

4

2 回答 2

0

变量 variables 仅在字符串中替换变量的名称。它无法评估该字符串的内容(在本例中为 string members['one']['child']

您的代码正在寻找一个名为$members['one']['child']not an element of the static array的静态属性$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 回答