Передача переменных PHP во включенный файл?
Вопрос
Это должно работать, поэтому я очень недоумеваю, почему это не работает.
Я проверяю, вошел ли пользователь в систему, используя метод класса $session в верхней части каждой страницы администратора.Однако я хочу динамически настраивать заголовочный файл в зависимости от того, вошел ли пользователь в систему и какой уровень роли у него есть.
Поэтому я проверяю $session->is_logged_in()
а затем я пошел дальше и определил переменную с именем $logged = true
;чтобы использовать позже.Затем я использую $user->find_by_id($session->id)
метод для создания нового объекта User и хранения $user->role_level
в новой переменной под названием $role_level
для удобства использования.
Все это происходит в верхней части страницы.Далее вниз по странице после обработки формы и т. д. находится include("../_layouts/header.php")
команда.Затем в файле header.php я использую небольшие проверки, например if(!$logged) { ... } else { ... }
.Однако...
Я получаю следующие ошибки:
Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 119
Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 131
Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 138
Как это может быть?Я определяю переменные в файле перед включением header.php!Разве это не должно сработать?
К вашему сведению, все работало нормально, пока я не попробовал использовать $logged
в файле header.php.
Решение
Переменные распространяются на включенные файлы, поэтому должно быть так, чтобы переменная НЕ была установлена при вызове включения:попробуйте проверить, так ли это, а затем выясните, почему переменная не установлена в этот момент.
Например, если вы определили $logged внутри блока if или внутри функции, то она не будет распространяться за его пределы:вы должны определить его в самой внешней области видимости (на том же уровне, на котором вы вызываете оператор include).И вы должны определить его для случая, когда пользователь не вошел в систему, а не только для случая, когда пользователь вошел в систему.Если переменная не инициализирована значением false, проверка if(!$logged) выдаст предупреждение.Скажите $logged = false;в начале вашей работы.
Другие советы
Попробуйте что-нибудь очень простое, например
// file1.php
$var = "foobar";
// file2.php
include("file1.php"); // or require("file1.php");
die($var);
Это работает? Может быть, это проблема за пределами вашего кода.
Просто мнение ... вместо того, чтобы включать код для выполнения в глобальном пространстве и в зависимости от другой определяемой глобальной переменной, включайте ваш файл везде, и код внутри header.php будет организован в соответствующие функции. Затем, где вы хотите получить вывод из header.php, вызовите соответствующую функцию с $ logged в качестве аргумента. Это поможет сделать ваш код более понятным и простым для тестирования (как в модульных тестах).
Вместо if (! logged) if (пусто ($ logged))
. Это не будет генерировать уведомление в тех случаях, когда переменная не была установлена.