【问题标题】:Scope of PHP variables and includePHP 变量的范围和包含
【发布时间】:2015-09-18 16:24:06
【问题描述】:

我正在尝试使用基本的 Feed 设置。

我有页面从数据库中获取一组项目并循环访问它们。然后它包含该项目的模板,并且在该项目中我想从正在循环的每个项目中填充它。

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

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

页面:

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

模板:

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

【问题讨论】:

  • 那么为什么这被否决了 3 次?

标签: php scope


【解决方案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(),它接受一个变量名称列表,并将其转换为一个关联数组。

【讨论】:

  • 不应该compact($item) 真的是compact("item") 吗? php.net/manual/en/function.compact.php
  • @MatteoTassinari 你是对的。自从我使用它以来已经有一段时间了。我已经更新了答案。
  • 就是这样,谢谢@Samlev。对于可能会阅读此内容的其他人,我将所有内容移至对象 Feed 中的一个函数中,以便我拥有 $item->addItem() 并且它可以正常工作。
【解决方案2】:

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

所以,你可以这样做:

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

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

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

【讨论】:

  • 我没有看到你的回复,原来是这样,谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2016-12-08
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多