MENU

PHPの基本から応用まで – 初心者向けチュートリアルシリーズ(第3回:関数とスコープ)

目次

はじめに

前回の制御構文とループに続き、今回はPHPにおける関数の定義と使用方法、そしてスコープについて解説します。関数は、コードの再利用性を高め、プログラムをより効率的に構造化するための重要な要素です。

関数の基本

関数の定義と呼び出し

<?php
// 基本的な関数の定義
function sayHello() {
    echo "こんにちは!\n";
}

// 関数の呼び出し
sayHello();  // 出力: こんにちは!

// パラメータを持つ関数
function greet($name) {
    echo "こんにちは、{$name}さん!\n";
}

greet("山田");  // 出力: こんにちは、山田さん!

戻り値のある関数

function calculateTax($price, $taxRate = 0.10) {
    return $price * (1 + $taxRate);
}

$totalPrice = calculateTax(1000);
echo "税込価格: {$totalPrice}円\n";  // 出力: 税込価格: 1100円

関数の引数

デフォルト引数

function createUser($name, $age = 20, $role = "user") {
    return [
        "name" => $name,
        "age" => $age,
        "role" => $role
    ];
}

$user1 = createUser("田中");  // ageとroleはデフォルト値を使用
$user2 = createUser("山田", 25, "admin");  // すべての値を指定

可変長引数

function calculateAverage(...$numbers) {
    $total = array_sum($numbers);
    $count = count($numbers);
    return $total / $count;
}

$average = calculateAverage(80, 90, 75, 85);
echo "平均点: {$average}\n";

型宣言(Type Hinting)

PHP7以降では、引数と戻り値の型を指定できます:

function addNumbers(int $a, int $b): int {
    return $a + $b;
}

function getUserInfo(string $name, int $age): array {
    return [
        "name" => $name,
        "age" => $age
    ];
}

スコープ

グローバルスコープとローカルスコープ

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

function testScope() {
    $localVar = "ローカル変数";
    global $globalVar;  // グローバル変数を関数内で使用
    
    echo $globalVar . "\n";
    echo $localVar . "\n";
}

testScope();
echo $globalVar . "\n";
// echo $localVar;  // エラー: ローカル変数は関数外でアクセス不可

static変数

function counter() {
    static $count = 0;
    $count++;
    return $count;
}

echo counter() . "\n";  // 出力: 1
echo counter() . "\n";  // 出力: 2
echo counter() . "\n";  // 出力: 3

実践的な例:ユーザー管理システムの関数化

<?php
// ユーザーデータを処理する関数群

function validateUser(array $userData): bool {
    return (
        isset($userData["name"]) &&
        isset($userData["age"]) &&
        isset($userData["email"]) &&
        filter_var($userData["email"], FILTER_VALIDATE_EMAIL)
    );
}

function createUserProfile(string $name, int $age, string $email): array {
    return [
        "name" => $name,
        "age" => $age,
        "email" => $email,
        "created_at" => date("Y-m-d H:i:s")
    ];
}

function getUserStatus(int $age): string {
    if ($age >= 20) {
        return "成人";
    } else {
        return "未成年";
    }
}

// 関数の使用例
$userData = [
    "name" => "山田太郎",
    "age" => 25,
    "email" => "yamada@example.com"
];

if (validateUser($userData)) {
    $profile = createUserProfile(
        $userData["name"],
        $userData["age"],
        $userData["email"]
    );
    
    $status = getUserStatus($userData["age"]);
    echo "ユーザー状態: " . $status . "\n";
}

無名関数(クロージャ)

$numbers = [1, 2, 3, 4, 5];

// 無名関数を変数に代入
$double = function($n) {
    return $n * 2;
};

// array_mapで使用
$doubled = array_map($double, $numbers);
print_r($doubled);

// 外部のスコープの変数を使用
$multiplier = 3;
$triple = function($n) use ($multiplier) {
    return $n * $multiplier;
};

$tripled = array_map($triple, $numbers);
print_r($tripled);

注意点とベストプラクティス

  1. 関数名の命名規則
    • わかりやすい英語の動詞で始める
    • キャメルケースを使用(例:calculateTotal)
  2. 単一責任の原則
    • 一つの関数は一つの責任のみを持つ
    • 複雑な処理は小さな関数に分割する
  3. 引数と戻り値
    • 引数は必要最小限に
    • 戻り値の型は一貫させる
  4. エラー処理
    • 適切な例外処理を行う
    • 無効な入力に対する対策を行う

まとめ

今回は、PHPの関数とスコープについて学びました。関数を適切に使用することで、コードの再利用性が高まり、メンテナンスも容易になります。

練習問題

  1. 配列を受け取り、その要素の合計、平均、最大値、最小値を計算して返す関数を作成してください。
  2. ユーザー名とパスワードを受け取り、以下の条件を確認する認証関数を作成してください:
    • ユーザー名は3文字以上20文字以下
    • パスワードは8文字以上で、英数字を含む
    • 条件を満たさない場合はfalseを返す

次回は、オブジェクト指向プログラミング(OOP)の基礎について解説していきます。お楽しみに!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次