1

申し訳ありませんが、この回答はインターネット上のどこかにあると確信していますが(おそらくスタックオーバーフローでさえ)、過去1時間検索に費やしたので、回答が見つからないようです...

PHP の extract() 関数は、コピー オン ライトを使用してシンボル テーブルに変数を追加しますか?

PHP 関数呼び出しはすべてデフォルトでコピー オン ライトであることを知っています (参照によって指定しない限り)。テンプレートファイルを含める前にそれらを抽出することが最善の方法であるかどうか疑問に思っています.

ありがとう!

編集:

明確にするために:

    $array = array('a' => array(1,2,3), 'b' => array(3,4,5), 'c' => array(6,7,8));
    extract($array);
    //is $a, $b, $c Copy-On-Write at this point? Would be a lot better performance as opposed to allocating 3 new array()'s

    //I would like to avoid having this change the original $array values so using EXTR_REFS is not a good solution for me here if I can avoid it and still keep performance!
    $a = array(3);
4

2 に答える 2

3

両方のバージョンが可能です (値の抽出と参照による抽出) - 両方を紹介するのは非常に簡単です。

function value() {
    $array = array('a' => 1, 'b' => 2);
    extract($array);
    var_dump($a);
    var_dump($b);
    $a = 3;
    $b = 4;
    var_dump($a);
    var_dump($b);
    var_dump($array);
}

function reference() {
    $array = array('a' => 1, 'b' => 2);
    extract($array, EXTR_REFS);
    var_dump($a);
    var_dump($b);
    $a = 3;
    $b = 4;
    var_dump($a);
    var_dump($b);
    var_dump($array);
} 

value();
/* 
int(1)
int(2)
int(3)
int(4)
array(2) {
  ["a"]=>
  int(1)    // original array item is unchanged
  ["b"]=>
  int(2)    // original array item is unchanged
}
*/

reference();
/*
int(1)
int(2)
int(3)
int(4)
array(2) {
  ["a"]=>
  &int(3)    // original array item is changed because it's a reference to the extracted variable
  ["b"]=>
  &int(4)    // original array item is changed because it's a reference to the extracted variable
}

extract()EXTR_REFSオプションとして機能する2番目のパラメーターを許可します。

参照として変数を抽出します。これは、インポートされた変数の値がまだ var_array パラメーターの値を参照していることを意味します。このフラグは単独で使用することも、extract_type を OR して他のフラグと組み合わせることもできます。

于 2012-11-29T12:11:13.903 に答える
0

EXTR_REFS変数を参照として抽出する渡すことができるフラグがあるので、そうだと思います。COWが使用されていなかった場合、これには意味がありません。

これを知っていると、変更していない変数が最適化されているため、必要に応じて抽出を続行すると思います。

于 2012-11-29T06:26:50.527 に答える