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

标签 php arrays oop properties getter-setter

是否有一种方法可以在不使用 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/

相关文章:

php - 使用 PHP 生成 HTML 时处理撇号

PHP 和 OCI-Lob::read from oracle clob

c# - 如何在 C# 中每 3 项用逗号将数组连接到字符串

java - Android导入图片到数组

Java:是否可以覆盖所有功能?

php echo 数据库中的名称和文件路径以使用 href 显示视频

php - 用 PHP 编写数据访问代码

java - 来自另一个类的框架中的 JComponent repaint()

java - java中如何在不声明范围的情况下创建String类型数组?

oop - 新的架构概念