псевдоним для включения

У меня есть псевдоним include() в моем файле functions.php :

 function render_template($template) { include($template); } 

и простой template.html :

 Hello, <?php echo $name ?> 

Но, к сожалению, функция alias дала мне этот результат:

 require 'functions.php'; $name = "world"; include('template.html'); // Hello, world render_template('template.html'); // PHP Notice:Undefined variable: name в require 'functions.php'; $name = "world"; include('template.html'); // Hello, world render_template('template.html'); // PHP Notice:Undefined variable: name 

почему это? и как я могу это исправить?

Благодарю.

У вас есть еще два варианта, позволяющих обойти проблему с областью. (Использование global потребовало бы локализации длинного списка варов. Также не совсем ясно, всегда ли ваше имя $ находится в глобальной области и всегда.)

Сначала вы можете просто превратить функцию render_template () в имя-resolver:

  function template($t) { return $t; // maybe add a directory later on } 

Используя его вот так:

  $name = "world"; include(template('template.html')); 

Что лучше читать и имеет очевидный синтаксический смысл.


Более причудливой альтернативой является захват локальных переменных для render_template:

  $name = "world"; render_template('template.html', get_defined_vars()); 

Если для render_template потребуется это дополнение:

 function render_template($template, $vars) { extract($vars); // in lieu of global $var1,$var2,$var3,... include($template); } 

Так что это более громоздко, чем использование имени-резольвера.

Переменная $name не отображается в точке, где вызывается include (внутри функции render_template ). Один из способов его устранения:

 function render_template($template) { global $name; include($template); } 

Его проблема с областью действия, вы можете установить переменную в глобальную или инкапсулировать все это немного больше, например, например:

 class view{ private $_data; public function __construct(){ $this->_data = new stdClass(); } public function __get($name){ return $this->_data->{$name}; } public function __set($name,$value){ $this->_data->{$name} = $value; } public function render($template){ $data = $this->_data; include($template); } } $view = new view; $view->name = "world"; $view->render('template.html'); 

template.html:

 Hello <?php print $data->name; ?> 

Если $name находится в глобальной области, то вы можете обойти его, объявив переменную global функцией. Но лучшим решением было бы перепроектировать код, чтобы потребовать передачи соответствующего значения переменной в функцию.

Это ожидается.

Послушайте.

Вам будет интересна следующая цитата: « Если включение происходит внутри функции в вызывающем файле, тогда весь код, содержащийся в вызываемом файле, будет вести себя так, как если бы он был определен внутри этой функции. переменная область действия этой функции. Исключением из этого правила являются магические константы, которые оцениваются парсером до появления include ».