别名包含

时间:2010-12-24 09:10:30

标签: php

我的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

为什么?以及如何解决这个问题?

感谢。

5 个答案:

答案 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

您会对以下引用感兴趣,“如果包含发生在调用文件中的函数内部,则调用文件中包含的所有代码都将表现为已在该函数内定义。因此,它将遵循该函数的变量范围。此规则的一个例外是魔术常量,在包含发生之前由解析器评估“。