2012-09-23 209 views
2

我在通過靜態類方法包含的文件中獲取變量時遇到問題。如何在靜態類的包含文件中獲取變量

one.php:

require_once("classes/tools.class.php"); 

$variable = "variable"; 

Tools::setView("test"); 

tools.class.php:

class Tools{  

    public static function setView($viewName){ 
     if(!is_file("views/" . $viewName . ".php")){ 
      echo "Chyba pri nacitani view: \"$viewName\" v " . $_SERVER["SCRIPT_NAME"]; 
      die(); 
     } 
     else{   
      include "views/" . $viewName . ".php"; 
     } 

    } 

} 

視圖/ test.php的:

echo $variable; 

後 「回聲」 我得到了「未定義變量「錯誤。

有人可以幫我解決這個問題嗎?

謝謝!

回答

2

您需要了解variable scope的工作原理。在這種情況下,您的變量不能在視圖腳本中看到,因爲視圖腳本正在函數內部執行,並且該函數無法訪問全局範圍內的變量。你可以在函數中聲明變量爲全局變量,但不建議這樣做 - 而且當你事先不知道將要設置什麼變量時,這是不切實際的。

理想情況下,您需要將視圖腳本將使用的變量注入設置視圖的調用中。也許是這樣的:

public static function setView($viewName, $vars) { 

    // loop through the passed vars and set them in the local scope 
    extract($vars); 

    // render the view 
    include "views/" . $viewName . ".php"; 
} 

然後,打電話的setView時傳遞變量:

$vars = array(
    'one' => 1, 
    'two' => 2 
); 
Tools::setView('test', $vars); 

這將創建一個名爲$one$two功能範圍內的變量,然後可以在正常使用了您查看腳本。此外,它還將視圖從您的程序中可能發生的其他偶然變量「中毒」中分離出來。也就是說,只有顯式傳遞給方法調用的變量才能在視圖腳本中使用。

+0

Psst:['extract'](http://php.net/manual/en/function.extract.php);) - 並減少副作用:http://stackoverflow.com/a/7697490/367456 – hakre

+0

噢,完全忘了那個功能,編輯... –

+0

嗨,亞歷克斯,非常感謝你,它的工作;) – Crylvarrey

相關問題