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