PHP的extract()
函數可以採用幾個extract_types
之一。但是extr_prefix_same
和extr_prefix_if_exists
有什麼區別?本手冊聽起來像是,無論哪種情況,如果變量名稱已經存在,新的變量將以前綴爲前綴。PHP - extract()類型
謝謝!
PHP的extract()
函數可以採用幾個extract_types
之一。但是extr_prefix_same
和extr_prefix_if_exists
有什麼區別?本手冊聽起來像是,無論哪種情況,如果變量名稱已經存在,新的變量將以前綴爲前綴。PHP - extract()類型
謝謝!
當使用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
似乎會繼承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'鍵。
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_IF_EXISTS」的連接。現在完美。 感謝Alan Storm和jason。 – CartoonChess 2009-07-20 03:16:09