如何将参数传递给用“包含”呈现的PHP模板?

2022-08-30 22:39:28

需要您在 PHP 模板方面的帮助。我是PHP的新手(我来自Perl +Embperl)。无论如何,我的问题很简单:

  • 我有一个小模板来渲染一些项目,让它成为一篇博客文章。
  • 我知道使用此模板的唯一方法是使用“包含”指令。
  • 我想在循环中调用此模板,以通过所有相关的博客文章。
  • 问题:我需要将一个参数传递给此模板;在本例中,引用表示博客文章的数组。

代码如下所示:

$rows = execute("select * from blogs where date='$date' order by date DESC");
foreach ($rows as $row){
  print render("/templates/blog_entry.php", $row);
}

function render($template, $param){
   ob_start();
   include($template);//How to pass $param to it? It needs that $row to render blog entry!
   $ret = ob_get_contents();
   ob_end_clean();
   return $ret;
}

任何想法如何做到这一点?我真的被难住了:)有没有其他方法来呈现模板?


答案 1

考虑包含一个 PHP 文件,就好像您将代码从 include 复制粘贴到 include 语句所在的位置一样。这意味着您将继承当前作用域

因此,在您的情况下,$param在给定的模板中已经可用。


答案 2

模板中应已提供$param。当您包含()文件时,它应该具有与包含它时相同的范围。

http://php.net/manual/en/function.include.php 相比

当包含文件时,它包含的代码将继承发生包含的行的变量作用域。从那时起,调用文件中该行上可用的任何变量都将在被调用文件中可用。但是,在包含的文件中定义的所有函数和类都具有全局作用域。

您也可以执行如下操作:

print render("/templates/blog_entry.php", array('row'=>$row));

function render($template, $param){
   ob_start();
   //extract everything in param into the current scope
   extract($param, EXTR_SKIP);
   include($template);
   //etc.

然后$row将可用,但仍然称为$row。


推荐