php全局变量不遵循嵌套函数调用

时间:2015-01-29 16:07:56

标签: php global-variables global

我遇到了一个奇怪的情况。我正在使用一个框架,该框架使用一个被声明为全局的类(是的,我知道,请不要关于全局,单例,'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。没有选择重写框架,任何人都有任何其他想法?

0 个答案:

没有答案