У меня есть класс, который я разрабатываю, методы которого вызывают друг друга и отправляют данные,

Class Template(){

   public variables = array('text' => 'test');

    public function loadTemplate( $filename ){           

        require PROJECT_PATH .DS. $filename;
    }

    public function render(){

       extract($this->variables);
       $this->loadTemplate('index.php');
    }

}

Index.php теперь отображает извлеченные переменные

<html>
<body>
      <?php

      var_dump($text);

        ?>
</html>

Но теперь он не отображает значения NULL !! но когда мне это нужно напрямую, это работает, что я делаю не так?

Заранее спасибо.

1
Stanley Ngumo 14 Апр 2015 в 21:03

1 ответ

Лучший ответ

Простой ответ заключается в том, что вам нужно переместить вызов extract() в функцию, которая фактически вызывает вызов require.

Более длинный ответ состоит в том, что extract() извлекает переменные в область видимости текущей функции. Когда вы вызываете новую функцию, чтобы фактически потребовать шаблон, она имеет новую область видимости. Фактически, у вас будет доступ только к переменной $filename.

Еще один момент: пожалуйста добавьте EXTR_SKIP в качестве второго аргумента к extract() < / a>, чтобы он не перезаписывал имя файла (и, следовательно, не превращался в уязвимость системы безопасности):

function loadTemplate($filename) {
    extract($this->variables, EXTR_SKIP);
    require PROJECT_PATH .DS. $filename;
}

Или вообще не храните его в переменной:

function render() {
    extract($this->variables);
    require $this->findTemplatePath("index.php");
}

function findTemplatePath($template) {
    return PROJECT_PATH .DS. $filename;
}
0
ircmaxell 16 Апр 2015 в 18:01