是全球$ argv;一个好的做法还是应该避免它?

时间:2018-01-26 08:11:45

标签: php global-variables argv

至于我,我避免使用全局,但我偶然发现了一点,使用似乎是最好的解决方案。我建立了这个功能:

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自动填充,只能从被调用的脚本访问。如果我想从类方法或函数中访问此变量,我需要将其传递到哪里,或将其放在公共静态类成员中。这将是一个解决方案,但我不想在每个脚本中编写相同的行来通过许多函数传递数组。那不是很好。因此,我将这种方式视为另一种可能的解决方案。

您对此的看法,或者是我目前没有看到的更好的方式?

2 个答案:

答案 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