2010-06-30 3 views
1

Я думал, что возможно что-то подобное.php question about scope

// this creates a variable $test in the scope it was called from 
function create_var() {} 

class A { 
    function test() 
    { 
    create_var(); 
    // now we have a local to var() method variable $test 
    echo $test; 
    } 
} 

Итак, вопрос в том, может ли функция create_var() создать переменную вне его сферы, но не в глобальном масштабе? Например, функция extract() - принимает массив и создает переменные в области, из которой она была вызвана.

ответ

3

Нет, это невозможно. Доступ к глобальному охвату возможен только внутри функции.

Вы можете сделать create_var() вернуть ассоциативный массив. Вы могли бы extract(), что в вашей функции:

function create_var() 
{ return array("var1" => "value1", "var2" => "value2"); } 

class A { 
function test() 
{ 
    extract(create_var()); 
    // now we have a local to var() method variable $test 
    echo $test; 
} 
} 

Что-то немного ближе к тому, что вы хотите сделать, это возможно в PHP 5.3 с помощью новой функции closures. Это требует предварительного объявления переменных, однако, поэтому оно действительно не применяется. То же самое для передачи переменной ссылки на create_var(): create_var(&$variable1, &$variable2, &$variable3....)

Слова предупреждения: Я не могу представить себе ситуации, когда все это было бы лучшим кодированием практики. Будьте осторожны при использовании extract() из-за неизбирательного импорта переменных, которые он выполняет. Лучше работать без него.

+0

Спасибо, я думаю, я знал все это, я просто тайно надеялся, что это возможно. Ну, я бы не использовал его с экстрактом, мне в основном нужна функция для извлечения некоторых параметров, исходящих из POST или GET или чего-то еще. И поскольку я хочу только позволить extract() играть с некоторыми конкретными переменными в этих массивах, самое простое решение похоже на то, что вы предоставили. Но все равно было бы неплохо, если бы я мог просто сделать что-то вроде: extractvars ('field1, field2, field3'), потому что такие вещи просто выглядят более чистыми для меня, чем куча массива;] – Marius