PHP:动态检索全局变量

PHP:动态检索全局变量,php,Php,我试图编写一个简单的包装器类来获取全局变量的值。我想这样使用它: print_r($class->session()->getAll()); print_r($class->cookie()->getAll()); 以下是我所拥有的: class GlobalVars() { private $current; public function session() { $this->current = 'SESSION'; return

我试图编写一个简单的包装器类来获取全局变量的值。我想这样使用它:

print_r($class->session()->getAll());
print_r($class->cookie()->getAll());
以下是我所拥有的:

class GlobalVars() {

  private $current;

  public function session() {
    $this->current = 'SESSION';
    return $this;
  }

  public function cookie() {
    $this->current = 'COOKIE';
    return $this;
  }

  public function getAll() {
    return $_{$this->current}; // Obviously wrong
  }

  public function get($key) {
    if (!isset($_{$this->current}[$key])) { // Obviously wrong
      return false;
    }

    return $_{$this->current}[$key]; // Obviously wrong
  }

  public function set($arr) {
    if (is_array($arr)) {
      foreach ($arr as $k => $v) {
        $_{$this->current}[$k] = $v;
      }
    }
  }

}

$class = new GlobalVars();

print_r($class->session()->getAll());

在这个例子中,我得到了一条
注意:未定义变量:\消息。我需要修改什么才能让它工作?

它不会像这样工作的。你需要:



使用varVars是一种非常糟糕的方法,因为它不可读,而且通常IDE不知道您在使用什么,而且很容易得到错误代码。

在我看来,这只是您犯的一个简单的语法错误。你所做的:

  public function getAll() {
    return $_{$this->current}; // Obviously wrong
  }
但从字符串模拟变量的正确方法是:

  public function getAll() {
    return ${"_".$this->current};
  }

我已经测试过了。其他变量的类似行为。文档中关于变量的更多信息:

现在,你为什么要这样做?你可以用一个叫做“变量”的功能来做,但这是一个糟糕的主意,所以我将把它留给你去查找。不要为了抽象而抽象。让你的每个公共功能从适当的变量中查找你想要的。这是一个缺乏良好建筑设计知识的典型例子,导致了完美的过度工程。这是一个完全有效的问题,伙计们,我不知道你为什么要关闭它。当然,这可能是过度工程化,但问题是“该怎么做才能使它工作”,而不是“这是一个伟大的代码”?依我看,如果你决定继续这样做。这是一个糟糕的想法,因为目前在一个地方有很多不受控制的全球状态。您需要能够在
get
函数中指定要从哪个源检索变量。i、 e.
公共函数get($key,$source){…
。否则,您需要能够指定搜索您提供的
$key
的顺序的层次结构。此外,您需要指定返回第一个找到的或要查找的位置列表中的所有位置。请仔细考虑这一点。您可以查看“配置”类。请不要给他更多ideas。
  public function getAll() {
    return ${"_".$this->current};
  }