У меня появилась проблема с глобальной областью видимости. Я знаю что глобальные переменные это зло, но есть необходимость их использовать (Передавать их как аргумент не вариант). Есть следующий код:
$conf = array();
function get_option($key){
global $conf;
var_dump($conf); // NULL
}
Однако, если сделать так:
global $conf;
$conf = array();
function get_option($key){
global $conf;
var_dump($conf); // work
}
То работает хорошо. Раньше global не добавлял и мог получить доступ до переменной.
Вопрос с чем это связано или как можно сделать, функция видела все глобальные переменные, которые объявлены в этом файле где и функция? Спасибо за внимание!
Функция всегда может их видеть как элементы массива $GLOBALS. Но если вы очень хотите выстрелить себе в ногу четыре раза подряд, то вот рецепт:
extract($GLOBALS);
Дополнено
...с чем это связано...
С тем что у вас файл подключается в другом php-файле внутри функции - соответственно все определенные, вроде бы как глобально, переменные становятся локальными внутри той самой функции. Например:
// файл main.php
function main_func() {
include 'my_functons.php';
}
// файл my_functions.php
$conf = array();
function get_option($key) {
global $conf;
// ...
}
Если вы будете подключать my_functions.php в глобальной области видимости - $conf будет глобальным, но в приведенном примере $conf - это локальная переменная внутри функции main_func(), поэтому $conf не видна внутри get_option() даже когда там написано global $conf
...как можно сделать, функция видела все глобальные переменные, которые объявлены в этом файле где и функция
Если отталкиваться от данной вами информации, то у вас все плохо и требуется достаточно глубокий рефакторинг. Относительно возникшей проблемы можете сделать так:
$conf = array();
global $meta_globals; // определяем массив для локальных переменных в глобальной видимости
$meta_globals = get_defined_vars(); // собираем локальные переменные
function get_option($key){
extract($GLOBALS['meta_globals']); // переносим собранные переменные в другую функцию
var_dump($conf);
}
Disclaimer
В указанных в вопросе условиях хорошего решения быть не может. Приведенное решение можно использовать только если в остальном все также плохо. Не используйте этот код если у вас есть возможность сделать все по человечески
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости