extract() 常量之间的区别:EXTR_PREFIX_SAME 与 EXTR_PREFIX_IF_EXISTS

问题描述 投票:0回答:3

PHP 的

extract()
函数可以承担多个
extract_types
之一。但是
extr_prefix_same
extr_prefix_if_exists
有什么区别呢?手册听起来像是,无论哪种情况,如果变量名已经存在,新变量都会被加上前缀。

php extract exists prefix
3个回答
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
不存在。


2
投票

EXTR_PREFIX_SAME
将提取 all 变量,并且仅提取当前范围内存在的前缀变量。

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
投票

根据手动定义,

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' 键。

© www.soinside.com 2019 - 2024. All rights reserved.