2012-11-22 220 views
1

在討論這個問題的細節之前,我想指出,我從來沒有見過這樣做,並且會很好奇,看它是否真的可以做好了,如果是的話,怎麼去做。我現在正坐在一個模板加載器上,爲了編寫它,我選擇稍微修改HAML文件格式,並用一些邏輯運算符(主要是循環)對其進行擴展。爲了有效地做到這一點,我需要將參數列表傳遞給模板解析器......如果可能,我寧願避免這種情況。雖然頭腦風暴的替代品,這個想法來了,也許,也許,也許,它可能會引用函數被調用的範圍。有沒有辦法將整個範圍傳遞給一個函數

目前,我正在爲文件調用模板解析器,如下所示。假設test()是一條路線。

function test() { 
    $q = $UserModel->tether($userID)->fetchPermissions(); 
    Util::Templating()->parse("file.haml"); 
} 

我試圖避免的是能夠訪問$ q而不通過一個龐大的數組作爲第二個參數。我最初的想法是,parse()可能會繼承其最初調用的範圍(此處,在test之內),而不是擁有自己的範圍。有沒有辦法來管理這個,如果是的話,它有多高效?

+2

聽起來像一個非常糟糕的主意。可能是http://php.net/manual/en/book.reflection.php中的內容。但它會很慢。 –

+0

@E_p:這正是我想要衡量的:這種方法的效率。如果它超過陣列版本的5-10%,那麼這是一個不行。畢竟,便利是方便的。 –

+0

雖然我不確定它會如何適應Reflection。我認爲問題的核心是如何引用來自被調用者的調用者範圍或來自被調用者的調用者 - 因爲我誠實地知道沒有辦法可靠和毫不含糊地執行此操作。 –

回答

4

包括超全局變量,以及:

$a = 'Hello World'; 
$b = range('A','Z'); 

$scopeVars = get_defined_vars(); 

var_dump($scopeVars); 
test($scopeVars); 


function test($scopeVars) { 
    extract($scopeVars); 

    echo '$a = '; var_dump($a); 
    echo '$b = '; var_dump($b); 
} 

編輯

只是作爲一個實驗,以消除超全局變量:

$a = 'Hello World'; 
$b = range('A','Z'); 

$scopeVars = get_user_defined_vars(get_defined_vars()); 

test($scopeVars); 


function test($scopeVars) { 
    extract($scopeVars); 

    echo '$a = '; var_dump($a); 
    echo '$b = '; var_dump($b); 
} 

function get_user_defined_vars($vars) { 
    return array_diff_key(
     $vars, 
     array_flip(
      array('_SERVER','_GET', '_POST', '_REQUEST', '_FILES', '_COOKIE', '_ENV') 
     ) 
    ); 
} 

但是,消除超全局似乎讓它慢一點

+0

今天我學到了一些東西。雖然這不是我正在尋找的,但我認爲這與接受這個問題的答案接近。 –

1

所以我認爲創建一個視圖對象設置它的屬性並傳遞它可以工作。或者直接使用數組來處理對象。例如:

function test() { 
    $params = array(); 
    $params['var_1'] = 'qwe1'; 
    $params['var_2'] = 'qwe2'; 
    $params['var_3'] = 'qwe3'; 
    $params['var_4'] = 'qwe4'; 
    $params['q'] = $UserModel->tether($userID)->fetchPermissions(); 
    Util::Templating()->parse("file.haml", $params); 
} 
+0

這是擺在桌面上的可能解決方案之一。我只是想知道是否有辦法完全消除這個參數,本質上。 –

+0

你爲什麼要這樣做?多餘的內存沒有用處。 Plus將創造更多問題而不是解決問題。 –

+0

答案是:用戶方便。有問題的模板引擎針對那些幾乎沒有任何線索的人。我試圖看看是否有可能儘可能多地清除地雷。 (另外,我沒有想過按價值傳遞。) –

相關問題