PHP变量的范围和包括

时间:2015-09-18 16:24:07

标签: php scope

我有一个基本的Feed设置我正在努力工作。

我有一个页面从数据库中获取一系列项目并循环遍历它们。然后它包含项目的模板,在项目中我想从每个循环的项目中填充它。

我遇到的问题是项目模板中没有定义项目,只是在包含模板的页面中。

我看过一些帖子说项目模板中仍然可以访问变量的范围,但我得到的变量未定义的典型错误。我在做错了什么或不在这里理解?

页:

<div>
    <?php 
        $items=Feed::getItems();
        foreach ($items as $item) {
            includeTemplate("item.php");
        }
    ?>
</div>

模板:

<div>
    echo $item->title;
</div>

2 个答案:

答案 0 :(得分:1)

如果您想保留当前范围, CAN NOT 使用自定义函数包含模板,因为它会改变范围。

所以,你可以这样做:

include "item.php"; // using built-in include

或者更好的是,不要依赖范围,只使用自定义函数传递相关参数:

includeTemplate("item.php", $item);  // passing $item as parameter

答案 1 :(得分:1)

这里的问题可能是includeTemplate功能。

使用include,范围保持不变(想象它就像你只是将代码从文件复制到包含的位置),但是因为你有一个功能,你是对的 - 它正在改变范围。

你能做些什么?最简单的方法是改变这样的功能:

includeTemplate($template, array $vars=[]) {
    extract($vars);
    // .. the rest of the function
}

然后这样称呼:

$items=Feed::getItems();
foreach ($items as $item) {
    includeTemplate("item.php", compact("item"));
}

这使用extract(),它接受​​一个关联数组并将其转换为变量,并使用相反的函数compact(),该函数获取变量名称列表,并将其转换为关联数组