2014-08-30 47 views
0

我創建了我的迷你微框架。在我加載模板的類中,我有名爲$ variable的屬性。該屬性存儲應該在我的模板中可用的viariables數組。將方法提取到具有全局範圍的模板中,類似於提取功能

例如:

$this->variable = array($key=>5, $data=>10); 

接下來,我用函數提取物()

extract($this->variable); 

所以,現在在我的模板(test.html.php)我有簡單的訪問傳遞的變量:

test.html.php

echo $key; 

我也有名爲import()的方法。 在我的模板我有運營商$此方法訪問這個

test.html.php

$this->import(); 

是否有可能調用模板我的功能導入(),而無需操作員$呢?

回答

0

讓你的模板實現__invoke()魔術方法。

class Template { 
    ...... 

    public function __invoke() { 
     $this->import(); 
    } 
} 

設置一個名爲import變量等於$this

$this->variable['import'] = $this; 

當您提取的變量將提供一個名爲$import變量,如果你在模板做$import()應該調用模板類,後者又調用類的import()方法的__invoke()方法。

如果可能,您應該儘量避免在模板中調用方法。你應該只是在處理變量。有人呼籲$import()可能不是世界上最糟糕的事情,它取決於該方法在做什麼。

+0

「你應該嘗試和調用模板,但如果可能的方法避免。」這將有助於獲得乾淨的模板,但在模板內調用ViewHelpers將內容轉換,轉換或格式應用於變量是一種常見做法。 – 2014-09-06 11:11:26

+0

這些事情應該在視圖中完成,而不是模板。然後模板只處理視圖創建的變量。 – ibanore 2014-09-07 09:02:56

0

如果可以,請儘量避免使用extract()和全局範圍。

要小心,當使用提取物()

提取物()是一個非常有活力的語言特性,這往往會導致在局部範圍內已經存在的變量衝突。您必須使用第二個參數 來控制新創建的變量。

  • (EXTR_SKIP)在內的不覆蓋任何現有的變量,
  • (EXTR_IF_EXISTS)僅覆蓋已有的變量(這樣你就可以創建一個白名單)
  • (EXTR_PREFIX_ALL)或通過添加前綴的變量

extract()會導致開發人員混淆,因爲您的項目上的新開發人員根本無法掌握變量是來自何處。

extract() is also a performance killer,關於在HHVM中使用它,因爲scoped-variables需要額外的記錄,這需要完成。總之:避免它,在HHVM上優化速度。


仍然是很常見的做法,在查看對象使用提取物,比如:使用

提取物()在視圖對象

// View.php 
class View { 

    public $variables; 

    function render($filename) { 
     extract($this->variables); 
     ob_start(); 
     $this->returned = include($this->dir . $this->filename); 
     return ob_get_clean(); 
    } 
} 

// test.php 
$view = new View; 
$view->variables = array('test' => 'Hello World!');  
$template = __DIR__.'/test.tpl'; 

echo $view->render($template); 

// var_dump($view->returned); // to see included template content 

// Template: test.tpl 
<p><?php echo $test; ?></p> 

如果你真的想污染全球範圍:

合併的變量$ GLOBALS

$GLOBALS += $vars;

function globalize($data) { 
    $GLOBALS += $data; 
} 

$vars = array('a' => 1, 'b' => 2); 
globalize($vars); 
echo $a; // prints 1 

的foreach從鍵名

foreach($array as $var_name => $var_value) 
{ 
    global $$var_name; 
    $$var_name = $var_value; 
} 

或更好的創建動態的全局變量(避免衝突)直接添加到GLOBALS數組。

foreach($array as $var_name => $var_value) 
{ 
    $GLOBALS[$var_name] = $var_value; 
} 

作品,但是邪惡...