【问题标题】:Issue with wrapping server variable arrays (e.g., $_POST, $_GET)包装服务器变量数组的问题(例如,$_POST、$_GET)
【发布时间】:2013-10-20 06:31:42
【问题描述】:

假设我已经定义了几个这样的类:

abstract class ServerVars {
  public static function get($k) {
    if (empty($arr[$k])) throw new Exception('Not found');
    return $arr[$k]; // Also include error checking
  }
  public static function set($k, $v) {
    $arr[$k] = $v;
  }
  ... // Other useful methods
}

public class Session extends ServerVars {
  static $arr = $_SESSION; // !!!
  public static function destroy() {
    ...
  }
}

基本上,我只是想包装某些服务器变量,如 $_SESSION、$POST 等,以使我的代码更加模块化。但是标有!!! 的行会导致错误unexpected '$_SESSION' (T_VARIABLE)。为什么会出现这个错误?有没有更好的方法来做我想要完成的事情?

【问题讨论】:

标签: php arrays session post get


【解决方案1】:

类变量的初始化器必须是常量。 $_SESSION 是变量,不一定是常量。

不要为此使用继承;这是完全不合适的。如果你坚持要一堂课,那就应该是一堂课:

class DuplicatesBuiltInFunctionality {
    public function __construct($arr) {
        $this->arr = $arr;
    }

    public function get($k) {
        if(!isset($this->arr[$k])) throw new Exception('Not found');
        return $this->arr[$k];
    }

    public function set($k, $v) {
        $this->arr[$k] = $v;
    }
}

【讨论】:

  • 为什么不合适?就我而言,它似乎是一个有用的抽象。按照你的方式做,我必须创建实例,这似乎不正确,因为我只需要一个用于整个程序的实例(并且我试图避免使用单例模式)。我只想知道如何让我的特定代码工作。
  • @Intredasting:不,整个程序不需要一个实例。 $_SESSION 需要一个,$_POST 需要一个(我假设你打算为 $_GET$_COOKIE 做同样的事情)。
  • 但是如果我最后说 $post = new DuplicatesBuiltInFunctionality($_POST),并且我在一个函数中使用它,然后在我需要的其他脚本中定义的另一个函数中,我不会能够使用该 $post 变量;我需要实例化另一个。
  • @Intredasting:使用global 关键字。
猜你喜欢
  • 2018-01-22
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 2014-07-01
相关资源
最近更新 更多