PHP 関数における戻り値
関数(ファンクション)は通常、計算を実行したりデータを取得したりするために使用されます。そして、これらのオペレーションの結果は、多くの場合、関数本体の外部で使用される必要があります。関数から値をリターン(Return / 戻り値)することで、関数は処理したデータを呼び出し元のコードに送り戻し、そのデータのさらなる処理や表示を可能にします。
1. return ステートメント
return ステートメントは、関数の内部から呼び出し元へ値を送り戻すために使用されます。PHP が関数内で return ステートメントに遭遇すると、関数の実行は即座に終了し、指定された値が返されます。関数内で return ステートメントの後に記述されたコードは、一切実行されません。
1.1 スカラ型の戻り値
関数は、ストリング、インテジャー、フロート、ブーリアン(真偽値)を含む、あらゆる有効な PHP のデータタイプを返すことができます。
<?php
// PHP 7+ 構文:引数のタイプを int、戻り値のタイプも int に指定
function calculateSum(int $num1, int $num2): int {
$sum = $num1 + $num2;
return $sum; // 整数の合計を返す
// echo "この行のコードは決して実行されません";
}
$result = calculateSum(5, 10);
echo "合計は:" . $result; // 出力:合計は:15
function getGreeting(string $name): string {
$greeting = "こんにちは、" . $name . "さん!";
return $greeting; // ストリングの挨拶文を返す
}
$message = getGreeting("Alice");
echo "<br>" . $message; // 出力:こんにちは、Aliceさん!
function isEven(int $number): bool {
if ($number % 2 == 0) {
return true; // ブーリアン値 true を返す
} else {
return false; // ブーリアン値 false を返す
}
}
$check1 = isEven(4); // $check1 は true になります
$check2 = isEven(7); // $check2 は false になります
echo "<br>4 は偶数ですか? " . ($check1 ? "はい" : "いいえ"); // 出力:4 は偶数ですか? はい
echo "<br>7 は偶数ですか? " . ($check2 ? "はい" : "いいえ"); // 出力:7 は偶数ですか? いいえ
?>calculateSum 関数では、return $sum; ステートメントが計算された合計値を関数の呼び出し元に送り戻します。その後、呼び出し元はその値を $result バリアブルに格納します。同様に、getGreeting はストリングを返し、isEven はブーリアン値を返します。
1.2 アレイとオブジェクトの戻り値
関数は、アレイ(配列)やオブジェクトのような、より複雑なデータタイプを返すこともできます。これは、複数の関連する値や構造化されたデータを一度に返したい場合に非常に一般的です。
<?php
function getUserDetails(int $userId): array {
// 実際のアプリケーションでは、通常はデータベースからデータを取得します
if ($userId === 1) {
return [
'id' => 1,
'name' => 'John Doe',
'email' => '[email protected]'
];
} elseif ($userId === 2) {
return [
'id' => 2,
'name' => 'Jane Smith',
'email' => '[email protected]'
];
} else {
return []; // ユーザーが見つからない場合は空のアレイを返す
}
}
$user1 = getUserDetails(1);
echo "ユーザー 1 氏名:" . $user1['name'] . "、メール:" . $user1['email'];
// 出力:ユーザー 1 氏名:John Doe、メール:[email protected]
$user3 = getUserDetails(3);
if (empty($user3)) {
echo "<br>ユーザー 3 は見つかりませんでした。"; // 出力:ユーザー 3 は見つかりませんでした。
}
// オブジェクトを返す例 (初歩的なデモ。オブジェクトの詳細は後の章で解説します)
class Product {
public string $name;
public float $price;
public function __construct(string $name, float $price) {
$this->name = $name;
$this->price = $price;
}
}
function createProduct(string $name, float $price): Product {
$product = new Product($name, $price);
return $product;
}
$item = createProduct("ノートパソコン", 1200.50);
echo "<br>製品:" . $item->name . "、価格:$" . $item->price;
// 出力:製品:ノートパソコン、価格:$1200.5
?>getUserDetails 関数は、ユーザー情報を含む連想配列を返します。これにより、関連するデータを単一の戻り値にまとめることができます。createProduct 関数はオブジェクトを返すデモであり、オブジェクトはデータと潜在的な振る舞いをカプセル化できます。
1.3 null の返却と戻り値なし
関数は必ずしも値を返す必要はありません。関数が末尾まで実行されても return ステートメントに遭遇しなかった場合、暗黙的に null を返します。また、明示的に return null; と記述することもできます。
<?php
// 'void' 戻り値タイプ宣言 (PHP 7.1+) は、この関数が値を返さないことを明示します
function doSomething(): void {
echo "この関数はアクションを実行しますが、データは返しません。";
// ここには return ステートメントはありません
}
$result1 = doSomething(); // 出力:この関数はアクションを実行しますが、データは返しません。
echo "<br>doSomething() の結果:";
var_dump($result1); // 出力:NULL
// '?string' タイプヒンティング (PHP 7.1+) は、この関数がストリングまたは null を返せることを示します
function findUserById(int $id): ?string {
if ($id === 10) {
return "Alice";
}
return null; // ユーザーが見つからない場合、明示的に null を返す
}
$userName1 = findUserById(10);
echo "<br>見つかったユーザー:" . $userName1; // 出力:見つかったユーザー:Alice
$userName2 = findUserById(20);
echo "<br>見つかったユーザー:";
var_dump($userName2); // 出力:NULL
?>明示的に null を返すことは、オペレーションの失敗や結果が見つからなかったことを示す非常に一般的な設計パターンです。
2. 総合的な実践ケース
2.1 割引価格の計算
Eコマースのシナリオを想定し、商品に割引を適用した後の最終価格を計算する必要があります。関数はこのロジックをカプセル化し、計算された価格を返します。
<?php
/**
* 商品の割引後価格を計算する。
*
* @param float $originalPrice 初期価格。
* @param float $discountPercentage 割引率 (例:10 は 10% を表す)。
* @return float 割引後の最終価格。
*/
function calculateDiscountedPrice(float $originalPrice, float $discountPercentage): float {
if ($discountPercentage < 0 || $discountPercentage > 100) {
// 無効な割引率を処理。シンプルにするためここでは元の価格を返す
return $originalPrice;
}
$discountAmount = $originalPrice * ($discountPercentage / 100);
$finalPrice = $originalPrice - $discountAmount;
return $finalPrice;
}
$productA_price = 150.00;
$discountA = 15; // 15% 割引
$finalPriceA = calculateDiscountedPrice($productA_price, $discountA);
echo "製品 A 元価格:$" . $productA_price . "<br>";
echo "製品 A " . $discountA . "% 割引後の最終価格:$" . number_format($finalPriceA, 2) . "<br><br>";
?>この関数は再利用性が高く、価格計算のロジックをアプリケーションの他の部分から隔離しています。呼び出し元は内部でどのように計算されているかを気にする必要はなく、返された $finalPriceA を表示に使用するだけです。
2.2 ユーザー入力のバリデーション
フォームの送信を処理する際、ユーザーの入力(メールアドレスの形式や最小パスワード長など)を検証(バリデーション)することがよくあります。このとき、関数がブーリアン値(true/false)を返して、検証がパスしたか失敗したかを示すのは標準的な設計です。
<?php
/**
* メールアドレスが有効かどうかをチェックする。
* @return bool 有効な場合は true、それ以外は false。
*/
function isValidEmail(string $email): bool {
// filter_var は非常に強力な PHP ビルトインバリデーション関数です
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
$userEmail1 = "[email protected]";
if (isValidEmail($userEmail1)) {
echo "'" . $userEmail1 . "' は有効なメールアドレスです。<br>";
} else {
echo "'" . $userEmail1 . "' は無効なメールアドレスです。<br>";
}
?>