$ GLOBALS和大写$ var之间的差异

时间:2015-08-19 04:36:01

标签: php global-variables

在$ GLOBALS范围内声明变量与声明大写变量之间的差异(如果有)是什么?

我一直在寻找答案,这里有一些链接有趣的信息,但我没有找到答案。

PHP global in functions
what is the difference between GLOBALS and GLOBAL?
http://php.net/manual/en/language.variables.scope.php
http://php.net/manual/en/reserved.variables.globals.php
How to declare a global variable in php?

一点点测试告诉我们:

$FOO='BAR';
$GLOBALS['foo']='bar';

function ufoo(){ echo $GLOBALS['FOO']; }
function lfoo(){ echo $GLOBALS['foo']; }

ufoo(); //outputs BAR
lfoo(); //outputs bar

关于使用常量:这里描述了一些限制,所以它们对我不起作用。 http://php.net/manual/en/language.constants.php 此外,定义为对象或数组的常量将通过向错误日志添加行来占用磁盘空间:

class foo_bar{
  var $a;
  var $b;
}
$foo_bar_object=new foo_bar();
$foo_bar_object->a='foo';
$foo_bar_object->b='bar';
define('FOO_BAR_OBJECT',$foo_bar_object);

$foo_bar_array=array('foo','bar');
define('FOO_BAR_ARRAY',$foo_bar_array);

print_r(FOO_BAR_ARRAY);
print_r(FOO_BAR_OBJECT);
  

PHP警告:常量只能评估为标量值   警告:常量只能评估标量值   注意:使用未定义的常量FOO_BAR_ARRAY - 假设   ' FOO_BAR_ARRAY'
PHP注意:使用未定义的常量   FOO_BAR_OBJECT - 假设' FOO_BAR_OBJECT'

在使用$ GLOBALS时,请减少关于不良做法的帖子。它在php中,当以正确的方式使用时它可能很有用。就像任何事情一样,这不是因为有些人滥用了每个人都应该避免的东西。

1 个答案:

答案 0 :(得分:1)

在全局范围内定义变量与将其定义为$ GLOBALS超全局数组的属性相同。无论变量如何,它都可以两种方式工作。

<?php
$test1 = "Hello World";
echo $GLOBALS["test1"];
echo "\n";
$GLOBALS["test2"] = "Goodbye World";
echo $test2;

// outputs
// Hello World
// Goodbye World     

Example

至于全局暴露数组或对象(这通常被认为是不好的做法),你有几个选择。正如您所说,define和const仅使用标量值,但您可以通过任何PHP超级全局(包括$ GLOBALS)访问该对象。

或者,您可以使用Singleton anti patternstatic class property。无论范围如何,所有这些都是可访问的。