PHP の型宣言(strict_types の使い方)を徹底解説!初心者でもわかる型の指定方法
新人
「PHPの型宣言って何ですか?」
先輩
「PHPの型宣言は、変数や関数の引数に決まったデータの種類(型)を指定する機能です。」
新人
「型って具体的に何ですか?」
先輩
「例えば、数字や文字列など、データの種類のことだよ。PHPでは、型宣言を使うと、決まった型のデータしか受け付けないようにできるんだ。」
新人
「それを使うとどんなメリットがあるんですか?」
先輩
「じゃあ、具体的に型宣言のメリットを見ていこう!」
1. PHPの型宣言とは?
PHPの型宣言とは、変数や関数の引数・戻り値にデータの型を指定する仕組みです。型を指定することで、間違ったデータの受け渡しを防ぎ、プログラムを安全に動作させることができます。
例えば、次のようなデータの種類(型)があります。
- 整数(
int
) - 小数(
float
) - 文字列(
string
) - 真偽値(
bool
) - 配列(
array
)
2. 型宣言を使うメリット
型宣言を使うと、以下のようなメリットがあります。
- エラーを未然に防げる - 間違った型のデータが渡されると、プログラムが止まるため、バグを早く見つけられる。
- コードの可読性が向上する - 関数の引数や戻り値の型が明確になるので、他の人が見ても理解しやすい。
- デバッグがしやすい - 型が決まっていることで、どこでエラーが発生したのか特定しやすい。
3. strict_types の基本的な使い方
PHPでは、strict_types
を使うことで、型の厳密なチェックを行うことができます。通常、PHPは型を自動的に変換しますが、strict_types=1
を指定すると、決められた型以外のデータは受け付けなくなります。
■ strict_types
を有効にする
ファイルの一番上に declare(strict_types=1);
を書くと、厳密な型チェックが適用されます。
<?php
declare(strict_types=1);
function add(int $a, int $b): int {
return $a + $b;
}
echo add(3, 5); // 出力: 8
?>
■ strict_types
を使わない場合(デフォルト)
PHPのデフォルトの動作では、型を自動的に変換します。例えば、文字列の "3"
を数値として扱うことができます。
<?php
function add(int $a, int $b): int {
return $a + $b;
}
echo add("3", "5"); // 出力: 8(型変換される)
?>
このように、文字列 "3"
も整数 3
に自動変換されるため、エラーになりません。
■ strict_types=1
を指定した場合
厳密な型チェックを有効にすると、型が一致しない場合にエラーになります。
<?php
declare(strict_types=1);
function add(int $a, int $b): int {
return $a + $b;
}
echo add("3", "5"); // エラー: 型が一致しない
?>
Fatal error: Uncaught TypeError: add(): Argument #1 must be of type int, string given
このように、文字列の "3"
を渡すとエラーが発生します。これにより、型のミスを防ぐことができます。
4. strict_types=1 を指定した場合の動作
PHP で strict_types=1
を指定すると、関数の引数や戻り値の型が厳密にチェックされるようになります。つまり、指定した型と完全に一致するデータ型でないとエラーになります。
■ 厳密な型チェックの例
以下のコードは、int
型の引数を持つ関数に対して、文字列を渡した場合の動作を示しています。
<?php
declare(strict_types=1);
function multiply(int $a, int $b): int {
return $a * $b;
}
echo multiply(5, "3"); // エラー発生
?>
Fatal error: Uncaught TypeError: multiply(): Argument #2 must be of type int, string given
このように、引数 $b
に文字列 "3"
を渡したため、エラーが発生します。strict_types=1
を有効にすることで、意図しない型変換を防ぎ、バグを減らすことができます。
5. strict_types=0(デフォルト)の動作との違い
PHPのデフォルトの設定では、関数の引数や戻り値の型が厳密にチェックされず、自動的に型変換が行われます。
■ デフォルト(strict_types=0
)の動作
以下のコードは、厳密な型チェックを行わない場合の動作を示しています。
<?php
function multiply(int $a, int $b): int {
return $a * $b;
}
echo multiply(5, "3"); // 出力: 15
?>
この場合、$b
に文字列 "3"
を渡していますが、自動的に整数に変換されて計算が実行されます。
■ strict_types=1
との比較
以下のように、同じ関数でも strict_types=1
を指定するとエラーになり、指定しない場合は自動的に型変換が行われるという違いがあります。
strict_types=1
: 型が厳密にチェックされ、間違った型のデータはエラーになる。strict_types=0
: 型が自動的に変換され、異なる型のデータでも処理が続行される。
安全性を高めるためには、strict_types=1
を使用することが推奨されます。
6. 型宣言と関数の引数・戻り値の関係
PHP では、関数の引数や戻り値に型を指定することができます。これにより、関数の動作をより明確にし、エラーを防ぐことができます。
■ 引数に型を指定する
関数の引数に型を指定すると、その型以外のデータを渡した場合にエラーを出すことができます。
<?php
declare(strict_types=1);
function greet(string $name) {
echo "こんにちは、" . $name . "さん!";
}
greet("田中"); // 出力: こんにちは、田中さん!
greet(123); // エラー発生
?>
Fatal error: Uncaught TypeError: greet(): Argument #1 must be of type string, int given
このように、数値 123
を渡すとエラーが発生します。
■ 戻り値に型を指定する
関数の戻り値の型も指定することができます。
<?php
declare(strict_types=1);
function add(int $a, int $b): int {
return $a + $b;
}
echo add(5, 3); // 出力: 8
echo add(5, 2.5); // エラー発生
?>
Fatal error: Uncaught TypeError: add(): Return value must be of type int, float returned
戻り値の型をint
に指定しているため、小数 2.5
を渡すとエラーになります。
■ 戻り値の型を柔軟にする(Union 型)
PHP 8.0 以降では、複数の型を指定することができます(Union 型)。
<?php
declare(strict_types=1);
function getValue(int $num): int|string {
if ($num > 10) {
return "大きい値";
}
return $num;
}
echo getValue(5); // 出力: 5
echo getValue(15); // 出力: 大きい値
?>
このように、戻り値の型にint|string
を指定することで、条件によって異なる型のデータを返せるようになります。
7. strict_types を使用する際の注意点
strict_types=1
を使用すると、厳密な型チェックが適用されるため、型のミスを防ぐことができますが、いくつか注意点もあります。
■ 関数間で strict_types
の影響を受ける
strict_types
はファイル単位で適用されるため、異なるファイルで関数を呼び出す際に注意が必要です。
<?php
// file1.php
declare(strict_types=1);
function add(int $a, int $b): int {
return $a + $b;
}
?>
<?php
// file2.php
include 'file1.php';
echo add("3", "5"); // Fatal error: TypeError
?>
このように、strict_types=1
を適用したファイルの関数を別のファイルから呼び出すと、型の不一致によるエラーが発生します。
■ 配列の型チェックには strict_types
だけでは不十分
PHP では、配列の要素ごとに型を指定することはできません。そのため、配列の中のデータ型を統一する場合は、手動でチェックする必要があります。
<?php
declare(strict_types=1);
function sumArray(array $numbers): int {
$sum = 0;
foreach ($numbers as $num) {
if (!is_int($num)) {
throw new TypeError("配列の要素はすべて整数である必要があります");
}
$sum += $num;
}
return $sum;
}
echo sumArray([1, 2, 3]); // 出力: 6
echo sumArray([1, "2", 3]); // TypeError 発生
?>
このように、配列の要素の型を手動でチェックすることで、厳密な型チェックを適用することができます。
8. 型宣言を適用する際のベストプラクティス
PHP で型宣言を活用する際に、より安全で可読性の高いコードを書くためのベストプラクティスを紹介します。
■ すべてのファイルで strict_types=1
を使用する
厳密な型チェックを有効にすることで、型のミスを未然に防ぐことができます。チーム開発の場合も、一貫性を持たせるために、すべての PHP ファイルで strict_types=1
を適用することが推奨されます。
■ 関数やメソッドには必ず型宣言をつける
関数の引数や戻り値には、明確に型を指定することで、バグの発生を防ぐことができます。
<?php
declare(strict_types=1);
function multiply(int $a, int $b): int {
return $a * $b;
}
echo multiply(4, 5); // 出力: 20
?>
型を指定することで、意図しないデータが渡された場合にエラーが発生し、バグを早期に発見できます。
■ 戻り値の型を適切に指定する
戻り値の型を指定することで、関数の出力が意図しない型になるのを防ぐことができます。
<?php
declare(strict_types=1);
function getMessage(bool $success): string {
return $success ? "成功しました" : "失敗しました";
}
echo getMessage(true); // 出力: 成功しました
?>
戻り値の型が明確になることで、関数の仕様を簡単に理解できるようになります。
9. PHP の型宣言と strict_types のまとめ
本記事では、PHP の型宣言と strict_types
の使い方について詳しく解説しました。最後に、重要なポイントを振り返ります。
■ strict_types
のポイント
strict_types=1
を指定すると、厳密な型チェックが行われる。strict_types=0
(デフォルト)では、PHP が型を自動変換するため、意図しない動作が発生することがある。- 関数の引数や戻り値に型を指定することで、コードの可読性と安全性が向上する。
■ 型宣言のポイント
- 引数や戻り値には、適切な型を指定する。
- 複数の型を許容する場合は、PHP 8.0 以降で導入された Union 型(例:
int|string
)を活用する。 - 配列の型チェックは
strict_types
だけでは不十分なので、手動でチェックを行う。
■ strict_types
を適用するベストプラクティス
- プロジェクト全体で
strict_types=1
を適用し、一貫した型の管理を行う。 - 関数の型指定を必ず行い、データのやり取りを明確にする。
- エラーが発生する可能性がある場合は、
try-catch
を使用して適切に処理する。
PHP で型宣言を活用することで、コードのバグを減らし、保守しやすいプログラムを作成することができます。ぜひ、strict_types
を活用して、より安全な PHP コードを書いてみてください。