【问题标题】:PHP global keyword workaroundPHP 全局关键字解决方法
【发布时间】:2012-06-23 19:07:47
【问题描述】:

在不使用global 关键字的情况下,在PHP 中是否有另一种以Java 风格使用全局变量的方法?

下面的例子是非常常见和简单的。我会用 define 关键字来做,但正如你所看到的,变量是相互依赖的,我相信你不能用 define 来实现。

当然,在下面的示例中,我遇到了错误。

真的很期待这个问题的解决方案。在我看来,必须编写一个global 定义我想使用全局变量的函数似乎是一个无效的解决方案,应该是一个更好的解决方案。

$BASE_URL = "mysite.com";
$PRODUCTS_URL = $BASE_URL . "/products";
$ABOUT_URL = $BASE_URL . "/about";

function foo() {
    echo $BASE_URL;
}

【问题讨论】:

    标签: php global-variables


    【解决方案1】:

    我会用 define 关键字来做,但正如你所见,变量是相互依赖的,我相信你不能用 define 来实现。

    不完全正确,这会很好 - 我可能会采用这种方式:

    define('BASE_URL', "mysite.com");
    define('PRODUCTS_URL', BASE_URL . "/products");
    define('ABOUT_URL', BASE_URL . "/about");
    

    小心吃掉常量命名空间,你可能想写一个函数,也许是这样的(可以使用调整,只是一个例子):

    function get_url($item = NULL, $include_base = TRUE)
    {
        $urls = array(
            'base'  =>  'mysite.com',
            'products'  =>  '/products',
            'about' =>  '/about',
        );
        $output = $include_base ? $urls['base'] : '';
        if (isset($urls[$item])) $output .= $urls[$item];
        return $output;
    }
    

    然后将其称为echo get_url('products');。只要在调用foo() 时定义了它,它就会起作用。我会一直努力避免global$GLOBALS

    【讨论】:

      【解决方案2】:

      您可以按如下方式使用 $GLOBALS 超全局...

      function foo() {
          echo $GLOBALS['BASE_URL'];
      }
      

      但是 - 请参阅下面的 Kolink 评论。从 PHP 5.4.0 开始,$GLOBALS 超全局变量仅在首次使用时初始化,因此不使用它并坚持使用 global 关键字会带来边际性能优势。

      对于您正在做的事情,您可以简单地定义一个全局数组,例如

       $CONF['BASE_URL']='foo';
      

      那么你只需要在任何需要它的函数中使用global $CONF,或者更好的是,将它包装到某种配置类中。

      【讨论】:

      • 请注意,$GLOBALS 数组是在 PHP 5.4 中即时添加的。在这种情况下,仅仅为了避免指定 global $myvar 而调用它是低效的。
      • 有趣 - 如果有人需要参考,请在此处查看 5.4.0 的更新日志php.net/ChangeLog-5.php#5.4.0
      【解决方案3】:

      您甚至可以使用$_SESSION,但这不是一个非常优雅的解决方案。 为什么你输入global 这么难?不是很着急。

      define()也不错。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多