如何在php中声明全局变量?


168

我有这样的代码:

<?
    $a="localhost";
    function body(){
        global $a;
        echo $a;
    }

    function head(){
        global $a;
        echo $a;
    }

    function footer(){
        global $a;
        echo $a;
    }
?>

有什么方法可以在一处定义全局变量并使$a所有函数一次访问该变量?不利用global $a;更多?


15
不,没有。如果您不喜欢该global关键字,请考虑$GLOBALS['a']在所有范围内使用superglobal,或考虑将参数传递给函数。
Michael Berkowski 2012年

5
如果这很重要,那么甚至可以使用会话变量。
Nikos Tsirakis 2012年

Answers:


259

$GLOBALS数组可以代替使用:

$GLOBALS['a'] = 'localhost';

function body(){

    echo $GLOBALS['a'];
}

手册

包含对所有变量的引用的关联数组,这些变量当前在脚本的全局范围内定义。变量名是数组的键。


如果您有一组需要一些公共变量的函数,那么带有属性的类可能是一个不错的选择,而不是全局的:

class MyTest
{
    protected $a;

    public function __construct($a)
    {
        $this->a = $a;
    }

    public function head()
    {
        echo $this->a;
    }

    public function footer()
    {
        echo $this->a;
    }
}

$a = 'localhost';
$obj = new MyTest($a);

78

如果变量不会更改,则可以使用 define

例:

define('FOOTER_CONTENT', 'Hello I\'m an awesome footer!');

function footer()
{
    echo FOOTER_CONTENT;
}

2
FOOTER_CONTENT尝试修改时会发生什么?就像finalJava还是constC,C ++和C#?
狮子

4
如果您尝试第二次定义FOOTER_CONTENT,则php会发出有关它的通知
Dale

每次加载页面时,我需要计算当前的UNIX纪元时间,然后在几个计算(函数)中使用该值。“定义”对我有用。最初,我没有看到“ echo FOOTER_CONTENT;” 没有前面的“ $”,并且出现错误。
user208145

如果变量不会更改,则它不是变量。是不是?
Sajidur Ra​​hman

29

在$ GLOBALS超级全局数组中添加变量,例如

$GLOBALS['variable'] = 'localhost'; 

并在全球范围内使用

或者您可以使用在整个脚本中都可以访问的常量

define('HOSTNAME', 'localhost');  

1
如果使用“定义”一次设置,则无法更改定义!
Reza MA

在您的第一个示例中,是说脚本后面的'$ variable现在称为'localhost'吗?
扎克·史密斯

不,如果要使用此变量,则必须像$ GLOBALS ['variable']一样使用它;
Pankaj Khairnar

25

如果在函数外部声明了变量,则该变量已在全局范围内。因此,无需声明。但是从那里调用此变量必须有权访问此变量。如果从函数内部调用,则必须使用global关键字:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

在函数外使用全局关键字不是错误。如果要将此文件包含在函数中,则可以将变量声明为global

config.php

global $variable;

$variable = 5;

other.php

function name()
{
    require_once __DIR__ . '/config.php';
}

您也可以使用$GLOBALS。这是一个超全球化的环境,因此无处不在。

$GLOBALS['variable'] = 5;

function name()
{
    echo $GLOBALS['variable'];
}

根据您的选择,您可以选择其中一个。


9

这个答案很晚,但是我要做的是设置一个类,该类将布尔值,数组和整数初始值保存为全局范围静态变量。这样定义了任何常量字符串。

define("myconstant", "value"); 

class globalVars {

    static $a = false;

    static $b = 0;

    static $c = array('first' => 2, 'second' => 5);

}


function test($num) {

    if (!globalVars::$a) {

        $returnVal = 'The ' . myconstant . ' of ' . $num . ' plus ' . globalVars::$b . ' plus ' . globalVars::$c['second'] . ' is ' . ($num + globalVars::$b + globalVars::$c['second']) . '.';

        globalVars::$a = true;

    } else {

        $returnVal = 'I forgot';

    }

    return $returnVal;

}

echo test(9); ---> The value of 9 + 0 + 5 is 14.

echo "<br>";

echo globalVars::$a; ----> 1

static关键字必须存在于其他的类瓦尔$ A,$ b和$ C不会被全局范围。


由于许多原因,这是一个很好的解决方案。静态类仅需要在基本变量名称中添加几个字符:G :: $ Name,其声明如下所示:class G {static $ Name,$ Name2;}注意G可以是真正的全局变量,那么E可以用于与员工相关的变量。比PHP支持的全面的面向对象范例更容易编程。如果确实需要常量,则可以像在“静态”之后声明的变量一样在“常量”之后声明它们-只需省略美元符号即可。G :: Example将是全局常量的示例。
David Spector

5

您以编写问题的方式回答了这个问题-使用'define'。但是一旦设置,就无法更改定义。

另外,也可以在类中使用带有常量的技巧,例如class :: constant。您还可以通过向类声明静态属性来使它们可变,如果要更改静态属性,可以使用这些函数设置静态属性。


5

如果符合您的意图,可以尝试useClosure函数或Lambdas中使用该关键字...虽然是PHP 7.0。那不是更好,而是另一种选择。

$foo = "New";
$closure = (function($bar) use ($foo) {
    echo "$foo $bar";
})("York");

演示 | 信息


1

让我们考虑一些不同:

class globe{
    static $foo = "bar";
}

您可以随心所欲地使用和修改它,例如:

function func(){
    echo globe::$foo;
}

0

如果您使用过程函数而不是变量,并在任意位置调用它们,该怎么办?

我通常会收集配置值,并将其放入带有return语句的函数中。我只包括需要利用全局值并调用特定函数的地方。

function host()
{
   return "localhost";
}

0

$GLOBALS[] 正确的解决方案,但是由于我们在谈论替代方案,因此函数也可以轻松地完成此工作:

function capital() {
    return my_var() . ' is the capital of Italy';
}

function my_var() {
    return 'Rome';
}

-19

您不应该再使用全局变量,因为它们在PHP 5.4中不可用。


19
REGISTER GLOBALS已删除。不是全局变量。
unity100

7
根据书面说明,该答案是错误的,应予以更新以反映unity100的评论。如果GLOBALS仍然可用,请说明GLOBAL变量的哪些方面已更改。这样的事情。
crashwap


@RobertColumbia非常有趣的帖子,我会在意其他答案,但是它不适用于这种特殊情况。(我希望您只是使用该meta来指出“不做那个”答案可能是有效的,而不是以此为理由的理由;))“ “不做那个” 可以 是一个有效的答案。 “ - ‘可以’而不是‘是’。“ 但是有时候,什么也不需要做。如果您只是停止做错事,那么一切都会神奇地再次开始工作。 ”-在这里并不适用,因为代码没有被“破坏”。OP只需要一种“较少键入”的处理方式。…
robinCTS

实际上是要回答这个问题吗?在大多数情况下是这样。 ”-“最多”,而不是“全部”。(我什至会质疑“最”,但我还没有看到足够多的答案来做出明智的论点。)“ 在这种情况下,不是。 ”-在这个“答案”中,也是出于同样的原因:“ 更糟糕的是,墨菲的答案并未提出解决问题的方法。 ”和“ 它没有给出向质问者提出的工具,方法或任何类似解决他问题的方法。…
robinCTS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.