是否有一种方法可以在不使用 foreach 循环(并且其他方面未更改)的情况下实现以下 PHP 类?
<?php
class foo {
private static $_thing = array(
'kee' => 'valyu'
);
public static function fetch($property, $key = '') {
if (property_exists('foo', $property)) {
if ($key == '') return self::$$property;
else {
# i cannot seem to do self::$$property[$key].
foreach (self::$$property as $_key => $_value) {
if ($_key == $key) return $_value;
}
}
}
return false;
}
}
var_dump(foo::fetch('bad')); # null
var_dump(foo::fetch('_thing')); # array(1) { ... }
var_dump(foo::fetch('_thing', 'bad')); # null
var_dump(foo::fetch('_thing', 'kee')); # string(5) "valyu"
?>
self::$$property[$key]
给我“访问未声明的静态属性:foo::$x”(x 是$key 的字符串值)。
最佳答案
这只是 php 解析器的一个怪癖,似乎没有办法用语法告诉解析器您希望首先解析变量变量,然后在其结果上使用 []
$property[$key]
的第一个,在一行中。
但是,如果你把它分成两部分,它就会正常工作:
class foo {
private static $_thing = array(
'kee' => 'valyu'
);
public static function fetch($property, $key = '') {
if (property_exists('foo', $property)) {
if ($key == '') {
return self::$$property;
} else {
$prop = self::$$property; // move the result to temporary variable, first part of $$property[$key]
if (array_key_exists($key, $prop)) { //isset will return false if the key is in fact set to null
return $prop[$key]; // use it, second part of $$property[$key]
}
}
}
return null;
}
}
var_dump(foo::fetch('bad')); // null
var_dump(foo::fetch('_thing')); // array(1) { ... }
var_dump(foo::fetch('_thing', 'bad')); // null
var_dump(foo::fetch('_thing', 'kee')); // string(5) "valyu"
更新:
如Dan善意地指出,{}
语法可用于消除解析器意图的歧义,如下所示:
public static function fetch($property, $key = '') {
if (property_exists('foo', $property)) {
if ($key == '') {
return self::$$property;
} else if (array_key_exists($key, self::${$property})) {
return self::${$property}[$key];
}
}
return null;
}
我还将最后一个返回值从 false
更改为 null
,以便它与您的示例的注释相匹配。
关于PHP OOP:为什么 self::$$property[$key] 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11877578/