3

PHP のextract()関数は、いくつかのextract_types. extr_prefix_sameしかし、との違いは何extr_prefix_if_existsですか? マニュアルでは、どちらの場合も、変数名が既に存在する場合、新しい変数がプレフィックスとして付けられるように聞こえます。

ありがとう!

4

3 に答える 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

于 2009-07-20T03:10:00.160 に答える
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
于 2009-07-20T03:11:25.463 に答える
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の値は同じままになり、3つの新しいローカル変数($ 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の値は引き続き保持されますが、ローカルスペースにインポートされる新しい変数は2つだけです。$ bazはすでに存在する変数ではないためEXTR_PREFIX_IF_EXISTS、配列内の「baz」キーを無視するようにPHPに指示します。

于 2009-07-20T03:10:25.107 に答える