2016-11-26 54 views
0

我有以下功能: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。顺便说里面get_include_contentsprint_r这样说:

正如你可以看到已经定义的变量
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

这就是它是如何工作的,包含的文件,从全球范围内启动,所以不会看到)内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的,嫩枝,Zend_View的,或任何其他。你可以找到尽可能多的,每个人都有不同的功能和语法,只需选择你最喜欢的一个。

只是不建立你自己的模板引擎,因为你最终会遇到真正严重的安全漏洞。

+0

我正在创建自己的框架而不使用任何可用的模板引擎。在github上查看EOSS2。 – durisvk

+0

我明白,我建议你不要这样做,因为你显然没有深厚的PHP知识,这是什么框架.. – Johnny