【PHP】Lesson3-5:関数の型付けをマスターしよう|引数・戻り値の指定方法を学ぶ

PHPでは関数を定義する際に、引数や戻り値に型を指定することができます。
これを「関数の型付け」と呼びます。
型付けを利用することでコードの品質が向上し、バグを減らす効果が期待できます。
本記事では関数の型付けについて基本的な考え方や使い方を解説します。
Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数編
・Lesson3-1:ビルトイン関数を理解しよう
・Lesson3-2:関数の基本を理解しよう
・Lesson3-3:関数の戻り値を理解しよう
・Lesson3-4:デフォルト引数とキーワード引数を理解しよう
・Lesson3-5:関数の型付けを理解しよう ◁今回はココ
・Lesson3-6:無名関数とアロー関数を理解しよう
・Lesson3-7:スコープを理解しよう
・確認問題3-1:石取りゲームを作ろう
・確認問題3-2:丁半賭博ゲームを作ろう
・確認問題3-3:モンスターとのバトルゲームを作ろう
Lesson4:データ構造編
Lesson5:クラス編
関数の型付けとは?目的と利点をわかりやすく解説

関数の型付けは、引数や戻り値に対して「このデータ型であるべき」というルールを強制する仕組みです。
これにより以下の利点があります:
- コードの読みやすさ向上: 関数の意図が明確になります。
- バグの予防: 不適切なデータ型が渡された場合、エラーを早期に検出できます。
- 一貫性の確保: プロジェクト全体で統一的なデータ型管理が可能です。
PHP関数の型指定方法と基本構文の例
PHPでは関数の引数と戻り値に対して型を指定できます。
以下は基本構文と例です:
引数と戻り値に型を指定
// 二つのint型の引数を受け取り、int型の戻り値を返すaddNumbers関数の定義 function addNumbers(int $a, int $b): int { return $a + $b; } echo addNumbers(5, 10); // 出力: 15 // echo addNumbers("5", 10); // エラー: 型の不一致
int $a, int $b
は引数の型を指定しています。: int
は戻り値の型を指定しています。- 異なる型が渡された場合はエラーが発生します。
ユニオン型とは?複数の型を許容する書き方と注意点
PHP 8.0以降では、ユニオン型を使用して複数の型を許容することができます。
ユニオン型の例
// int型かstring型の引数を受け取り、String型の戻り値を返すformatValue関数の定義 function formatValue(int|string $value): string { return "Value: " . $value; } echo formatValue(42); // 出力: Value: 42 echo formatValue("Hello"); // 出力: Value: Hello // echo formatValue(3.14); // エラー: 型の不一致
int|string
は、引数がint
またはstring
のいずれかであることを意味します。- 異なる型が渡されるとエラーになります。
Nullable型を使ってnullを許容する関数を作ろう
型付けにおいて「値が null でも許容される」場合は?
を使用して Nullable 型を指定します。
Nullable型の例
// string型かnullの引数を受け取り、int型の戻り値を返すgetLength関数の定義 function getLength(?string $input): int { return $input ? strlen($input) : 0; } echo getLength("Hello"); // 出力: 5 echo getLength(null); // 出力: 0
?string
は引数がstring
またはnull
を受け取ることを意味します。null
が渡された場合でもエラーになりません。
関数の型付けのまとめ|PHPの型指定を使いこなそう
関数の型付けはコードを安全かつ明確にするための重要な機能です。
PHPでは引数や戻り値の型を指定することでコードの品質向上が期待できます。
次回は「無名関数とアロー関数」について学びましょう。型付けを活用して堅牢なプログラムを作成してください。
演習問題|関数の型付けを使って安全な数値処理関数を作ろう

入力された数値を2倍にする関数を作成しましょう。
この関数では引数と戻り値の両方に型を指定し、PHPの型付けの仕組みを体験します。
関数を使う際、適切な型でない場合はエラーが発生するようにしてください。
この演習の要件
以下の要件に従ってコードを完成させてください。
doubleValue
という関数を作成すること。- 引数には 整数型(int) のみを受け取る。
- 戻り値は 整数型(int) である。
- 引数の値を2倍にして返す。
- ユーザーに数値を入力してもらうこと。
fgets
を使用して標準入力からデータを受け取る。- 入力値の前後の余白を
trim
で取り除くこと。
- 入力された値が数値であるか確認すること。
- 数値でない場合は「エラー: 数値を入力してください」と表示して終了する。
- 数値が正しく入力された場合は、
doubleValue
関数を呼び出し、結果を画面に表示すること。
ただし、以下のような実行結果となること。
数値を入力してください: 7 入力した数値の2倍は: 14
数値を入力してください: abc エラー: 数値を入力してください。
解き方のヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)1:関数
doubleValue
を定義(引数に整数型を指定し、戻り値も整数型)
□ 引数を2倍にした結果を返す
2:「数値を入力してください: 」と改行を出力
3:標準入力から値を取得し、trim
で前後の空白を削除した結果を変数$input
に代入
4:if文
で$input
が数値かどうかを判定
□$input
を整数型にキャストし、変数$number
に代入
□doubleValue
関数を呼び出し、その結果を変数$result
に代入
□ 「入力した数値の2倍は: 」と変数$result
の内容を出力
5:else文
□ 「エラー: 数値を入力してください。」と出力
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
<?php // 2倍する関数: 引数に整数型(int)を指定し、戻り値も整数型を指定します。 /* 【穴埋め問題1】ここにdoubleValue関数を定義し、引数に整数型(int)を指定して戻り値も整数型を指定してください。 また、関数内で引数を2倍にして返すコードを書いてください。 */ // メイン処理部分 echo "数値を入力してください: " . PHP_EOL; // ユーザーからの入力を取得 (ビルトイン関数fgetsを使用) $input = trim(fgets(STDIN)); // 入力値の前後の空白を削除します // 入力値の型チェックを実施 if (is_numeric($input)) { // キャストして関数を呼び出します $number = (int)$input; // doubleValue関数を呼び出して結果を取得 $result = doubleValue($number); // 結果を表示 echo "入力した数値の2倍は: " . $result . PHP_EOL; } else { // 入力が数値でない場合のエラーメッセージ echo "エラー: 数値を入力してください。" . PHP_EOL; }
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
演習問題の答え合わせ
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
<?php // 2倍する関数: 引数に整数型(int)を指定し、戻り値も整数型を指定します。 function doubleValue(int $number): int { // ここで引数の数値を2倍にして返します。 return $number * 2; } // メイン処理部分 echo "数値を入力してください: " . PHP_EOL; // ユーザーからの入力を取得 (ビルトイン関数fgetsを使用) $input = trim(fgets(STDIN)); // 入力値の前後の空白を削除します // 入力値の型チェックを実施 if (is_numeric($input)) { // キャストして関数を呼び出します $number = (int)$input; // doubleValue関数を呼び出して結果を取得 $result = doubleValue($number); // 結果を表示 echo "入力した数値の2倍は: " . $result . PHP_EOL; } else { // 入力が数値でない場合のエラーメッセージ echo "エラー: 数値を入力してください。" . PHP_EOL; }
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
関数の定義と型付け
function doubleValue(int $number): int { return $number * 2; }
- 関数の定義:
function doubleValue
によって、doubleValue
という名前の関数を定義しています。 - 引数の型付け:
(int $number)
は、この関数が 整数型 (int) の引数のみ受け取れることを指定しています。 - 戻り値の型付け:
: int
は、この関数が 整数型 (int) の値を返すことを指定しています。 - 型付けの利点: 型付けを行うことで、誤った型のデータが渡された場合にエラーを出して安全性を高めることができます。
メイン処理部分
echo "数値を入力してください: " . PHP_EOL; $input = trim(fgets(STDIN));
echo
: 文字列を出力します。ここでは「数値を入力してください」と画面に表示します。fgets
: 標準入力 (キーボードからの入力) を取得するビルトイン関数です。trim
: 入力値の前後の余分な空白や改行を取り除くために使います。PHP_EOL
: 改行を表します。環境に依存せず、適切な改行コードを使用します。
型チェックと条件分岐
if (is_numeric($input)) { $number = (int)$input; $result = doubleValue($number); echo "入力した数値の2倍は: " . $result . PHP_EOL; } else { echo "エラー: 数値を入力してください。" . PHP_EOL; }
is_numeric
: 入力値が数値であるかを確認する関数です。数値でない場合はエラーメッセージを表示します。- キャスト:
(int)
は入力値を整数型に変換します。 - 関数の呼び出し:
$result = doubleValue($number);
で、定義した関数を呼び出し、引数に渡した値を2倍にして戻り値を取得します。 - 条件分岐:
if-else
文を使用して入力が数値である場合とそれ以外の場合で処理を分けています。
- 関数の定義:
まとめ
このコードでは「関数の型付け」の重要性を学びました。
型付けを行うことで不適切なデータが渡された際にエラーを早期に検出でき、コードの安全性が向上します。
ぜひ自分で新しい関数を作り、型付けの効果を実感してください!