Pregunta

extract() función

de PHP puede tomar uno de los varios extract_types. Pero ¿cuál es la diferencia entre extr_prefix_same e extr_prefix_if_exists? El manual hace que suene como, en cualquier caso, nuevas variables llevarán el prefijo si el nombre de la variable ya existe.

Gracias!

¿Fue útil?

Solución

Cuando se utiliza EXTR_PREFIX_IF_EXISTS, si la variable no existe ya continuación la versión prefijado no se creará tampoco. En este ejemplo:

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 y $my_c no se crean debido a $b y $c no existen.

Otros consejos

EXTR_PREFIX_SAME extraerá todos variables y únicos prefijo que existen en el ámbito actual.

EXTR_PREFIX_IF_EXISTS voluntad solamente variables de extracto que existen en el ámbito actual, y el prefijo de ellos con el prefijo deseado.

Así, por ejemplo:

$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

Si bien ....

$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

Sobre la base de las definiciones manuales, EXTR_PREFIX_SAME creará variables basadas en el nombre de clave, y si una variable en el espacio local ya existe, un prefijo se añadirá a nombre de la variable.

Por el contrario, EXTR_PREFIX_IF_EXISTS aparecería para heredar el comportamiento de EXTR_IF_EXISTS (sólo sobrescribir si ya existen las variables), pero en lugar de sobrescribir las variables locales, se creará una versión prefijado.

Considere el siguiente

$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
//) 

Así que con EXTR_PREFIX_SAME, los valores de $ foo y $ bar seguirá siendo el mismo, y tres nuevas variables locales ($ pre_foo, pre_bar $ y $ baz) serán definidos. Sin embargo, si usamos 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
//)     

Los valores de $ foo y $ bar aún se conservan, pero sólo dos variables nuevas se importan en el espacio local. Desde $ baz no es una variable que ya existe la EXTR_PREFIX_IF_EXISTS dice a PHP que ignore la tecla 'baz' en la matriz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top