PHP チートシート — 簡潔なリファレンス
PHP 8.3 の構文、型、配列と最もよく使う標準ライブラリをカバーするチートシートで、日常シーンの約 80% を網羅する。
PHP PHP 8.3(LTS 相当)
Zend Engine(PHP ランタイム) · 命令型 · OO · 関数型 · 動的(オプションで静的型付け)
おすすめの学習パス
まず php hello.php と php -S 内蔵サーバーを使いこなす → 変数、型、フロー制御を修得 → 関数、クロージャ、配列を深く学ぶ → 参照のセマンティクスとオブジェクトの参照ハンドルを理解 → クラス、インターフェース、例外でコードを組み立てる → 必要に応じてファイル I/O、cURL、日付、正規表現を学ぶ → Fiber/pcntl で並行処理に対応する。FAQ セクションは後で落とし穴を回避するのに役立つ。
1.Hello World と実行環境
PHP プログラムの実行、組み込み Web サーバー、コマンドライン引数と終了コード。
最小プログラム
PHP ファイルは <?php で始まり、CLI では php ファイル名 で実行する。echo で文字列を出力する。
CLI 実行
php コマンドでスクリプトを直接実行する。php -l で構文チェック、php -r でコードを直接実行する。
組み込み Web サーバー
php -S で組み込みサーバーを起動し、ディレクトリをドキュメントルートとして、ローカル開発やデバッグに合う。
ファイル構造
<?php と ?> タグで PHP と HTML を分ける。PHP のみのファイルでは閉じタグを省略することを推奨する。
コマンドライン引数
$argv は引数の配列、$argc は引数の個数、argv[0] はスクリプト名である。
終了コード
exit() または die() でスクリプトを終了しステータスコードを返す。0 が成功、0 以外がエラーである。
ファイル読み込み
require は必ず存在するファイルを取り込み、include は失敗時に警告のみ、_once は二重読み込みを防ぐ。
環境チェック
php -i で設定を出力、php -m で拡張を一覧、phpinfo() で完全な情報を出力する。
2.変数と定数
変数の宣言、定数、型宣言、strict モードとスコープ。
変数宣言
変数は $ で始まり、型の宣言は不要で、最初に代入した時点で作成され、名前は大文字小文字を区別する。
値コピー代入
通常の代入は値コピーであり、スカラーは独立する。配列もコピーされるが、内部でコピーオンライトにより最適化される。
定数
const は名前空間の定数を定義し、define() はグローバル定数を定義する。定義後に変更はできない。
マジック定数
__DIR__、__FILE__、__LINE__ などのコンパイル時定数は対応する位置で評価され、ログ出力によく使われる。
スコープと static
関数内の変数はデフォルトでローカルであり、global でグローバル変数を参照し、static で複数呼び出し間で値を保持する。
引数と戻り値の型
引数と戻り値には型を宣言でき、弱いモードでは自動変換され、strict_types と組み合わせると厳格になる。
strict モード
declare(strict_types=1) で型を厳密に検証し、一致しなければ直接 TypeError をスローする。
命名規約
クラスと名前空間はパスカルケース、関数と変数はキャメルケース、定数は全大文字で、PSR-12 に従う。
3.データ型
スカラー、配列、null、列挙と型システムを理解し、暗黙の変換と型判定を学ぶ。
スカラー型
int、float、string、bool の 4 種類のスカラー型がある。文字列はバイト列であり、中国語などはマルチバイトとして扱う。
配列
PHP の配列は順序付きマップであり、整数キーと文字列キーを持ち、リストと辞書を兼ねる。
null と空の値
null は値がないことを表す。未代入の変数、明示的な null、関数が返す null はいずれも null である。
callable と iterable
callable は呼び出し可能を表し、iterable は反復可能な配列または Traversable オブジェクトを表す。
mixed と void
mixed は任意の型を表し、void は戻り値なし、never は決して戻らないことを表す。
列挙 enum
enum(8.1+)で一連の名前付き定数を定義する。純粋な列挙もしくは値を持つ列挙で、メソッドを追加できる。
ユニオンと交差型
int|float はそのいずれかを表し、交差型は複数のインターフェース制約を同時に満たすことを要求する。
暗黙の型変換
弱いモードでは演算時に自動的に型が変換され、文字列と数値の比較規則は特殊なので FAQ を参照すること。
型判定関数
is_int、is_string などの is_* シリーズで型を判定し、真偽値を返す。
4.参照とメモリセマンティクス
PHP には生のポインターはない。変数参照、コピーオンライト、オブジェクトハンドル、null 処理について。
参照とは何か
PHP の参照は変数の別名であり、2 つの名前が同じ内容を指し、一方を変更すれば他方も変更される。
コピーオンライト
配列とオブジェクトの代入ではまずデータが共有され、実際に書き込まれた時点でコピーされ、メモリを節約する。
参照の解除
unset は現在の名前の参照のみを解除し、他の別名が指す内容には影響しない。
参照引数
引数の前に & を付けると参照渡しとなり、関数内での変更が呼び出し元の変数に反映される。
オブジェクトハンドル
オブジェクト変数はハンドルを保持し、代入や引数渡しでは同じインスタンスを指す。複製するには clone を使う。
null 処理
isset は存在し null でないことを判定し、is_null は null であることを判定し、empty は空であることを判定する。
null 合体演算子 ??
?? は左辺が存在しないか null の場合に右辺を返し、連鎖可能で、throw と組み合わせることも可能である。
可変変数
$$var は変数の値を別の変数名として使う。可読性が低いため、配列の使用を推奨する。
unset とメモリ
unset で名前を解放し参照カウントを減少させ、0 になるとメモリは回収可能となり、循環参照は GC が処理する。
5.制御フロー
条件分岐、ループ、switch、match、そして break/continue。
if / else
if で条件を判定して分岐を実行し、elseif で順次判定し、else でフォールバックする。
三項演算子
条件 ? 真の値 : 偽の値 は式であり代入できる。ネストは可読性を損なう。
switch 文
switch はデフォルトで緩い比較を行い、マッチ後に break しないとフォールスルーし、default がフォールバックとなる。
match 式
match(8.0+)は厳密比較で値を返し、分岐が自動的に戻り、break は不要である。
for ループ
for(初期化; 条件; ステップ) は古典的なカウンタループであり、ステップは自由に制御できる。
foreach での反復
foreach は配列とオブジェクトを反復処理し、キーと値を同時に取得でき、参照での変更には残存に注意が必要である。
while と do-while
while は先に条件を判定するため一度も実行されないことがあり、do-while は必ず一度は実行される。
break と continue
break はループや switch を抜け、continue は次の繰り返しへ進む。数値を付ければ複数階層を抜けられる。
6.関数とクロージャ
関数定義、デフォルト引数、可変長引数、名前付き引数、クロージャとジェネレータ。
関数定義
function で関数を定義し、引数に型を付け、return で値を返す。関数名は大文字小文字を区別しない。
デフォルト引数
引数にはデフォルト値を指定でき、呼び出し時に省略できる。デフォルト値は定数式でなければならない。
可変長引数
...$args は残りの引数をすべて配列としてまとめる。引数リストの最後に置く。
名前付き引数
呼び出し時に 引数名: 値 の形で渡せる(8.0+)。省略可能な引数を飛ばせ、順序も自由。
戻り値の型
戻り値の型はコロンの後ろに宣言する。void、?T、合併型、配列に対応する。
クロージャ
無名関数は function() で定義し、use で外側の変数を捕捉する。変数に代入したりコールバックとして渡せる。
アロー関数
fn() => 式 は外側の変数を自動的に値で捕捉する。単一の式で簡潔に書けるため、コールバックによく使われる。
呼び出し可能オブジェクト
8.1+ では strlen(...) で first-class callable を作り、関数を第一級の値として扱える。
ジェネレータ
yield で値を一つずつ生成する関数をジェネレータと呼ぶ。遅延評価なので大量データの処理でメモリを節約できる。
7.文字列
文字列リテラル、変数展開、連結、マルチバイト処理とよく使う関数。
文字列リテラル
シングルクォートはそのまま出力し、ダブルクォートはエスケープと変数を解釈する。この二つのスタイルがよく使われる。
変数展開
ダブルクォート内では $var がそのまま展開される。複雑な式は波括弧を使って {$arr['k']} と書く。
文字列の連結
. は二つの文字列を連結し、.= は追記する。何度も連結する場合は implode や sprintf のほうが読みやすい。
マルチバイト関数
日本語などを扱うときは mb_ で始まる関数を使って文字数で数える。strlen はバイト数で数える。
sprintf による書式化
sprintf/printf は %s や %d のプレースホルダで書式化でき、連結より読みやすい。
検索と置換
strpos で位置を探し、str_contains で含まれるかを判定し、str_replace でまとめて置換する。
分割と結合
explode は区切り文字で配列に分割し、implode は配列を文字列に戻す。
大文字小文字と空白除去
strtolower/strtoupper で大文字小文字を変換し、trim で前後の空白を除去する。ltrim/rtrim は片側だけを除去する。
8.配列とコレクション
配列の作成、追加・削除・更新・参照、走査、ソートと Spl データ構造。
配列の作成
[] または array() で配列を作る。配列リテラルは連番の整数キーを自動的に割り当てる。
アクセスと変更
添字で要素にアクセスし、[] で追加、unset で削除する。存在しないキーを読むと警告が出る。
追加・削除と件数
array_push/array_pop は末尾を操作し、array_shift/unshift は先頭を操作する。count で件数を数える。
配列の走査
foreach で値またはキーと値の組を走査する。リスト分解を使えば二次元配列も走査できる。
マップとフィルタ
array_map は要素ごとに変換し、array_filter はコールバックで絞り込み、array_reduce は畳み込む。
ソート
sort は値を並べ替え、ksort はキー順、asort は値順でキーの対応を保ち、usort は比較を自作する。
結合とスライス
array_merge は配列を結合し、array_slice は部分配列を取り出し、array_combine はキーと値を組み合わせる。
分割代入
リスト形式の [] やキー指定の [] による分解で、配列の要素を複数の変数にまとめて代入できる。foreach の中でも使える。
Spl データ構造
SplStack、SplQueue、SplFixedArray は用途を絞ったデータ構造を提供する。
9.メモリと性能
参照カウント、循環参照の GC、WeakReference とメモリ計測。
参照カウント
zval が参照数を記録し、ゼロになった時点で即座に解放される。代入や引数渡しでカウントが増える。
循環参照の GC
オブジェクトが互いに参照し合うと参照カウントがゼロにならないため、循環参照用のガベージコレクタが定期的に回収する。
WeakReference 弱参照
WeakReference(8.0+)はオブジェクトを保持しつつ回収を妨げないため、キャッシュなどの用途に向く。
メモリ計測
memory_get_usage で現在の使用量を、memory_get_peak_usage でピーク値を確認する。
早めの解放
大きな変数は使い終わったら unset で参照カウントをゼロにするとピークが下がり、バッチ処理が安定する。
OPcache キャッシュ
OPcache はコンパイル済みのバイトコードをキャッシュし、リクエストごとの再コンパイルを防ぐ。本番では必ず有効にする。
大規模データの処理
巨大な配列はメモリを圧迫するため、ジェネレータやストリーム読み込み、SplFixedArray で使用量を抑える。
性能の要点
ループ内での文字列連結を避け、事前に確保し、接続を使い回し、無駄なクエリを減らす。
10.オブジェクト指向
クラス、コンストラクタ、可視性、継承、インターフェース、trait と読み取り専用プロパティ。
クラス定義
class でクラスを定義し、プロパティに型を付け、メソッドをクラス内に宣言する。new でインスタンスを生成する。
コンストラクタとプロパティ昇格
__construct はオブジェクトを初期化するコンストラクタ。8.0+ ではコンストラクタ引数をそのままプロパティに昇格できる。
可視性
public は公開、protected はサブクラスから参照可能、private は自クラスのみ。既定は public。
継承
extends で親クラスを継承し、メソッドをオーバーライドし、parent:: で親クラスのメソッドを呼ぶ。
インターフェース
`interface` はメソッドのシグネチャを定義し、`implements` で実装する。クラスは複数のインターフェースを実装できる。
抽象クラス
`abstract class` はインスタンス化できず、抽象メソッドはサブクラスで実装する。
trait による再利用
`trait` は複数のクラスにメソッドを横方向に再利用し、`use` で取り込む。複数の trait を組み合わせることもできる。
静的メンバー
`static` プロパティとメソッドはインスタンスではなくクラスに属し、`self::` または `クラス名::` でアクセスする。
読み取り専用プロパティ
`readonly` プロパティ(8.1+)は宣言時とコンストラクタで 1 回だけ代入でき、その後は読み取り専用となる。
11.エラー処理
例外の階層、try/catch/finally、独自の例外とエラー処理。
try / catch
`try` ブロックで投げられた例外は `catch` で捕捉され、捕捉後はプログラムの実行が継続する。
Throwable の階層
`Throwable` は基底クラスで、`Error` はエンジン側のエラー、`Exception` はプログラム側の例外を表す。
独自の例外
`Exception` または `RuntimeException` を継承して業務例外を定義し、追加フィールドを保持できる。
多重キャッチ
複数の例外型を `catch` するには `|` で区切る。上から順にマッチングされるため、サブクラスを親クラスより先に書く。
finally
`finally` ブロックは例外の有無に関わらず実行され、リソースの解放や接続のクローズに使う。
グローバル例外ハンドラ
`set_exception_handler` は未捕捉例外の受け皿となり、ログとレスポンスを一元化する。
Error と Exception
エンジンのエラー(型/引数)は `Error`、業務上の例外は `Exception` であり、別々に捕捉する。
例外チェーン
`catch` 内で新しい例外を投げるとき、元の例外を第 3 引数に渡すと `getPrevious` で遡れる。
12.ファイル I/O
ファイルの読み書き、JSON、CSV、標準ストリーム。
ファイルの読み込み
`file_get_contents` はファイル全体を一つの文字列として読み込む。小さなファイルに向いており、失敗時は `false` を返す。
ファイルの書き込み
`file_put_contents` は文字列を書き込み、追記には `FILE_APPEND` を指定する。書き込みバイト数を返す。
行単位の読み込み
`fopen` と `fgets` を組み合わせて行単位で読み込む。メモリ使用量が一定のため、大規模ファイルに適する。
オープンモード
`fopen` の `r` / `w` / `a` などのモードが読み書きの挙動を制御し、`w` は既存の内容を消去する。
JSON のエンコード/デコード
`json_encode` で JSON に変換し、`json_decode` で解析する。第 2 引数に `true` を指定すると配列として取得できる。
CSV の読み書き
`fgetcsv` は 1 行の CSV を解析し、`fputcsv` は 1 行を書き出す。引用符やエスケープは自動で処理される。
ディレクトリと glob
`glob` はパターンでファイルをマッチし、`scandir` はディレクトリを列挙し、`mkdir` はディレクトリを作成する。
標準ストリーム
`STDIN`、`STDOUT`、`STDERR` の定数は標準入力/標準出力/標準エラー出力に対応し、CLI でよく使われる。
13.よくある落とし穴
日常開発で踏みやすい落とし穴と正しい書き方。
== と ===
`==` は型を緩く比較し、`===` は型と値の両方を厳密に比較する。判定には基本的に `===` を使う。
foreach の参照の落とし穴
`foreach` で `&` を使って要素を変更したあと、最後の要素は元の配列を指したままになり、`$item` を再利用すると思いがけない上書きが起きる。
isset とキーの存在
`isset` は値が `null` のキーを「存在しない」とみなす。キーが実在するかどうかは `array_key_exists` で判定する。
弱い型比較の落とし穴
弱い比較では文字列と数値のルールが特殊で、`'0'` と `false` が等しくなる。明示的に型変換が必要。
未定義キーの警告
存在しない配列キーにアクセスすると警告が出る(8.0+)。`??` や `isset` で先に判定する。
出力後のレスポンスヘッダ送信
すでに出力したあとに `header()` を呼ぶと失敗する。先にバッファを有効化するか、ヘッダを先に送信する。
empty と isset
`empty` は `0`、`''`、`'0'` などに対して `true` を返し、`isset` は `null` かどうかだけを判定する。意味に合う方を選ぶ。
SQL インジェクション対策
SQL 文字列の連結はインジェクションのリスクがある。PDO のプリペアドステートメントでパラメータをバインドする。
14.並行処理とコルーチン
PHP の並行モデル:マルチプロセス、コルーチン、Fiber、そしてサードパーティ拡張。
プロセスモデル
PHP はデフォルトでシングルスレッドで動作し、リクエストごとに独立したプロセスで実行されるため、変数はリクエスト終了時に解放される。
pcntl_fork によるマルチプロセス
`pcntl_fork` は子プロセスを生成し、親子それぞれのプロセスで実行される。CLI のみで利用可能。
シグナル処理
`pcntl_signal` でシグナルハンドラを登録し、`dispatch` で保留中のシグナルを配送する。
parallel 拡張
`parallel` は PECL 拡張であり、真のマルチスレッド worker を提供する。標準では組み込まれていない。
Swoole コルーチン
Swoole は高性能なネットワークフレームワークで、コルーチンによるスケジューリングと常駐メモリを特徴とし、高並行処理に適する。
Fiber コルーチン
`Fiber`(8.1+)はネイティブのコルーチンで、`suspend` で中断し、`resume` で再開する手動スケジューリングである。
非同期ライブラリ
PHP には組み込みの `async` / `await` がないため、ReactPHP や Amp といったイベントループライブラリで非同期を実現する。
プロセス間通信
複数プロセスでデータを共有するには、メッセージキュー、ファイル、共有メモリを使い、同じファイルを直接書き換えるのは避ける。
15.ネットワーク
HTTP クライアント、curl、URL 解析、セッションとソケット。
HTTP リクエスト
`file_get_contents` で簡単なリクエストを送り、`stream_context_create` でタイムアウトやヘッダを設定する。
curl 拡張
`curl_init` と `curl_exec` でリクエストを完全に制御し、ステータスコードやエラー情報を取得する。
POST と Guzzle
`stream_context` で POST の JSON を送信できるが、実運用では Guzzle クライアントを優先する。
リクエストとレスポンスヘッダー
header() でレスポンスヘッダーを送信し、http_response_code でステータスコードを設定する。出力前に呼び出す必要がある。
URL 解析
parse_url で URL の各コンポーネントを分解し、parse_str でクエリ文字列を解析、http_build_query で組み立てる。
Cookie とセッション
session_start でセッションを開始し、setcookie で Cookie を書き、$_COOKIE で読み取る。
ソケット
stream_socket_client でリモートに接続し、fwrite で送信、fgets で読み取る。
SSE と WebSocket
SSE は単方向のテキスト push、WebSocket は双方向通信で、用途に応じて選択する。
16.日付と時刻
タイムスタンプ、フォーマット、解析、タイムゾーン、時刻計算。
現在時刻の取得
time() で秒単位のタイムスタンプを取得し、microtime でミリ秒単位を取得、date でフォーマットする。
日付のフォーマット
date() はフォーマット文字でタイムスタンプをレンダリングし、年・月・日・時・分・秒とローカライズ表記に対応する。
日付の解析
strtotime は日付テキストと相対時刻を解析し、失敗時は false を返す。
タイムスタンプ
Unix タイムスタンプは UTC の秒数であり、DateTime がタイムスタンプとオブジェクトの相互変換を提供する。
タイムゾーン
date_default_timezone_set でデフォルトのタイムゾーンを設定し、DateTime は独自のタイムゾーンを保持できる。
時間間隔
DateInterval は期間を表し、DateTime の add/sub で間隔を加算・減算する。
時間差の計算
DateTime diff は DateInterval を返し、年齢や残日数などを読み取れる。
スリープとタイマー
sleep はブロッキングで一時停止し、イベントループのタイマーは非ブロッキングで遅延タスクをスケジューリングできる。
17.プロセスと CLI
コマンドライン引数、入出力、環境変数、プロセス制御。
コマンドライン引数
$argv 配列はコマンドライン引数を保持し、$argv[0] がスクリプト名である。
入力の読み取り
fgets(STDIN) は 1 行を読み、stream_get_contents は全部を読み、trim で改行を除去する。
外部コマンドの実行
shell_exec は出力を取得し、exec はステータスコードを取得する。引数渡しは escapeshellarg でインジェクションを防ぐ。
環境変数
getenv で環境変数を読み取り、putenv で設定する。機密性の高い設定は環境変数経由とする。
プロセス情報
getmypid で現在の PID を取得し、posix_* 系でユーザーと親プロセスを調べ、hrtime で計測する。
プロセスシグナル
pcntl_signal でシグナル処理を制御し、pcntl_wait で子プロセスの終了を待つ。
パイプと端末
stream_isatty で対話端末かを判定し、stderr で進捗を出力し、exit で終了コードを制御する。
終了コード
exit() は終了コードを渡し、0 が成功・非 0 が失敗で、シェルは $? で読み取る。
18.正規表現
マッチ、キャプチャ、置換、分割、マルチバイトモード。
preg_match
preg_match は最初の結果にマッチし、キャプチャグループは $m に格納される。名前付きグループは名前で取得する。
preg_match_all
すべての結果にマッチし、デフォルトはグループ単位、PREG_SET_ORDER はマッチ単位でグループ化する。
preg_replace
正規表現で置換し、$1 でキャプチャグループを参照する。preg_replace_callback はコールバックで処理する。
よく使うパターン
文字クラス、数量子、貪欲マッチ、正規表現のデリミタとエスケープ規則。
キャプチャとアサーション
キャプチャグループ、非キャプチャグループ、名前付きグループ、前後アサーション。
アンカーと境界
^ は行頭、$ は行末、\b は単語境界で、m 修飾子で複数行マッチに対応する。
正規表現による分割
preg_split は正規表現で文字列を分割し、区切り文字を保持したり数を制限したりできる。
マルチバイトと u 修飾子
マルチバイト文字を扱うには u 修飾子を付け、preg_quote でユーザー入力をエスケープする。
19.ビルドとツールチェーン
Composer の依存管理、オートロード、CLI ビルドフロー。
プロジェクトの初期化
composer init は composer.json を生成し、依存関係とオートロードルールを宣言する。
依存関係のインストール
composer install は lock に基づいてインストールし、require で新しい依存関係を追加する。
依存関係の取り込み
require vendor/autoload.php を実行すれば依存クラスを use でき、オートロードが有効になる。
PSR-4 オートロード
名前空間とディレクトリが 1 対 1 に対応し、App\ が src/ にマップされる。dump-autoload が必要。
Composer スクリプト
composer.json の scripts はコマンドのエイリアスを定義し、インストールフックのコールバックに対応する。
バージョン制約
^、~、>= などの制約構文で依存バージョンの範囲を制御し、lock で正確な版を固定する。
CLI コマンド
フレームワークコマンド(artisan / console)がマイグレーション、キャッシュ、スケジュールタスクを実行する。
PHP 設定
php -i / php --ini / php -m でランタイムを検査し、ini_get で設定を参照する。
このチートシートについて
本ページは PHP 8.3 の自己完結的なチートシートであり、実プロジェクトで頻出する言語コアと最もよく使う標準ライブラリの約 80% の一般的用法をカバーする。内容は現代のイディオムに寄せており、declare(strict_types=1) 厳格モード、enum、readonly プロパティ、match 式、名前付き引数、アロー関数、first-class callable を含む。権威あるリファレンスは公式 PHP マニュアルと PHP The Right Way を参照。 19 のセクションはそれぞれ 1 つのテーマに焦点を当てており、最初のプログラムから配列、オブジェクト指向、よくある落とし穴までを扱う。各セクションは 8〜14 のサンプル付きサブセクション(各 5〜20 行)に分かれ、合計約 150 トピック。コードスニペットは意図的に短く、自己説明的である。 すべての処理はブラウザ内で行われる。アップロードもトラッキングもない。本ページは GuruToolkit の無料開発者ツールセットの一部であり、コードスニペットはいかなる保証もなく自由に使用できる。
バージョン 2.1.0