我创建了我的迷你微框架。在我加载模板的类中,我有一个名为$ variable的属性。此属性存储应在我的模板中可用的viariables数组。
例如:
$this->variable = array($key=>5, $data=>10);
接下来,我使用function extract()
extract($this->variable);
所以,现在在我的模板(test.html.php)中,我可以轻松访问传递的变量:
test.html.php
echo $key;
我也有名为import()的方法。 在我的模板中,我可以通过运算符$ this
访问此方法test.html.php
$this->import();
是否有可能在模板中调用我的函数import(),而不使用运算符$ this?
答案 0 :(得分:0)
让您的模板实现__invoke()魔术方法。
class Template {
......
public function __invoke() {
$this->import();
}
}
设置名为import
的变量,该变量等于$this
。
$this->variable['import'] = $this;
当您提取变量时,名为$import
的变量将可用,如果您在模板中执行$import()
,则应调用模板类的__invoke()
方法,该方法又调用该课程的import()
方法。
尽管可能,您应该尽量避免在模板中调用方法。你应该只处理变量。在那里某处调用$import()
可能不是世界上最糟糕的事情,这取决于该方法的作用。
答案 1 :(得分:0)
如果可以,请尽量避免使用extract()和全局范围。
使用extract()
时要小心extract()是一种非常动态的语言特性,它往往会导致与本地范围内已存在的变量发生冲突。你必须使用第二个来处理 参数,控制新创建的变量。
extract()会导致开发人员混淆,因为您的项目中的新开发人员根本没有掌握变量的来源。
extract() is also a performance killer,关于将它与HHVM一起使用,因为需要对scoped-variable进行额外的簿记,这需要完成。简而言之:在HHVM上优化速度时,请避免使用它。
在View对象中使用extract仍然是常见做法,如下所示:
在View对象中使用extract()
// 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($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;
}
工作,但是很邪恶......