変数とデータ型
PHPで利用できる基本的な変数宣言とデータ型の一覧です。
変数宣言
ドル記号 ($
) の後に変数名を記述します。
データ型
データ型 | 説明 | 例 |
---|---|---|
string (文字列) | 文字の並び | |
int (整数) | 符号付き整数 | |
float (浮動小数点数) | 小数 | |
bool (論理値) | 真 (true) または偽 (false) | |
array (配列) | 順序付けられたマップ | |
object (オブジェクト) | クラスのインスタンス | |
null (ヌル) | 値が存在しないことを示す | |
resource (リソース) | 外部リソースへの参照 (ファイルハンドルなど) |
型チェックとキャスト
gettype($var)
: 変数の型を取得is_string($var)
,is_int($var)
,is_float($var)
,is_bool($var)
,is_array($var)
,is_object($var)
,is_null($var)
: 型をチェック(string)$var
,(int)$var
,(float)$var
,(bool)$var
,(array)$var
,(object)$var
: 型キャスト
演算子
計算や比較などに使う演算子です。
種類 | 演算子 | 説明 |
---|---|---|
算術演算子 | + | 加算 |
- | 減算 | |
* | 乗算 | |
/ | 除算 | |
% | 剰余 | |
代入演算子 | = , += , -= , *= , /= , %= , .= | 変数に値を代入 |
比較演算子 | == | 等しい (型変換を行う) |
=== | 等しい (型も比較) | |
!= or <> | 等しくない (型変換を行う) | |
!== | 等しくない (型も比較) | |
< , > | 小なり、大なり | |
<= , >= | 小なりイコール、大なりイコール | |
<=> | 宇宙船演算子 (比較結果を -1, 0, 1 で返す) | |
論理演算子 | and or && | 論理積 (AND) |
or or || | 論理和 (OR) | |
xor | 排他的論理和 (XOR) | |
! | 否定 (NOT) | |
インクリメント/デクリメント | ++$a , $a++ | インクリメント |
--$a , $a-- | デクリメント | |
文字列演算子 | . | 文字列結合 |
配列演算子 | + | 配列の結合 |
== , === , != , etc. | 配列の比較 | |
三項演算子 | (条件) ? 真の場合の値 : 偽の場合の値 | 条件に基づいて値を返す |
Null合体演算子 | $a ?? $b | $a が null でなければ $a を、null なら $b を返す |
Null合体代入演算子 | $a ??= $b | $a が null の場合、$b を $a に代入する |
エラー制御演算子 | @ | 式のエラーを抑制する |
制御構造
プログラムの流れを制御するための構文です。
条件分岐
if / elseif / else
switch
match (PHP 8.0+)
switch
と似ていますが、より厳密な比較 (===
) を行い、値を返す式です。
ループ
for
while
do-while
条件に関わらず、最低1回はブロック内の処理が実行されます。
foreach
配列やオブジェクトの要素を反復処理します。
ループ制御
break
: 現在のループ (for
,while
,do-while
,foreach
,switch
) を終了します。continue
: 現在のループの反復処理をスキップし、次の反復処理に進みます。
関数
特定の処理をまとめて再利用可能にするためのブロックです。
基本的な関数定義と呼び出し
引数
型宣言 (Type Hinting)
引数の型を指定できます。
デフォルト引数値
可変長引数 (Variadic functions)
...
を使って、任意の数の引数を受け取れます。
戻り値
return
文
関数の結果を返します。
戻り値の型宣言
関数の戻り値の型を指定できます。
戻り値の型として void
を指定すると、関数が何も返さないことを示します (PHP 7.1+)。
無名関数 (クロージャ)
変数に関数を代入できます。親スコープの変数を引き継ぐには use
キーワードを使います。
アロー関数 (PHP 7.4+)
より簡潔な無名関数の構文です。親スコープの変数は自動的に引き継がれます。
可変関数
変数名を使って関数を呼び出します。
配列
複数の値をまとめて管理するためのデータ構造です。
配列の作成
要素へのアクセス
添字(数値または文字列キー)を使ってアクセスします。
要素の追加・変更・削除
配列操作関数 (一部)
関数 | 説明 | 例 |
---|---|---|
count($array) | 要素数を返す | |
sort($array) | 配列を昇順にソート (値を変更) | |
rsort($array) | 配列を降順にソート (値を変更) | |
asort($array) | 連想配列を値で昇順ソート (キー保持) | |
ksort($array) | 連想配列をキーで昇順ソート | |
array_push($array, $val1, ...) | 配列の末尾に要素を追加 | |
array_pop($array) | 配列の末尾の要素を取り出す | |
array_unshift($array, $val1, ...) | 配列の先頭に要素を追加 | |
array_shift($array) | 配列の先頭の要素を取り出す | |
array_merge($arr1, $arr2, ...) | 配列を結合する (数値キーは振り直し) | |
array_keys($array) | 配列の全てのキーを返す | |
array_values($array) | 配列の全ての値を返す (数値添字配列になる) | |
in_array($needle, $haystack) | 配列内に値が存在するかチェック | |
array_key_exists($key, $array) | 配列内に指定したキーが存在するかチェック | |
array_map($callback, $array1, ...) | 各要素に関数を適用し、新しい配列を返す | |
array_filter($array, $callback, $mode) | 関数でフィルタリングし、条件に合う要素のみの新しい配列を返す | |
array_slice($array, $offset, $length, $preserve_keys) | 配列の一部を切り出す | |
array_splice($array, $offset, $length, $replacement) | 配列の一部を削除または置換する (元の配列を変更) |
多次元配列
配列の要素として、さらに配列を持つことができます。
文字列操作
文字列を処理するための関数群です。
関数 | 説明 | 例 |
---|---|---|
. (結合演算子) | 文字列を結合する | |
strlen($string) | 文字列のバイト長を返す (マルチバイト注意) | |
mb_strlen($string, 'encoding') | 文字列の文字数を返す (マルチバイト対応) | |
substr($string, $start, $length) | 文字列の一部を返す (バイト単位) | |
mb_substr($string, $start, $length, 'encoding') | 文字列の一部を返す (文字単位) | |
strpos($haystack, $needle, $offset) | 文字列内で部分文字列が最初に現れる位置を検索 (バイト単位) | |
mb_strpos($haystack, $needle, $offset, 'encoding') | 文字列内で部分文字列が最初に現れる位置を検索 (文字単位) | |
str_replace($search, $replace, $subject) | 文字列内の部分文字列を置換する | |
strtolower($string) | 文字列を小文字にする (ASCII) | |
strtoupper($string) | 文字列を大文字にする (ASCII) | |
mb_strtolower($string, 'encoding') | 文字列を小文字にする (マルチバイト対応) | |
mb_strtoupper($string, 'encoding') | 文字列を大文字にする (マルチバイト対応) | |
trim($string, $chars) | 文字列の先頭と末尾の空白 (または指定文字) を取り除く | |
ltrim($string, $chars) | 文字列の先頭の空白 (または指定文字) を取り除く | |
rtrim($string, $chars) | 文字列の末尾の空白 (または指定文字) を取り除く | |
explode($delimiter, $string, $limit) | 文字列をデリミタで分割し、配列にする | |
implode($glue, $pieces) or join() | 配列要素を文字列で連結する | |
sprintf($format, $args...) | フォーマットに従って文字列を生成し、返す | |
printf($format, $args...) | フォーマットに従って文字列を生成し、出力する | |
htmlspecialchars($string, $flags, $encoding, $double_encode) | 特殊文字をHTMLエンティティに変換 (XSS対策) | |
nl2br($string, $is_xhtml) | 文字列中の改行文字 (\n ) の前にHTMLの改行タグ (<br> ) を挿入する |
ファイル操作
ファイルやディレクトリを操作するための基本的な方法です。
ファイル内容の読み書き (簡易)
ファイル操作 (詳細)
fopen
, fread
, fwrite
, fclose
を使って、より細かい制御を行います。
モード | 説明 |
---|---|
r | 読み込み専用。ポインタはファイルの先頭。 |
r+ | 読み書き両用。ポインタはファイルの先頭。 |
w | 書き込み専用。ポインタはファイルの先頭。ファイルが存在すれば内容を空にし、なければ新規作成。 |
w+ | 読み書き両用。ポインタはファイルの先頭。ファイルが存在すれば内容を空にし、なければ新規作成。 |
a | 追記用。ポインタはファイルの末尾。ファイルがなければ新規作成。 |
a+ | 読み書き両用(追記)。ポインタはファイルの末尾。ファイルがなければ新規作成。 |
x | 書き込み専用で新規作成。ファイルが既に存在する場合は失敗。 |
x+ | 読み書き両用で新規作成。ファイルが既に存在する場合は失敗。 |
c | 書き込み専用。ポインタはファイルの先頭。ファイルが存在しなければ新規作成。存在する場合、内容は消去されず、ポインタのみ先頭に。 |
c+ | 読み書き両用。ポインタはファイルの先頭。ファイルが存在しなければ新規作成。存在する場合、内容は消去されず、ポインタのみ先頭に。 |
注意: ファイル操作後は必ず fclose()
でファイルを閉じるようにしましょう。
ファイル・ディレクトリのチェック関数
関数 | 説明 |
---|---|
file_exists($filename) | ファイルまたはディレクトリが存在するかチェック |
is_file($filename) | 通常のファイルであるかチェック |
is_dir($filename) | ディレクトリであるかチェック |
is_readable($filename) | 読み込み可能かチェック |
is_writable($filename) | 書き込み可能かチェック |
filesize($filename) | ファイルサイズをバイト単位で返す |
filemtime($filename) | ファイルの最終更新時刻をUnixタイムスタンプで返す |
ディレクトリ操作
関数 | 説明 |
---|---|
mkdir($pathname, $mode, $recursive) | ディレクトリを作成する |
rmdir($dirname) | 空のディレクトリを削除する |
scandir($directory) | 指定したパスのファイルとディレクトリのリストを配列で返す |
rename($oldname, $newname) | ファイルまたはディレクトリの名前を変更する |
copy($source, $dest) | ファイルをコピーする |
unlink($filename) | ファイルを削除する |
オブジェクト指向 (OOP)
クラスとオブジェクトを用いて、コードを構造化し、再利用性を高めるプログラミングパラダイムです。
クラスとオブジェクト
継承
既存のクラスの機能を引き継いで新しいクラスを作成します。
Static プロパティとメソッド
オブジェクトを生成せずにクラス名から直接アクセスできます。
定数 (const)
クラス内で変更不可能な値を定義します。
抽象クラスと抽象メソッド
インスタンス化できず、継承されることを前提としたクラス。抽象メソッドは実装を持たず、子クラスでの実装を強制します。
インターフェース (Interface)
クラスが実装すべきメソッドのシグネチャ(名前、引数、戻り値の型)を定義します。実装はクラス側で行います。
トレイト (Trait)
クラスにメソッドを「ミックスイン(取り込み)」するための仕組み。コードの再利用性を高めます。
Final キーワード
final
をクラスにつけると継承できなくなり、メソッドにつけるとオーバーライドできなくなります。
マジックメソッド
特定の状況で自動的に呼び出される、__
で始まる特別なメソッドです。
メソッド | 説明 |
---|---|
__construct() | オブジェクト生成時 |
__destruct() | オブジェクト破棄時 |
__call($name, $args) | アクセス不能なメソッド呼び出し時 |
__callStatic($name, $args) | アクセス不能な静的メソッド呼び出し時 |
__get($name) | アクセス不能なプロパティ読み込み時 |
__set($name, $value) | アクセス不能なプロパティ書き込み時 |
__isset($name) | アクセス不能なプロパティに isset() or empty() が呼ばれた時 |
__unset($name) | アクセス不能なプロパティに unset() が呼ばれた時 |
__toString() | オブジェクトが文字列として扱われた時 |
__invoke() | オブジェクトが関数のように呼び出された時 |
__clone() | オブジェクトが clone された時 |
エラー処理と例外
プログラム実行中に発生する可能性のあるエラーや予期しない状況に対処する方法です。
try-catch ブロック
例外が発生する可能性のあるコードを try
ブロックで囲み、発生した例外を catch
ブロックで捕捉して処理します。finally
ブロックは例外の有無に関わらず必ず実行されます。
カスタム例外
Exception
クラス (またはそのサブクラス) を継承して、独自の例外クラスを作成できます。
エラーレポート設定
開発環境と本番環境でエラー表示レベルを制御します。
error_reporting(level)
: レポートするエラーレベルを設定します。例:E_ALL
(全てのエラー),E_ALL & ~E_NOTICE
(Notice以外)。ini_set('display_errors', 'On'/'Off')
: エラーを画面に表示するかどうかを設定します。開発中は ‘On’, 本番環境では ‘Off’ にするのが一般的です。ini_set('log_errors', 'On'/'Off')
: エラーをログファイルに記録するかどうかを設定します。ini_set('error_log', '/path/to/php-error.log')
: エラーログファイルのパスを指定します。
データベース操作 (PDO)
PHP Data Objects (PDO) は、様々なデータベースへのアクセスを統一的なインターフェースで提供する拡張モジュールです。SQLインジェクション対策としてプリペアドステートメントの使用が推奨されます。
データベース接続
注意: 接続情報(ユーザー名、パスワード)はコードに直接書かず、設定ファイルなどから読み込むのが安全です。
クエリの実行 (プリペアドステートメント)
SQLインジェクションを防ぐ最も安全な方法です。
SELECT (データ取得)
INSERT (データ挿入)
UPDATE (データ更新)
DELETE (データ削除)
トランザクション処理
複数のクエリをひとまとまりの処理として扱い、全て成功した場合のみデータベースに反映させます(コミット)。途中でエラーが発生した場合は、それまでの処理を取り消します(ロールバック)。これによりデータの整合性を保ちます。
クエリの実行 (簡易: query / exec)
注意: これらの方法は、外部からの入力を直接SQLに埋め込むとSQLインジェクションの脆弱性を生む可能性があります。ユーザー入力など信頼できない値を含まない固定的なSQL、または適切にエスケープ処理が行える場合に限定して使用してください。通常はプリペアドステートメントの使用が強く推奨されます。
日付と時刻
PHP で日付や時刻を扱うためのクラスや関数です。DateTime
Immutable クラス (PHP 5.5+) は、メソッド呼び出し時に元のオブジェクトを変更せず、新しいオブジェクトを返すため、予期せぬ変更を防ぎやすく推奨されます。
DateTime
/ DateTimeImmutable
クラス
format()
で使用できる主な書式文字:
Y
: 4桁の年 (例: 2024)y
: 2桁の年 (例: 24)m
: 2桁の月 (01-12)n
: 先頭ゼロなしの月 (1-12)d
: 2桁の日 (01-31)j
: 先頭ゼロなしの日 (1-31)H
: 2桁の時 (24時間表記, 00-23)h
: 2桁の時 (12時間表記, 01-12)i
: 2桁の分 (00-59)s
: 2桁の秒 (00-59)A
: 午前/午後 (AM/PM)w
: 曜日 (0:日曜 – 6:土曜)U
: Unixタイムスタンプc
: ISO 8601形式 (例: 2004-02-12T15:19:21+00:00)r
: RFC 2822形式 (例: Thu, 21 Dec 2000 16:01:07 +0200)P
: タイムゾーンオフセット (例: +09:00)T
: タイムゾーン識別子 (例: Asia/Tokyo)
DateInterval
クラス
二つの日時の間の期間や、DateTime::add()
, DateTime::sub()
で使用する期間を表します。
日付/時刻関連の関数
DateTime
クラスが導入される前から存在する関数群です。現在では DateTime
/DateTimeImmutable
の利用が推奨されますが、互換性や特定の用途で使われます。
関数 | 説明 | 例 |
---|---|---|
date($format, $timestamp) | Unixタイムスタンプを指定した書式でフォーマットする (タイムスタンプ省略時は現在時刻) | |
time() | 現在の Unix タイムスタンプ (1970年1月1日 00:00:00 GMT からの経過秒数) を返す | |
strtotime($time, $now) | 英文形式の日付/時刻表現を Unix タイムスタンプに変換する | |
mktime($hour, $minute, $second, $month, $day, $year) | 指定した日時から Unix タイムスタンプを生成する | |
getdate($timestamp) | Unix タイムスタンプから日付/時刻情報を要素とする連想配列を返す | |
checkdate($month, $day, $year) | 指定された日付がグレゴリオ暦として有効かチェックする |
セッション管理
ユーザーがウェブサイトを訪れている間、ユーザー固有の情報をサーバーサイドで維持するための仕組みです。通常、セッションIDがクッキーを使ってブラウザに保存され、リクエストごとに送信されます。
セッションの開始と利用
注意: session_start()
は、HTMLなどの出力がブラウザに送信される前に呼び出す必要があります。
セッションを利用する各ページの先頭(出力前)で session_start()
を呼び出すことで、前のページで設定した $_SESSION
変数の値にアクセスできます。
セッションの破棄
セッション設定 (php.ini または ini_set)
セキュリティ向上のため、以下の設定を確認・変更することが推奨されます。
session.use_strict_mode = 1
: PHPが初期化していないセッションIDを受け付けなくなり、セッション固定化攻撃のリスクを軽減します。(PHP 5.5.2+) 推奨session.use_cookies = 1
: セッションIDの管理にクッキーを使用します。通常は1です。session.use_only_cookies = 1
: URLなどにセッションIDが含まれるのを防ぎ、セッションハイジャックのリスクを軽減します。推奨session.cookie_httponly = 1
: JavaScriptからセッションクッキーにアクセスできなくなり、XSSによるセッションID盗難のリスクを軽減します。強く推奨session.cookie_secure = 1
: HTTPS接続の場合のみセッションクッキーを送信するようにします。HTTPSサイトでは必須。session.gc_maxlifetime = 1440
: セッションデータがガベージコレクション(削除)されるまでの秒数(デフォルトは1440秒=24分)。必要に応じて調整します。session.cookie_lifetime = 0
: セッションクッキーの有効期限(秒)。0はブラウザを閉じるまで有効。session.save_path = "/path/to/sessions"
: セッションファイルの保存場所。デフォルトの場所から変更し、ウェブサーバーから直接アクセスできない場所に設定するとより安全です。session.name = PHPSESSID
: セッションIDを格納するクッキー名。デフォルトから変更することが推奨される場合があります。session.regenerate_id = 1
: (PHP 7.1 で非推奨化, session_regenerate_id() を使う) 定期的にセッションIDを再生成します。ログイン成功時などにsession_regenerate_id(true)
を呼び出すのが一般的です。
クッキー操作
サーバーからユーザーのブラウザに小規模なデータを保存させる仕組みです。HTTPヘッダーを通じて送受信されます。
注意: クッキーはユーザーが改変・削除できるため、重要な情報や認証情報そのものを直接保存するのは避けるべきです。通常はセッションIDのような一時的な識別子を保存するために使われます。
注意: setcookie()
は、HTMLなどの出力がブラウザに送信される前に呼び出す必要があります。
クッキーの設定 (送信)
クッキーの取得
ブラウザから送信されたクッキーは、スーパーグローバル変数 $_COOKIE
に連想配列として格納されます。
クッキーの削除
クッキーを削除するには、同じ名前のクッキーを過去の有効期限で設定します。他のパラメータ(パス、ドメインなど)も設定時と同じにする必要があります。
⇆ JSON 操作
JavaScript Object Notation (JSON) は、データ交換フォーマットとして広く使われています。PHPでは、配列やオブジェクトとJSON文字列を相互に変換する関数が用意されています。
PHPのデータ → JSON文字列 (エンコード)
json_encode()
関数を使用します。
JSON文字列 → PHPのデータ (デコード)
json_decode()
関数を使用します。
正規表現 (PCRE)
PHPはPerl互換の正規表現 (PCRE – Perl Compatible Regular Expressions) をサポートしており、文字列の複雑なパターンマッチングや置換、分割が可能です。preg_
系の関数を使用します。
正規表現パターンは通常、デリミタ(多くは /
)で囲み、必要に応じて末尾に修飾子をつけます。
パターンマッチ (preg_match
)
文字列がパターンにマッチするかどうかを調べ、最初にマッチした部分を取得します。
全パターンマッチ (preg_match_all
)
文字列中にあるパターンにマッチする全ての箇所を検索します。
置換 (preg_replace
)
パターンにマッチした部分を別の文字列に置き換えます。
分割 (preg_split
)
文字列をパターンに基づいて分割し、配列にします。
その他の関数と注意点
preg_quote($str, $delimiter)
: 正規表現の特殊文字(メタ文字:. \ + * ? [ ^ ] $ ( ) { } = ! < > | : - #
など)をエスケープします。ユーザー入力などをパターンの一部として使う場合に安全です。preg_last_error()
/preg_last_error_msg()
: 直前のPCRE関数実行時のエラーコード/メッセージを取得します (PHP 7.0+)。- パフォーマンス: 複雑すぎる正規表現や、バックトラックが多く発生する可能性のあるパターンは、パフォーマンスに影響を与えることがあります。
- 文字エンコーディング: マルチバイト文字(日本語など)を扱う場合は、
u
修飾子 (UTF-8モード) をパターンに追加することが重要です。これにより、正規表現エンジンが文字単位で正しく動作します。
その他
その他の便利な構文や関数です。
定数定義
define("CONSTANT_NAME", value, case_insensitive)
: グローバル定数を定義します。実行時に定義されます。第3引数(大文字小文字区別しない)は非推奨。const CONSTANT_NAME = value;
: クラス外でもグローバル定数を定義できます(PHP 5.3+)。コンパイル時に定義されます。こちらが推奨されることが多いです。
ファイルのインクルード
他のPHPファイルを読み込みます。
include 'file.php';
: ファイルを読み込みます。ファイルが見つからない場合は Warning が発生し、スクリプトの実行は継続されます。require 'file.php';
: ファイルを読み込みます。ファイルが見つからない場合は Fatal Error が発生し、スクリプトの実行は停止します。include_once 'file.php';
:include
と同じですが、同じファイルが既に読み込まれている場合は再読み込みしません。require_once 'file.php';
:require
と同じですが、同じファイルが既に読み込まれている場合は再読み込みしません。関数やクラス定義の重複を防ぐためによく使われます。
名前空間 (Namespace)
クラス、インターフェース、関数、定数などの名前の衝突を防ぐための仕組みです (PHP 5.3+)。
オートロード (Autoloading)
クラスやインターフェースなどが初めて使われる際に、対応するファイルを自動的に読み込む仕組みです。require_once
を大量に書く必要がなくなります。