Передача переменных на другую страницу с помощью include - PullRequest
1 голос
/ 09 мая 2020

Я знаю, что есть много вопросов по этому поводу, но у меня странная ситуация.

Вот мой случай, у меня есть класс с именем Theme, и в нем есть функция для включения частей темы;

class Theme {
  function getThemePart($part, $lang) {
    include_once 'theme/theme.'.$part.'.php';
  }
}

И в моем index. php page я вызываю его;

$theme->getThemePart('footer', $lang);

Это нормально, пока здесь, но у меня также есть переменная $ lang. Я объявляю его в index. php, но я также использую его в файле theme.footer. php. Вот так;

<footer class="sticky-footer">
    <div class="container-fluid copyright">
        <span class="float-right"><?=$lang['footer]?><a href="<?=$lang['footer_link]?>" target="_blank"><u><?=$theme->escLang('footer_jc','html')?></u></a></span>
    </div>
</footer>

Думаю, вы поняли, что в атрибутах getThemePart есть $ lang, и он бесполезен, однако, когда я удаляю его в index. php file $ lang ['footer' ] и $ lang ['footer_link'] не печатаются, но когда я добавляю эту бесполезную переменную $ lang в getThemePart, они печатаются.

Как это работает?

1 Ответ

0 голосов
/ 09 мая 2020

Ваш файл «нижнего колонтитула» существует только внутри функции getThemePart . Таким образом, он не «знает» ничего, что было объявлено снаружи.

Вы заметите, что даже объект {$theme} на самом деле не определен (вы можете заставить его работать, используя вместо этого $this).

Что вам нужно сделать, так это передать какую-то ссылку на «мир» или среду, которую должен знать элемент темы (это будет своего рода внедрение зависимостей):

$env  = [ 'lang' => 'en', ... ];

You можно сохранить внутри темы:

private $env;

public function setEnv($env) {
    $this->env = $env;
}

Теперь, если вы инициализируете тему с помощью $theme->setEnv($env), внутри включений вы сможете вызвать {$this->env['lang']}. Или вы можете создать вспомогательную функцию или, может быть, даже лучше, объявить magi c getter , который позволит вам написать $this->lang.

Лично я обычно предпочитаю другой подход и замените последовательности вроде {{name}} содержимым $this->env[name], используя preg_replace_callback().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...