我有以下功能:
function get_include_contents($filename, $params = array()) {
if (is_file($filename)) {
ob_start();
extract($params);
include $filename;
$contents = ob_get_contents();
ob_end_clean();
print_r(get_defined_vars());
return $contents;
}
return false;
}
在$filename
中,我获得了layout.php
的路径,如下所示:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><?= $title; ?></title>
</head>
<body>
<div id="todos"></div>
<input id="todo" type="text" />
<input type="button" id="addTodo" value="Add Todo" />
</body>
</html>
正如您所看到的,我正在尝试回显变量$title
,我将其作为一个数组传递到get_include_contents
第二个参数($params
),然后我将其提取出来。问题是我得到undefined variable $title
。顺便说一句,print_r
get_include_contents
说明了这一点:
Array
(
[filename] => /home/lchost/EOSS2/app/view/layout.php
[params] => Array
(
[title] => Hello World
)
[title] => Hello World
[contents] => <!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World</title>
</head>
<body>
<div id="todos"></div>
<input id="todo" type="text" />
<input type="button" id="addTodo" value="Add Todo" />
</body>
</html>
)
你可以看到定义变量$title
...
可能是什么问题呢?有任何想法吗?提前谢谢。
好的,我已经解决了这个问题......问题在某个地方绝对别的......这个工作正常。管理员,你可以关闭这个问题。谢谢。
答案 0 :(得分:0)
它是如何工作的,所包含的文件从全局范围开始,因此它不会看到get_include_contents()中定义的任何内容,你唯一的机会是再次使用全局环境:
function get_include_contents($filename, $params = array()) {
global $tpl_params;
if (is_file($filename)) {
ob_start();
$tpl_params = $params; // make it global
include $filename;
$contents = ob_get_contents();
ob_end_clean();
print_r(get_defined_vars());
return $contents;
}
return false;
}
在模板中:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><?= $tpl_params['title']; ?></title>
</head>
<body>
<div id="todos"></div>
<input id="todo" type="text" />
<input type="button" id="addTodo" value="Add Todo" />
</body>
</html>
我的最后建议是使用专用模板引擎,如Smarty,Twig,Zend_View或任何其他。您可以找到任意多个,每个都有不同的功能和语法,只需选择您喜欢的一个。
不要构建自己的模板引擎,因为最终会遇到严重的安全漏洞。