目次
はじめに
前回の制御構文とループに続き、今回は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);
注意点とベストプラクティス
- 関数名の命名規則
- わかりやすい英語の動詞で始める
- キャメルケースを使用(例:calculateTotal)
- 単一責任の原則
- 一つの関数は一つの責任のみを持つ
- 複雑な処理は小さな関数に分割する
- 引数と戻り値
- 引数は必要最小限に
- 戻り値の型は一貫させる
- エラー処理
- 適切な例外処理を行う
- 無効な入力に対する対策を行う
まとめ
今回は、PHPの関数とスコープについて学びました。関数を適切に使用することで、コードの再利用性が高まり、メンテナンスも容易になります。
練習問題
- 配列を受け取り、その要素の合計、平均、最大値、最小値を計算して返す関数を作成してください。
- ユーザー名とパスワードを受け取り、以下の条件を確認する認証関数を作成してください:
- ユーザー名は3文字以上20文字以下
- パスワードは8文字以上で、英数字を含む
- 条件を満たさない場合はfalseを返す
次回は、オブジェクト指向プログラミング(OOP)の基礎について解説していきます。お楽しみに!
コメント