PHP里面的未定义变量包括

时间:2016-11-26 22:28:31

标签: php

我有以下功能:

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 ... 可能是什么问题呢?有任何想法吗?提前谢谢。

好的,我已经解决了这个问题......问题在某个地方绝对别的......这个工作正常。管理员,你可以关闭这个问题。谢谢。

1 个答案:

答案 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或任何其他。您可以找到任意多个,每个都有不同的功能和语法,只需选择您喜欢的一个。

不要构建自己的模板引擎,因为最终会遇到严重的安全漏洞。

相关问题