読み込み中...

PHPの型宣言を極める!3ステップで理解と実装をマスター

PHPの型宣言を解説するコード例のスクリーンショット PHP
この記事は約9分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

PHPの型宣言をマスターしたいと思っているあなたへ。

この記事を読むことでPHPの型宣言についての全てが理解でき、自信を持ってコードを書くことができるようになります。

始める前に深呼吸を一つ。今から一緒にPHPの型宣言の世界を探検していきましょう。

●PHPの型宣言とは

PHPはもともと動的型付け言語でした。

つまり、変数に値を代入する際にその型を明示的に指定する必要がない言語です。

しかし、PHP7から、静的型付け機能が導入され、型宣言が可能になりました。

この型宣言により、コードの可読性と安全性が格段に向上しました。

○型宣言の重要性

型宣言は、プログラムが安全に動作することを保証する重要な要素です。

型が宣言されている場合、その型に合わない値が入るとエラーが発生します。

これにより、開発者は意図しないエラーを早期にキャッチし、バグの早期発見や修正が可能になります。

●型宣言の使い方

では、具体的なコードを見ていきましょう。

下記の例はPHPでの基本的な型宣言の方法を示しています。

○サンプルコード1:基本的な型宣言

このコードではaddという関数を定義しています。

関数の引数$a$bにはintという型宣言をし、戻り値にもintという型を宣言しています。

これにより、$a$bに整数以外の値が渡されたり、整数以外の値を返そうとした時点でエラーが発生します。

<?php
declare(strict_types=1); // 厳密な型チェックを有効にする

function add(int $a, int $b): int {
    return $a + $b;
}

echo add(1, 2); // 出力: 3

○サンプルコード2:引数の型宣言

この例では、sayHelloという関数の引数$namestringという型宣言をしています。

この関数は文字列型の値を受け取り、その値を使って挨拶を出力します。

<?php
declare(strict_types=1); // 厳密な型チェックを有効にする

function sayHello(string $name): void {
    echo "Hello, " . $name;
}

sayHello("PHP"); // 出力: Hello, PHP

○サンプルコード3:戻り値の型宣言

ここでは、squareという関数にて引数$numと戻り値にintという型宣言を行っています。

この関数は引数の数値を二乗して返します。

<?php
declare(strict_types=1); // 厳密な型チェックを有効にする

function square(int $num): int {
    return $num * $num;
}

echo square(5); // 出力: 25

●型宣言の応用例

基本的な型宣言について理解したところで、より高度な型宣言の応用例について見ていきましょう。

これらの技術は、より大規模なPHPプロジェクトや高度なアプリケーション開発で活用できます。

○サンプルコード4:クラスとメソッドでの型宣言

このコードではPersonというクラスを定義し、その中に$nameというプライベート変数と、__constructおよびgetNameというメソッドを設定しています。

メソッドの引数と戻り値には型宣言をし、コードの安全性を高めています。

<?php
declare(strict_types=1); // 厳密な型チェックを有効にする

class Person {
    private string $name;

    public function __construct(string $name) {
        $this->name = $name;
    }

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

$person = new Person("Taro");
echo $person->getName(); // 出力: Taro

○サンプルコード5:配列とオブジェクトの型宣言

この例では、processArrayという関数の引数$itemsarrayという型宣言を行っています。

この関数は配列を引数に取り、その各要素を出力します。

<?php
declare(strict_types=1); // 厳密な型チェックを有効にする

function processArray(array $items): void {
    foreach ($items as $item) {
        echo $item . "\n";
    }
}

processArray(["apple", "banana", "cherry"]); // 出力: apple, banana, cherry

○サンプルコード6:NULL許容型の型宣言

ここではprintLengthという関数にて引数$textの型宣言に?stringを使用しています。

この?マークはNULL許容型を表し、文字列またはnullを受け取ることを示しています。

<?php
declare(strict_types=1); // 厳密な型チェックを有効にする

function printLength(?string $text): void {
    if ($text === null) {
        echo "No text given.";
    } else {
        echo strlen($text);
    }
}

printLength(null); // 出力: No text given.

●型宣言の注意点と対処法

型宣言はコードの安全性と可読性を向上させますが、注意点もあります。

特に、型チェックと型変換、さらには型の互換性と型安全について理解しておくことが重要です。

○型チェックと型変換

PHPの型宣言は、通常の実行時には”弱い型チェック”を行い、型が一致しない値が来た場合でもエラーを出す代わりに自動的に型変換を試みます。

しかし、declare(strict_types=1);を使うことで”厳密な型チェック”を有効にし、型が一致しないとエラーを出すようになります。

<?php
declare(strict_types=1); // 厳密な型チェックを有効にする

function sayHello(string $name): void {
    echo "Hello, " . $name;
}

sayHello(123); // エラー: Uncaught TypeError: Argument must be of the type string, integer given

この例では、sayHello関数の引数$namestring型宣言をしています。

そのため、文字列ではない123を引数として渡すとエラーが発生します。

○型の互換性と型安全

PHPの型システムは、型の互換性や型安全についても考慮が必要です。

たとえば、クラスやインターフェースによる型宣言は、そのクラスやインターフェースを実装または継承したオブジェクトも受け入れます。

<?php
declare(strict_types=1); // 厳密な型チェックを有効にする

interface Animal {
    public function makeSound(): void;
}

class Dog implements Animal {
    public function makeSound(): void {
        echo "Woof!\n";
    }
}

function playWithAnimal(Animal $animal): void {
    $animal->makeSound();
}

$dog = new Dog();
playWithAnimal($dog); // 出力: Woof!

このコードでは、Animalインターフェースを実装したDogクラスを作成しています。

そして、playWithAnimal関数はAnimal型の引数を受け入れます。

したがって、Dog型のオブジェクトもこの関数に渡すことができます。

●型宣言のカスタマイズ方法

型宣言は基本的なデータ型だけでなく、カスタムクラスでも使用可能です。

これにより、プログラムの柔軟性と保守性を向上させることができます。

○サンプルコード7:カスタムクラスの型宣言

カスタムクラスとその型宣言を使用したコードの例を紹介します。

<?php
declare(strict_types=1); // 厳密な型チェックを有効にする

class User {
    private string $name;
    private int $age;

    public function __construct(string $name, int $age) {
        $this->name = $name;
        $this->age = $age;
    }

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

    public function getAge(): int {
        return $this->age;
    }
}

function printUserInfo(User $user): void {
    echo "名前: " . $user->getName() . ", 年齢: " . $user->getAge();
}

$user = new User("Yamada", 25);
printUserInfo($user); // 出力: 名前: Yamada, 年齢: 25

この例では、Userというクラスを作成し、そのインスタンスを引数に取る関数printUserInfoを定義しています。

このように、型宣言にクラス名を使用すると、そのクラスのインスタンスを引数として期待することを明示的に示すことができます。

これはコードの可読性を向上させ、また、予期しない型のデータが渡されることを防ぐために有効な手段です。

まとめ

型宣言はPHPでのコードの堅牢性と可読性を向上させるための重要な手段です。

型宣言を使用することで、関数やメソッドが期待する引数の型や戻り値の型を明示的に示し、プログラムが意図しない挙動をすることを防ぐことが可能となります。

PHPの型宣言は、スカラー型(int, float, bool, string)、複合型(array, object)、および特別な型(callable, iterable, null)など、多くのデータ型に対応しています。

また、クラス名を用いてカスタムクラスの型宣言も行うことができます。

型宣言には、関数の引数や戻り値だけでなく、プロパティに対しても使用することが可能です。

さらに、型宣言にはNULL許容型があり、ある変数が特定の型かNULLを取ることが可能なことを示すことができます。

一方で、型宣言を用いる際には、型チェックと型変換、型の互換性と型安全について理解しておくことが重要です。

これらの知識を持つことで、PHPでの型宣言を効果的に活用することができます。

以上が、PHPの型宣言に関する全体像です。

この知識を活用して、より安全で効率的なプログラミングを目指しましょう。