Глобальная область видимости в PHP

239
16 ноября 2017, 05:12

У меня появилась проблема с глобальной областью видимости. Я знаю что глобальные переменные это зло, но есть необходимость их использовать (Передавать их как аргумент не вариант). Есть следующий код:

$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 не добавлял и мог получить доступ до переменной.
Вопрос с чем это связано или как можно сделать, функция видела все глобальные переменные, которые объявлены в этом файле где и функция? Спасибо за внимание!

Answer 1

Функция всегда может их видеть как элементы массива $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

В указанных в вопросе условиях хорошего решения быть не может. Приведенное решение можно использовать только если в остальном все также плохо. Не используйте этот код если у вас есть возможность сделать все по человечески

READ ALSO
Особенности $_SESSION php

Особенности $_SESSION php

Насколько безопасным является использование сессий в php?

226
Парсер для сайта [требует правки]

Парсер для сайта [требует правки]

ЗдравствуйтеУ меня такой вопрос: есть сайт, на котором имеется обычный поиск по сайту

308
Как расшифровать файл

Как расшифровать файл

Есть зашифрованный php файлВот содержимое

377
Как открыть файл с++ [требует правки]

Как открыть файл с++ [требует правки]

Как открыть любой файл?(именно открыть а не прочитать, что бы пользователь выдел его открытие)

441