2

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の文字列値の最初の文字です)を取得します。

4

1 に答える 1

3

これは単にphpパーサーの癖であり、構文解析に変数変数を最初に解決[]してから、最初の結果ではなくその結果を$property[$key]1行で使用するように指示する方法はないようです。

ただし、2つに分割すると、正常に機能します。

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;
}

また、最後のリターンをからに変更してfalsenull例のコメントと一致するようにしました。

于 2012-08-09T06:18:22.000 に答える