使用$ GLOBALS定义常量

时间:2012-05-08 04:36:49

标签: php variables global

我想使用全局变量设置,它们都在PHP中声明,初始化和使用友好语法,所以我提出了这个想法:

<?
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

$GLOBALS['debugger'] = 1;                   // set $GLOBALS['debugger'] to 1 
DEFINE('DEBUGGER','$GLOBALS["debugger"]');  // friendly access to it globally

echo "1:" . DEBUGGER . ":<br>";
echo "2:" . ${DEBUGGER}. ":<br>";
echo "3:" . $GLOBALS['debugger'] . ":<br>";
if (DEBUGGER==1) {echo "DEBUG SET";}
?>

生成以下内容:

  

1:$ GLOBALS [ “调试器”]:

     

注意:第8行/home/tra50118/public_html/php/test.php中的未定义变量:$ GLOBALS [“debugger”]

     

2 ::

     

3:1:

如果明确$GLOBALS["debugger"]被定义,那么2如何出错?然后在第10行没有生成类似的测试通知?

我认为我要做的是强制PHP在运行时将字符串($GLOBALS["debugger"])解释为变量,即一个常量变量

4 个答案:

答案 0 :(得分:1)

免责声明:我同意这些意见,全局性通常是一个坏主意。

那就是说,这里有一些值得回答的问题,间接的概念很有用,所以这里就是这样。

${'$GLOBALS["debugger"]'}未定义。使用间接时,不包括前导'$'。因此,正确的版本为define('DEBUGGER', 'GLOBALS["debugger"]')

但是,这也不起作用。您只能通过间接访问一个级别。因此,您可以访问数组$GLOBALS,但无法访问该数组中的键。因此,您可以使用:

define('DEBUGGER', 'debugger');
${DEBUGGER};

实际上这没用。您也可以直接使用$debugger,因为它被定义为全局,并且随处可用。您可能需要在函数开头定义global $debugger;

if语句未导致通知的原因是您将DEBUGGER定义为字符串。由于您根本不想在该行中使用间接,因此它最终会显示为:

if ("$GLOBALS['debugger']"==1) {echo "DEBUG SET";}

这显然不是真的,尽管它是完全有效的PHP代码。

答案 1 :(得分:0)

我想你可能会让你的常数交叉一点。

DEFINE('DEBUGGER','$GLOBALS["debugger"]');将常量DEBUGGER设置为字符串 $GLOBALS["debugger"]
请注意,这既不是值也不是引用,只是一个字符串。

导致这些结果:

1:输出字符串$GLOBALS["debugger"]
2:输出名为$GLOBALS["debugger"]的变量的值。请注意,这是名为“$GLOBALS["debugger"]”的变量,而不是数组$GLOBALS中键“调试器”的值。因此发生警告,因为该变量未定义 3:输出$GLOBALS["debugger"]

的实际值

希望一切都有道理。

答案 2 :(得分:0)

如果您打算在数组或方法中执行此操作,则不能将“变量变量”与任何超全局数组一起使用,其中$ GLOBALS为1。要获得行为,你必须使用$$,但这不会像我提到的那样工作。

php中的常量已经是全局的,所以我不知道这会从你的例子中得到什么,或者你想要的是什么。

您的上一次比较“有效”,因为您将常量设置为字符串,并且可以使用PHP的类型转换将字符串与整数进行比较。当然,它的评估结果为假,这可能会让您感到惊讶,因为您希望它能够真正发挥作用。

答案 3 :(得分:0)

好的,感谢所有回答的人。我想我现在就明白了,我是PHP的新手,已经形成了C ++背景,并且正在将定义视为C ++ #define,并假设它只是在预编译/运行阶段进行了字符串替换。

在精确度方面,我只是想使用像

这样的东西
DEBUGGER = 1;

而不是

$GLOBALS['debugger'] = 1;

出于很多正当理由;其中最重要的是阻止简单的拼写错误填补你。唉,看来这在PHP中是行不通的。 感谢您的帮助,谢谢。