Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用$GLOBALS定义常量_Php_Variables_Global - Fatal编程技术网

Php 使用$GLOBALS定义常量

Php 使用$GLOBALS定义常量,php,variables,global,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"]'); // f

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

我想你的常数可能有点交叉

DEFINE('DEBUGGER','$GLOBALS[“DEBUGGER”]”)将常量
调试器设置为字符串
$GLOBALS[“调试器”]

请注意,这既不是值也不是引用,只是一个字符串

导致这些结果的原因是:

1:输出字符串
$GLOBALS[“调试器”]

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


希望这一切都有意义。

免责声明:我同意这些评论,全球化通常是个坏主意

这就是说,这里有几个问题值得回答,而间接的概念是有用的,所以这里开始

${'$GLOBALS[“调试器”]}
未定义。使用间接寻址时,不包括前导的
“$”
。因此,正确的版本应该是
define('DEBUGGER','GLOBALS[“DEBUGGER”])

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

define('DEBUGGER', 'debugger');
${DEBUGGER};
实际上,这没有用。您也可以直接使用
$debugger
,因为它被定义为全局的,并且在任何地方都可用。您可能需要定义
global$debugger

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

if ("$GLOBALS['debugger']"==1) {echo "DEBUG SET";}
尽管这是完全有效的PHP代码,但这显然是不正确的。

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

php中的常量已经是全局的,所以我不知道这会从您的示例中为您带来什么,也不知道您的目的是什么


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

好的,感谢所有回答的人。我想现在我知道了,我是PHP新手,从C++背景开始,正在处理C++之类的定义,定义< <代码>,假设它在预编译/运行阶段做了一个字符串替换。 在precis中,我只想使用

DEBUGGER = 1;
而不是

$GLOBALS['debugger'] = 1;
有很多正当的理由;其中最重要的一点是防止简单的打字错误把你搞砸。唉,看来这在PHP中是不可行的。
谢谢你的帮助,谢谢。

建议:停止。不要这样做。忘了环球吧。说真的。你不应该使用globals,因为globals并不好。事实上,我不知道其他的超globals,但当我为自己的答案运行一些测试时,以下方法确实奏效了:
$foo='globals';变量转储(${$foo})。你只是不能索引到数组中,所以它有点没用。@Matthew:是的,那会起作用,但在函数或方法中不行。这是一个非常严重的限制,我对它的使用大打折扣,但我应该更清楚一点。常量在php中已经是全局的了。您只需要使用DEFINE('DEBUGGER',1);