Можно ли обернуть include функцией?

Проблема состоит в следующем, решил сделать подключение нужных файлов шаблона через __get()
В процессе генерации HTML вызываю нужные файлы например $this->menu или $this->logo
Подключись соответствующие файлы menu.php или logo.php и все было хорошо так как там лежал только HTML, далее решил подключить файл в котором нужно было вывести переменную, а так как include производиться внутри функции __get() теряется области видимости этих самых переменных, как можно решить данную проблему?
  • Вопрос задан
  • 253 просмотра
Решения вопроса 1
delphinpro
@delphinpro Куратор тега PHP
frontend developer
Ничего не теряется.

class Templater {

  public function render($file) {
    include $file;
  }

  public function __get($name) {
    return $this->$name;
  }
}

$tmpl = new Templater();
$tmpl->name = 'Bob';
$tmpl->render('template.php');


внутри template.php:
<? echo $this->name ?>

Я тут опустил всяческие проверки, оставил только суть.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@IceJOKER
Web/Android developer
Изменить структуру, а то include через __get() это не дело О_О
или можете перед include достать переменные из глобальной области , тоже не есть хорошо
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Ты просто поторопился, столкнулся с ошибкой, но пока не осознал её важности.
Никакое подключение через геттер, разумеется, работать не будет.
потому что фундаментальный принцип подключения шаблонов как раз и состоит в том, что кроме имени файла шаблона в него еще передаются и переменные.

И как ты собрался подключать через геттер шаблоны, лежащие в поддиректориях?
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
решил подключить файл в котором нужно было вывести переменную, а так как include производиться внутри функции __get() теряется области видимости этих самых переменных

Задача решается выносом модуля (функции) из шаблона уровнем выше: на уровень модулей.
Сейчас: шаблон->модуль
Нужно: шаблон, модуль
Тогда можно вывести нормально переменные: модуль->шаблон
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы