2012-11-23 139 views
117

我的代码是这样的:如何在php中声明一个全局变量?

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

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

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

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

+11

没有没有外部访问。如果您不喜欢'global'关键字,请考虑在所有作用域中使用'超全局'$ GLOBALS ['a']',或考虑将参数传递给您的函数。 –

+3

如果它是重要的东西,那么甚至可以使用会话变量。 –

回答

183

$GLOBALS阵列可以用来代替:

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

function body(){ 

    echo $GLOBALS['a']; 
} 

Manual

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


如果你有一组需要一些公共变量功能,具有属性的类可能是一个不错的选择,而不是一个全球性的:

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); 
+6

+ 10。这完美的作品。 –

+4

+2将它包装在一个类中,而不必处理烦人的全局语法! –

+0

+100也为我工作 –

4

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

或者,在类中有一些常量,比如可以使用的class :: constant。你也可以通过向类声明静态属性来使它们变化,如果你想改变它,用函数来设置静态属性。

57

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

例子:

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

function footer() 
{ 
    echo FOOTER_CONTENT; 
} 
+0

尝试修改FOOTER_CONTENT时会发生什么?它是像Java中的'final'还是C,C++和C#中的'const'? – Lion

+2

如果您尝试第二次定义FOOTER_CONTENT,php会发出一个关于它的通知 – Dale

+0

我需要计算每次加载页面时的当前unix纪元时间,然后在几次计算(函数)中使用该值。 “定义”为我工作。最初,我没有看到“echo FOOTER_CONTENT;”没有前面的'$',我得到了错误。 – user208145

23

添加您的变量$ GLOBALS超级全局数组一样

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

,并在全球范围使用

或者你可以使用常量访问IBLE整个脚本

define('HOSTNAME', 'localhost'); 
+0

如果使用'define',一旦设置,就不能更改定义! –

+0

在你的第一个例子中,它是说'$变量现在在脚本中稍后被称为'localhost'? – HollerTrain

+0

不,如果你想使用这个变量,你必须像使用$ GLOBALS ['variable']; –

-16

你不应该使用全局变量而且,它们在PHP 5.4中不可用。

+13

REGISTER GLOBALS被删除。不是全局的。 – unity100

+4

正如所写,这个答案是错误的,应该更新以反映unity100的评论。如果GLOBALS仍然可用,请澄清GLOBAL变量的哪些方面已经改变。 [类似这样。](http://stackoverflow.com/questions/10158140/php-5-4-0-register-globals-deprecated#answer-10158165) – crashwap

+0

http://php.net/manual/en/ security.globals.php – m13r

5

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

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不会被全局范围的增值经销商。

4

您可以尝试关键字use关闭功能或Lambda表达式如果这符合你的意图... PHP 7.0虽然。这不是更好,但只是一种选择。

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

demo | info

1

函数外部声明的变量具有全局范围的,只能一个功能

<?php 
global $a; 
$a=10; 
echo $a; 
function xl($a){ 
echo "in the function".$a." <br/>"; 
} 
echo "in outside ".$a."<br/>"; 
xl($a); 
?>