PHP をテンプレートのように使いたいとき、extract
で連想配列をシンボルテーブルにインポートすることがありますが・・・
<?php
function render1($filename, array $params)
{
extract($params);
include $filename;
}
このようにすると $params
に "filename"
というキーが含まれていると $filename
が上書きされてしまい非常にマズイことになります。
<?php
render1("template.php", ["filename" => "ore_no_himitu.txt"]);
なので次のように extract
で EXTR_SKIP
を指定して名前が衝突したときは無視されるようにしていました。
<?php
function render2($filename, array $params)
{
extract($params, EXTR_SKIP);
include $filename;
}
が、次のようにすれば関数のスコープに引数が無いので衝突を気にする必要がなくなります。
<?php
function render3(/*$filename, array $params*/)
{
extract(func_get_arg(1));
include func_get_arg(0);
}