MMAオタクは夢を見る

一児の父のITエンジニアが送る日常記録

プログラミングPHPを自分の言葉で書いてみる vol.1

PHPの歴が2年あるのに、よくわかってない構文が多かったので改めて勉強をしています。

本はこちら

PHPの基本

大文字・小文字の区別について

  • ユーザー定義関数・キーワード

    • ユーザー定義の関数、クラス名、whileやechoなどの組み込みキーワードは大文字・小文字を区別しない為、変えても実行される
  • 変数名

    • 大文字・小文字を区別する

<?php の終了タグは直前の命令文は、セミコロンがなくても実行できる

これは知らなかったので驚きました、以下のような状態が成立します。

<?php 

echo 'これはAppleです';

echo '<br>';

echo 'これはLemonです'

?>
  • ただしあまりバグを生む可能性があることや、PHPの終了タグがないとダメなことなど条件がある為、基本はセミコロンをつけること

コメントアウトについて

  • シェル方式 #が使えるよ
  • C++方式 // が使えるよ
  • C方式 / / が使えるよ
    • C方式に関しては、ネストさせると後に書かれた閉じコメントが普通のPHPのコードと実行されてエラーになる為注意

リテラル

  • プログラムに直接書かれたデータのことで、文字列や、数値型など

データ型

スカラー

  • 単一を表す型のことで、プリミティブ型に近い、文字列、整数や、不動小数点、論理値など

整数型

  • 実行されている環境により異なるが、整数範囲の限界がある
    • 一般的には、-2,147,483,648 ~ 2,147,483,647 の間をPHPで扱うことができる
  • 整数リテラルは、以下の4種類を扱うことが可能
    • 10進数、8進数、2進数、16進数

浮動小数点型

  • 浮動小数点型は、精度15桁になっている(小数点15桁まで正確でそれ以降は丸られる)
    • コンピュータで2進数表記する場合に、正確に表現できないケースがあるため浮動小数点は正確な数値は出せない
  • そのため、比較を行うのであれば、基本的には整数に治して比較
    • もしくは、二つの数値を計算した誤差を、事前に定義した閾値に沿っているかどうかで判断をする

文字列型

  • シングルクォートとダブルクォートで表現できる
  • ダブルクォートで表現する場合は、変数を内部で展開できる
  • ダブルクォートの場合は、内部でエスケープシーケンスを使用できる

論理型

  • PHPでは以下の値は、false扱いされる
    • キーワードfalse
    • 整数値0
    • 浮動小数点数値0.0
    • 空の文字列、もしくは"0"
    • 素数がゼロの配列
    • null値

オブジェクト型

リソース

  • データベースや、ファイルにアクセスなど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種類ある
      • ローカル
      • グローバル
      • スタティック
      • 関数のパラメータ

ローカルスコープ

  • 関数内で定義された変数は、定義した関数内でしか参照できないというもの
  • 関数の外部で定義した変数も、関数の内部からアクセスすることはできない
// ローカルスコープを体験する
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への値の更新が行われた際に初めてメモリ上へデータのコピーを行うため、メモリを効率的に使うことができる仕組み

なんとなく、理解していたことを改めてしっかり言語化できたそんな日でした。