2016-11-26 9 views
0

ich die folgende Funktion haben:PHP undefinierte Variable innerhalb umfassen

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; 
} 

In $filename i Pfad zu layout.php übergeben bekommen, die wie folgt aussieht:

<!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> 

wie Sie sehen können Ich versuche, zu Echo-Variable $title, die ich in den zweiten Parameter get_include_contents übergeben ($params) als ein Array, die ich dann extrahieren. Das Problem ist, ich bekomme undefined variable $title. Durch die Art und Weise der print_r innen get_include_contents sagt dies:

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> 
) 

die, wie Sie $title Variable definiert sehen ist ... , was das Problem sein könnte? irgendwelche Ideen? Vielen Dank im Voraus.

Ok Ich habe das behoben .. das Problem war irgendwo absolut anders ... das hat gut funktioniert. Admin, Sie können diese Frage schließen. Danke.

Antwort

0

Das ist, wie es funktioniert, die mitgelieferte Datei aus dem globalen Bereich beginnt, so wird es nichts sehen innerhalb get_include_contents() definiert, ist Ihre einzige Chance ist wieder die globale Umwelt zu verwenden:

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; 
} 

innen Vorlage:

<!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> 

Mein letzter Rat ist, eine eigene Template-Engine wie Smarty, Zweig, Zend_View, oder jede andere zu verwenden. Sie können so viele finden, wie Sie möchten, jeder hat verschiedene Funktionen und Syntax, wählen Sie einfach Ihren Favoriten.

Erstellen Sie einfach keine eigene Vorlagen-Engine, da Sie dann mit ernsthaften Sicherheitsfehlern konfrontiert werden.

+0

Ich erstelle mein eigenes Framework, ohne eines der verfügbaren Template-Engines zu verwenden. Schau dir EOSS2 auf github an. – durisvk

+0

Ich verstehe, dass ich Ihnen vorschlug, es NICHT zu tun, da Sie offensichtlich kein tiefes PHP-Wissen haben, dafür sind Frameworks gedacht. – Johnny