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

LIG*_*GHT 159 php global global-variables

我有这样的代码:

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

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

    function footer(){
        global $a;
        echo $a;
    }
?>
Run Code Online (Sandbox Code Playgroud)

有没有办法在一个地方定义全局变量,并使变量$a可以在所有函数中同时访问?没有使用global $a;更多?

MrC*_*ode 253

$GLOBALS可以使用该数组:

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

function body(){

    echo $GLOBALS['a'];
}
Run Code Online (Sandbox Code Playgroud)

手册:

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


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

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);
Run Code Online (Sandbox Code Playgroud)

  • 警告:从 PHP 8.1.0 开始,不再支持对整个 $GLOBALS 数组的写访问 (4认同)

Dal*_*ale 77

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

例:

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

function footer()
{
    echo FOOTER_CONTENT;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你第二次尝试定义FOOTER_CONTENT,php会抛出一个关于它的通知 (4认同)
  • 尝试修改"FOOTER_CONTENT"时会发生什么?它就像Java中的`final`或C,C++和C#中的`const`一样? (2认同)
  • 如果变量不会改变,那么它就不是变量。不是吗?! (2认同)

Pan*_*nar 28

在$ GLOBALS超全局数组中添加变量

$GLOBALS['variable'] = 'localhost'; 
Run Code Online (Sandbox Code Playgroud)

并在全球使用它

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

define('HOSTNAME', 'localhost');  
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用'define',一旦设置,您将无法更改定义! (3认同)

Saj*_*man 22

如果变量在函数之外声明,则它已在全局范围内.所以没有必要申报.但是,从调用此变量的位置,必须有权访问此变量.如果从函数内部调用,则必须使用global关键字:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}
Run Code Online (Sandbox Code Playgroud)

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

config.php

global $variable;

$variable = 5;
Run Code Online (Sandbox Code Playgroud)
other.php

function name()
{
    require_once __DIR__ . '/config.php';
}
Run Code Online (Sandbox Code Playgroud)

你也可以使用$GLOBALS.这是一个超级全球,因此它可以随处访问.

$GLOBALS['variable'] = 5;

function name()
{
    echo $GLOBALS['variable'];
}
Run Code Online (Sandbox Code Playgroud)

根据您的选择,您可以选择其中之一.


The*_*lob 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
Run Code Online (Sandbox Code Playgroud)

static关键字必须存在于其他类$ A,$ b和$ C不会被全局范围的增值经销商.


Ami*_*ati 8

您可以将全局变量声明为静态属性:

class global {
    static $foo = "bar";
}
Run Code Online (Sandbox Code Playgroud)

您可以在任何您喜欢的地方使用和修改它,例如:

function echoFoo() {
    echo global::$foo;
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*bie 5

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

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


Thi*_*ous 5

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

$foo = "New";
$closure = (function($bar) use ($foo) {
    echo "$foo $bar";
})("York");
Run Code Online (Sandbox Code Playgroud)

演示 | 信息