PHP 的extract()
功能可以是几个之一extract_types
。extr_prefix_same
但是和有什么区别extr_prefix_if_exists
?该手册听起来像是在任何一种情况下,如果变量名称已经存在,则新变量将作为前缀。
谢谢!
使用时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
不存在。
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
根据手动定义,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' 键。