【问题标题】:Is global $argv; a good practice or should i avoid it? [duplicate]是全局$argv;一个好的做法还是我应该避免它? [复制]
【发布时间】:2018-01-26 08:11:45
【问题描述】:

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

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? 中提到的那样,使用 global 是不好的做法。但是 argv 数组有点特别。它是通过 php-cli 自动填充的,并且只能从被调用的脚本中访问。如果我想从类方法或函数中访问这个变量,我需要将它传递到哪里,或者将它放在一个公共静态类成员中。那将是一个解决方案,但我不想在每个脚本中编写相同的行来将数组传递给许多函数。那不是很好。所以我正在考虑这种方式作为另一种可能的解决方案。

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

【问题讨论】:

  • 避免.......................
  • 尽可能不要使用全局变量。

标签: php global-variables argv


【解决方案1】:

使用global 可能会造成混淆。我建议您这样做以避免出于您的目的使用该关键字,$argv$_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") ;

【讨论】:

  • 首先,感谢您的建议。这将是一个解决方案,是的,但在每个文件中都以相同的行结束,可以双向调用。构建一个单独的函数来做这些事情难道不违反惯例吗?
  • 该类被缩进以与“自动加载”一起使用。只有 Params::init($argv) ; 应该在脚本开始时调用一次,就像初始化数据库连接一样。
【解决方案2】:

虽然避免global 的建议重要且正确,但了解为什么您要避免它也很重要。为自己的利益而教条主义会适得其反。这几乎是唯一适合 global 的用例。 $argv 本质上是一个 PHP API,只能在全局范围内访问。但是,您当然希望将从中检索值的逻辑封装在一个函数中,而不必将该代码也设为全局代码。那么,在纯函数式编程(忽略 OO 替代方案)中,唯一的选择是从 global 范围导入 $argv

【讨论】:

  • 什么是面向对象的替代方案?与 Syscall 的回答有何不同?
  • 我想,我很清楚为什么要避免全局变量。全局变量可能会在其他任何地方更改。它会得到一个非常痛苦的经历,寻找点,变量被改变了(我很早以前就犯了这些错误,并从中吸取了教训)。
  • 是的,Syscall 的回答是 OO 方法的一个例子。它唯一的优点是它允许你用其他东西模拟或替换$argv;这是否有必要是另一个问题。 – 由于$argv 是已定义的 PHP API,因此您通常不应遇到任何常见的global 警告。
猜你喜欢
  • 2011-07-22
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 2012-02-01
  • 2011-07-31
  • 1970-01-01
相关资源
最近更新 更多