2

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

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

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

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

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

function foo() {
    echo $BASE_URL;
}
4

3 回答 3

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

于 2012-06-23T19:17:46.000 回答
1

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

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

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

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

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

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

于 2012-06-23T19:09:35.803 回答
0

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

define()也很好。

于 2012-06-23T19:14:52.197 回答