Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.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_Global Variables - Fatal编程技术网

Php 将变量推入全局范围?

Php 将变量推入全局范围?,php,global-variables,Php,Global Variables,我们使用实例化并将系统关键对象放在$GLOBALS中,以便从任何地方(如数据库、缓存、用户等)轻松访问 我们经常使用$GLOBALS,如果我能像$G=&$GLOBALS那样引用它来进行速记调用,那么它(是的,真的)会减少很多代码 问题是,根据我的经验和几个小时的谷歌搜索,我在PHP中没有发现任何构造允许您将变量“标记”为全局变量,使$GLOBALS成为第一类,而其他一切都是第二类 我错过什么了吗?这可能吗?您可能不想将所有内容都放在$GLOBALS中,而是想看看在php世界中广泛存在的 glob

我们使用实例化并将系统关键对象放在
$GLOBALS
中,以便从任何地方(如数据库、缓存、用户等)轻松访问

我们经常使用
$GLOBALS
,如果我能像
$G=&$GLOBALS
那样引用它来进行速记调用,那么它(是的,真的)会减少很多代码

问题是,根据我的经验和几个小时的谷歌搜索,我在PHP中没有发现任何构造允许您将变量“标记”为全局变量,使
$GLOBALS
成为第一类,而其他一切都是第二类


我错过什么了吗?这可能吗?

您可能不想将所有内容都放在
$GLOBALS
中,而是想看看在php世界中广泛存在的

global $variable; //?

然而,拥有许多全局变量/对象是设计糟糕和高度耦合的标志。使用类似于
$G
的东西可以保证使用意大利面代码,并且很快就会成为维护的噩梦。谁在乎你能不能把代码的数量减少几个字符呢?

与其把所有的东西都放进
$GLOBALS
中,不如看看php世界中普遍存在的问题


然而,拥有许多全局变量/对象是设计糟糕和高度耦合的标志。使用类似于
$G
的东西可以保证使用意大利面代码,并且很快就会成为维护的噩梦。谁在乎你能不能减少几个字符的代码量呢?

除了Middus指出的注册表概念外,还有几种方法和概念,其中一些可以在这个问题的答案中找到:


除了Middus指出的注册中心概念外,还有几种方法和概念,其中一些方法和概念可以在这个问题的答案中找到:


不,但是你可以用一个小把戏。创建一个与全局变量同名的全局函数,并让它返回全局实例。例如:

function db() {
  return $GLOBALS['db'];
}
现在,您可以将代码编写为:

...
$stuffs = db()->query("select * from stuff");
...
你可能会认识到这是一个相对于单例模式的变体,但在语法上更令人愉快


其他人已经提到过,但是你也应该首先考虑不使用全局对象。我通常更喜欢将对象传递到需要的地方(依赖项注入)。不过,我对注册表模式不太了解。

不,但您可以使用一些小技巧。创建一个与全局变量同名的全局函数,并让它返回全局实例。例如:

function db() {
  return $GLOBALS['db'];
}
<?php

function &G($name) {
    if(func_num_args() > 1) {
        $GLOBALS[$name] = func_get_arg(1);
    }
    return $GLOBALS[$name];
}


G('test', 'hey');

echo G('test'); // outputs hey
echo $test; // outputs hey

$b =& G('test');
$b = 'hello';

echo G('test'); // outputs hello
echo $test; // outputs hello
现在,您可以将代码编写为:

...
$stuffs = db()->query("select * from stuff");
...
你可能会认识到这是一个相对于单例模式的变体,但在语法上更令人愉快


其他人已经提到过,但是你也应该首先考虑不使用全局对象。我通常更喜欢将对象传递到需要的地方(依赖项注入)。不过,我对注册表模式没有太多的了解。

这只会在已建立的作用域中打开一个漏洞,它不会主动突破子作用域。这只会在已建立的作用域中打开一个漏洞,不会主动突破子作用域。我们不会将所有内容都放在
$GLOBALS
中。
$GLOBALS
中可能有八(8)个对象。如果某个内容是系统关键性的,因为它在每个页面上都是必需的,并且经常被访问,我们会将其放入
$GLOBALS
。为什么不在进行任何其他操作之前加载注册表?如果您投反对票,请让我知道原因,以便我可以从错误中吸取教训。我们不会将所有内容都放入
$GLOBALS
$GLOBALS
中可能有八(8)个对象。如果某个内容是系统关键的,因为它在每个页面上都是必需的,并且经常被访问,那么我们将它放在
$GLOBALS
中。为什么不在执行任何其他操作之前加载注册表?如果您投反对票,请让我知道原因,以便我可以从错误中吸取教训。这是一个很好的链接!多谢各位@PEKKA,断开链接,考虑用另一个链接更新这个答案!这是一个伟大的链接!多谢各位@PEKKA,断开链接,考虑用另一个链接更新这个答案!全局函数的概念很有趣。它确实在大多数系统调用上添加了另一个函数调用,但这可能是值得的。要清楚的是,我们实际上在GLOBALS中有8个对象,它们是不断使用的实例化对象。我们的系统是完全独立的。我们根本不使用任何第三方代码。在五年多的时间里,我们实际上没有任何问题。我理解对全球数据的担忧,但这并不真正适用于此。我们对全球数据相当谨慎。为了安全起见,我们甚至把所有的控制器都关上了谢谢你的回答。全局函数的想法很有趣。它确实在大多数系统调用上添加了另一个函数调用,但这可能是值得的。要清楚的是,我们实际上在GLOBALS中有8个对象,它们是不断使用的实例化对象。我们的系统是完全独立的。我们根本不使用任何第三方代码。在五年多的时间里,我们实际上没有任何问题。我理解对全球数据的担忧,但这并不真正适用于此。我们对全球数据相当谨慎。为了安全起见,我们甚至把所有的控制器都关上了谢谢你的回复
<?php

function &G($name) {
    if(func_num_args() > 1) {
        $GLOBALS[$name] = func_get_arg(1);
    }
    return $GLOBALS[$name];
}


G('test', 'hey');

echo G('test'); // outputs hey
echo $test; // outputs hey

$b =& G('test');
$b = 'hello';

echo G('test'); // outputs hello
echo $test; // outputs hello