2016-11-26 73 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