PHP全局关键字解决方法

时间:2012-06-23 19:07:47

标签: php global-variables

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

以下示例非常常见且简单。我会使用define关键字进行操作,但正如您所看到的,varibales相互依赖,我相信您无法通过define来实现。

在下面的示例中,我当然会收到错误。

真的期待这个解决方案。在我看来,不得不为我想要使用全局变量的函数写一个global定义似乎是一个应该是更好的解决方案。

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

function foo() {
    echo $BASE_URL;
}

3 个答案:

答案 0 :(得分:1)

您可以使用$ GLOBALS超全局,如下所示......

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

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

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

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

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

答案 1 :(得分:1)

  

我会用define关键字来做,但正如你所看到的,varibales彼此依赖,我相信你无法用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 :(得分:0)

你甚至可以使用$_SESSION但不是一个非常优雅的解决方案。 为什么输入global这么难?这不是一件容易的事。

define()也很好。