Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.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 注册表或$\u ENV_Php_Design Patterns_Global - Fatal编程技术网

Php 注册表或$\u ENV

Php 注册表或$\u ENV,php,design-patterns,global,Php,Design Patterns,Global,注册表模式和$\u ENV之间有什么区别,特别是在php中使用时 它们中的哪一个提供了更高的安全性和性能 例如,为什么许多编码器使用$config['deflang']和注册表模式,而不仅仅是$\u ENV['deflang'] 提前感谢$\u ENV有一个非常特殊的目的——它是流程环境。你不应该真的把随机数据扔进去。如果您想这样做,至少使用一个全局的(或者更好的是,使用一个静态类成员)。这两件事是完全不同的 $\u ENV是包含所有环境变量的超全局数组 $config是一些用户定义的变量,可

注册表模式$\u ENV之间有什么区别,特别是在php中使用时

它们中的哪一个提供了更高的安全性和性能

例如,为什么许多编码器使用$config['deflang']和注册表模式,而不仅仅是$\u ENV['deflang']


提前感谢

$\u ENV
有一个非常特殊的目的——它是流程环境。你不应该真的把随机数据扔进去。如果您想这样做,至少使用一个全局的(或者更好的是,使用一个静态类成员)。

这两件事是完全不同的

  • $\u ENV
    是包含所有环境变量的超全局数组
  • $config
    是一些用户定义的变量,可以来自配置文件、数据库等

一种常见的方法(特别是在某些框架中)是使用一个配置文件,该文件包含一个具有多个配置的数组和一个环境变量(例如,
FRAMEWORKNAME\u ENV
),然后选择活动配置。

注册表模式允许您延迟加载资源

$db = $_ENV['db_connection']; // The connection must be setup prior
vs

试试这个:

class Registry {

    public static $instance;

    public function set($key, $val) {
        $this->_reg[$key] = $val;
    }
    public function get($key) {
        return $this->_reg[$key];
    }
    public static function Singleton() {
        $class = __CLASS__;
        if (!(self::$instance instanceof $class)) {
            try {
                if (!defined('REQUIRED')) {
                    throw new Registry_Exception('No direct access.');
                }
            } catch (Registry_Exception $e) {}
            self::$instance = new $class();
        }
        return self::$instance;
    }
    private function __construct() {}

}

$registry = new Registry();
$registry->set('setting', 'value');

谢谢,但是如果我可以使用$\u ENV,为什么要使用配置文件呢?为什么我不能使用$_ENV['db']而不是$config['db']?为什么它是“坏的”?因为这样您就必须为所有配置变量创建环境变量-至少如果您不想通过手动向数组添加值来滥用该数组的话。好的,那么您的建议是使用一些用户定义的变量定义$config[],然后定义一个包含$config数组的$\u ENV['FRAMEWORKNAME\u ENV']。是吗?不是。你的数组应该是
$config=array('dev'=>array(…),'prod'=>array(…)
,你可以使用
$config[$\u ENV['WHATEVER_ENV']]][…]
,并在vhost配置中使用SetEnv将ENV变量设置为
dev
prod
,具体取决于你想要的配置。我也可以在函数中检查连接,我的问题是关于在整个脚本中所有作用域中都可用的静态变量为什么全局更好$\u ENV?正如我在这里读到的,这是一个“超全局”,或自动全局变量。这仅仅意味着它在整个脚本的所有作用域中都可用。不需要做全局$variable;在函数或方法中访问它。
$GLOBALS
也是超全局的,与
$\u ENV
不同,它没有任何预定义的含义。在
$\u ENV
中存储任意垃圾没有任何意义,就像将其放入
$\u GET
$\u SERVER
中一样——所有这些都是为了其他目的。非常感谢,现在我知道$GLOBAL比$u ENV更有用,但是$GLOBAL和注册表模式呢?我不需要解释,它们中的哪一个提供了更高的性能和安全性(当然,如果它们提供的话)。
class Registry {

    public static $instance;

    public function set($key, $val) {
        $this->_reg[$key] = $val;
    }
    public function get($key) {
        return $this->_reg[$key];
    }
    public static function Singleton() {
        $class = __CLASS__;
        if (!(self::$instance instanceof $class)) {
            try {
                if (!defined('REQUIRED')) {
                    throw new Registry_Exception('No direct access.');
                }
            } catch (Registry_Exception $e) {}
            self::$instance = new $class();
        }
        return self::$instance;
    }
    private function __construct() {}

}

$registry = new Registry();
$registry->set('setting', 'value');