Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.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

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_Php_Variables_Global Variables_Global - Fatal编程技术网

使所有变量成为全局变量,PHP

使所有变量成为全局变量,PHP,php,variables,global-variables,global,Php,Variables,Global Variables,Global,有没有一种方法可以使所有变量都是全局的?不管你想做什么,但这是一种不好的方法。您最好将变量作为参数传递给函数,或者在函数中声明它们为全局变量 但简言之,如果没有大量的全局声明,就没有简单的方法可以做到这一点。快速而肮脏的方法: $GLOBALS += get_defined_vars(); 我不知道这个黑客是否是可移植的(它在PHP5.3.1上工作),我怀疑对象是克隆的。我认为这有助于foreach($GLOBALS as$name=>$value)global$$name将其放入函数中,所有

有没有一种方法可以使所有变量都是全局的?

不管你想做什么,但这是一种不好的方法。您最好将变量作为参数传递给函数,或者在函数中声明它们为全局变量

但简言之,如果没有大量的全局声明,就没有简单的方法可以做到这一点。

快速而肮脏的方法:

$GLOBALS += get_defined_vars();

我不知道这个黑客是否是可移植的(它在PHP5.3.1上工作),我怀疑对象是克隆的。

我认为这有助于
foreach($GLOBALS as$name=>$value)global$$name将其放入函数中,所有定义的变量都将可见

以将所有全局变量(包括超全局变量和参数冲突名称)导入函数范围:

extract($GLOBALS, EXTR_REFS | EXTR_SKIP);
问题出在这里。您可能希望排除它们,下面是一个列表(PHP5.2):

您可以使用获取参数变量名

这也是为什么相反的方法不那么复杂的原因,它不返回超全局变量,只返回局部变量

global
创建对全局范围变量的引用,因此它实际上是一个局部变量,是同名全局变量的别名。此外,一些本地变量在导出时会发生冲突,因此应采取一些预防措施,如深奥的变量名:

foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"})
{
    $GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"};
}
请注意,与
globals
一样,
$globals
超全局数组也包含对全局变量的引用,因此也会在此处创建引用。如果您通过
global
和$GLOBALS[…]
或上述
提取
进行导入,则特别需要使用此选项。或者,如果您的局部变量是私有类成员的别名(不要这样做;):

示例/:


您可以简单地将它们作为$GLOBALS的引用

foreach($GLOBALS as $k => $v)
   $$k=&$GLOBALS[$k];

守则解释:

$GLOBLAS是一个超全局变量(随处可见)。基本上,它包含所有变量


$$表示具有您编写的变量值名称的变量

用外语解释有点奇怪,下面是一个例子:

$color='blue';
$blue='foo';

echo $$color;
将输出

foo


这意味着$k是对$v的引用。这并不是一个好的做法,因为它不能使所有变量都是全局的。要将变量添加为全局变量,您必须在每次访问时添加全局关键字。另一种方法是使用数组$GLOBAL。

如果在泛型函数中设置变量GLOBAL确实不切实际,则始终可以使用$GLOBALS数组(即$GLOBALS['var_name'])对象,但不应克隆该对象,但它不能使用别名。但是我想说它非常接近,其他东西有更多的开销:(出于完整性原因添加了答案)重要注意:这不会覆盖任何现有的全局变量,但只添加以前不存在的变量,因为。Do
foreach(将变量()定义为$k=>v)$GLOBALS[$k]=$v如果要覆盖。或者更好:永远不要这样做。
$color='blue';
$blue='foo';

echo $$color;
foo
$k=& $v;