プログラミングPHPを自分の言葉で書いてみる vol.1
PHPの歴が2年あるのに、よくわかってない構文が多かったので改めて勉強をしています。
本はこちら
PHPの基本
大文字・小文字の区別について
ユーザー定義関数・キーワード
- ユーザー定義の関数、クラス名、whileやechoなどの組み込みキーワードは大文字・小文字を区別しない為、変えても実行される
変数名
- 大文字・小文字を区別する
<?php の終了タグは直前の命令文は、セミコロンがなくても実行できる
これは知らなかったので驚きました、以下のような状態が成立します。
<?php echo 'これはAppleです'; echo '<br>'; echo 'これはLemonです' ?>
- ただしあまりバグを生む可能性があることや、PHPの終了タグがないとダメなことなど条件がある為、
基本はセミコロンをつけること
コメントアウトについて
リテラル
- プログラムに直接書かれたデータのことで、文字列や、数値型など
データ型
スカラー型
- 単一を表す型のことで、プリミティブ型に近い、文字列、整数や、不動小数点、論理値など
整数型
- 実行されている環境により異なるが、整数範囲の限界がある
- 一般的には、-2,147,483,648 ~ 2,147,483,647 の間をPHPで扱うことができる
- 整数リテラルは、以下の4種類を扱うことが可能
- 10進数、8進数、2進数、16進数
浮動小数点型
- 浮動小数点型は、精度15桁になっている(小数点15桁まで正確でそれ以降は丸られる)
- コンピュータで2進数表記する場合に、正確に表現できないケースがあるため浮動小数点は正確な数値は出せない
- そのため、比較を行うのであれば、基本的には整数に治して比較
- もしくは、二つの数値を計算した誤差を、事前に定義した閾値に沿っているかどうかで判断をする
文字列型
- シングルクォートとダブルクォートで表現できる
- ダブルクォートで表現する場合は、変数を内部で展開できる
- ダブルクォートの場合は、内部でエスケープシーケンスを使用できる
論理型
オブジェクト型
リソース
- データベースや、ファイルにアクセスなどPHPの外部システムを利用するときに使われる
- 通常は関連するメソッドが入る
- リソースはPHPが参照を終えることで、自動で接続を解除できる
- ゆえに関数内のローカル変数などで利用すると便利
- 基本的には、自動的な後始末に頼らず明示的に接続を解除した方がいい
PHPの基本構文編
変数
- 識別子の頭文字に$マークをつける
- コンパイル時、実行時に型チェックを行わない
- 値が設定された時点で、その変数がメモリに作成される
可変変数
- 変数名の識別子を文字列で動的に扱える
- 以下のようにして扱う
$foo = 'bar'; $$foo = 'baz';
- $barの変数を参照すると、$fooで宣言をした、識別子barの変数を参照し、$barの中に'baz'が格納される仕組み
変数への参照
- 変数を参照渡しすることができる構文
// 変数への参照を利用した例 $foo = 'test'; echo 'foo: ' . $foo; echo nl2br("\n"); $bar = & $foo; $bar = '書き換え'; echo 'bar: ' . $bar; echo nl2br("\n"); echo 'foo: ' . $foo;
変数のスコープ
- 変数の宣言された場所によってアクセスを制御できる概念
- 全4種類ある
- ローカル
- グローバル
- スタティック
- 関数のパラメータ
- 全4種類ある
ローカルスコープ
- 関数内で定義された変数は、定義した関数内でしか参照できないというもの
- 関数の外部で定義した変数も、関数の内部からアクセスすることはできない
// ローカルスコープを体験する function updateConter() { $counter = 5; $counter++; // ローカル変数 echo $counter; echo '<br>'; } $counter = 10; // グローバル変数 updateConter(); // ローカル変数の$counterを加算 echo $counter;
- グローバルスコープ
- 関数の内部から、外部の変数にアクセスする場合は、関数ないでglobal宣言を行う必要がある
- globalスコープを宣言するには、globalキーワードを使用するか、GLOBALS配列を使用して宣言をする
// globalキーワード function updateConter() { global $counter; $counter++; // ローカル変数 } $counter = 10; // グローバル変数 updateConter(); // ローカル変数の$counterを加算 echo $counter; // GLOBALS配列 function updateConter() { $GLOBALS['counter']++; } $counter = 10; // グローバル変数 updateConter(); // ローカル変数の$counterを加算 echo $counter;
スタティック変数
- 関数内部だけで値を保持できるキーワード
- 通常呼び出すたびに初期化される関数内のローカル変数の値を保持させることができる
function updateConter() { static $counter = 0; $counter++; // ローカル変数 echo $counter . '<br>'; } $counter = 10; // グローバル変数 updateConter(); // ローカル変数の$counterを加算 updateConter(); // ローカル変数の$counterを加算 echo $counter;
メモリの解放
ガーベッジコレクション
- プログラムの使用していないデータを自動的にメモリから解放する仕組みのこと
- PHPではは参照カウンタを使用し、書き込み時に初めてコピーするコピーオンライト方式のメモリ管理を採用している
シンボルテーブル
- 変数や、関数、クラスが割り当てられているメモリのアドレスや、メモリを解放する基準となる参照カウンタの情報群
参照カウンタ
- ガーベッジコレクションが自動でメモリを解放するための基準となる数値で、シンボルテーブルはこの数値を参照する
コピーオンライト方式
- 変数aを変数bに代入するときにそのままデータのコピーを行わず、シンボルテーブルの参照情報のみ共有させること
- 変数bへの値の更新が行われた際に初めてメモリ上へデータのコピーを行うため、メモリを効率的に使うことができる仕組み
なんとなく、理解していたことを改めてしっかり言語化できたそんな日でした。