これは少し特殊です。これが実際に可能だとは思いませんが、SOコミュニティには何度も何度も驚かされました。ここに行きます。
PHP で与えられます。次のスニペットがあります。
$path = 'path/to/file.php';
$buffer = call_user_func(function() use($path){
ob_start();
require $path;
return ob_get_clean();
});
含まれpath/to/file.php
ている場合は$path
、そのスコープに含まれます。インクルードされたファイルのコンテキストでこの変数を使用できないようにする方法はありますか?
たとえば、unset()
設定解除された変数の値が返された場合、次のことができます。
require unset($path);
しかし、もちろんそれはうまくいきません。
好奇心旺盛な人のために、インクルーダーから値を継承しないようにし$path
ています。
「難読化によるセキュリティ」は私が考えたものです。のようなものを渡しますが$thisIsThePathToTheFileAndNobodyBetterUseThisName
、それは少しばかげているようで、まだ確実ではありません。
継承する必要がある他の「予約済み」変数については、すでにextract()
andを使用していunset()
ます。
$buffer = call_user_func(function() use($path, $collection){
extract($collection);
unset($collection);
ob_start();
// ...
編集:
私が最終的に行ったこと:
$buffer = call_user_func(function() use(&$data, $registry){
extract($registry, EXTR_SKIP);
unset($registry);
ob_start();
// only $data and anything in $registry (but not $registry) are available
require func_get_arg(0);
return ob_get_clean();
}, $viewPath);
use()
おそらく、変数を無名関数のスコープに渡すために を使用しているため、私の質問は少し誤解を招くものでした。引数を渡すことは、私が言及するのを怠ったオプションでした。
@hakre とuse()
+についてfunc_get_args()
:
$var = 'foo';
$func = function() use($var){
var_dump(func_get_args());
};
$func(1, 2, 3);
/* produces
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}