187

我有这样的代码:

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

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

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

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

4

10 回答 10

282

$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);
于 2012-11-23T13:56:10.200 回答
84

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

例子:

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

function footer()
{
    echo FOOTER_CONTENT;
}
于 2012-11-23T13:55:50.687 回答
36

如果变量在函数之外声明,则它已经在全局范围内。所以没有必要声明。但是从你调用这个变量的地方必须可以访问这个变量。如果您从函数内部调用,则必须使用global关键字:

$variable = 5;

function name()
{
    global $variable;
    
    $value = $variable + 5;
    
    return $value;  
 
}

在函数外部使用 global 关键字不是错误。如果要将此文件包含在函数中,可以将变量声明为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'];
}

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

于 2018-03-28T17:09:53.960 回答
31

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

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

并在全球范围内使用

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

define('HOSTNAME', 'localhost');  
于 2012-11-23T13:55:58.273 回答
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 将不会是全局范围的。

于 2016-07-12T18:46:26.260 回答
6

如果这符合您的意图,您可以尝试使用Closure函数或Lambdasuse中的关键字......不过 PHP 7.0。并不是这样更好,而只是一种选择。

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

演示| 信息

于 2016-08-08T13:32:58.570 回答
5

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

或者,您可以使用类中的常量技巧,例如 class::constant。您还可以通过向类声明静态属性来使它们可变,如果您想更改静态属性,可以使用函数来设置它。

于 2012-11-23T13:55:26.970 回答
4

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

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

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

function echo_foo() {
    echo global::$foo;
}
于 2019-02-10T14:38:41.493 回答
0

如果您使用过程函数而不是变量并在任何地方调用它们会怎样。

我通常会收集配置值并将它们放在带有 return 语句的函数中。我只是在需要使用全局值并调用特定函数的地方包含了它。

function host()
{
   return "localhost";
}
于 2018-03-23T16:17:07.237 回答
-2

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

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

function my_var() {
    return 'Rome';
}
于 2020-05-09T18:36:22.787 回答