我有一个带有静态函数的实用程序类,它使用全局变量:
private static function isRateLimited($ip) {
global $memcached_node;
$memcache = new Memcache;
$memcache->connect($memcached_node['host'], $memcached_node['port']) or die ("memcache failure");
// do stuff
}
全局变量通过厨师食谱设置。在最近的变化之前,一切都在应用程序中运行良好。更改调整了代码执行,以便在单个Web请求期间调用isRateLimited()
两次。
调试显示,第一次调用isRateLimited()
时,全局变量已设置,一切都按预期工作。但是,第二次调用isRateLimited()
时,全局变量返回一个空值(使用empty()
进行测试)。结果是与memcached的第二个连接失败。
全局不会被代码中的任何其他地方覆盖或取消设置。 为什么全局变量在同一Web请求中执行函数之间会失去其值?
作为参考,我尝试将全球使用$memcached_node = $GLOBALS["memcached_node"];
作为我的“最后努力”飞镖之一。行为是一样的。
答案 0 :(得分:1)
private static function isRateLimited($ip) {
var_dump(debug_backtrace()); // or log to file - whatever suits the context
// ...
}
您可以使用PHP的debug_backtrace()
函数(more info here)跟踪调用。或者,如果您明确知道哪个调用是错误的,则可以递增全局计数器变量,仅针对给定服务器请求的 nth 调用isRateLimited()
执行此操作。
答案 1 :(得分:0)
有类似的问题,在静态函数调用全局变量存在之前,静态函数内部为空。它在全局关键字上变得空洞。但我正在通过bootstrap为PHPunit加载代码。没有PHPunit,它按预期工作。
我最终做的是明确地将变量指定为超级全局:
$GLOBALS['foo'] = $foo;