我遇到了一个奇怪的情况。我正在使用一个框架,该框架使用一个被声明为全局的类(是的,我知道,请不要关于全局,单例,'Dependancy Injection'之类的火焰战争。我不能重写现有的整个框架)来传递功能的框架设置。函数本身的内容是“包含”代码段。谁知道他们在想什么......
无论如何,问题是:global
正在功能级别1中进行修改,这使得更改正确,当对level1的调用结束时,global
反映了更改。如果直接调用函数level2,global
再次正常工作。但是如果函数level2被调用FROMININ1级别,那么从level1到调用level2之间对global
所做的任何更改都不会传播到函数level2。它可能就像level1更改不会传播到global
,直到level1函数退出?
global $config;
$config->set('my_var','some_dummy_value'); // set some variable
function level2(anotherparam) { include 'somecode.php'; };
// while the somecode.php include file contains code something like:
global $config;
echo $config->get('my_var'); // <- problem spot
$config->set('my_var','some_other_data');
echo $config->get('my_var'); // <- works as expected
function level1($someparam) {
global $config;
echo $config->get('my_var'); // <- works fine.
$config->set('my_var','new_data_2'); // <- works fine.
echo $config->get('my_var'); // <- works fine, has new value
if ($someparam == 'oops') { level2('blah2'); }; // <- calls level2 but level2's global doesn't contain 'new_data_2', but rather 'some_dummy_value' (original value before level1 was called)
};
echo $config->get('my_var');
level1('blah');
level2('blah');
$config->set('my_var','some_dummy_value');
level1('oops');
echo $config->get('my_var');
运行时,您会得到:
some_dummy_value // <- original value
some_dummy_value // <- from func level1 before change
new_data_2 // <- from func level1 after change
new_data_2 // <- from func level2 before change
some_other_data // <- from func level2 after change
some_dummy_value // <- reset back to original value
some_dummy_value // <- from func level1 again before change
new_data_2 // <- from func level1 again after change
//PROBLEM. You would think the next value would be 'new_data_2', not the previous value of the global
some_dummy_value // <- from nested call to func level2 before change !!
some_other_data // <- from the level2 func after change
some_other_data // <- back in the main program global has func2 value
调用函数level1直接正常工作。 global
设置为“new_data_2”,只要输入$someparam
没有触发对level2的调用,事情就会很好。如果你直接调用level2,结果会按预期工作,全局设置等等。但如果你用$someparam = 'oops'
调用level1并从level1触发对level2的调用,则level2中的global
变量将包含在调用level1之前存在的'my_var'的值。换句话说,在调用level2之前对level1中的global
所做的更改似乎不会传播回'global scope',如果你愿意,直到AFTER level1函数退出。要么,或者它可能与包含level2的代码时有关?我不确定。以前有人见过这样的事吗?谷歌搜索,无法在任何地方找到这个独特的问题。
在LAMP盒子(fedora)上使用php 5.5.12。没有选择重写框架,任何人都有任何其他想法?