Глобальные переменные php не следуют за вызовами вложенных функций

Я столкнулся со странной ситуацией. Я работаю с фреймворком, который использует класс, объявленный как глобальный (да, я знаю, пожалуйста, не ведите пламенных войн за глобальные переменные, синглтоны, 'Dependancy Injection' и т. Д. Я не могу переписать существующий весь фреймворк) для передачи настройки фреймворка для функций. Содержимое самих функций представляет собой "включающие" сегменты кода. Кто знает, о чем они думали...

Во всяком случае, проблема заключается в следующем: global изменяется в функции level1, которая вносит изменения должным образом, и когда вызов level1 завершен, global отражает изменения. если функция level2 вызывается напрямую, снова global работает отлично. Но если функция level2 называется FROM WITHIN level1, любые изменения, внесенные в global из уровня level1 до точки вызова level2 НЕ распространяются на функцию level2. Это действует так, как будто изменения уровня 1 НЕ распространяются на 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 напрямую, результаты работают должным образом, глобальное значение устанавливается и т. Д. Но если вы должны вызывать level1 с $someparam = 'oops' и инициировать вызов на уровень2 из уровня 1, global переменная в level2 будет содержать значения "my_var", которые существовали ДО вызова уровня 1. Другими словами, изменения, внесенные в global на уровне 1 до вызова level2, по-видимому, не распространяются обратно в "глобальную область", если хотите, до выхода из функции AFTER level1. Либо это, либо это может иметь какое-то отношение к тому, когда был включен код для level2?? Я не уверен. Кто-нибудь видел что-нибудь подобное раньше? Погуглил и не могу найти нигде упомянутой этой уникальной проблемы.

используя php 5.5.12 на коробке LAMP (fedora). Не имея возможности переписать рамки, у кого-нибудь есть другие идеи?

0 ответов

Другие вопросы по тегам