Php 是全局$argv;一个好的做法还是应该避免?
对于我来说,我避免使用global,但我有一点绊倒了,在那里使用似乎是最好的解决方案。我构建这个函数:Php 是全局$argv;一个好的做法还是应该避免?,php,global-variables,argv,Php,Global Variables,Argv,对于我来说,我避免使用global,但我有一点绊倒了,在那里使用似乎是最好的解决方案。我构建这个函数: function _get($parameter_name) { global $argv; // register the argv array as a global variable if (isset($argv)) { parse_str(implode('&', array_slice($argv, 1)), $_GET);
function _get($parameter_name)
{
global $argv; // register the argv array as a global variable
if (isset($argv))
{
parse_str(implode('&', array_slice($argv, 1)), $_GET);
}
return $_GET[$parameter_name];
}
此方法的目的是调用_get('test')并获取argv传递的参数值或url get参数。但我不确定
我已经意识到,global的使用是一种糟糕的做法,如中所述。但是argv数组有点特殊。它通过PHPCLI自动填充,并且只能从被调用的脚本访问。如果我想从类方法或函数中访问此变量,我需要将其传递到何处,或者将其放入公共静态类成员中。这将是一个解决方案,但我不想在每个脚本中编写相同的行,以便通过许多函数传递数组。那可不太好。所以我在考虑另一种可能的解决方法
您对这一点的看法,或者是我目前没有看到的更好的方式?使用
全局
可能会令人困惑。我建议您这样做,以避免出于您的目的使用该关键字,$argv
vs$\u GET
的摘要
class Params
{
static private $args = [] ;
static public function init($args = null)
{
if (! is_null($args)) {
parse_str(implode('&', array_slice($args, 1)), self::$args);
}
if (isset($_GET) && !empty($_GET)) {
self::$args = $_GET ;
}
}
static public function get($parameter_name, $default = null)
{
if (! isset(self::$args[$parameter_name]))
{
return $default ;
}
return self::$args[$parameter_name] ;
}
}
// Usage :
Params::init($argv) ;
$value = Params::get("test") ;
使用
global
可能会令人困惑。我建议您这样做,以避免出于您的目的使用该关键字,$argv
vs$\u GET
的摘要
class Params
{
static private $args = [] ;
static public function init($args = null)
{
if (! is_null($args)) {
parse_str(implode('&', array_slice($args, 1)), self::$args);
}
if (isset($_GET) && !empty($_GET)) {
self::$args = $_GET ;
}
}
static public function get($parameter_name, $default = null)
{
if (! isset(self::$args[$parameter_name]))
{
return $default ;
}
return self::$args[$parameter_name] ;
}
}
// Usage :
Params::init($argv) ;
$value = Params::get("test") ;
虽然避免
global
的建议既重要又正确,但了解自己为什么要避免它也很重要。为了自身的利益而对它进行教条化是适得其反的。这几乎是唯一适用于global
的用例$argv
本质上是一个PHP API,它只能在全局范围内访问。当然,您希望将从中检索值的逻辑封装到函数中,而不必让代码也是全局的。在纯函数式编程中(忽略OO替代方案)唯一的选择是从全局
范围导入$argv
。虽然避免全局
的建议是重要和正确的,但重要的是要知道为什么要避免它。为了自身的利益而对它进行教条化是适得其反的。这几乎是唯一适用于global
的用例$argv
本质上是一个PHP API,它只能在全局范围内访问。当然,您希望将从中检索值的逻辑封装到函数中,而不必让代码也是全局的。在纯函数式编程中(忽略OO替代方案)唯一的选择是从global
范围导入$argv
。avoid………如果可能,不要使用全局变量。avoid………如果可能,不要使用全局变量。首先,谢谢你的建议。这将是一个解决方案,是的,但在每个文件中都以相同的行结束,可以双向调用。这不是违背了构建一个函数来完成这些工作的实践吗?该类被缩进以与“自动加载”一起使用。只有Params::init($argv)代码>应该在脚本开始时调用一次,就像初始化数据库连接一样。首先,感谢您的建议。这将是一个解决方案,是的,但在每个文件中都以相同的行结束,可以双向调用。这不是违背了构建一个函数来完成这些工作的实践吗?该类被缩进以与“自动加载”一起使用。只有Params::init($argv)代码>应该在脚本开始时调用一次,就像初始化数据库连接一样。OO的替代方案是什么?与Syscall的回答不同?我想,我很清楚为什么要避免使用globals。全局变量可以在其他任何地方更改。它可能会有一个非常痛苦的经历,为了寻找这个点,变量发生了变化(我很久以前就犯过这些错误,并从中吸取了教训)。是的,Syscall的答案就是一个OO方法的例子。它唯一的优点是允许您模拟或用其他东西替换$argv
;这是否有必要是另一个问题由于$argv
是一个已定义的PHP API,您通常不应该遇到任何常见的全局
警告。OO替代方案是什么?与Syscall的回答不同?我想,我很清楚为什么要避免使用globals。全局变量可以在其他任何地方更改。它可能会有一个非常痛苦的经历,为了寻找这个点,变量发生了变化(我很久以前就犯过这些错误,并从中吸取了教训)。是的,Syscall的答案就是一个OO方法的例子。它唯一的优点是允许您模拟或用其他东西替换$argv
;这是否有必要是另一个问题由于$argv
是一个已定义的PHP API,因此通常不应遇到任何常见的全局
警告。