Это немного странно;Я не думаю, что это на самом деле возможно, однако сообщество 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()
вернул значение переменной, которую она не сбрасывала, я мог быdo:
require unset($path);
Но, конечно, это не работает.
Для любопытных я пытаюсь помешать $path
наследовать значение из include- er .
"Безопасность путем обфускации" - это соображение, которое я сделал;передать что-то вроде $thisIsThePathToTheFileAndNobodyBetterUseThisName
, но это кажется немного глупым и все же не надежным.
Для других «зарезервированных» переменных, которые должны быть унаследованы, я уже пошел с extract()
и 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)
}