在详细讨论这个问题之前,我想指出我之前从未见过这样做,并且很想知道它是否真的能够完成,如果是的话,怎么去呢?这样做。
我目前正坐在模板加载器上,为了编写它,我选择略微调整HAML文件格式并使用几个逻辑运算符扩展它 - 主要是循环。为了有效地这样做,我需要将一个参数列表传递给模板解析器......如果可能的话,我宁愿避免这种情况。在为替代方案进行头脑风暴时,我想到了这样的想法,也许只是可能引用调用该函数的范围。
目前,我正在调用文件的模板解析器,如下所示。假设test()
是一条路线。
function test() {
$q = $UserModel->tether($userID)->fetchPermissions();
Util::Templating()->parse("file.haml");
}
我试图避免的是能够访问$ q而不传递一个大型长数组作为第二个参数。我最初的想法是,parse()
可能有一种方法可以继承最初调用它的范围(这里,在test
内),而不是拥有它自己的范围。有没有办法管理这个,如果有的话,它有多高效?
答案 0 :(得分: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')
)
);
}
但是删除超全球似乎确实会让它慢一点
答案 1 :(得分:1)
所以我认为创建一个视图对象设置它的属性,而不是传递它可以工作。或者代替对象直接使用数组。 e.g:
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);
}