使用 $GLOBALS 定义常量


Defining constants with $GLOBALS

我想使用全局变量设置,其中它们都被声明,初始化并在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["调试器"]:

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

阿拉伯数字::

3:1:

2:当明确定义IS时,怎么会有错误$GLOBALS["debugger"]?然后不生成类似的通知,在第 10 行进行测试?

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

免责声明:我同意评论,全局变量通常是一个坏主意。

也就是说,这里有几个问题值得回答,间接寻址的概念很有用,所以在这里。

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

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

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

实际上,这没有用。您也可以直接使用 $debugger,因为它已被定义为全局并且将在任何地方使用。但是,您可能需要在函数开始时定义global $debugger;

if 语句不引起通知的原因是您将DEBUGGER定义为字符串。由于您根本没有尝试在该行中使用间接寻址,因此它最终显示为:

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

这显然永远不会正确,尽管它是完全有效的PHP代码。

我想你可能把你的常量交叉了一点。

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

这会导致以下结果:

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

希望这一切都有意义。

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

在 precis 中,我只想使用类似的东西

DEBUGGER = 1;

而不是

$GLOBALS['debugger'] = 1;

有很多正当的理由;其中最重要的是防止简单的错别字把你塞进去。唉,这在 PHP 中似乎不可行。感谢您的帮助,非常感谢。

如果您

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

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

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