至于我,我避免使用全局,但我偶然发现了一点,使用似乎是最好的解决方案。我建立了这个功能:
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参数。但我不确定。
我已经意识到,全球的使用是Are global variables in PHP considered bad practice? If so, why?中提到的不良实践。但是argv数组有点特别。它通过php-cli自动填充,只能从被调用的脚本访问。如果我想从类方法或函数中访问此变量,我需要将其传递到哪里,或将其放在公共静态类成员中。这将是一个解决方案,但我不想在每个脚本中编写相同的行来通过许多函数传递数组。那不是很好。因此,我将这种方式视为另一种可能的解决方案。
您对此的看法,或者是我目前没有看到的更好的方式?
答案 0 :(得分:1)
使用global
可能会造成混淆。我建议您这样做,以避免将该关键字用于您的目的,摘要为$argv
vs $_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") ;
答案 1 :(得分:1)
虽然避免global
的建议很重要且正确,但重要的是要知道为什么你要避免它。对它本身的教条是有效的。这只是global
适用的唯一用例。 $argv
本质上是一个PHP API,只能在全局范围内访问。但是当然你想要在函数中封装从中检索值的逻辑,而不是必须让代码也是全局的。纯函数式编程(忽略OO替代方案)的唯一选择是从$argv
范围导入global
。