如果可以,請儘量避免使用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;
}
作品,但是邪惡...
「你應該嘗試和調用模板,但如果可能的方法避免。」這將有助於獲得乾淨的模板,但在模板內調用ViewHelpers將內容轉換,轉換或格式應用於變量是一種常見做法。 – 2014-09-06 11:11:26
這些事情應該在視圖中完成,而不是模板。然後模板只處理視圖創建的變量。 – ibanore 2014-09-07 09:02:56