我正在尝试构建一个动态关联数组值查找函数(在一个类中):
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']”
致命错误:访问未申报的静态属性:第23行/family.php中的Family :: $ members ['one'] ['child']
PHP致命错误:访问未声明的静态属性:第23行/family.php中的Family :: $ members ['one'] ['child']
虽然,复制转储的值,并粘贴在脚本+附加的美元符号内,它会返回预期的内容:
var_dump( Family::$members['one']['child'] );
INT(0)
我需要它的原因是,因为它将与多个变量一起使用,并从生成器函数调用。
该代码段有什么问题?
答案 0 :(得分:0)
变量变量仅在字符串中替换变量名称。它无法评估该字符串的内容(在本例中为字符串members['one']['child']
)
您的代码正在寻找一个静态属性,其名称为$members['one']['child']
,而不是静态数组$members
的元素。
请改为尝试:
$member = static::$members[$chain[0]];
return $member[$chain[1]];
另外,我建议不要使用func_get_args()
,而是在方法声明中明确命名参数。 PHP的一些功能最好留下......
答案 1 :(得分: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)
我已经遗漏了这个例子的任何错误检查,但它确实做了我想要的。
是的,就我的例子而言,it nails it。