1

在讨论这个问题的细节之前,我想指出我以前从未见过这样做,并且很想知道它是否真的可以做到,如果可以,如何去做。

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

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

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

我试图避免的是能够访问 $q 而不传递一个非常长的数组作为第二个参数。我最初的想法是,可能有一种方法parse()可以继承最初调用它的范围(此处,内部test)而不是拥有自己的范围。有没有办法解决这个问题,如果有,效率如何?

4

2 回答 2

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')
        )
    );
}

但是删除超全局变量似乎确实让它变慢了一点

于 2012-11-22T23:47:47.427 回答
1

所以我认为创建一个视图对象来设置它的属性而不是传递它可以工作。或者直接使用数组代替对象。例如:

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);
}
于 2012-11-22T23:43:39.710 回答