有没有办法将整个范围传递给函数

时间:2012-11-22 23:33:20

标签: php

在详细讨论这个问题之前,我想指出我之前从未见过这样做,并且很想知道它是否真的能够完成,如果是的话,怎么去呢?这样做。

我目前正坐在模板加载器上,为了编写它,我选择略微调整HAML文件格式并使用几个逻辑运算符扩展它 - 主要是循环。为了有效地这样做,我需要将一个参数列表传递给模板解析器......如果可能的话,我宁愿避免这种情况。在为替代方案进行头脑风暴时,我想到了这样的想法,也许只是可能引用调用该函数的范围。

目前,我正在调用文件的模板解析器,如下所示。假设test()是一条路线。

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

我试图避免的是能够访问$ q而不传递一个大型长数组作为第二个参数。我最初的想法是,parse()可能有一种方法可以继承最初调用它的范围(这里,在test内),而不是拥有它自己的范围。有没有办法管理这个,如果有的话,它有多高效?

2 个答案:

答案 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);
}