0

我想使用一个全局变量设置,它们都在 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

4 回答 4

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 代码。

于 2012-05-08T05:02:33.743 回答
0

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

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

您的最后一个比较“有效”,因为您将常量设置为字符串,并且 PHP 的类型转换可以将字符串与整数进行比较。当然,它的计算结果为 false,这可能会让您感到惊讶,因为您希望它实际工作。

于 2012-05-08T05:09:48.427 回答
0

我认为你的常数可能有点过分。

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

导致这些结果:

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

希望这一切都说得通。

于 2012-05-08T04:55:49.597 回答
0

好的,感谢所有回答的人。我想我现在明白了,我是 PHP 的新手,具有 C++ 背景,并且像对待 C++ 一样对待定义,#define并假设它只是在预编译/运行阶段进行了字符串替换。

确切地说,我只是想使用类似的东西

DEBUGGER = 1;

代替

$GLOBALS['debugger'] = 1;

出于很多正当理由;其中最重要的是防止简单的错别字填满你。唉,看来这在 PHP 中是不可行的。感谢您的帮助,不胜感激。

于 2012-05-08T11:02:18.677 回答