PHPの基本知識をゼロから学ぶハンズオン学習(前編)

本PHPのページは、3部作となります。焦らず進めていきましょう。

  1. 環境構築
    1. 1. VSCodeでPHPを使用する拡張機能を入れる
    2. 2. XAMPPをインストールする
      1. 2-1. XAMPPのインストール
      2. 3. XAMPPを起動
      3. 3-1. HelloWorldを表示させてみよう
        1. 3-1-1. 「2-2. XAMPPを起動」でブラウザ表示されたファイルの正体
    3. 4. phpMyAdminにアクセス
    4. 5. トラブルシューティング
        1. 5-1. 修正内容が表示されない場合
      1. 5-2. Apacheが起動しない
      2. 5-3. phpMyAdminにアクセスできない
      3. 5-4. ブラウザで文字化けする
  2. Webアプリの仕組み
    1. 1. Client と Server
    2. 2. HTTPリクエスト、HTTPレスポンス
      1. 2-1. クライアントとサーバー間の通信
      2. 2-2. HTTPプロトコル
    3. 3. クライアントサイドとサーバーサイドの言語
      1. 3-1. クライアントサイド
      2. 3-2. サーバーサイド
  3. HelloWorldを表示してみよう
    1. 1. HelloWorldを表示してみよう
    2. 2. コメントアウト
    3. 3. 改行
    4. 4. 大文字小文字の区別
    5. 5. PHPのエラー
      1. 5-1. PHPのエラーの段階
      2. 5-2. よく見かけるエラーとその対処法
  4. データ型
    1. 1. データ型とは
    2. 2. スカラー型
      1. 2-1. bool
      2. 2-2. int
      3. 2-3. float(double)
      4. 2-4. string
        1. 2-4-1. ヒアドキュメント構文
        2. 2-4-2. エスケープシーケンス
    3. 3. null型
  5. 変数
    1. 1. 変数
      1. 1-1. 変数とは
      2. 1-2. 変数の定義
        1. 1-2-1. 変数の命名規則
        2. 1-2-2. 未定義の変数の使用
      3. 1-3. 変数にデータ型の異なる値を再代入
      4. 1-4. 変数同士を結合する
        1. 1-4-1. データ型がint型(float型、double型を含む)の場合
        2. 1-4-2. データ型がstring型の場合(文字列演算子)
      5. 1-5. 文字列の中で変数を展開
      6. 1-6. 変数にnullを代入
    2. 2. 型変換
    3. 3. 変数の操作を行う関数
      1. 3-1. 変数の型や値の情報を確認(var_dump関数)
      2. 3-2. 変数を削除する(unset関数)
      3. 3-3. 変数のデータ型を判定する
    4. 4. 変数のスコープ
      1. 4-1. グローバルスコープ
        1. 4-1-1. global命令
        2. 4-1-2. $GLOBALS
      2. 4-2. ローカルスコープ
    5. 5. 可変変数
    6. 6. 静的変数
  6. 定数
    1. 1. 定数
      1. 1-1. 定数とは
      2. 1-2. 定数の定義
        1. 1-2-1. constキーワード
        2. 1-2-2. define() 関数
      3. 1-3. 定数の命名規則
  7. 配列
    1. 1. 配列
    2. 2. 添字配列
      1. 2-1. 添字配列の定義
      2. 2-2. 添字配列の要素へのアクセス
      3. 2-3. 添字配列の初期値を確認
      4. 2-4. 要素数を取得
      5. 2-5. 要素の情報を修正
      6. 2-6. 添字配列の末尾に要素を追加
      7. 2-7. 添字配列の末尾の要素を削除
      8. 2-8. 添字配列の先頭に要素を追加
      9. 2-9. 添字配列の先頭の要素を削除
      10. 2-10. 指定した添え字の配列の要素を削除
      11. 2-11. 配列の添え字を振りなおす
      12. 2-12. 添字配列の分割
      13. 2-13. 添字配列の結合
    3. 3. 連想配列
      1. 3-1. 連想配列の定義とアクセス
      2. 3-2. 連想配列に追加
      3. 3-3. 連想配列の要素を削除
      4. 3-4. 連想配列の値を修正
    4. 4. 多次元配列
      1. 4-1. 多次元配列の定義
      2. 4-2. 多次元配列のアクセス
  8. 演算子
    1. 1. 算術演算子
      1. 1-1. int型やdouble型の算術演算子
      2. 1-2. string型の数字を算術演算子
      3. 1-3. 浮動小数点の演算の注意点
    2. 2. 複合代入演算子
    3. 3. 単項演算子(インクリメント、デクリメント)
    4. 4. 比較演算子
    5. 5. 論理演算子
      1. 5-1. 論理演算子とは
      2. 5-2. ショートカット演算(短絡演算)
    6. 6. エラー制御演算子
  9. 条件分岐
    1. 1. 条件分岐とは
    2. 2. if文
      1. 2-1. if文
      2. 2-2. else文
      3. 2-3. else if文
      4. 2-4. if文のネスト
      5. 2-5. ブロック
        1. 2-5-1. 波かっこ {}
        2. 2-5-2. コロン : と endif;
        3. 2-5-3. ブロックの省略
    3. 3. switch文
      1. 3-1. switch文の定義
      2. 3-2. switch文を抜けるには
    4. 4. match式
      1. 4-1. match式の定義
      2. 4-2. switch文とmatch式の比較
  10. 繰り返し処理
    1. 1. 繰り返し処理とは
    2. 2. for文
      1. 2-1. for文
      2. 2-2. for文のネスト
    3. 3. while文 と do-while文
      1. 3-1. while文
      2. 3-2. do-while文
      3. 3-3. while文 と do-while文の違い
    4. 4. foreach文
      1. 4-1. 連想配列の要素を取得
      2. 4-2. 添字配列の要素を取得
    5. 5. 無限ループ
    6. 6. break命令
    7. 7. continue命令
    8. 8. goto命令
      1. 8-1. 遷移先の定義
      2. 8-2. goto命令の定義
      3. 8-3. 注意点
  11. ユーザー定義関数
    1. 1. ユーザー定義関数の定義
      1. 1-1. 関数の定義
      2. 1-2. 関数名の命名規則
      3. 1-3. 関数の定義位置
      4. 1-4. インクルードファイルの読み込み方法
        1. 1-4-1. インクルードファイルのスコープ
    2. 2. 関数の呼び出し
    3. 3. 仮引数と実引数
      1. 3-1. 仮引数
        1. 3-1-1. 仮引数の定義
        2. 3-1-2. デフォルト引数値
      2. 3-2. 実引数
        1. 3-2-1. 関数の呼び出し
        2. 3-2-2. 名前付き引数
      3. 3-3. 引数の並び順
    4. 4. 戻り値
      1. 4-1. 戻り値とは
      2. 4-2. 複数の戻り値
    5. 5. 型宣言
      1. 5-1. スカラー型(基本のデータ型)
      2. 5-2. 複合型
      3. 5-3. 特殊型
        1. 5-3-1. resource
        2. 5-3-2. void
        3. 5-3-3. union types
        4. 5-3-4. mixed
        5. 5-3-5. never
        6. 5-3-6. true / false
      4. 5-4. オブジェクト・インターフェース型
      5. 5-5. null許容型(nullable 型)
      6. 5-6. false 擬似型
    6. 6. 可変長引数の関数
      1. 6-1. 仮引数での可変長引数
      2. 6-2. 実引数での可変長引数
    7. 7. 再帰関数
    8. 8. 可変関数
    9. 9. 無名関数(クロージャー)
      1. 9-1. 無名関数の使い方
      2. 9-2. 無名関数 で外部の変数を利用
    10. 10. アロー関数
    11. 11. ジェネレーター
      1. 11-2. yield で他の関数を呼び出す

環境構築

1. VSCodeでPHPを使用する拡張機能を入れる
2. XAMPPをインストールする
3. XAMPPを起動
4. phpMyAdminにアクセス
5. トラブルシューティング

はじめに

Web開発を始めたいけれど「何からインストールすればいいの?」と迷う人は多いです。
この記事では、VSCodeとXAMPPを使ってPHPの環境構築を行い、実際にプログラムを動かすところまでを解説します。

さらに、単なる手順だけでなく、「なぜその設定が必要なのか」や「エラーが出たときの対処法」も紹介していきます。

1. VSCodeでPHPを使用する拡張機能を入れる

まずはエディタの準備です。
VSCode(Visual Studio Code)は無料で高機能なエディタで、プログラミング初心者からプロまで幅広く使われています。

おすすめ拡張機能

  • PHP Intelephense
    コード補完やエラー表示をしてくれるので、初心者でもタイピングミスや構文ミスにすぐ気付けます。

なぜ必要?

ただのメモ帳でもPHPは書けますが、メモ帳で書いたPHPはエラーがわかりにくく、原因を探すのに苦労しました。
VSCode+Intelephenseなら、エラー箇所がハイライトされ、すぐに修正できます。

インストールすると以下のメリットがあります:

  • コード補完が効く
  • エラーをリアルタイムで検知してくれる
  • 関数の説明を確認できる

初心者でも安心してコードを書けるようになるので必須です。

2. XAMPPをインストールする

次に、PHPを実行するためのサーバー環境「XAMPP」を入れます。
XAMPPは「Apache(Webサーバー)」「PHP」「MariaDB(データベース)」がまとめて入った便利なツールです。

💡 XAMPPとは?

  • Apache(Webサーバー)
  • MySQL(データベース)
  • PHP(プログラミング言語)
    をまとめてインストールできるパッケージ

初心者でも簡単に「動く環境」を整えられるのがメリット。

2-1. XAMPPのインストール

XAMPPをインストールしていきます。
XAMPPをインストール」をクリックし、ご使用のOSのXAMPPをインストールしてください。
ここでは、PHP8以上をインストールしてください。

ダウンロードしたXAMPPを開きます。
以下の画像のようにダイアログが開きますので、以降の確認ダイアログを「Next>」で進めていきインストールを行います。

インストールが開始されるとこのような画面になります。

インストールが完了すると以下の画像となります。
「Launch XAMPP(XAMPPを起動する)」のチェックは入れたままで、「Finish」を押下します。

3. XAMPPを起動

インストールが終わったらXAMPPコントロールパネルを起動し、「Apache」と「MySQL」をスタートします。

  • Welcome・・・XAMPPのバージョンが確認できます。
  • Manage Servers・・・サーバーの起動、停止を制御できます。
  • Server Events・・・サーバーの履歴を確認できます。

Manage Serversのタブを選択します。
赤色が停止中、緑色は起動中を意味します。

それでは、「Start All」を押下し、起動します。
(起動準備中)

(起動中)

Welcomeタブ内の、「Go to Application」を押下すると、ブラウザが表示されるとOKです。

ここで表示される画面は「htdocs」にある index.php というファイルです。

3-1. HelloWorldを表示させてみよう

環境構築が完了しました。
ここでデモファイル(.php)を用意し、これをブラウザで表示してみます。

Welcome内の「Open Application Folder」を押下します。

xamppfilesのディレクトリ内が表示されるので、「htdocs」フォルダをVSCodeへドラッグ&ドロップします。するとPHPフォルダが開かれた状態でVSCodeが起動します。

(参考)htdocsフォルダは「ドキュメントルート」というフォルダであり、ここに格納したファイルが呼び出されます。

HTDOCSの横のを押下し新しいファイルを作成します。

ファイル命名は何でも良いですが、拡張子は「.php」とします。ここでは「Demo.php」としています。
そして、このphpファイル内にブラウザで表示したい内容を記述します。
今回は「HelloWorld」を表示します。

<?php
    echo "Hello World";
?>

これでデモファイル(Demo.php)が用意できました。
いよいよブラウザに表示していきます。
すでにサーバーを起動しているので、ブラウザのアドレスバーには以下のURLを入力してみましょう。ブラウザに「HelloWorld」と表示されます。

http://localhost/Demo.php

このURLですが、今回ではphpファイルの命名をDemoとしていますが、別の命名を行った場合はそれぞれに対応したURLを入力します。

http://localhost/ファイル名.php

※サーバー起動していない場合、2-2. XAMPPを起動をご確認ください。

表示したい内容を変更したい場合は、VSCodeで修正を行い、ブラウザの更新をしてください。

3-1-1. 「2-2. XAMPPを起動」でブラウザ表示されたファイルの正体

「2-2. XAMPPを起動」の説明で、Welcomeタブ内の、「Go to Application」を押下すると、以下のブラウザが表示されました。

これは、XAMPPにあらかじめ用意されているphpファイルです。
「Go to Application」を押下することで、index.phpが呼び出されているということです。

4. phpMyAdminにアクセス

XAMMPは、MariaDB(MySQL)というDatabaseを使用しています。MySQLデータベースを管理するツールが phpMyAdmin です。
phpMyAdmin にアクセスするには、以下のURLでアクセスすると管理画面が開きます。

http://localhost/phpmyadmin/

ここからデータベースを作成して、PHPと連携することで 動的なWebアプリ を作れるようになります。

5. トラブルシューティング

5-1. 修正内容が表示されない場合

修正内容は、保存をしないと反映されないため、保存しましょう。
保存しているかの見分け方ですが、ファイル名であるDemo.phpの右隣に◯がついています。これは修正内容が保存されていないサインです。保存を行うとこの◯は消えます。
(保存前)

(保存後)

5-2. Apacheが起動しない

SkypeやIISなどが ポート80を使用している 場合に起きます。対策としてXAMPPの「Config」→「Apache (httpd.conf)」からポート番号を8080などに変更します。

5-3. phpMyAdminにアクセスできない

MySQLサーバーが停止している可能性があります XAMPPの「Manage Servers」からMySQLを再起動してみましょう。

5-4. ブラウザで文字化けする

日本語が「????」になるときはUTF-8設定を忘れています。対策としてPHPファイルの先頭に書きます。

header("Content-Type: text/html; charset=UTF-8");

Webアプリの仕組み

1. Client と Server
2. HTTPリクエスト、HTTPレスポンス
3. クライアントサイドとサーバーサイドの言語

1. Client と Server

Webは、大きく分けて Client と Server という概念があります。

Client「見る側」や「使う側」 のこと。
ユーザーが操作するパソコンやスマホ、ブラウザ(ChromeやSafariなど)がこれにあたる。
サーバーに「これください!」とリクエストを送る役割。
Server「提供する側」や「配る側」 のこと。
世界のどこかにあるコンピューターで、Webページやデータを保管・処理している。
クライアントからのリクエストに応えて、「どうぞ!」とレスポンスを返す役割。
データーベースサーバーやメールサーバー、FTPサーバー等様々なサーバーがあります。

例えるなら:

  • クライアント → レストランで注文するお客さん
  • サーバー → 注文を受けて料理を出すキッチン(+店員)

お客さん(クライアント)が欲しいものを頼み、キッチン(サーバー)がそれを作って渡す…そんな関係です。

2. HTTPリクエスト、HTTPレスポンス

2-1. クライアントとサーバー間の通信

クライアントとサーバー間の通信は、HTTPプロトコルによって情報を受け渡しします。
簡単な流れの構成

クライアント → サーバー「このページください!」(HTTPリクエスト)
例: GET /index.html HTTP/1.1
サーバー → クライアント「はい、これどうぞ!」(HTTPレスポンス)
例: HTTP/1.1 200 OK + ページの中身

2-2. HTTPプロトコル

HTTPリクエストには、以下のメソッドが用意されています。

HTTPメソッド概要
GET(取得)目的:サーバーからデータを取得する
ブラウザでURLを開くときの基本動作
例:Webページや画像を読み込む
特徴:サーバーのデータは変更しない
POST(送信)目的:サーバーに新しいデータを送信する
例:フォームからユーザー登録情報を送る
特徴:送信内容はリクエストの本文(body)に入る
PUT(更新)目的:サーバー上の既存データを更新する(全体を置き換える)
例:ユーザー情報を新しい内容で丸ごと上書きする
特徴:指定されたリソースを丸ごと新しいものにするイメージ
DELETE(削除)目的:サーバー上のデータを削除する
例:登録済みの記事を消す
特徴:実行すると、そのデータはサーバーからなくなる

3. クライアントサイドとサーバーサイドの言語

クライアントサイドとサーバーサイドの技術はプログラミング言語によって区別されます。

3-1. クライアントサイド

実行場所ユーザーのブラウザ(PCやスマホ)
役割Webページの見た目や動きを制御
特徴ページを再読み込みせずに動きをつけられる(例:ボタンを押したらメニューが開く)
サーバーに負担をかけず、即時に反応できる
HTMLやCSSと組み合わせて、インタラクティブなUIを作る
クライアントサイドでバリデーションを行った場合、ユーザー側で一時的に編集できてしまう

→ ユーザーの操作に反応してブラウザ内で処理を行う

例(JavaScript)

document.getElementById("btn").addEventListener("click", function() {
alert("ボタンがクリックされました!");
});

3-2. サーバーサイド

実行場所Webサーバー
役割データベース処理、動的コンテンツ生成、セキュリティ管理
特徴ユーザーのリクエストを受け取り、必要な処理を行いHTMLなどを生成して返す
データベースと連携して情報を取得・保存できる
クライアントからは直接ソースコードが見えない(セキュリティ上有利)

→ フォームから送信されたデータを受け取り、サーバーで処理して結果を返す

例(PHP)

<?php
$name = $_POST['name'];
echo "こんにちは、" . htmlspecialchars($name) . "さん!";
?>

HelloWorldを表示してみよう

1. HelloWorldを表示してみよう
2. コメントアウト
3. 改行
4. 大文字小文字の区別
5. PHPのエラー

1. HelloWorldを表示してみよう

PHPを使用してHelloworldをブラウザに表示してみます。
拡張子はphpとしてください。「hello.php」

作成されたphpファイル内に以下のHTMLを準備します。
なお、はじめに「!」を入力し、Enterを押下すると、自動生成されます。
※<?php ?>だけで記述できますので、以降のカリキュラムではHTMLの記述部分は省いで解説していきます。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
</body>
</html>

bodyタグ内に<?php ?>を入力します。
このphpタグ内においてPHPの処理を記述していきます。
ブラウザに表示したい場合は、「echo」か「print」を使用しますが、以降は「echo」を使用します。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <?php
        echo "HelloWorld";
    ?>
</body>
</html>

スクリプト文を区切るには「;(セミコロン)」を使用します。
ブラウザにHelloWorldが表示されました。

2. コメントアウト

PHPもコードをコメントアウトできます。
コメントアウトすることにより、その部分は処理されません。
以下のコードは、2行目で変数printStrに「PHP」で初期化を行い、その後3行目で「JavaScript」を代入しています。
そのため、「JavaScript」が表示されます。

<?php
    $printStr = "PHP";
    $printStr ="JavaScript";
    echo $printStr;
?>

ここで3行目を「//」によりコメントアウトすると、「PHP」が表示されます。

<?php
    $printStr = "PHP";
    // $printStr ="JavaScript";
    echo $printStr;
?>

コメントアウトの種類は以下のとおりです。

//単一行のコメントアウト。
/* */複数行のコメントアウト。
<!– –>HTMLのコメントアウト。
PHP言語はHTML埋め込み型言語のため、HTMLの部分で使用。

3. 改行

以下のコードを表示してみます。

<?php
  echo "PHP";
  echo "JavaScript";
?>

つながって表示されました。

これは意図的に改行を行う必要があります。「<br>」を使用します。

<?php
  echo "PHP<br>";
  echo "JavaScript";
?>

4. 大文字小文字の区別

PHP言語は大文字小文字を区別しません。

5. PHPのエラー

5-1. PHPのエラーの段階

PHPのエラーは、重要度に応じてレベルが割り振られています。

エラー種別概要
Error致命的なエラー
処理が中断する
Warning警告
処理は中断しないが、将来的な問題、バグの原因となる
Notice注意
処理は中断しないが、将来的な問題、バグの原因となる

5-2. よく見かけるエラーとその対処法

Parse error: syntax error, unexpected end of file

「ファイルの終わりまで来たけど、まだ構文が閉じられていない」 というエラーです。
つまり、カッコやブロックを閉じ忘れていることが原因です。
対処方法

  1. エラーが出たファイルを確認する
    エラー行番号が出ない場合でも、ファイル末尾付近をチェック。
  2. {} の数を確認する
    エディタの自動インデント機能を使うと見つけやすい。
  3. PHP Linterphp -l ファイル名.php を実行して文法チェックする。
Call to undefined function 関数名()

その関数が見つからない / 定義されていない状態で呼び出した という意味です。
対処方法

  • 「未定義の関数を呼び出した」= その関数が存在しない or 読み込んでない
  • 自作なら require で読み込む
  • 標準関数なら拡張機能や PHP バージョンを確認
Notice: Undefined variable: 変数名

その変数がまだ定義されていない状態でアクセスされている という意味です。
PHP は未定義変数にアクセスすると警告を出します(Notice レベル)。

  • 変数を宣言・代入していない
  • スコープの問題
  • 配列やループで未初期化の要素を使っている

対処方法

  • 変数は 必ず初期化してから使う
  • スコープを確認する(関数内でグローバル変数を使う場合は global か引数で渡す)
  • 配列やオブジェクトは 存在チェックをしてからアクセス
Warning: failed to open stream: No such file or directory in /path/to/file.php on line XX

指定したファイルが見つからないため、読み込めない という意味です。
多くの場合、includerequirefopen などで発生します。

  • ファイルパスが間違っている
  • ファイルが存在しない
  • PHP がファイルを読める権限がない
  • URL やリモートファイルの扱い(基本的には ローカルファイルを使う)
Fatal error: Cannot redeclare 関数名() / クラス名() in /path/to/file.php on line XX

同じ名前の関数やクラスを二重に定義しようとしている という意味です。
PHP では、同じ名前の関数やクラスを複数回定義できません。

  • 同じファイルを複数回読み込んでいる
  • 複数ファイルで同じ関数・クラスを定義している
  • オートローダーと手動読み込みの併用

対処方法

  • 関数やクラスは 1 回だけ定義する
  • 複数回読み込む可能性がある場合は *_once を使う
  • 名前の衝突が起きやすい場合は namespace を活用する
〜 is deprecated, use 〜 instead

現在では推奨されていない機能を利用した場合に発生します。
セキュリティ的なリスクや将来的に削除される可能性があるので、特別な意図がない場合は排除しておくべきです。
対処方法

  1. エラーメッセージに書いてある「instead」を確認する
    新しい関数・方法に置き換える。
  2. すぐ修正できない場合
    一時的に error_reporting(E_ALL & ~E_DEPRECATED); で非推奨警告を隠せます。
    ただし将来のバージョンで動かなくなるので、早めの修正が必要。

データ型

1. データ型とは
2. スカラー型
3. null型

1. データ型とは

「HelloWorldを表示してみよう」のレッスンでは、「HelloWorld」や「PHP」、「JavaScript」をブラウザに表示しました。
これらの表示される文字にはデータ型があり、string型に該当します。
PHPでは、大別して以下のデータ型に分類されます。

スカラー型1つの変数で1つの値だけを扱える
複合型1つの変数で複数の値をまとめて扱える
特殊型スカラー型と複合型以外のデータ型

2. スカラー型

スカラー型とは、1つの変数で1つの値だけを扱う事ができるものを言います。
PHPに扱えるスカラー型は主に以下のとおりです。

データ型概要
bool論理型
論理の真もしくは偽の2種類しかない
true, false
int整数型
整数の値
-1, 100, 0など
float
(double)
浮動小数点
小数点の付いた数値
-1.1, 55.8, 0.0など
string文字列型
” や ‘ で囲む
“PHP”, ‘テスト’など

2-1. bool

論理型を扱うデータ型であり、真(true)か偽(false)のいずれかしか値を持ちません。
論理リテラルを必要とする条件下において、以下の値では自動的にfalseとみなされてしまうため注意が必要です。

  • 空文字列、または文字列の0(ゼロ)
  • 整数リテラルの0
  • 浮動小数点リテラルの0.0
  • 要素数が空の配列(0個)
  • null(未定義値)

2-2. int

PHPの整数リテラルは、ソースコード中に直接書く「整数の値」のことです。
PHPでは整数リテラルは書き方によって基数(進数)が変わるのが特徴です。
主な種類は以下の通りです。

書き方基数説明
10進数1042普通の数字の書き方
16進数160x2A0x または 0X を前に付ける
8進数8052先頭に 0 を付ける(PHP 8.1からは非推奨警告)
2進数20b1010100b または 0B を前に付ける
数値区切り1_000_000アンダースコアで見やすく区切れる(PHP 7.4以降)

2-3. float(double)

小数を扱うための型です。(例: 3.14, -0.5, 2.0e8 など)
PHPでは公式ドキュメントでも型名としては float を推奨されています。(昔の関数や内部表現では double と表示されることがある)。

2-4. string

文字列を扱う型です。
シングルクォート '...' とダブルクォート "..." で表記できます。

‘ ‘中の文字をそのまま扱う(変数展開は効かない)
” “中の変数を展開できる

例文

<?php
    $name = "Moka";

    echo 'Hello $name\n'; // Hello $name\n
    echo "<br>";
    echo "Hello $name\n"; // Hello Moka(改行あり)
?>
2-4-1. ヒアドキュメント構文

複数行にわたる長い文字列を、改行やクォートのエスケープを気にせずに書ける記法です。
例文

<?php
$text = <<<EOD
これはヒアドキュメントの例です。
改行もそのまま書けますし、
"ダブルクォート" もエスケープ不要です。
変数も展開されます: $name
EOD;

echo $text;
  • <<<EOD の部分は開始マーカーで、EOD は任意の識別子(好きな名前でOK)
  • 終了マーカー EOD; は必ず行頭から始める(前後に空白など入れない)
  • 終了マーカーまでの間は、文字列として扱われる
  • 変数展開あり(ダブルクォートと同じ動き)
<<<EOD
<<<"EOD
ヒアドキュメント構文
文字列に含まれる変数やエスケープシーケンスを展開する
<<<'EOD'NowDoc構文
文字列に含まれる変数やエスケープシーケンスを展開しない
2-4-2. エスケープシーケンス

エスケープシーケンスは通常の文字列で表示できないような文字列を表示したい場合に使います。PHPで利用できるエスケープシーケンスは、次のようなものがあります。

エスケープシーケンス概要
\n改行
\rキャリッジリターン
\tタブ
¥文字
\$$文字
\(半角左カッコ
\)半角右カッコ
\[半角左角カッコ
\]半角右角カッコ
\’シングルクォーテーション
\”ダブルクォーテーション

3. null型

値が存在しないことを表す特殊な型で、変数に値がセットされていない場合、明示的に null を代入した場合に使われます。
例文

$var;          // 初期化していない変数
$var = null;   // 値を null に設定
var_dump($var); // NULL

変数

1. 変数
2. 型変換
3. 変数の操作を行う関数
4. 変数のスコープ
5. 可変変数
6. 静的変数

1. 変数

1-1. 変数とは

変数とは、数値や文字列などの値を入れるための箱のようなもので、中の値を変更することが可能です。
この変数には、値を1つだけ格納することが可能です。

1-2. 変数の定義

変数を定義する方法は以下のとおりです。
なお、PHPは動的言語のため、Javaのように変数を定義する際にデータ型を指定する必要がありません。

$変数名 = 変数に代入する値;

「=」は右辺の値を左辺の変数に格納することを意味します。

例文

<body>
    <?php
        $strValue = "テスト文字列型";  //①
        echo $strValue;  //②
        echo "<br>";  //③
        $strValue = "テストあいうえお";  //④
        echo $strValue;  //⑤
    ?>
</body>

① 変数strValueに「テスト文字列型」を代入します。
 (ここで、変数のための領域が自動的にメモリ上に確保される)
② ①の変数strValueを出力します。
③ 改行を行います。
④ ①の変数strValueに対し、「テストあいうえお」で書き換えます。
⑤ ④で再代入した値を出力します。

1-2-1. 変数の命名規則

変数名を命名する時のルールとして、半角アルファベット(a~z、A~Z)、数字、_(アンダーバー)が使用でき、大文字と小文字を区別します。
変数名は自由に付けることができますが、$の次が数字や、PHPにあらかじめ定義されている予約語は名前に付けられません。
開発現場では、そのプロジェクトの開発規約に沿って定義しますが、変数名は基本的にはキャメルケースを使用します。

  • 半角アルファベット(a~z、A~Z)、数字、_(アンダーバー)が使用できる
  • 大文字と小文字を区別
  • 予約語は名前に付けられない
  • 誰がみても理解できる名前にする
1-2-2. 未定義の変数の使用

例えば、未定義の変数を echo すると指定された変数が存在しないため、「Undefined variable 変数名」のようなWarning(警告)が発生します。
そのため、定義された変数を使用するように心掛けましょう。

1-3. 変数にデータ型の異なる値を再代入

string型が代入されている変数に、int型を再代入することもできます。

<body>
    <?php
        $strValue = "テスト文字列型"; //①
        echo $strValue;
        echo "<br>";
        $strValue = 1;  //②
        echo $strValue;
    ?>
</body>

① 変数strValueにstring型の「テスト文字列型」を代入します。
② 変数strValueにint型の「1」を再代入します。

このように、PHPでは同一の変数に、型が異なる値を代入できます。

1-4. 変数同士を結合する

変数を結合する場合、その変数のデータ型によって結合する演算子に注意が必要です。

1-4-1. データ型がint型(float型、double型を含む)の場合

以下のコードのような変数が2つあり、その変数を結合していきます。

<body>
    <?php
        $intVal1 = 2; //int
        $intVal2 = 55.3; //int
        echo $intVal1 + $intVal2;
    ?>
</body>

57.3 が出力されます。

1-4-2. データ型がstring型の場合(文字列演算子)

以下のコードのような変数が2つあり、その変数を結合していきます。

<body>
    <?php
        $strVal1 = "値1"; //string型
        $strVal2 = "値2"; //string型
        echo $strVal1 + $strVal2; //変数の結合
    ?>
</body>

すると、エラーが表示されます。

このように、string型の変数を結合する時に「+」を用いると「Uncaught TypeError: Unsupported operand types: string + 」が表示されます。
そのため、string型の変数を結合するには「 . 」を使用します。

<body>
    <?php
        $strVal1 = "値1";
        $strVal2 = "値2";
        echo $strVal1 . $strVal2;
    ?>
</body>

値1値2 が出力されます。

1-5. 文字列の中で変数を展開

“(ダブルクォーテーション)で囲んだ中に 変数名入れると、変数の値を表示できます。

"{$変数名}"

例文

<body>
    <?php
        $intVal = 111;
        echo "変数intValの値は、$intVal です。"; // 変数intValの値は、111 です。
    ?>
</body>

しかし、’(シングルクォーテーション)で囲んだ中に変数名を入れると、変数名が表示されるため注意が必要です。

<body>
    <?php
        $intVal = 111;
        echo '変数intValの値は、$intVal です。'; // 変数intValの値は、$intVal です。
    ?>
</body>

1-6. 変数にnullを代入

「データ型」のレッスンでnullを紹介しました。nullは型がない特殊な値で、「何もない」ことを意味します。
変数はあらかじめ用意しておきたいが値はまだ代入しなくても良い場合にnullを代入したり、変数に値があるが何も代入したくない場合に使用します。

<?php
    $a = null; //変数aをnullで初期化
    echo $a; //何も表示されない
    echo "<br>";
    $a = 10; //変数aに10を代入
    echo $a; //10を表示
    echo "<br>";
    $a = null; //変数aにnullを代入
    echo $a; //何も表示されない
?>

2. 型変換

PHPでは変数等に値を代入すると、その値でその変数のデータ型が自動で決まります。(暗黙的な変換)
以下の例のコードでは変数aに10を代入します。10は整数のためint型と判別されます。

$a = 10;  //int型

ここで、あらかじめ型( )内に指定する事ができます。
この変数aは文字列であるstring型として扱われます。

$a = (string)10;  //string型

以下のように、明示的な型変換(キャスト)を行う事ができます。

(データ型)値

なお、var_dump()は、変数の型や値の情報を確認できる関数であり、後述の「3. 変数の操作を行う関数」で紹介します。

<?php
    $a = 10; //int型
    var_dump($a); //int(10) を表示
    echo "<br>";
    $a = (string)10; //int型からstring型へキャスト
    var_dump($a); //string(2) "10" を表示
?>

3. 変数の操作を行う関数

関数とは、計算などある処理を行うコードのかたまりのようなイメージです。
PHPにはあらかじめ変数の操作を行う関数が用意されています。

3-1. 変数の型や値の情報を確認(var_dump関数)

var_dump関数は、( )内に入れた変数の型や値の情報を返します。

var_dump(変数)

例文

<body>
    <?php
        $value = 111;
        echo var_dump($value); //①
    ?>
</body>

① int(111) が出力されます。これはint型で、値が111を意味します。

3-2. 変数を削除する(unset関数)

unset関数は、変数そのものを削除します。

unset(削除したい変数);

例文

$a = 10;
unset($a);

var_dump(isset($a)); // bool(false)

3-3. 変数のデータ型を判定する

PHP には、変数のデータ型や状態を判定するための is_ 系関数 が用意されています。
これらを使うと、変数が特定の型かどうか、または特定の条件を満たすかを確認できます。

関数説明
is_int($var) / is_integer($var)整数かどうか
is_float($var) / is_double($var)浮動小数点かどうか
is_string($var)文字列かどうか
is_bool($var)真偽値かどうか
is_array($var)配列かどうか
is_object($var)オブジェクトかどうか
is_resource($var)リソース型かどうか
is_null($var)null かどうか
is_numeric($var)数値(文字列含む)かどうか
is_callable($var)関数やメソッドを呼び出せるかどうか
is_iterable($var)foreach で繰り返せるかどうか

4. 変数のスコープ

変数のスコープとは有効範囲のことで、「{ }(ブロック)」内でその変数が使用できる有効範囲です。
そのため、このスコープ内で同名の変数を定義することができません。
スコープには、グローバルスコープ と ローカルスコープ に分かれます。

項目グローバルスコープローカルスコープ
定義場所関数やクラスの外関数・メソッド内
有効範囲スクリプト全体関数内のみ
同名変数同じ名前のローカル変数とは別物外のグローバル変数とは別物
関数内アクセスglobal 命令 or $GLOBALS が必要直接アクセス可能

4-1. グローバルスコープ

スクリプト全体で有効な変数であり、関数内からは 直接アクセスできません。
グローバルスコープのを持つ変数のことを、グローバル変数といいます。
例文

$globalVar = "Hello"; // グローバル変数

function test() {
    // echo $globalVar; // ❌ エラーになる
    global $globalVar;  // globalキーワードでアクセス可能
    echo $globalVar;    // ✅ Hello
}

// $GLOBALS 配列でもアクセス可能
function test2() {
    echo $GLOBALS['globalVar']; // ✅ Hello
}

test();  //test関数の呼び出し
test2();  //test2関数の呼び出し
4-1-1. global命令

global 命令とは、関数の中から グローバル変数にアクセスするための命令です。
通常、関数の中では関数外の変数(グローバルスコープの変数)には直接アクセスできませんが、 global を使うと、外側の変数を関数内でも利用できます。
例文1(OK)

$greeting = "Hello";

function sayHello() {
    global $greeting; // グローバル変数を参照
    echo $greeting;
}

sayHello(); // ✅ Hello

例文2(NG)

$greeting = "Hello";

function sayHello() {
    echo $greeting; // ❌ Notice: Undefined variable
}

sayHello();
4-1-2. $GLOBALS

$GLOBALSすべてのグローバル変数を配列として保持 しているスーパーグローバル変数です。

特徴global$GLOBALS
役割関数内で「外の変数を使う」ことを宣言すべてのグローバル変数を保持する連想配列
書き方global $x;$GLOBALS['x']
アクセス方法変数名を静的に書く必要がある文字列キーでアクセス可能(動的アクセスも可)
読みやすさ短くて直感的配列経由なので少し冗長
可変変数的利用❌ 不可✅ 可能($GLOBALS[$varName]

例文1

global の場合

$a = 10;
$b = 20;

function sum() {
    global $a, $b; // 宣言が必要
    return $a + $b;
}

echo sum(); // ✅ 30

$GLOBALS の場合

$a = 10;
$b = 20;

function sum() {
    return $GLOBALS['a'] + $GLOBALS['b']; // 直接アクセス
}

echo sum(); // ✅ 30

例文2
$GLOBALS なら動的アクセスできる

$varName = "message";
$message = "Hello World";

function showMessage() {
    echo $GLOBALS['message'];      // ✅ Hello World
    echo $GLOBALS[$GLOBALS['varName']]; // ✅ Hello World
}
showMessage();

4-2. ローカルスコープ

関数やメソッドの内部で有効な変数であり、関数内からは 直接アクセスできます。
ローカルスコープのを持つ変数のことを、ローカル変数といいます。
例文

function myFunc() {
    $localVar = "Local";
    echo $localVar; // ✅ Local
}

myFunc();
// echo $localVar; // ❌ エラー。関数外では見えない

5. 可変変数

可変変数とは、変数の値によって変数名を決める事ができる変数をいいます。
以下のように利用します。

$$変数名;

例文

<?php
    $val = "a";
    $a = "aaaaaaaa";
    $b = "bbbbbbbb";
    echo $$val;  //aaaaaaaa が出力
?>

なお、可変部分を{ } でくくることも意味は同じです。

<?php
    $val = "a";
    $a = "aaaaaaaa";
    $b = "bbbbbbbb";
    echo ${$val};  //aaaaaaaa が出力
?>

6. 静的変数

関数内で 一度だけ初期化され、関数が呼び出されても 値が保持され続ける変数 のことです。
通常のローカル変数は関数が終わると消えますが、static を付けると消えません。

static 変数名;

例文1

function counter() {
    static $count = 0;  // 最初の1回だけ初期化
    $count++;
    echo $count . "\n";
}

counter(); // 1
counter(); // 2
counter(); // 3

例文2
static は変数だけでなく クラスのプロパティやメソッド にも使えます。
その場合、静的変数へのアクセス方法には、クラス名を指定する必要があります。

class MyClass {
    public static $counter = 0;

    public static function increment() {
        self::$counter++;
        echo self::$counter . "\n";
    }
}

MyClass::increment(); // 1
MyClass::increment(); // 2
MyClass::increment(); // 3

アクセス方法

クラス名::静的変数名;

定数

1. 定数

1. 定数

1-1. 定数とは

定数とは、一度値を設定したら変更できない変数のことです。
PHP で定数を定義する方法には constdefine の2種類があります。

1-2. 定数の定義

constdefine の違いは以下のとおりです。

項目constdefine
定義方法キーワード関数
使用可能場所クラス内 / グローバルスコープグローバルスコープのみ
評価タイミングコンパイル時(必ず定数値が必要)実行時(動的に設定可能)
値の型スカラー型(int, float, string, bool)や array, そして PHP8.1以降は enum などもOK基本的にスカラー型(配列は PHP 7 以降で対応)
名前の扱い名前空間対応 (App\Foo::CONST_NAME)名前空間に非対応(常にグローバル)
クラスで利用✅ 利用できる(クラス定数)❌ 利用できない
再定義❌ 不可❌ 不可
1-2-1. constキーワード

クラス定数の定義でも使えますが、関数の中では使えません。(クラスやトップレベルで使う)

const 定数名 = 値;

例文

// グローバルスコープ
const SITE_NAME = "My Website";

// クラス内で利用
class App {
    const VERSION = "1.0";
}

echo SITE_NAME;           // My Website
echo App::VERSION;        // 1.0
1-2-2. define() 関数

以下のように、定義します。

define(定数名, 値);

例文

define("SITE_NAME", "My Website");
echo SITE_NAME; // My Website

1-3. 定数の命名規則

  • スネークケースを推奨
  • アルファベット、数字、アンダースコア( _ )が使用可能
  • 数字で始めることはできない
  • 予約語は使えない
  • 一度定義した定数は再定義・変更できない

配列

1. 配列
2. 添字配列
3. 連想配列
4. 多次元配列

1. 配列

変数は、一度に複数のデータを扱う事ができませんが、配列を使用すると、複数のデータを扱う事ができます。
PHPの配列には、「添字配列」と「連想配列」があります。

2. 添字配列

2-1. 添字配列の定義

配列を定義する方法は以下のとおりです。

$変数名 = [値1, 値2, 値3];

配列に代入された値を要素といいます。

例文

<body>
    <?php
        $arr = ["A", "B", "C"]; //①
    ?>
</body>

① 配列arrに「1」「2」「3」を代入します。

2-2. 添字配列の要素へのアクセス

配列内の各値は、添え字により値の一対のペアで構成されています。
この添え字は「0」から始まります。

例文

<?php
    $arr = ["A", "B", "C"];
    echo $arr[0]; //値の0番目にアクセス、Aを表示
    echo $arr[1]; //値の1番目にアクセス、Bを表示
    echo $arr[2]; //値の2番目にアクセス、Cを表示
?>

2-3. 添字配列の初期値を確認

配列に格納されている初期値を全て確認したい場合、echoで表示しても正しく表示されません。そのときは print_r() を使用します。

<?php
    $arr = ["A", "B", "C"];
    echo $arr; //Arrayが表示
    print_r($arr); //Array ( [0] => A [1] => B [2] => C )が表示
?>

2-4. 要素数を取得

配列の長さは、count関数で求める事ができます。

<?php
    $arr = ["A", "B", "C"]; //配列に値3つを格納
    $size = count($arr); //count関数により配列内の要素数を取得
    echo $size; //要素数である「3」が表示される
?>

2-5. 要素の情報を修正

要素の情報を修正するには、修正したい値の添え字を指定します。

<?php
    $arr = ["A", "B", "C"];
    $arr[1] = "Z";
    print_r($arr); //Array ( [0] => A [1] => Z [2] => C )が表示
?>

2-6. 添字配列の末尾に要素を追加

PHPの配列は、格納される要素の数を可変させることが許されています。
そのため、追加や削除が可能です。
array_push()を使用します。

<?php
    $arr = ["A", "B", "C"];
    array_push($arr, "Z");
    print_r($arr); //Array ( [0] => A [1] => B [2] => C [3] => Z )
?>

2-7. 添字配列の末尾の要素を削除

配列の末尾の要素を削除は、array_pop()を使用します。

<?php
    $arr = ["A", "B", "C"];
    array_pop($arr);
    print_r($arr); //Array ( [0] => A [1] => B )
?>

2-8. 添字配列の先頭に要素を追加

配列の先頭に値を追加するには、array_unshift()を使用します。

<?php
    $arr = ["A", "B", "C"];
    array_unshift($arr, "Z");
    print_r($arr); //Array ( [0] => Z [1] => A [2] => B [3] => C )
?>

2-9. 添字配列の先頭の要素を削除

配列の先頭に要素を削除するには、array_shift()を使用します。

<?php
    $arr = ["A", "B", "C"];
    array_shift($arr);
    print_r($arr); //Array ( [0] => B [1] => C )
?>

2-10. 指定した添え字の配列の要素を削除

指定した添え字の配列の要素を削除するには、unset()を使用します。

<?php
    $arr = ["A", "B", "C"];
    unset($arr[1]);
    print_r($arr); //何も表示されない
?>

2-11. 配列の添え字を振りなおす

配列の添え字を振りなおすには、array_values()を使用します。

<?php
    $arr = ["A", "B", "C"];
    print_r($arr); //Array ( [0] => A [1] => B [2] => C )
    unset($arr[1]);
    print_r($arr); //Array ( [0] => A [2] => C )
    $format =  array_values($arr);
    print_r($format); //Array ( [0] => A [1] => C )
?>

2-12. 添字配列の分割

1つの配列をarray_slice()で分割することができます。

array_slice(配列名, 開始添え字位置, 切り取る長さ, 添え字の保持有無)
<?php
    $arr = ["A", "B", "C"];
    $format =  array_slice($arr, 0, 1); 
    print_r($format); //Array ( [0] => A )
?>

2-13. 添字配列の結合

array_merge()により配列を結合することができます。

<?php
    $arr1 = ["A", "B"];
    $arr2 = ["Y", "Z"];
    $result = array_merge($arr1, $arr2);
    print_r($result); //Array( [0] => A [1] => B [2] => Y [3] => Z )
?>

3. 連想配列

配列は添え字で値を指定していましたが、連想配列では任意のキーを指定することでそのキーに関連付けられた値を呼び出すことができます。

3-1. 連想配列の定義とアクセス

次のように定義します。

配列名 = [ キー1 => 値1, キー2 => 値2,キー3 => 値3 ];

例文

<?php
    $arr = [
        "JPN"=>"日本",
        "USA"=>"アメリカ"
    ];
    print_r($arr); //Array ( [JPN] => 日本 [USA] => アメリカ ) 
    echo $arr["JPN"]; //日本
    echo $arr["USA"]; //アメリカ
?>

3-2. 連想配列に追加

追加するには、以下のようにします。

配列[追加するキー] = "追加する値";

3-3. 連想配列の要素を削除

削除するには、以下のようにします。

unset(配列名[削除するキー]);

3-4. 連想配列の値を修正

値を修正するには、修正したいキーを指定します。

配列名[修正したいキー] = 修正する値;

4. 多次元配列

配列の要素として格納できるのは数値や文字列だけではなく、配列自体も格納することができます。これを、多次元配列といいます。
理論的には何層も定義することができますが理解しやすいという意味では、最大3次元配列までにしておきます。

4-1. 多次元配列の定義

多次元配列の定義方法は以下のとおりです。

配列名 = [[配列1],[配列2],[配列3]];

例文

<?php

// 連想配列の多次元配列の例
$users = [
    ["name" => "Moka", "age" => 20],
    ["name" => "Taro", "age" => 25],
    ["name" => "Hanako", "age" => 22]
];

// 配列の内容を出力
foreach ($users as $user) {
    echo "名前: " . $user["name"] . ", 年齢: " . $user["age"] . "<br>";
}

?>

4-2. 多次元配列のアクセス

連想配列の場合、キーにより取得します。
なお、配列の要素を1つずつ順番に取り出すforeach文を使用します。

<?php

// 連想配列の多次元配列の例
$users = [
    ["name" => "Moka", "age" => 20],
    ["name" => "Taro", "age" => 25],
    ["name" => "Hanako", "age" => 22]
];

// 配列の内容を出力
foreach ($users as $user) {
    echo "名前: " . $user["name"] . ", 年齢: " . $user["age"] . "<br>";
}

?>

連想配列の場合、添字により取得します。

配列名[一番外側の要素添字][次の要素添字];

例文

<?php

// 多次元配列の例
$value = [
    ["A", "B", "C", "D"],
    ["E", "F", "G"],
    ["H", "I", "J", "K","L"]
];

// 配列の要素を出力
echo $value[0][2];  // Cを表示

?>

演算子

1. 算術演算子
2. 複合代入演算子
3. 単項演算子(インクリメント、デクリメント)
4. 比較演算子
5. 論理演算子
6. エラー制御演算子

1. 算術演算子

1-1. int型やdouble型の算術演算子

PHPでは算術演算等を行うことができ、演算には演算子の記号を使用します。

演算の種類演算子の記号記述例
加算+2 + 1
減算2 – 1
乗算*2 * 1
除算/2 / 1
剰余%2 % 1

例文

<?php
    /* 加算 */
    echo 2+1; // 3が表示される
    /* 減算 */
    echo 2-1; // 1が表示される
    /* 乗算 */
    echo 2*1; // 2が表示される
    /* 除算 */
    echo 2/1; // 2が表示される
    /* 剰余 */
    echo 2%1; // 0が表示される
?>

1-2. string型の数字を算術演算子

PHPでは、string型の数字を四算演算子すると、「1-1. int型やdouble型の算術演算子」と同じ結果を得られます。

<?php
    /* 加算 */
    echo "2"+"1"; // 3が表示される
    /* 減算 */
    echo "2"-"1"; // 1が表示される
    /* 乗算 */
    echo "2"*"1"; // 2が表示される
    /* 除算 */
    echo "2"/"1"; // 2が表示される
    /* 剰余 */
    echo "2"%"1"; // 0が表示される
?>

では、string型の数字「”2″」と「”1″」を用いて「21」にしたい場合、「+」の代わりに「.」を使用します。

<?php
    // 加算
    echo "2"."1"; // 21が表示される
?>

1-3. 浮動小数点の演算の注意点

PHPで浮動小数点(float / double)を扱うときは、コンピュータの内部表現の都合で人間が期待する結果とズレることがあるのが最大の注意点です。

var_dump(0.1 + 0.2); // float(0.30000000000000004)
var_dump(0.3 == 0.1 + 0.2); // bool(false)

そこでPHPで用意されている任意精度数学関数を使用し、浮動小数点(float)のように誤差が出やすい通常の計算ではなく、桁数制限のない正確な数値計算を行います。

関数概要
bcadd($a, $b, $scale)加算
bcsub($a, $b, $scale)減算
bcmul($a, $b, $scale)乗算
bcdiv($a, $b, $scale)除算
bcmod($a, $b)剰余
bcpow($a, $b, $scale)累乗
bcpowmod($a, $b, $mod)累乗の剰余
bccomp($a, $b, $scale)比較(-1, 0, 1を返す)
bcscale($scale)デフォルト小数点桁数を設定

例文

// 加算
echo bcadd('0.1', '0.2', 2); // 0.30

// 減算
echo bcsub('10.5', '1.25', 3); // 9.250

// 乗算
echo bcmul('2.5', '3', 1); // 7.5

// 除算(小数点5桁)
echo bcdiv('1', '3', 5); // 0.33333

// 剰余
echo bcmod('10', '3'); // 1

// 累乗
echo bcpow('2', '10'); // 1024

// 比較
var_dump(bccomp('1.234', '1.233', 3)); // int(1) → 左が大きい

2. 複合代入演算子

複合代入演算子とは、=演算子と他の演算子を組み合わせて、代入と同時に演算を行う演算子をいい、次のような複合代入演算子があります。

複合代入演算子概要記述例該当する演算
=変数などに値を左辺に代入$a = 1;
+=$aに$bの値を加算して左辺に代入$a += $b$а = $а + $b
-=$aに$bの値を減算して左辺に代入$a -= $b$а = $а – $b
*=$aに$bの値を乗算して左辺に代入$a *= $b$а = $а * $b
/=$aに$bの値を除算して左辺に代入$a /= $b$а = $а / $b
%=$aに$bとの剰余演算の結果を左辺に代入$a %= $b$а = $а % $b
.=$aに$bの値を連結して左辺に代入
(文字列として扱われる)
$a .= $b$а = $а . $b

3. 単項演算子(インクリメント、デクリメント)

変数に1を足す、もしくは引くだけの処理を行う際、変数の前後どちらかに「++」を付けた処理をインクリメント、変数の前後どちらかに「–」を付けた処理をデクリメントといいます。

インクリメント

$変数名++;

デクリメント

$変数名--;

4. 比較演算子

比較演算子は、ある値と別の値を比較し、その結果をtrueまたはfalseで返します。
主な比較演算子は以下のとおりです。

比較演算子概要
$a == $b型の相互変換をしたあと、$aが$bと等しい場合はtrue
$a === $b$aが$bに等しく同じ型である場合はtrue
$a != $b型の相互変換をしたあと、$aが$bと等しくない場合はtrue
$a <> $b型の相互変換をしたあと、$aが$bと等しくない場合はtrue
$a !== $b$aが$bと等しくないか、同じ型でない場合はtrue
$a < $b$aがSbより小さい場合はtrue
$a > $b$aが$bより大きい場合はtrue
$a <= $b$aが$b以下の場合はtrue
$a >= $b$aが$b以上の場合はtrue
$a <=> $b左辺が右辺より小さい場合には-1、
左辺と右辺が等しい場合には0、
左辺が右辺より大きい場合には1
?:三項演算子
条件式 ? trueの場合の式 : falseの場合の式
?? null合体演算子
左辺がnullでなければその値、
左辺がnullならば右辺の値、
左辺も右辺もnullの場合はnull

5. 論理演算子

5-1. 論理演算子とは

論理演算子とは、ある値と別の値を「および」や「または」で評価し、その結果をtrueまたはfalseで返します。
主な論理演算子は以下のとおりです。

論理演算子概要
$a and $b論理積
$aと$bがどちらもtrueの場合、true
$a && $b論理積
$aと$bがどちらもtrueの場合、true
$a or $b論理和
$aまたは$bのどちらかがtrueの場合、true
$a || $b論理和
$aまたは$bのどちらかがtrueの場合、true
$a xor $b排他的論理和
$aまたはSbのどちらかがtrue、かつ両方ともtrueでない場合、true
! $a否定
$aがtrueでない場合、true

5-2. ショートカット演算(短絡演算)

条件式の評価途中で結果が確定した時点で、残りを評価せずに打ち切る仕組みのことです。

$a = false;
$b = true;

if ($a && $b) {
echo "OK";
}
  • && は左から順に評価
  • $afalse なので、右側 $b は調べなくても結果は false と分かる → $b は評価されない
$a = true;
$b = false;

if ($a || $b) {
    echo "OK";
}
  • $a が true なので、右側 $b を見なくても結果は true と分かる → $b は評価されない

つまり、条件式の左側の結果だけで全体の真偽が確定する場合、右側は実行しないのがショートカット演算です。

6. エラー制御演算子

エラー制御演算子は、式や関数呼び出しの前につけると、その式で発生するエラーや警告を非表示にする 仕組みです。
@ の後に書いた処理で発生するエラーや警告は、表示されずに無視されます。

@式

例文

// 存在しないファイルを開く
// 通常なら Warning が出るが、@ を付けると非表示
$file = @file('no_such_file.txt');

エラーや警告は表示されずに無視できるため、できるだけ使用するべきではありません。

  1. エラーが消えるだけで処理は行われる
    • エラーを握りつぶすため、原因が分からなくなりやすい。
  2. パフォーマンス低下
    • 内部的にエラー抑制のための処理が走るため、少し遅くなる。
  3. 本番コードで多用は非推奨
    • デバッグが難しくなる。
  4. 非表示になるのは画面出力だけ
    • ログ設定(error_log)を有効にしていればログには残る。

条件分岐

1. 条件分岐とは
2. if文
3. switch文
4. match式

1. 条件分岐とは

if文は「もし明日晴れだったら公園に行く、雨だったら家で過ごす」というような、条件によって処理を分けたいときに使います。
PHPでの条件分岐には、if文とswitch文、match式があります。

2. if文

2-1. if文

if文による条件分岐は以下のように定義します。

if (条件式) {  //①
  条件式でtrueの時の処理 //②
}

① 条件式には結果がbool型で返されるような式にします。(trueかfalseを返す)
 比較演算子や論理演算子が使用できます。
② 処理は①の条件式により結果がtrueとなった場合に、実行されます。そのため、①がfalseの場合②の処理は実行されません。

例文1

<body>
    <?php
        $intVal = 1;
        if ($intVal == 1) { //①
            echo "変数intValの値は1です";  //②
        }
    ?>
</body>

① 変数intValの値は1であり、if文により1なのかをチェックしています。
② ①のチェックで1なので、②の処理が実行されます。

例文2

<body>
    <?php
        $intVal = 1;
        if ($intVal == 2) { //①
            echo "変数intValの値は1です";  //②
        }
    ?>
</body>

① 変数intValの値は1であり、if文により2なのかをチェックしています。
② ①のチェックで2なので、②の処理は実行されません。

2-2. else文

上記の2-1. if文の例文2で、条件式の結果がfalseのときなので何も処理されませんでした。
ここで、else文を使用するとfalseの場合の処理を行うことができます。

if (条件式) {
  条件式でtrueの時の処理
} else {
  条件式でfalseの時の処理
}

例文

<body>
    <?php
        $intVal = 2;
        if ($intVal == 1) {
            echo "変数intValの値は1です";
        } else {
            echo "変数intValの値は1ではありません";
        }
    ?>
</body>

変数intValの値は1ではありません が出力されます。

2-3. else if文

if~else の処理の場合2分岐のみですが、if elseを使うことで3つ以上の条件分岐を記述することができます。
else if文はいくつでも定義できます。
ここで注意すべきなのが、コードは上から下へ順に処理され、またif文は条件式でtrueと評価されると以降のelse ifの条件式は評価せずにそのif文を抜けます。そのため、上から条件に厳しい条件式を定義すると良いです。

if (条件式A) {
  条件式Aでtrueの時の処理
} else if (条件式B) {
  条件式Bでtureの時の処理
} else {
  上記の条件式全てでfalseの時の処理
}

例文

<body>
    <?php
        $intVal = 2;
        if ($intVal == 1) {
            echo "変数intValの値は1です";
        } else if ($intVal == 2) {
            echo "変数intValの値は2です";
        } else {
            echo "変数intValの値は1と2以外です";
        }
    ?>
</body>

2-4. if文のネスト

ネストとは、入れ子構造を意味し、if文の中にif文を記述できます。
いくつでも定義することができますが、複雑さや可読性などを考慮しあまり多くし過ぎるのも良くありません。

<?php
    if (条件式){
        if (条件式){
        }
    }
?>

2-5. ブロック

if文の条件による処理は、ブロックで囲われた範囲が対象となります。
PHPでは、波かっこ {} か、または コロン :endif; を使って書くことができます。
どちらを使用するかは統一し、混在は基本しません。

2-5-1. 波かっこ {}

{} の中に書いた部分が「条件成立時の処理」として実行されます。

if ($a > 10) {
    echo "aは10より大きい";
    echo "処理がここまで含まれる";
}
2-5-2. コロン : と endif;

HTMLと混在させる場合やテンプレートで可読性を上げるのに使われます。

if ($a > 10):
    echo "aは10より大きい";
    echo "処理がここまで含まれる";
endif;
2-5-3. ブロックの省略

ブロックを省略して 1 行だけ処理を書くことができます。
しかし、条件が真のとき、次の 1 文だけが対象になります。

if ($a > 10)
    echo "大きい";  // if文の対象
    echo "これは常に実行される";  // if文の対象外

基本は {} を省略しないほうが安全です。

3. switch文

3-1. switch文の定義

switch文による条件分岐は以下のように定義します。

switch (値) { //①
  case 値1: //② 値はcaseの値1と同じかをチェック
    処理1; //③
    break; //④
  case 値2: //② 値はcaseの値2と同じかをチェック
    処理2; //③
  case 値3: //② 値はcaseの値3と同じかをチェック
    処理3; //③
    break; //④
  default: //⑤
    上記のcaseに該当しない場合の処理
}

① caseと比較する値を指定します。
② caseはswitchの値と比較され、同じであれば③の処理を行います。
③ ②のcaseで一致(true)した場合、その処理を行います。
④ breakは、そのcaseの処理を抜けます。すなわち、breakに到達しなければ処理を抜けないことを意味するため、case2にはbreakがないため、case3の処理も実行されます。
⑤ defaultは、caseに該当しない場合に実行されます。

3-2. switch文を抜けるには

switch文を抜けるには、break が必要です。そのため、基本case毎にbreakを付与してあげる必要があり、breakがなければ次のcaseも処理されてしまいます。
複数のcaseを続けて処理することをフォールスルーといいます。

4. match式

match 式は、PHP 8.0 で追加された構文で、switch 文に似ていますが より簡潔・安全・式として値を返し、変数に代入したり、引数として渡せる のが特徴です。

  • match なので、結果を変数に代入できる
  • 厳密比較(===)で評価される
  • ブロックを抜けるためのbreakは不要
  • 意図的なフォールスルーには、「カンマ区切り」で列挙する
  • 「=>」の右辺には単一の式や関数の呼び出しのみとする
  • 「=>」の左辺には関数の呼び出しなど任意の式を指定できる
  • default は必須

4-1. match式の定義

以下のように定義します。

match(式) {
    値1 => 式1,
    値2 => 式2,
    default => 式d
}

例文1

$value = 1; 
$result = match ($value) {
    1 => 'One',
    2 => 'Two',
    default => 'Other',
};

echo $result;   // One が表示

例文2
match式なので、厳密比較(===)で評価されます。
そのため、例文1の$value = 1; の部分をstring型の "1" に変更して挙動を確認してみます。

$value = "1"; 
$result = match ($value) {
    1 => 'One',
    2 => 'Two',
    default => 'Other',
};

echo $result;   // Other が表示

例文3
意図的なフォールスルー

$value = 1;
$result = match ($value) {
    1, 2 => 'One or Two',
    default => 'Other',
};

echo $result;  // One or Two が表示

4-2. switch文とmatch式の比較

switch との違いは以下のとおりです。

特徴switchmatch
比較方法ゆるやか比較 (==)厳密比較 (===)
値を返すできない(文)できる(式)
break必要不要
フォールスルーありなし
必ず網羅不要必須(defaultか全ケース)

例文
match の方が短く、break漏れによるバグが起きにくい。

// switch
switch ($status) {
    case 1:
        $msg = 'OK';
        break;
    case 2:
        $msg = 'Warning';
        break;
    default:
        $msg = 'Error';
}

// match
$msg = match ($status) {
    1 => 'OK',
    2 => 'Warning',
    default => 'Error',
};

PHP 8.1以降では、条件式も書け、例えば true を渡して条件分岐として使えます。

$age = 20;
$category = match (true) {
    $age < 13 => 'Child',
    $age < 20 => 'Teen',
    default => 'Adult',
};

繰り返し処理

1. 繰り返し処理とは
2. for文
3. while文 と do-while文

4. foreach文
5. 無限ループ

6. break命令
7. continue命令
8. goto命令

1. 繰り返し処理とは

1〜100の数字を表示したい場合、以下のようにすると表示できます。

echo 1;
echo "<br>";
echo 2;
echo "<br>";
 // 3~99は省略
echo 100;

しかし、面倒です。
その時にPHPでは繰り返し処理によるfor文またはwhile文などを使用します。

for文while文
繰り返し回数回数が決まっているループに向いている回数が未定のループや「条件が成り立つ間ずっと」繰り返す処理に向いている

2. for文

2-1. for文

for文による条件分岐は以下のように定義します。

for (初期化式; 条件式; 更新式) {  //①
  for文の条件式でtrueの際、繰り返される処理 //②
}

① 初期化式には、for文の処理のスタート地点を指定します(最初の一度だけ実行)
  条件式には、for文による繰り返し処理がどのくらいまで行うかの条件を指定します。省略すると無限ループになってしまいます。
  更新式には、{ }内の処理を実行したあとに行われます。{ }内には更新式を操作しません。
② 処理は①の条件式により結果がtrueとなった場合に、実行されます。そのため、①がfalseの場合②の処理は実行されません。

例文

「1. 繰り返し処理とは」で出題した参考コードを、for文に置き換えてみます。
1からスタート($i = 1;)し、100まで処理を繰り返します($i <= 100;)。なので、100まではtrueの評価となります。
for文内の処理が終わると、初期化式の数値から1ずつ増えていきます($i++)。
条件式が101となるとfalseの評価となりこのfor文を抜けます。

for ($i = 1; $i <= 100; $i++){
    echo $i;
    echo "<br>";
}

2-2. for文のネスト

for文もif文と同様にネストすることができます。

<?php
    for (初期化式; 条件式; 更新式){
        for (初期化式; 条件式; 更新式){
        }
    }
?>

3. while文 と do-while文

3-1. while文

while文による条件分岐は以下のように定義します。

初期化式 //①
while (条件式) { //②
  while文の条件式でtrueの際、繰り返される処理 //③
  更新式 //④
}

① 初期化式には、while文の処理の最初に、一度だけ実行されます。
② 条件式には、while文による繰り返し処理の条件を指定します。
③ 処理は②の条件式により結果がtrueとなった場合に、実行されます。そのため、②がfalseの場合③の処理は実行されません。
④ 更新式には、{ }内の処理を実行したあとに行われます。

例文

「1. 繰り返し処理とは」で出題した参考コードを、while文に置き換えてみます。

$i = 1;
while ($i <= 100) {
  echo $i;
  echo "<br>";
  $i++;
}

3-2. do-while文

do-while文による条件分岐は以下のように定義します。

do {
  処理 //①
} while (条件式); //②

① whileの条件式判定より前にdo{ } 内の処理が実行されます。
② ①の処理後に条件式判定を行います。以降の処理はwhile文と同じです。

例文

$i = 1;
do {
  echo $i;
  echo "<br>";
  $i++;
} while ($i <= 100);

3-3. while文 と do-while文の違い

while文do-while文 の大きな違いは、条件判定のタイミングです。

while文do-while文
条件判定のタイミング先に条件判定
→ 条件が真なら処理を実行
先に処理を実行
→ その後に条件判定
処理の実行最初の条件が偽なら、一度も処理されない場合がある条件が偽でも、必ず1回は処理される

4. foreach文

連想配列は添字配列と違い、数値がないためforループが使用できません。
そのため、配列の要素を先頭から1つずつ順番に取り出すforeach文を使用します。

4-1. 連想配列の要素を取得

配列の要素を1つずつ順番に取り出す

foreach(配列名 as キーの変数 => 値の変数) {
    繰り返す処理;
}

4-2. 添字配列の要素を取得

配列の要素を1つずつ順番に取り出す

foreach(配列名 as 値の変数) {
    繰り返す処理;
}

例文

<?php
    $arr = ["JPN"=>"日本", "USA"=>"アメリカ", "GBR"=>"イギリス"];
    foreach($arr as $value) {
        echo $value; // 日本アメリカイギリス
    }
?>

5. 無限ループ

無限ループとは、処理が限りなく繰り返されるループ処理のことです。
条件式が常にtrueとなっており、無限に処理が繰り返されます。このような場合、サーバーを停止、Webブラウザもしくはタブを閉じなければ処理が終了しませんが、後述のbreakで無限ループを抜けることができます。

6. break命令

ループの処理を途中で抜けるには、break文を使います。
break文を使うとループから強制的に抜けることが可能です。なお、for ループでもdo~while ループで同様にbreak文を使えます。

<?php
    $value = 0; //①
    while(true) { //②
        echo "無限ループ中<br>"; //③
        $value++; //④
        if($value === 5) { //⑤
            break; //⑥
        }
    }
?>

① 変数valueに0で初期化(0からスタート)
② 条件式をtrueにし、無限ループを意図的に発生
③ 無限ループ中を表示
④ 0から1ずつ増えていく
⑤ 条件分岐により変数valueの値が5のときにtrueとする
⑥ ⑤の条件分岐がtrueのとき、breakによりwhile文を抜ける

7. continue命令

continue命令は、現在の周回だけをスキップし、ループは継続します。

<?php
    $value = 0; //①
    while(true) { //②
        echo "無限ループ中<br>"; //③
        $value++; //④
        if($value === 5) { //⑤
            continue; //⑥
        }
    }
?>

① 変数valueに0で初期化(0からスタート)
② 条件式をtrueにし、無限ループを意図的に発生
③ 無限ループ中を表示
④ 0から1ずつ増えていく
⑤ 条件分岐により変数valueの値が5のときにtrueとする
⑥ ⑤の条件分岐がtrueのとき、continueによりその周回をスキップし、ループは継続する

8. goto命令

goto命令は、プログラムの実行位置を指定したラベルへ強制的に移動させる命令です。
条件分岐やループ構造を無視して実行位置を移動できるため便利な反面、コードが読みにくくなりやすく、バグの温床になりやすいので現在はほとんど推奨されません。

8-1. 遷移先の定義

goto命令の遷移先のラベル定義は以下のとおりです。

ラベル名:

8-2. goto命令の定義

goto命令の定義は以下のとおりです。

goto ラベル名

例文

for ($i = 1; $i <= 5; $i++) {
    echo "カウント: $i\n";

    if ($i === 3) {
        goto skip; // iが3のときループを飛び出す
    }
}

echo "for文の最後\n";

skip:
echo "gotoで飛んできた\n";

for文は $i = 1 から $i = 5 まで繰り返し
$i3 になった瞬間、goto skip; が実行される
skip: というラベルの位置まで強制的にジャンプ
④ その後はジャンプ先から処理が継続され、残りのループは実行されない

8-3. 注意点

goto命令は、どこへでも無条件でどこでも移動できる訳ではありません。

  • 異なるファイルには移動できない
  • 関数やクラス(メソッドを含む)の中に移動できない
  • ループの外からループの内部には移動できない(ループの内からループの外部には移動できる)

ユーザー定義関数

1. ユーザー定義関数の定義
2. 関数の呼び出し
3. 仮引数と実引数
4. 戻り値
5. 型宣言
6. 可変長引数の関数
7. 再帰関数
8. 可変関数
9. 無名関数(クロージャー)
10. アロー関数
11. ジェネレーター

組み込み関数はあらかじめPHPで用意されている関数ですが、ユーザー独自で関数を作成することができます。それをユーザー定義関数といいます。
計算を行う処理など何度でも再利用可能な処理をまとめたものを定義することができます。

1. ユーザー定義関数の定義

1-1. 関数の定義

関数の定義には以下のように定義します。

function 関数名(仮引数のデータ型 仮引数): 戻り値のデータ型 { //①
    処理
    return 返す値; //②
}

① 仮引数は省略でき、またカンマで区切って複数指定できます。
 この受け取った引数を使用して関数内の処理に使用していきます。
② returnは戻り値であり、関数の処理結果をこの関数を呼び出した元へ返します。省略可能です。
またreturnは処理制御を戻す意味もあり、このreturn直後にコードを記述すると到達できないコードとなりエラーになります。

1-2. 関数名の命名規則

関数名は、変数名と同じルールです。
詳しくは、変数名の命名規則をご確認ください。

1-3. 関数の定義位置

関数は基本的に条件分岐内や関数内など、どこの位置でも定義することができます。
ただし実際の利用では、可読性や再利用性を高めるために、通常は以下のようにまとめて書くのが一般的です。

  • ファイルの先頭やクラスの中にまとめて定義
  • 条件分岐内で関数定義するのは推奨されない(見通しが悪くなる)

更にもっと再利用性を高めるためにはスクリプトを外部化します。スクリプトを外部化して別ファイルに関数をまとめることで、「コードの再利用性」「メンテナンス性」が大幅に向上します。
特に大規模開発では、require_once で共通ライブラリを読み込むのが基本です。

1-4. インクルードファイルの読み込み方法

読み込まれたファイルのことをインクルードファイルといい、ファイル読み込む方法には、いくつかあります。
外部ファイルを読み込む場合は、原則 絶対パス を利用し、相対パスは避けます。

ファイル読み込み方法概要
include指定したファイルを読み込む。
もしファイルが見つからなくても「警告(Warning)」が出るだけで、処理は続行される。
「料理のレシピを見に行ったけど、レシピが無くてもとりあえず料理を続ける」イメージ。
require必ず指定したファイルを読み込む。
もしファイルが存在しなければ「致命的エラー(Fatal error)」になり、そこでプログラムは止まる。
「調理器具が無ければ絶対に料理ができないから、料理自体を中止する」イメージ。
include_onceすでに読み込まれている場合は再度読み込まない。「レシピを1回見たら、それ以降はもう同じレシピを何度も取りに行かない」イメージ。
require_once必ず読み込み、重複も防ぐ「絶対必要なレシピだから必ず用意するけど、2冊目を持ってくることはしない」イメージ。
1-4-1. インクルードファイルのスコープ

インクルードファイルのスコープは以下のとおりです。

ファイルの読み込み箇所スコープ
関数外グローバルスコープ
関数内ローカルスコープ

2. 関数の呼び出し

関数の呼び出しには、関数名と実引数を指定します。
必須引数の数は、関数定義で指定された仮引数の数に合わせる必要がありますが、デフォルト値が設定されている引数や可変引数を使う場合は、省略することもできます。
例文

<?php
    $result =  avg(7, 5); // avg関数の呼び出し
                          // その結果6を変数resultに格納
    echo $result;

    /* 
    * 平均を計算する関数
    * $val1 第一引数(今回は7がセット)
    * $val2 第二引数(今回は5がセット)
    * return 計算結果(今回は6が戻り値)
    */
    function avg($val1, $val2) {
        $result = ($val1 + $val2) / 2.0;
        return $result;
    }
?>

3. 仮引数と実引数

3-1. 仮引数

3-1-1. 仮引数の定義

関数を定義するときに使う変数 のことで、関数定義の括弧内に定義します。

function greet($name) { // $name が仮引数
    echo "こんにちは、$name さん!";
}
3-1-2. デフォルト引数値

デフォルト引数値とは、関数を呼び出す際に引数が指定されなかった場合、引数に入れる値のことです。代入演算子を利用することで、デフォルト値を設定できます。
デフォルト引数値の定義は以下のように行います。

function 関数名(引数 = デフォルト引数値) {
}

例文

<?php
    $result =  avg(); // avg関数の呼び出し
                      // その結果6を変数resultに格納
    echo $result;

    /* 
    * 平均を計算する関数
    * $val1 第一引数
    * $val2 第二引数
    * return 計算結果
    */
    function avg($val1=7, $val2=5) { //デフォルト引数値で処理される
        $result = ($val1 + $val2) / 2.0;
        return $result;
    }
?>

3-2. 実引数

3-2-1. 関数の呼び出し

関数を呼び出すときに渡す具体的な値 のことで、実際に関数内の仮引数に代入されます。

greet("太郎"); // "太郎" が実引数
3-2-2. 名前付き引数

関数やメソッドを呼び出すときに、引数の順番ではなく「名前(パラメータ名)」で指定できる 機能です。
例文

function createUser($name, $age, $country = "Japan") {
    echo "Name: $name, Age: $age, Country: $country";
}

// 通常の呼び出し(位置引数)
createUser("Taro", 20);

// 名前付き引数
createUser(age: 20, name: "Taro");

3-3. 引数の並び順

順序通りに実引数が仮引数に対応するため、関数呼び出し時に渡す値は、定義した順番に仮引数に代入されます。

例文(OK)
$name必須引数

$greetingデフォルト値付き引数
デフォルト値付き引数は 必須引数の後 に書く必要があります

function greet($name, $greeting = "こんにちは") {
    echo "$greeting、$name さん\n";
}

greet("太郎");               // デフォルト値を使用 → "こんにちは、太郎 さん"
greet("花子", "おはよう");   // 実引数を指定 → "おはよう、花子 さん"

例文(NG)
エラー: デフォルト値付き引数の後に必須引数を置くことはできない

function greet($greeting = "こんにちは", $name) {
    echo "$greeting、$name さん\n";
}

4. 戻り値

4-1. 戻り値とは

return は、 関数の処理結果を呼び出し元に返すための命令 です。
returnは戻り値であり、関数の処理結果をこの関数を呼び出した元へ返します。省略可能です。
またreturnは処理制御を戻す意味もあり、このreturn直後にコードを記述すると到達できないコードとなりエラーになります。

return 返り値

基本的なイメージは以下のとおりです。
①関数の中で計算や処理をする
return を使って、その結果を外に渡す
③呼び出し元(関数を使った場所)で、その値を受け取って使える

例文

function add($a, $b) {
    return $a + $b;  // 計算結果を返す
}

$result = add(3, 5);
echo $result;  // 出力: 8
  • add(3, 5) を呼び出すと、関数内で 3 + 5 が計算されます
  • return 8; で「8」を呼び出し元に返す
  • $result8 が代入され、echo で表示されます

4-2. 複数の戻り値

returnにより複数の戻り値を返すことができます。
例文1(配列)

function getUserData() {
    return ["Alice", 25]; // 配列で返す
}

[$name, $age] = getUserData(); // まとめて受け取る
echo $name; // Alice
echo $age;  // 25

例文2(連想配列)

function getUserData() {
    return ['name' => 'Alice', 'age' => 25];
}

$data = getUserData();
echo $data['name']; // Alice
echo $data['age'];  // 25

5. 型宣言

仮引数と戻り値には、データ型を指定することができます。型宣言を行うことで、宣言された型以外の値が渡されるのを未然に防ぐことができます。
予期せぬ挙動を防ぐという意味でも型宣言を行うことは非常に重要です。
PHP の 型宣言 で利用できる型は大きく分けて以下のものがあります。

  • スカラー型(基本型)
  • 複合型
  • 特殊型
  • オブジェクト・インターフェース型
  • null許容型(nullable 型)
  • false 擬似型

5-1. スカラー型(基本のデータ型)

型名説明使用例
int整数123, -10
float小数(浮動小数点数)3.14, -0.5
string文字列"Hello", 'PHP'
bool真偽値true, false

5-2. 複合型

複合型とは、1つの変数で複数の値をまとめて扱う事ができるものを言います。
PHPに扱える複合型は主に以下のとおりです。

型名説明
array配列型
1つの変数に、複数のデータを順番やキー付きで保存できます。
objectオブジェクト型
引数や戻り値、変数がクラスのインスタンスであることを保証したいときに使います。
callableコールバック型
引数や戻り値に使います。

5-3. 特殊型

PHPに扱える特殊型は主に以下のとおりです。

型名説明
resourceリソース型
外部のシステムやサービスとの接続や操作を扱う特殊な型
void戻り値なし(関数専用)
union typesユニオン型(複数の型を許可)
1つの変数や引数、戻り値が複数の型を取得できる
mixed何でも受け取れる(PHP 8.0~)
never戻らない関数(例外スローなど)(PHP 8.1~)
true / falseNULL 型のみ(PHP 8.2~)
5-3-1. resource

外部のリソース(ファイル、データベース接続、画像、ネットワークソケットなど)を 参照する「ハンドル(参照番号)」 を表します。

5-3-2. void

関数やメソッドの戻り値型で、「この関数は値を返さない」ことを明示的に宣言する型です。
例文

function sayHello(): void {
    echo "Hello!";
}

そのため、returnにより戻り値を定義するとエラーとなります。

function foo(): void {
    return 123; // ❌ エラー
}

returnだけを定義した場合は、エラーになりません。

function foo(): void {
    return; // OK
}
5-3-3. union types

1つの変数や引数、戻り値が複数の型を取得できます。
「|」を使用することで、複数の型を使用することができます。
例文

function test(int|string $value): int|string {
    return $value;
}

上記の例では、

  • $valueintstring を受け取れる
  • 戻り値も intstring を返せる

注意点としては、以下のとおりです。

① 重複はできない

function foo(int|int $x) {} // ❌ エラー

nullable?型 または |null で表現

function foo(?string $x) {}       // string|null と同じ
function foo(string|null $x) {}   // 同じ意味

③ void は単独でしか使えない

function foo(): void {}     // OK
function bar(): int|void {} // ❌ エラー
5-3-4. mixed

void 以外のすべての型が mixed で扱うことができます。
例文

function showValue(mixed $value): void {
    var_dump($value);
}

showValue(123);         // int
showValue("Hello");     // string
showValue([1,2,3]);     // array
showValue(null);        // NULL
showValue(new stdClass); // object

注意点としては、以下のとおりです。

何でも受け入れるので、型安全性は低下します。
できるだけ union types(例: int|string)を使う方が望ましい。

② 戻り値の型指定にも使える

function getConfig(): mixed {
    // 配列や文字列など色々返す
}

③ void とは併用不可

mixed|void はエラーになります。

5-3-5. never

この関数は絶対に値を返さないことを意味し、具体的には、関数が 例外を投げるスクリプトを終了する しかないときに使います。
例文1(例外を必ず投げる関数)

function alwaysThrows(): never {
    throw new Exception("必ず例外が発生します");
}

例文2(終了処理専用の関数)

function stopExecution(string $message): never {
    echo $message;
    exit(1); // スクリプトを強制終了
}

void との違い

意味
void値を返さないが、処理は最後まで実行される
never戻り値がなく、関数は必ず例外・exit などで終了する
return 文を書くことはできない
5-3-6. true / false

戻り値が必ず true か false であることを保証する型です。
bool型とtrue / false型との違いは以下のとおりです。

型宣言許容される値導入バージョン用途
booltrue または false古くから一般的な真偽値
truetrue のみPHP 8.0 〜戻り値が必ず true であることを保証
falsefalse のみPHP 8.0 〜戻り値が必ず false であることを保証

例文1(戻り値は常に true)

function alwaysSuccess(): true {
    return true;   // ✅ OK
    // return false; // ❌ エラー
}

例文2(戻り値は常に false)

function alwaysFail(): false {
    return false;   // ✅ OK
}

5-4. オブジェクト・インターフェース型

クラス名を直接指定できる

class User {}

function register(User $user): void {
    echo "ユーザー登録しました";
}

インターフェースも指定できる

interface Logger {
    public function log(string $msg): void;
}
function setLogger(Logger $logger) { ... }

5-5. null許容型(nullable 型)

型の前に ? を付けると「null も許可」になります。

function greet(?string $name) {
    echo $name ?? "名無し";
}

5-6. false 擬似型

関数やメソッドが 成功時はある型を返すが、失敗時は false を返す というケースを表現するための擬似型です。
例文

// string または false を返す関数
function getData(): string|false {
    if (rand(0, 1) === 1) {
        return "データ取得成功";
    }
    return false; // 失敗
}

$result = getData();

if ($result === false) {
    echo "失敗しました";
} else {
    echo "結果: $result";
}

6. 可変長引数の関数

6-1. 仮引数での可変長引数

仮引数での可変長引数は、関数が受け取る引数の数が固定でなく、任意の数の引数を受け取れる仕組みです。...(スプレッド演算子)を使って実装できます。

function 関数名(データ型 ...可変長引数名): 戻り値のデータ型

例文1(可変長引数のみ)

function sum(int ...$numbers): int {
    $total = 0;
    foreach ($numbers as $num) {
        $total += $num;
    }
    return $total;
}

echo sum(1, 2, 3, 4); // 10
echo sum(5, 10);      // 15

例文2(可変長引数と通常引数の組み合わせ)

function greet($greeting, ...$names) {
    foreach ($names as $name) {
        echo "$greeting, $name!\n";
    }
}

greet("Hello", "Alice", "Bob", "Charlie");
// Hello, Alice!
// Hello, Bob!
// Hello, Charlie!
  • 可変長引数は 関数の最後に置く必要があります
  • 複数の可変長引数を同時に定義することはできません。

6-2. 実引数での可変長引数

実引数でも可変長引数を使用することができます。
例文

$people = ["Alice", "Bob", "Charlie"];

function greet(...$names) {
    foreach ($names as $name) {
        echo "$name\n";
    }
}

greet(...$people);
// 出力結果
// Alice
// Bob
// Charlie
  • 関数定義で ...$names → 可変長引数。受け取った値は配列 $names にまとめられる。
  • 実引数で ...$people → 配列 $people を展開して、要素ごとに個別の引数として渡す。

7. 再帰関数

再帰関数 は、ある関数が自分自身を呼び出すこと、または、そのような関数のことです。
繰り返し処理や階乗・フィボナッチ数列など に便利です。
例文

function factorial($n) {
    if ($n <= 1) { // 終了条件
        return 1;
    }
    return $n * factorial($n - 1); // 自分を呼ぶ
}

echo factorial(5); // 120

再帰関数は、終了条件がないと無限ループになりますので、終了条件が必須です。

8. 可変関数

可変関数とは、変数に関数名を入れて、その変数を呼び出すと関数が実行される関数をいいます。

$変数名();

例文

function greet($name) {
    echo "Hello, $name!";
}

$func = "greet";
$func("Alice");   // Hello, Alice!

9. 無名関数(クロージャー)

9-1. 無名関数の使い方

名前を持たない関数のことで、関数そのものを「値」として変数に代入したり、引数として渡したりできます。
無名関数は必ず 変数に代入するか、引数として渡す 必要があります。

function(仮引数) {
}

例文

$hello = function() { // ①
    echo "Hello!";
};

$hello(); // ②   Hello!が出力

function() { ... }無名関数 で、名前がないので、そのままでは呼び出せません。
変数 $hello に代入することで、$hello() として呼び出せるようになります。

9-2. 無名関数 で外部の変数を利用

無名関数(クロージャ)で外部の変数を利用するため には、use命令を使用します。それにより、親スコープの変数を関数内に引き継ぐ(取り込む)ことができます。
例文

$message = "Hello"; // ① 親スコープの変数

$greet = function($name) use ($message) { // ② useで$messageを引き継ぐ
    echo "$message, $name!";
};

$greet("Alice"); // Hello, Alice!

$message は関数外で定義された変数(親スコープ)
use ($message) によって、無名関数内で $message が使える

use命令とglobal命令の違いについては、以下のとおりです。

globaluse(クロージャ用)
対象グローバル変数親スコープの変数(ローカルも可)
動作直接参照(変更可能)デフォルト値渡し、&で参照可
用途通常の関数内でグローバルを操作無名関数内で外の変数を使う
制限無名関数でも使えるが非推奨無名関数・クロージャ専用

global の場合

$count = 0; // グローバル変数

function incrementGlobal() {
    global $count; // globalで親スコープの$countを参照
    $count++;
}

incrementGlobal();
echo $count; // 1
  • global を使うと 関数内で変数を直接操作できる
  • 無名関数やクロージャ以外でも使える

use の場合

$count = 0;

$func = function() use ($count) { // 値渡し
    $count++;
    echo $count; // 1
};

$func();
echo $count; // 0 (外の$countは変わらない)

$funcRef = function() use (&$count) { // 参照渡し
    $count++;
};

$funcRef();
echo $count; // 1
  • デフォルトでは 値渡し → 関数内で変更しても外の変数は変わらない
  • 無名関数に「外の変数をコピー(または参照)」して渡す

10. アロー関数

無名関数をよりシンプルに定義できる関数を、アロー関数といいます。
任意の式では、暗黙的に親スコープの変数を利用できます。(use命令が不要)

fn(仮引数) => 任意の式

例文

$double = fn($x) => $x * 2; // ②

echo $double(5); // ①,  ③

① 無名関数doubleの引数に「5」を渡す
② $x * 2により、「5 * 2」となり、その結果が返される
③結果を出力

無名関数とアロー関数の違い

無名関数アロー関数
書き方function($x) { return $x*2; }fn($x) => $x*2
外部変数の扱いuse ($var) が必要自動で親スコープからキャプチャ
return の省略できない(必ず書く)単一式なら自動で返す
コードの長さ長くなる短くなる

11. ジェネレーター

ジェネレーターとは、yield 命令を利用することで、returnのように関数を終了することなく、その時々の値を返すことができます。
yield で値を順次返します。
関数は途中で「一時停止」し、次の呼び出しで続きから再開します。

function 関数名() {
    yield 返す値1;
    yield 返す値2;
}

return と yield の違い

function test() {  // ①
    yield 1;
    yield 2;
    return 3;
}

$gen = test();
foreach ($gen as $val) {  // ②
    echo $val, " "; // 1 2
}

yield で返す値だけが foreach に渡る
returnforeach には渡らず Generator 内部で終了を示す

例文

function fruits() {
    yield "Apple";
    yield "Banana";
    yield "Cherry";
}

foreach (fruits() as $fruit) {
    echo $fruit . "\n";
}

結果

Apple
Banana
Cherry

11-2. yield で他の関数を呼び出す

yield で他の関数を呼び出すと、処理の分割や再利用 がわかりやすくなります。

  • yield from 関数名() を使うと、他のジェネレーター関数の値を順番にすべて返せる
  • 大きな処理を分割しても、foreach では 1つのジェネレーターのように扱える
  • 配列にまとめる必要がなく、メモリ効率も良い

例文

// サブジェネレーター関数
function getFruits() {
    yield "Apple";
    yield "Banana";
}

function getVegetables() {
    yield "Carrot";
    yield "Lettuce";
}

// メインジェネレーターで他の関数を呼び出す
function getFoods() {
    yield from getFruits();      // getFruits の yield をすべて返す
    yield from getVegetables();  // getVegetables の yield をすべて返す
    yield "Meat";                // 自分の値も追加
}

// 実行
foreach (getFoods() as $food) {
    echo $food . "\n";
}

結果

Apple
Banana
Carrot
Lettuce
Meat