Просмотр поколения и зарезервированных имен в PHP - PullRequest
3 голосов
/ 27 июля 2011

Это немного странно;Я не думаю, что это на самом деле возможно, однако сообщество 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)
}

Ответы [ 3 ]

2 голосов
/ 27 июля 2011

Используйте func_get_arg() вместо использования традиционных аргументов функции:

$buffer = call_user_func(function() {
    ob_start();
    require func_get_arg(0);
    return ob_get_clean();
}, $path);
2 голосов
/ 27 июля 2011

Вы можете сделать это с помощью дополнительной функции.В примере я использовал echo вместо require:

$path = 'hello';

function valStore($value = null) {
    static $s = null;
    if ($value !== null)
        $s = $value;
    else
        return $s;
}

valStore($path);
unset($path); # and gone
echo valStore();
1 голос
/ 27 июля 2011

Вы можете использовать что-то вроде этого:

$path = 'path/to/file.php';
function getPath() {
    global $path;
    $p = $path;
    unset($path);
    return $p;
}
$buffer = call_user_func(function() {
    ob_start();
    require getPath();
    return ob_get_clean();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...