2009-07-20 49 views
3

PHP的extract()函數可以採用幾個extract_types之一。但是extr_prefix_sameextr_prefix_if_exists有什麼區別?本手冊聽起來像是,無論哪種情況,如果變量名稱已經存在,新的變量將以前綴爲前綴。PHP - extract()類型

謝謝!

回答

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不存在不創建。

+0

感謝一大堆!讀得太快,錯過了與「EXTR_IF_EXISTS」的連接。現在完美。 感謝Alan Storm和jason。 – CartoonChess 2009-07-20 03:16:09

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和$欄中的值將保持不變,和三個新的局部變量($ pre_foo,$ pre_bar和$巴茲)將被定義。但是,如果我們使用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和$欄中的數值依然保留着,但只有兩個新的變量被導入到本地空間。由於$ baz不是已經存在的變量,所以EXTR_PREFIX_IF_EXISTS告訴PHP忽略數組中的'baz'鍵。

2

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