基礎

PHPの型宣言(タイプヒント)|引数と戻り値の型を指定する方法

PHPの型宣言(Type Declarations)は、関数の引数や戻り値にデータ型を指定する機能です。型宣言を使うことで、意図しない型の値が渡された場合にエラーを発生させ、バグを未然に防ぐことができます。

PHP 5で基本的な型ヒントが導入され、PHP 7以降でスカラー型やnull許容型、PHP 8でunion型やmixed型など、型システムが大幅に強化されてきました。現代のPHP開発では型宣言は必須のテクニックです。

基本的な使い方

引数の前に型名を記述し、戻り値の型は ): の後に記述します。

PHP
<?php
function add(int $a, int $b): int {
    return $a + $b;
}

echo add(3, 5) . "\n";
echo add(10, 20) . "\n";
実行結果
8
30

int $a で引数 $a が整数型であることを宣言し、: int で戻り値が整数型であることを宣言しています。もし文字列など異なる型を渡すと、型の自動変換が行われるか、strict モードではエラーになります。

使用可能な型一覧

PHPで使用できる主な型宣言を紹介します。

PHP
<?php
// スカラー型
function scalarExample(int $i, float $f, string $s, bool $b): string {
    return "int:{$i} float:{$f} string:{$s} bool:" . ($b ? "true" : "false");
}
echo scalarExample(42, 3.14, "hello", true) . "\n";

// 配列型
function sumArray(array $numbers): int {
    return array_sum($numbers);
}
echo sumArray([1, 2, 3, 4, 5]) . "\n";

// callable型
function applyFunc(callable $func, int $value): int {
    return $func($value);
}
echo applyFunc(function($n) { return $n * 2; }, 5) . "\n";
実行結果
int:42 float:3.14 string:hello bool:true
15
10

null許容型とunion型

PHP 7.1以降では ? でnull許容型、PHP 8.0以降では | でunion型を宣言できます。

PHP
<?php
// null許容型(PHP 7.1+)
function findUser(?int $id): ?string {
    if ($id === null) {
        return null;
    }
    $users = [1 => "田中", 2 => "佐藤"];
    return $users[$id] ?? null;
}

echo findUser(1) . "\n";
echo var_export(findUser(null), true) . "\n";

// union型(PHP 8.0+)
function formatValue(int|float|string $value): string {
    if (is_numeric($value)) {
        return number_format((float)$value, 2);
    }
    return (string)$value;
}

echo formatValue(1234) . "\n";
echo formatValue(3.14159) . "\n";
echo formatValue("テスト") . "\n";
実行結果
田中
NULL
1,234.00
3.14
テスト

strictモード

declare(strict_types=1) を宣言すると、暗黙の型変換が無効になり、厳密な型チェックが行われます。

PHP
<?php
declare(strict_types=1);

function multiply(int $a, int $b): int {
    return $a * $b;
}

echo multiply(3, 4) . "\n";  // OK: 12

// multiply(3, "4");  // TypeError が発生する
// multiply(3, 4.5);  // TypeError が発生する
実行結果
12

実用的な例

PHP
<?php
// void戻り値型:何も返さないことを明示
function logMessage(string $message, string $level = "INFO"): void {
    echo "[{$level}] {$message}\n";
    // return文なし、またはreturn;のみ
}

logMessage("処理開始");
logMessage("警告です", "WARN");

// クラスの型宣言
class Product {
    public function __construct(
        private string $name,
        private int $price
    ) {}

    public function getName(): string { return $this->name; }
    public function getPrice(): int { return $this->price; }
}

function showProduct(Product $product): void {
    echo $product->getName() . ": " . $product->getPrice() . "円\n";
}

$p = new Product("PHP入門書", 2980);
showProduct($p);
実行結果
[INFO] 処理開始
[WARN] 警告です
PHP入門書: 2980円
ポイント

PHP 8.0以降では mixed 型(全ての型を許容)や never 型(PHP 8.1、関数が正常に終了しないことを示す)も使用できます。型宣言を積極的に使うことで、IDE の補完機能が向上し、静的解析ツール(PHPStan等)の恩恵も最大限受けられます。

注意

strict_types の宣言はファイルごとに行う必要があり、呼び出し元のファイルで宣言されている場合にのみ厳密チェックが適用されます。呼び出される関数側のファイルで宣言していても、呼び出し元に宣言がなければ緩やかな型チェックが行われます。

まとめ

  • 引数の前に型名、戻り値は : の後に型名を記述して型宣言する
  • int, float, string, bool, array, callable などが使用可能
  • ?型名 でnull許容型、型1|型2 でunion型を宣言できる
  • declare(strict_types=1) で厳密な型チェックを有効にできる
  • 型宣言はバグ防止・IDE補完・静的解析に大きく貢献する