我的include()
文件中有functions.php
的别名:
function render_template($template)
{
include($template);
}
和简单的template.html
:
Hello, <?php echo $name ?>
但不幸的是,别名函数给了我这个输出:
require 'functions.php';
$name = "world";
include('template.html'); // Hello, world
render_template('template.html'); // PHP Notice:Undefined variable: name
为什么?以及如何解决这个问题?
感谢。
答案 0 :(得分:3)
变量$name
在调用include
的位置不可见(内部函数render_template
)。解决问题的一种方法是:
function render_template($template)
{
global $name;
include($template);
}
答案 1 :(得分:3)
您还有两个选项可以解决范围问题。 (使用全局将需要本地化一长串变量。此外,实际上并不总是清楚你的$ name是否始终位于全局范围内。)
首先,您可以将render_template()函数转换为名称解析器:
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);
}
这比使用名称解析器更麻烦。
答案 2 :(得分:1)
它是一个范围问题,你可以将变量设置为全局,或者将整个事物封装得更多,例如:
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; ?>
答案 3 :(得分:0)
如果 $name
在全局范围内,那么您可以通过使用该函数声明变量global来绕过它。但更好的解决方案是重新设计代码,以便将相关的变量值传递给函数。
答案 4 :(得分:0)
这是预期的。
看here。
您会对以下引用感兴趣,“如果包含发生在调用文件中的函数内部,则调用文件中包含的所有代码都将表现为已在该函数内定义。因此,它将遵循该函数的变量范围。此规则的一个例外是魔术常量,在包含发生之前由解析器评估“。