7

存在しない変数 (単純な変数または配列) を参照するときに php が文句を言わないのはなぜだろうと思っていました。たとえば、このコード

<?php
$t = &$r["er"];
var_dump($r);
?>

存在しない変数について警告をスローしません。

それに加えて、これをvar_dump示します:

array(1) { ["er"]=> &NULL }

それ&NULLは私が本当に期待していなかったことですNULL

前もって感謝します!

4

2 に答える 2

8

PHP インタープリター参照 var 割り当てのメモリが正しく機能する場合、PHP は、送信したキーと同じようなキーを使用してハッシュ テーブルに null 要素を作成し、それを参照します。これは、次のテストを実行すると表示されます。

<?php
$i = 0;
$arr = [];
$arrS = null;
$v = memory_get_peak_usage();
for ($i = 0; $i < 150; $i++) {
    $arrS = &$arr[rand()];
}
$v = memory_get_peak_usage() - $v;
echo $v;

デフォルトのヒープ サイズになるまで、PHP は余分な 0 メモリを使用して返します。これは、既に「準備された」配列項目をまだ割り当てているためです (PHP はいくつかの余分なハッシュ テーブル要素を空のままにしますが、パフォーマンスのために割り当てます)。これは、0 から 16 の範囲で設定することで確認できます (これはヒープ サイズです!)。

16 を超えると、PHP は余分な項目を割り当てる必要があり、i=17、i=18 などでそれを行い、それらを参照するために null 項目を作成します。

PS: 人々が言っ​​たことに反して、これはエラー、警告、または通知をスローしません。参照なしで空のアイテムを呼び出すと、存在しないアイテムを参照しても呼び出されません。大きな大きな大きな違い。

于 2013-04-06T16:13:24.100 に答える
3

存在しない変数について警告をスローしません。

これが参照の仕組みです。 まだ存在しない場合は、「将来の参照用に」$a = &$b;作成します。$b参照によって渡されるパラメーターと同じです。たぶん、これはあなたになじみがあるように見えます:

preg_match($pattern, $string, $matches);

ここで、3 番目のパラメーターは参照パラメーターであるため$matches、メソッド呼び出し時に存在する必要はありませんが、作成されます。

その &NULL は、私が本当に期待していなかったことです。単純な NULL になると思っていました。

なぜ期待していなかったのですか?$r['er']参照 "to/from"$tです。参照はポインターではなく、同じ値への等しい参照であることに注意してください。$r['er']一方$tから他方への方向はありません (したがって、最後の文の引用符)。

于 2013-04-06T16:46:39.323 に答える