存在しない変数 (単純な変数または配列) を参照するときに php が文句を言わないのはなぜだろうと思っていました。たとえば、このコード
<?php
$t = &$r["er"];
var_dump($r);
?>
存在しない変数について警告をスローしません。
それに加えて、これをvar_dump
示します:
array(1) { ["er"]=> &NULL }
それ&NULL
は私が本当に期待していなかったことですNULL
。
前もって感謝します!
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: 人々が言ったことに反して、これはエラー、警告、または通知をスローしません。参照なしで空のアイテムを呼び出すと、存在しないアイテムを参照しても呼び出されません。大きな大きな大きな違い。
存在しない変数について警告をスローしません。
これが参照の仕組みです。 まだ存在しない場合は、「将来の参照用に」$a = &$b;
作成します。$b
参照によって渡されるパラメーターと同じです。たぶん、これはあなたになじみがあるように見えます:
preg_match($pattern, $string, $matches);
ここで、3 番目のパラメーターは参照パラメーターであるため$matches
、メソッド呼び出し時に存在する必要はありませんが、作成されます。
その &NULL は、私が本当に期待していなかったことです。単純な NULL になると思っていました。
なぜ期待していなかったのですか?$r['er']
参照 "to/from"$t
です。参照はポインターではなく、同じ値への等しい参照であることに注意してください。$r['er']
一方$t
から他方への方向はありません (したがって、最後の文の引用符)。