我想使用全局变量设置,它们都在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"]
)解释为变量,即一个常量变量
答案 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中是行不通的。 感谢您的帮助,谢谢。