Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP:为什么self::$$property[$key]不起作用?_Php_Arrays_Oop_Properties_Getter Setter - Fatal编程技术网

PHP OOP:为什么self::$$property[$key]不起作用?

PHP OOP:为什么self::$$property[$key]不起作用?,php,arrays,oop,properties,getter-setter,Php,Arrays,Oop,Properties,Getter Setter,有没有一种方法可以在不使用foreach循环的情况下实现以下PHP类(或者不进行更改) self::$$property[$key]让我“可以访问未声明的静态属性:foo::$x”(x是$key字符串值中的第一个字符)。这只是php解析器的一个怪癖,似乎无法用语法告诉解析,您希望先解析变量,然后使用[]而不是$property[$key]首先,在一行中 但是,如果将其分成两部分,则可以正常工作: class foo { private static $_thing = array(

有没有一种方法可以在不使用foreach循环的情况下实现以下PHP类(或者不进行更改)



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"
更新: 正如善意地指出的,
{}
语法可用于消除解析器意图的歧义,如下所示:

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
,因此它与示例的注释相匹配。

耸耸肩。好吧,至少循环消失了。(在foreach之前应该想到这一点!)非常感谢!嗯。没有尝试过这个,但是
self::${$property}[$x]
也不起作用吗?此处描述:不是针对属性,而是针对普通变量。我不知道这里的用法是否有差异。我尝试在那里添加
{}
s,但似乎没有找到正确的组合。我已经更新了答案,我似乎还记得我也尝试过
{}
。幽灵般的
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;
}