1

この質問の詳細に入る前に、私はこれがこれまでに行われたのを見たことがないことを指摘したいと思います。実際にできるかどうか、できる場合はどうすればよいかを知りたいと思います。

私は現在、テンプレート ローダーを使用しています。これを作成するために、HAML ファイル形式を少し変更し、いくつかの論理演算子 (主にループ) で拡張することにしました。これを効率的に行うには、パラメーターのリストをテンプレート パーサーに渡す必要があります。可能であれば、これは避けたいと思います。代替案についてブレインストーミングを行っているときに、関数が呼び出されたスコープを参照できるかもしれないというアイデアが浮かびました。

現在、次のようにファイルのテンプレート パーサーを呼び出しています。をルートとtest()します。

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

私が避けようとしているのは、非常に長い配列を 2 番目のパラメーターとして渡さずに $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 に答える