PHP - извлечение () тип - PullRequest
3 голосов
/ 20 июля 2009

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

Спасибо!

Ответы [ 3 ]

3 голосов
/ 20 июля 2009

При использовании 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 не существуют.

2 голосов
/ 20 июля 2009

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

Хотя ....

$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
1 голос
/ 20 июля 2009

На основании описаний, введенных вручную, 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 и $ bar останутся прежними, и будут определены три новые локальные переменные ($ pre_foo, $ pre_bar и $ baz). Однако, если мы используем 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 и $ bar все еще сохраняются, но только две новые переменные импортируются в локальное пространство. Поскольку $ baz не является переменной, которая уже существует, EXTR_PREFIX_IF_EXISTS указывает PHP игнорировать ключ 'baz' в массиве.

...