Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.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 是全局$argv;一个好的做法还是应该避免?_Php_Global Variables_Argv - Fatal编程技术网

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

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);

对于我来说,我避免使用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);
    }

    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,因此通常不应遇到任何常见的
全局
警告。