PHP 入門

PHP ユーザー定義関数

PHP において、関数(Functions)は極めて重要な基礎ビルディングブロックです。関数を使用することで、特定のタスクを実行するコードブロックを一つにパッケージ化(カプセル化)できます。このメカニズムはコードの冗長性を排除するだけでなく、ロジックを独立したユニットとして組織化するため、コードの再利用性、モジュール化、そして将来的なメンテナンス効率を飛躍的に向上させます。

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

PHP でユーザー定義関数をデリクレア(宣言)するには、function キーワードを使用し、その後に関数名、丸括弧 ()、そして波括弧 {} で囲まれたコードブロックを記述します。

関数名はアルファベットまたはアンダースコア(_)から始める必要があり、その後に任意の数のアルファベット、数字、アンダースコアを続けることができます。PHP の関数名はケースインセンシティブ(大文字・小文字を区別しない)ですが、一貫性のある命名規則(業界で最も一般的なのは camelCase:キャメルケース)に従うことが強く推奨されます。

<?php
// 引数も戻り値もない基本的な関数の定義
function greetUser() {
    echo "こんにちは、アプリケーションへようこそ!";
}

// 1つの引数(パラメータ)を持つ関数の定義
function displayMessage($message) {
    echo $message;
}

// 複数の引数を持つ関数の定義
function addNumbers($num1, $num2) {
    $sum = $num1 + $num2;
    echo "合計は:" . $sum;
}

// デフォルト値を持つ引数の定義(詳細は次章で解説します)
// ここではコンテキストを理解するためのプレビューです。
function sayGoodbye($name = "ゲスト") {
    echo "さようなら、" . $name . "さん!";
}
?>

1.1 関数の命名規則 (Naming Conventions)

PHP では関数名の大文字・小文字は区別されませんが、一貫したネーミングコンベンション(命名規約)を維持することは、コードの可読性とメンテナンス性を高めるために不可欠です。モダンな PHP 開発において最も一般的なのは camelCase(キャメルケース / 小峰打ち) です。これは最初の単語をすべて小文字にし、以降の単語の頭文字を大文字にする形式です(例:calculateTotal, getUserProfile)。

また、1文字だけの関数名や、do_stuff() のような抽象的すぎる名前は避け、その関数の目的が明確に伝わる名前を付けるようにしましょう。

<?php
// ベストプラクティス:キャメルケース (camelCase) を使用
function calculateAreaOfRectangle($length, $width) {
    return $length * $width;
}

// 許容範囲だがモダンな PHP では一般的ではない:スネークケース (snake_case)
function calculate_area_of_rectangle($length, $width) {
    return $length * $width;
}

// 回避すべき:大文字小文字がバラバラ(動作はするが非常に不適切)
function CalculateAreaOfRectangle($length, $width) { // 先頭が大文字
    return $length * $width;
}

// 回避すべき:名前が広範すぎて目的が不明確
function processData($data) {
    // ... ロジック ...
}
?>

2. ユーザー定義関数の呼び出し (Calling)

定義された関数を実行するには、関数名を記述し、その直後に丸括弧を付けます。この動作を「呼び出し(Calling / コール)」と呼びます。関数が引数を必要とする場合は、丸括弧の中に値を渡します。関数が呼び出されると、その内部に記述されたコードが実行されます。

<?php
// シンプルな関数の定義
function showGreeting() {
    echo "おはようございます!\n";
}

// 引数として名前を受け取る関数の定義
function personalizeGreeting($name) {
    echo "こんにちは、" . $name . "さん!\n";
}

// showGreeting 関数の呼び出し
showGreeting(); // 出力:おはようございます!

// 引数を渡して personalizeGreeting 関数を呼び出し
personalizeGreeting("アリス"); // 出力:こんにちは、アリスさん!
personalizeGreeting("ボブ");   // 出力:こんにちは、ボブさん!

// スクリプト内で定義された関数を呼び出す例
function performCalculation() {
    $result = 5 * 10;
    echo "計算結果は:" . $result . "\n";
}

performCalculation(); // 出力:計算結果は:50
?>

関数はスクリプト全体で何度でも呼び出すことができるため、繰り返し実行が必要なタスクの処理に最適です。例えば、ユーザー入力をバリデーション(検証)するコードを関数として定義しておけば、フォームが送信されるたびにその関数を呼び出すだけで済みます。これにより、アプリケーションのあちこちで同じロジックを繰り返し書く手間(コードの二重管理)を防ぐことができます。

3. 関数の実行フロー

PHP が関数呼び出しに遭遇すると、メインスクリプトの実行を一時的に一時停止し、関数の定義場所までジャンプします。関数体内のすべてのステートメントを実行した後、関数が呼び出された元の位置に戻り、メインスクリプトの後続の処理を再開します。

ユーザーログインのプロセスを例に挙げてみましょう:

  1. メインスクリプト: ユーザーがログインフォームを送信。
  2. メインスクリプト: validateCredentials() 関数を呼び出し。
  3. 関数 validateCredentials() ユーザー名とパスワードをデータベースと照合。
  4. 関数 validateCredentials() 照合結果として true または false をリターン。
  5. メインスクリプト: 戻り値を受け取り、それに基づいてページ遷移するかエラーを表示するかを決定。

これは、関数がいかに複雑なロジックを抽象化して隠蔽し、メインスクリプトをクリーンかつビジネスロジック全体に集中させることができるかを完璧に示しています。

4. 総合的な実践ケース

異なるシナリオで関数をどのように定義し、呼び出すか、より具体的な例を見ていきましょう。

4.1 ケース 1:円の面積の計算

この関数は半径を引数として受け取り、面積を計算して表示します。

<?php
/**
 * 円の面積を計算する。
 *
 * @param float $radius 円の半径
 * @return void (結果を直接 echo するため戻り値なし)
 */
function calculateCircleArea($radius) {
    $pi = 3.14159; // 円周率の近似値
    $area = $pi * $radius * $radius; // 面積 = Pi * r^2
    echo "半径 " . $radius . " の円の面積は:" . $area . "\n";
}

// 異なる半径で関数を呼び出す
calculateCircleArea(5);  // 出力:半径 5 の円の面積は:78.53975
calculateCircleArea(10); // 出力:半径 10 の円の面積は:314.159
calculateCircleArea(2.5); // 出力:半径 2.5 の円の面積は:19.6349375
?>

4.2 ケース 2:パーソナライズされたウェルカムメッセージの生成

ユーザー名と優先言語を受け取り、それに応じた挨拶文を構築します。

<?php
/**
 * 名前と言語に基づいてパーソナライズされたメッセージを生成する。
 *
 * @param string $userName ユーザー名
 * @param string $language 優先言語 ('en' は英語、'es' はスペイン語)
 * @return void
 */
function createWelcomeMessage($userName, $language) {
    if ($language == 'en') {
        echo "Welcome, " . $userName . "! Enjoy your stay.\n";
    } elseif ($language == 'es') {
        echo "¡Bienvenido, " . $userName . "! Disfruta tu estancia.\n";
    } else {
        echo "こんにちは、" . $userName . "さん!その言語は現在サポートされていません。\n";
    }
}

// 異なる引数で関数を呼び出す
createWelcomeMessage("Maria", "es"); // 出力:¡Bienvenido, Maria! Disfruta tu estancia.
createWelcomeMessage("John", "en");  // 出力:Welcome, John! Enjoy your stay.
createWelcomeMessage("Anna", "fr");  // 出力:こんにちは、Annaさん!その言語は現在サポートされていません。
?>

4.3 ケース 3:簡易トランザクションログの記録

金融取引のログエントリを生成する関数です。

<?php
/**
 * タイムスタンプ、タイプ、金額を含む取引ログを記録する。
 *
 * @param string $transactionType 取引タイプ (例:"Deposit", "Withdrawal")
 * @param float $amount 取引金額
 * @return void
 */
function logTransaction($transactionType, $amount) {
    $timestamp = date("Y-m-d H:i:s"); // 現在の日時を取得
    echo "[" . $timestamp . "] 取引タイプ:" . $transactionType . ",金額:$" . number_format($amount, 2) . "\n";
}

// 関数を呼び出して異なる取引を記録
logTransaction("Deposit", 150.75);    // 例:[2026-05-08 19:30:00] 取引タイプ:Deposit,金額:$150.75
logTransaction("Withdrawal", 50.00);     // 例:[2026-05-08 19:31:05] 取引タイプ:Withdrawal,金額:$50.00
logTransaction("Transfer", 200.50);    // 例:[2026-05-08 19:32:10] 取引タイプ:Transfer,金額:$200.50
?>