このスクリプトについて考えてみましょう。
$arr = array();
for ($i = 0; $i < 100000; $i++) $arr[] = null;
echo memory_get_usage() . "\n";
これは私のマシンで出力されます:21687696、つまり21MBの使用済みメモリです。一方、これを使用すると:
$master_null = null;
$arr = array();
for ($i = 0; $i < 100000; $i++) $arr[] = $master_null;
echo memory_get_usage() . "\n";
出力:13686832、つまり13MB。この情報に基づいて、メモリ使用量が懸念される限り、実際には「マスターヌル」変数を使用する方が実際には優れていると推測できます。ただし、それでも配列内のすべての項目が必要であり、HashTable(配列の内部表現)のすべてのエントリもある程度のメモリを必要とします。
zvalsと参照をさらに深く掘り下げたい場合は、関数を使用することをお勧めしますdebug_zval_dump
。これを使用すると、どの変数が同じzvalを共有しているかを確認できます。
$a = $b = $c = $d = "abc";
debug_zval_dump($a);
$x = $y = $z = $w = null;
debug_zval_dump($x);
$q = null;
debug_zval_dump($q);
出力:
string(3) "abc" refcount(5)
NULL refcount(5)
NULL refcount(2)
これは、変数$xと$qは両方ともNULLですが、同じzvalではないことを意味します。ただし、$xと$yは互いに割り当てられているため、同じzvalを共有します。この関数についてはご存知だと思いますが、そうでない場合は、 http:debug_zval_dump
//php.net/manual/en/function.debug-zval-dump.phpでrefcountの説明を注意深くお読みください。
また、私の投稿の最後に、この情報はPHPの内部に関する知識を深めるのに役立つかもしれないと言いたいのですが、最適化を行うことはまったく役に立たないと思います。主な理由は、そのようなマイクロ最適化よりも、スクリプトの最適化を開始するのにはるかに適した場所があるためです。また、これは仕様の一部ではありませんが、PHPの作成者は将来この動作を変更する可能性があります(たとえば、将来のバージョンでは、すべてのNULL変数が同じzvalを共有する可能性があります)。