Глобальные переменные 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). Не имея возможности переписать рамки, у кого-нибудь есть другие идеи?