Как переопределить переменную (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 вы могли реализовать новый правильный подход.

  1. Перенесите логику вычисления title из header.php в функцию clalcHeader:
<?php // helpers.php

function clalcHeader(): array {
    $title = 'default';
    if (stristr($_SERVER['REQUEST_URI'],'page2') == true) {
         $title = 'стр 2';
    }

    // ...

    return [
        'title' => $title,
        // ...
    ];
}

  1. Перенесите логику вывода title в функцию printHeader:
<?php // helpers.php

function printHeader(array $header): void {
    // ...

    printf('<title>%s</title>', htmlspecialchars($header['title']));

    // ...
}

  1. Используйте clalcHeader и printHeader в header.php
<?php // header.php

require_once __DIR__ . '/helpers.php';

$header = clalcHeader();
printHeader($header);

После этого весь ваш код будет работать так же как и прежде.

  1. Теперь в 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 и прочее. Этот объект будет постепенно заполняться и выводится уже в самом конце.

→ Ссылка