Как переопределить переменную (PHP)
В header.php есть переменная $title которая определяется там же (в зависимости от URL страниц). В одной из внутренних страниц я хочу переопределить $title, так как он берется там из БД. Например: в header.php есть if (...) {$title = "Раздел 1";} а потом echo $title
А в inner.php -
include(header.php); ... SELECT .....
$title = "Страница 1";
И вот это, разумеется, не работает. Пытался использовать global, но без успеха. Как нужно переписать из inner.php переменную $title (из header.php)? Спасибо за советы, я не очень в PHP разбираюсь...
Ответы (1 шт):
Вам поможет рефакторинг. Надо исправить архитектуру вашего приложения так, чтобы весь код работал как раньше, а в inner.php вы могли реализовать новый правильный подход.
- Перенесите логику вычисления title из header.php в функцию
clalcHeader:
<?php // helpers.php
function clalcHeader(): array {
$title = 'default';
if (stristr($_SERVER['REQUEST_URI'],'page2') == true) {
$title = 'стр 2';
}
// ...
return [
'title' => $title,
// ...
];
}
- Перенесите логику вывода title в функцию
printHeader:
<?php // helpers.php
function printHeader(array $header): void {
// ...
printf('<title>%s</title>', htmlspecialchars($header['title']));
// ...
}
- Используйте
clalcHeaderиprintHeaderвheader.php
<?php // header.php
require_once __DIR__ . '/helpers.php';
$header = clalcHeader();
printHeader($header);
После этого весь ваш код будет работать так же как и прежде.
- Теперь в inner.php не подключайте header.php, вместо этого используйте
clalcHeaderиprintHeader:
<?php // inner.php
require_once __DIR__ . '/helpers.php';
$header = clalcHeader();
$header['title'] = 'Страница 1'; // перезапишите title в соответствии с логикой inner.php
printHeader($header);
Когда справитесь с этой задачей, подумайте о переходе на архитектуру, в который вывод у вас будет только один раз в самом конце. То есть у вас будет объект (или массив, если вы ещё не разобрались с ООП) Page, который содержит title, styles, scripts, content и прочее. Этот объект будет постепенно заполняться и выводится уже в самом конце.