首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP - extract()类型

PHP - extract()类型
EN

Stack Overflow用户
提问于 2009-07-20 02:58:26
回答 3查看 908关注 0票数 3

PHP的extract()函数可以接受几个extract_types中的一个。但是extr_prefix_sameextr_prefix_if_exists有什么不同呢?无论哪种情况,手册都会让人觉得,如果变量名已经存在,就会加上新变量的前缀。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-20 03:10:00

使用EXTR_PREFIX_IF_EXISTS时,如果变量不存在,则也不会创建带前缀的版本。在此示例中:

代码语言:javascript
复制
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不存在。

票数 3
EN

Stack Overflow用户

发布于 2009-07-20 03:11:25

EXTR_PREFIX_SAME将提取所有变量,并且只提取当前作用域中存在的前缀变量。

EXTR_PREFIX_IF_EXISTS将只提取存在于当前作用域中的变量,并为它们添加所需的前缀。

所以,举个例子:

代码语言:javascript
复制
$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

虽然...

代码语言:javascript
复制
$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
票数 2
EN

Stack Overflow用户

发布于 2009-07-20 03:10:25

根据手动定义,EXTR_PREFIX_SAME将根据键名创建变量,如果本地空间中已经存在变量,则会在变量名中添加前缀。

相比之下,EXTR_PREFIX_IF_EXISTS似乎继承了EXTR_IF_EXISTS的行为(只有在变量已经存在的情况下才会覆盖),但将创建一个前缀版本,而不是覆盖本地变量。

考虑以下几点

代码语言:javascript
复制
$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

代码语言:javascript
复制
$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的值仍然保留,但只有两个新变量被导入到局部空间中。因为PHP不是一个已经存在的变量,所以EXTR_PREFIX_IF_EXISTS告诉$baz忽略数组中的“baz”键。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1151560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档