2009-07-20 2 views
3

Функция PHP extract() может принимать одно из нескольких extract_types. Но в чем разница между extr_prefix_same и extr_prefix_if_exists? В руководстве это звучит так: в любом случае новые переменные будут иметь префикс, если имя переменной уже существует.PHP - extract() тип

Спасибо!

ответ

3

При использовании EXTR_PREFIX_IF_EXISTS, если переменная еще не существует, префиксная версия также не будет создана. В этом примере:

function test() { 
    $a = 12345; 

    extract(array('a' => 1, 'b' => 2, 'c' => 3), EXTR_PREFIX_IF_EXISTS, 'my_'); 

    var_export(get_defined_vars()); 
} 
test(); 

$my_b и $my_c не создаются, потому что $b и $c не существует.

+0

Благодаря кучу! Слишком быстро читал и пропустил соединение с «EXTR_IF_EXISTS». Теперь имеет смысл. Спасибо Алану Шторму и Джейсону внизу. – CartoonChess

+0

Формулировка в руководстве не совсем понятна - мне пришлось провести несколько экспериментов, чтобы выяснить, как они себя ведут. –

1

На основе ручных определений EXTR_PREFIX_SAME создаст переменные на основе имени ключа, и если переменная в локальном пространстве уже существует, к имени переменной будет добавлен префикс.

В отличие от этого, EXTR_PREFIX_IF_EXISTS будет наследовать поведение EXTR_IF_EXISTS (только перезаписывать, если переменные уже существуют), но вместо перезаписывания локальных переменных будет создана префиксная версия.

Рассмотрим следующий

$array = Array(); 
$array['foo'] = 'foo'; 
$array['bar'] = 'bar'; 
$array['baz'] = 'baz'; 

$foo = 'local foo'; 
$bar = 'local bar'; 

extract($array, EXTR_PREFIX_SAME, 'pre'); 

print_r(get_defined_vars()); 

//partial output  
//Array 
//(
// [array] => Array 
//  (
//   [foo] => foo 
//   [bar] => bar 
//   [baz] => baz 
//  ) 
// 
// [foo] => local foo 
// [bar] => local bar 
// [pre_foo] => foo 
// [pre_bar] => bar 
// [baz] => baz 
//) 

Так с EXTR_PREFIX_SAME, значения $ Foo и $ бар останется такой же, и будут определены три новые локальные переменные ($ pre_foo, $ pre_bar и $ БАЗ) , Однако, если мы используем EXTR_PREFIX_IF_EXISTS

$array = Array(); 
$array['foo'] = 'foo'; 
$array['bar'] = 'bar'; 
$array['baz'] = 'baz'; 

$foo = 'local foo'; 
$bar = 'local bar'; 

extract($array, EXTR_PREFIX_IF_EXISTS, 'pre'); 

print_r(get_defined_vars()); 

//partial output  
//Array 
//(
// [array] => Array 
//  (
//   [foo] => foo 
//   [bar] => bar 
//   [baz] => baz 
//  ) 
// 
// [foo] => local foo 
// [bar] => local bar 
// [pre_foo] => foo 
// [pre_bar] => bar 
//)  

Значения $ Foo и $ бар до сих пор сохранились, но только две новые переменные импортируются в локальное пространство. Поскольку $ baz не является переменной, которая уже существует, EXTR_PREFIX_IF_EXISTS сообщает PHP игнорировать ключ «baz» в массиве.

2

EXTR_PREFIX_SAME будет извлекать все переменные и только префиксные, которые существуют в текущей области.

EXTR_PREFIX_IF_EXISTS будет только извлекать переменные, существующие в текущей области, и префикс их с нужным префиксом.

Так, например:

$foo = 'foo'; 
$bar = 'bar'; 

extract(array('foo' => 'moo', 'bar' => 'mar', 'baz' => 'maz'), EXTR_PREFIX_IF_EXISTS, 'prefix'); 

isset($prefix_foo); // true 
isset($prefix_baz); // false 
isset($baz); // false 

While ....

$foo = 'foo'; 
$bar = 'bar'; 

extract(array('foo' => 'moo', 'bar' => 'mar', 'baz' => 'maz'), EXTR_PREFIX_SAME, 'prefix'); 

isset($prefix_foo); // true 
isset($prefix_baz); // false 
isset($baz); // true