【问题标题】:Difference between $GLOBALS and uppercase $var$GLOBALS 和大写 $var 之间的区别
【发布时间】:2015-08-19 04:36:01
【问题描述】:

在 $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 警告:常量只能计算为标量值
PHP 警告:常量只能计算为标量值
PHP 注意:使用未定义的常量 FOO_BAR_ARRAY - 假设 'FOO_BAR_ARRAY'
PHP 注意:未定义常量的使用 FOO_BAR_OBJECT - 假定为“FOO_BAR_OBJECT”


请减少有关使用 $GLOBALS 的不良做法的帖子。它在 php 中,如果以正确的方式使用,它会很有用。就像任何事情一样,并不是因为某些人滥用某些东西而每个人都应该避免它。

【问题讨论】:

  • 将变量名全大写对其本身没有影响。只有特定的保留超全局变量($GLOBALS$_REQUEST)是超全局变量。 - 常量是不同的东西,按照惯例只有全大写。关于对象作为常量的问题部分完全没有意义。
  • 感谢@Tim Ogilvy 的编辑

标签: php global-variables


【解决方案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。无论范围如何,所有这些都可以访问。

【讨论】:

猜你喜欢
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 2013-02-19
相关资源
最近更新 更多