在$ 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中,当以正确的方式使用时它可能很有用。就像任何事情一样,这不是因为有些人滥用了每个人都应该避免的东西。
答案 0 :(得分:1)
在全局范围内定义变量与将其定义为$ GLOBALS超全局数组的属性相同。无论变量如何,它都可以两种方式工作。
<?php
$test1 = "Hello World";
echo $GLOBALS["test1"];
echo "\n";
$GLOBALS["test2"] = "Goodbye World";
echo $test2;
// outputs
// Hello World
// Goodbye World
至于全局暴露数组或对象(这通常被认为是不好的做法),你有几个选择。正如您所说,define和const仅使用标量值,但您可以通过任何PHP超级全局(包括$ GLOBALS)访问该对象。
或者,您可以使用Singleton anti pattern或static class property。无论范围如何,所有这些都是可访问的。