[PHPのはじめ方] Part18: プロパティ、メソッド、コンストラクタ

オブジェクト指向プログラミング(OOP)は、PHP開発において非常に重要な概念です。コードを整理し、再利用しやすく、保守しやすいものにするための強力な手法です。このステップでは、OOPの基本的な構成要素である「クラス」が持つ3つの重要な要素、「プロパティ」、「メソッド」、「コンストラクタ」について学んでいきましょう! 😊

プロパティとは? 🤔 (クラスが持つデータ・状態)

プロパティは、クラスの中に定義される「変数」のようなもので、オブジェクトの状態やデータを保持します。例えば、「User」クラスなら、ユーザー名やメールアドレスなどがプロパティになります。

プロパティは、クラス定義の中で `public`、`protected`、`private` といったアクセス修飾子を付けて宣言します。(アクセス修飾子の詳細は今後のステップで学びますが、まずは `public` を使ってみましょう。)

クラスからオブジェクト(インスタンス)を作成した後、プロパティにはアロー演算子 `->` を使ってアクセスします。

コード例:

<?php
class User {
    // プロパティの定義
    public string $name;
    public string $email;
}

// Userクラスからインスタンス(オブジェクト)を作成
$user1 = new User();

// プロパティに値を設定
$user1->name = '山田 太郎';
$user1->email = 'yamada@example.com';

// プロパティの値を出力
echo $user1->name; // 出力: 山田 太郎
echo '<br>';
echo $user1->email; // 出力: yamada@example.com

?>

この例では、`User` クラスに `$name` と `$email` という2つの `public` なプロパティを定義しました。そして、`new User()` で `$user1` というインスタンスを作成し、`->` を使って各プロパティに値を設定・取得しています。

メソッドとは? ⚙️ (クラスができること・振る舞い)

メソッドは、クラスの中に定義される「関数」のようなもので、オブジェクトの振る舞いや操作を定義します。特定の処理を実行するために使われます。例えば、「User」クラスなら、「自己紹介する」といった操作がメソッドになります。

メソッドもプロパティと同様に、アクセス修飾子(`public`, `protected`, `private`)を付けて定義します。メソッド内では、特別な変数 `$this` を使うことで、同じインスタンス内のプロパティや他のメソッドにアクセスできます。

メソッドもプロパティと同じく、インスタンスからアロー演算子 `->` を使って呼び出します。

コード例:

<?php
class User {
    public string $name;
    public string $email;

    // メソッドの定義
    public function introduce(): void {
        echo "こんにちは!私の名前は {$this->name} です。";
    }

    public function getEmail(): string {
        return $this->email;
    }
}

$user1 = new User();
$user1->name = '佐藤 花子';
$user1->email = 'sato@example.com';

// メソッドを呼び出す
$user1->introduce(); // 出力: こんにちは!私の名前は 佐藤 花子 です。
echo '<br>';

$email = $user1->getEmail();
echo "メールアドレス: " . $email; // 出力: メールアドレス: sato@example.com

?>

この例では、`introduce` メソッドと `getEmail` メソッドを追加しました。`introduce` メソッド内では `$this->name` を使って、そのインスタンス自身の `$name` プロパティにアクセスしています。`getEmail` メソッドは `$email` プロパティの値を返します。メソッドを呼び出す際も `->` を使います。

コンストラクタとは? ✨ (インスタンス生成時の初期化処理)

コンストラクタは、クラスからインスタンスが生成されるときに自動的に呼び出される特別なメソッドです。主に、プロパティの初期化など、インスタンス生成時に行いたい処理を記述します。

コンストラクタは、`__construct` (アンダースコア2つ) という名前で定義します。コンストラクタには引数を設定でき、`new` でインスタンスを作成する際にその引数を渡すことができます。これにより、インスタンス生成時にプロパティへ値を設定することが容易になります。

コード例:

<?php
class User {
    public string $name;
    public string $email;

    // コンストラクタの定義
    public function __construct(string $userName, string $userEmail) {
        echo "Userインスタンスが生成されました!<br>";
        // 引数で受け取った値でプロパティを初期化
        $this->name = $userName;
        $this->email = $userEmail;
    }

    public function introduce(): void {
        echo "こんにちは!私の名前は {$this->name} です。メールアドレスは {$this->email} です。";
    }
}

// インスタンス生成時にコンストラクタへ引数を渡す
$user1 = new User('鈴木 一郎', 'suzuki@example.com');
// ↑ この時点でコンストラクタが実行され、プロパティに値が設定される

echo '<br>';

// メソッドを呼び出す
$user1->introduce();
// 出力:
// Userインスタンスが生成されました!
//
// こんにちは!私の名前は 鈴木 一郎 です。メールアドレスは suzuki@example.com です。 ?>

この例では、`__construct` メソッドを定義し、引数 `$userName` と `$userEmail` を受け取るようにしました。`new User(…)` でインスタンスを作成する際にこれらの引数を渡し、コンストラクタ内で `$this->name` と `$this->email` に値を設定しています。これにより、インスタンス生成と同時に必要な情報を持ったオブジェクトを作成できます。

PHP 8.0からはコンストラクタプロパティプロモーションという機能が導入され、より簡潔にコンストラクタでプロパティの宣言と初期化を行えるようになりました。これも非常に便利なので、調べてみると良いでしょう!🔍

まとめ 🚀