PHP入門 第9回 変数
今回は、PHPでの変数の扱いについて解説していきます。
基本ルール
- PHP の変数はドル記号の後に変数名が続く形式で表されます。
- 変数名は大文字小文字を区別します。
- 有効な変数名は文字またはアンダースコアから始まり、任意の数の文字、 数字、アンダースコアが続きます。
- 定義済みの変数があります、が全て記述することはできません
使用例)
1 2 3 |
<?php $a = 'hello'; ?> |
変数$aに「hello」という文字列を代入します。
可変変数
- 変数名を可変にできると便利なことが時々あります。
可変変数では、変数名を動的にセットし使用できます。
通常の変数は、次のような命令でセッ トします。
使用例)
1 2 3 4 5 6 7 |
<?php $a = 'hello'; //変数$aにhelloを代入 $$a = 'world'; //変数$helloにworldを代入 echo "$a ${$a}"; //hello worldと出力 echo "$a $hello"; //3行目と同じ結果になります ?> |
リファレンスカウント
PHPは内部でリファレンスカウントというものを持っています。
何に使っているかというと同じ変数を参照している変数の数を管理しています。
同じ値を参照できる場合は複数の変数で同じメモリ領域を参照し、変数の値が変わって同じ値を参照できなくなった場合にのみ新しい値を保存するメモリ領域を確保したり、参照している変数がなくなったメモリ領域を自動的に開放するために利用しています。
つまりPHPは、変数の代入では変数のコピーは発生せずに、リファレンスカウントが+1されるだけなのです。
変数の値を変更した場合に変数のコピーが発生します。
PHPが内部的に管理していてプログラマは意識する必要はありませんが、循環参照するように変数を使用してしまうとリファレンスカウントが減らずにメモリが解放されずにメモリリークを起こしてしまう可能性があるので注意が必要です。
リファレンスカウントがどのように動作しているのか見るためのサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php print '<pre>'; print phpversion() . "\n"; $a = 1; debug_zval_dump($a); $b = $a; debug_zval_dump($a); $c = $a; debug_zval_dump($a); $d = $a; debug_zval_dump($a); $e = $a; debug_zval_dump($a); $e = 1; debug_zval_dump($a); $d = 1; debug_zval_dump($a); $c = 1; debug_zval_dump($a); $b = 1; debug_zval_dump($a); print '</pre>'; ?> |
実行結果は以下のようになります。
思ったのと同じ内容で作成されているでしょうか?
内部管理用の値ですが、PHPを扱うプログラマーとしては一応知ってく必要はあると思います。
PHP6からこのリファレンスカウントが別の仕組みに変わるらしいですが・・・。
コメント:0件
トラックバック:1件
[...] 第9回 変数 [...]