PHP入門 第10回 式
今回は式についてです。
PHPでは、ほとんどの記述は値を持つ式で成り立っています。
最も簡単で最も正確な式の定義は、"全ての式には値がある。" ということです。
一番簡単な例で考えて見ましょう
1 2 3 |
<?php $a = 5; ?> |
これは、$a に ’5′ を代入することを表しています。
’5′ は、5 という値です。
言葉を変えると ’5′ は 5 という値を有する式なのです。
なので$a に ’5′という式の結果を代入している文になります。
このことから、PHPではほとんどの記述が値をもつ式となっていることがわかると思います。
でも、あまりそんなことは意識しないので頭の片隅にでもおいておいてください。
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からこのリファレンスカウントが別の仕組みに変わるらしいですが・・・。
PHP入門 第8回 定数
第8回目は、PHPで扱う定数についてです。
定数は簡単な値のためのID(名前)です。
この名前が示すように、定数の値は スクリプト実行中に変更できません(このことを知らないことが多いので注意が必要です。)
デフォルトで定数では大文字小文字を区別します。
慣習的に、 定数は常に大文字で表記します。
定数のルール
- 有効な定数の名前は、 文字またはアンダースコアで始まり、任意の数の文字、数字、 アンダースコアが後に続きます。
使用例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php // 有効な定数名 define("FOO", "something"); define("FOO2", "something else"); define("FOO_BAR", "something more"); // 無効な定数名 define("2FOO", "something"); // 有効だが、避けるべき。 // 将来 PHP に定数の予約語が追加された場合に // スクリプトが動作しなくなる可能性がある define("__FOO__", "something"); ?> |
定義済みの定数を取得するには、「get_defined_constants()」を使うと取得できます。
1 2 3 |
<?php var_dump(get_defined_constants()); ?> |
こんな風にです。
PHP入門 第7回 型
PHPで使われる型について解説していきます。
全部で、大別すると8種類に分類されます。
スカラー型
型名 | 説明 | |
論理型 | boolean | 真偽の値を表します。 この値は、TRUE または FALSE のどちらかになります。 |
整数 | integer |
整数 は、10 進数、16 進数 、8 進数表記で指定することが可能です。 |
浮動小数点数 | float | |
文字列 | string |
文字が連結されたものです。 |
使用例)
- 論理型
1 2 3 4 5 6
<?php $a = true; if ($a) { echo "true"; } ?>
- 整数
1 2 3 4 5 6
<?php $a = 1234; // 10進整数 $a = -123; // 負の数 $a = 0123; // 8進数 (10進数の83と等価) $a = 0x1A; // 16進数 (10進数の26と等価) ?>
- 浮動小数点
1 2 3 4 5
<?php $a = 1.234; $b = 1.2e3; $c = 7E-10; ?>
- 文字列
引用符1 2 3
<?php echo 'Hello'; ?>
二重引用符
1 2 3
<?php echo "Hello"; ?>
二重引用符を使用した文字列の場合、特殊文字のエスケープシーケンスが利用できます。
記述 意味 r ラインフィード n キャリッジリターン t 水平タブ v 垂直タブ f フォームフィード \ バックスラッシュ $ ドル記号 " 二重引用符 [0-7]{1,3} 正規表現にマッチする文字シーケンスは、8 進数表記の 1 文字です。 x[0-9A-Fa-f]{1,2} 正規表現にマッチする文字シーケンスは、16 進数表記の 1 文字です。 ヒアドキュメント
1 2 3 4 5 6 7
<?php $str = <<<EOD Example of string spanning multiple lines using heredoc syntax. EOD; ?>
ヒアドキュメントは、二重引用符と同じ特殊文字のエスケープシーケンスが使用できます。
Nowdoc1 2 3 4 5 6 7
<?php $str = <<<'EOD' Example of string spanning multiple lines using nowdoc syntax. EOD; ?>
ヒアドキュメントと似ていますが、Nowdocは、引用符のときと同様の文字列のあつかいをされるので特殊文字のエスケープシーケンスはできません。
複合型
型名 | 説明 | |
配列 | array | 順番付けられたマップです。 マップは型の一種で、 値をキーに関連付けます。 |
オブジェクト | object | クラスの定義からインスタンス化したデータと振舞いを持つデータ型の変数 |
使用例)
- 配列
- オブジェクト
1 2 3 4 5 6 7 8 9 10 11 12 13
<?php class foo { function do_foo() { echo "foo を実行します。"; } } $bar = new foo; $bar->do_foo(); ?>
特殊な型
型名 | 説明 | |
リソース | resource | リソースは特別な変数であり、外部リソースへのリファレンスを保持しています。 ファイルやデータベース接続、SQLの実行結果などを管理しています。 |
ヌル | NULL | 値を持たないことを表します。 |
PHP入門 第6回 コメント
PHPでのコメントの書き方を勉強します。
コメントの書き方には3種類あります。
コメント | 説明 |
/* */ | 複数行のコメント |
// | 1行のコメント |
# | 1行のコメント |
使用例
1 2 3 4 5 6 7 8 9 10 |
<?php // これは1行のコメントです。 # この行も1行のコメントです。 /* これは 複数行の コメントです。 */ ?> |
このようにコメントは使用します。
コメント文はPHPのプログラムとして解釈されません。
1行のコメントについて例外があります。
1行のコメント「//」「#」の記述してある行にPHPスクリプト終了タグがあった場合それは、コメントとみなされずスクリプト終了タグとして処理されるので注意してください。