Это зависит от того, насколько сильно вам нужно это сделать.Если это только для красоты источника, найдите другой путь.Если по какой-то причине вам действительно нужно связываться с родительской областью действия, всегда есть способ.
РЕШЕНИЕ 1
Самый безопасный способ - это на самом деле используйте сам экстракт для этой работы, так как он знает хитрость.Скажем, вы хотите создать функцию, которая извлекает элементы массива, но со всеми именами в обратном направлении - довольно странно!-, давайте сделаем это с помощью простого преобразования массива в массив:
function backwardNames($x) {
$out = [];
foreach($x as $key=>$val) {
$rev = strrev($key);
$out[$rev] = $val;
}
return $out;
}
extract(backwardNames($myArray));
Никакой магии здесь.
РЕШЕНИЕ 2
Если вам нужно больше чем extract делает, используйте eval и var_export .ДА Я ЗНАЮ, Я ЗНАЮ, все успокоятся, пожалуйста.Нет, Эвал не злой.Eval - это электроинструмент, и он может быть опасным, если вы используете его без осторожности, поэтому используйте его с осторожностью.( нет способа ошибиться , если вы только оцениваете что-то, что было сгенерировано var_export - это не дает никакого способа вторжениям, даже если вы помещаете значения в ваш массив из ненадежного источника. Элементы массива ведут себяхорошо.)
function makeMyVariables() {
$vars = [
"a" => 4,
"b" => 5,
];
$out = var_export($vars,1);
$out = "extract(".$out.");";
return $out;
}
eval(makeMyVariables()); // this is how you call it
// now $a is 4, $b is 5
Это почти то же самое, за исключением того, что вы можете сделать намного больше в eval.И это значительно медленнее, конечно.
Однако, действительно, нет способа сделать это с помощью одного вызова.