【PHP】レッスン5-04:クラスメンバを理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:クラスメンバ

この記事の練習問題を解くために必要な知識:
基礎文法・制御構造・関数・データ構造(レッスン1~4)クラスの定義と使用コンストラクタアクセス修飾子とカプセル化クラスメンバクラスの継承メソッドのオーバーライド抽象クラスインターフェーストレイト

<<前のページ PHP記事一覧 次のページ>>

PHPの「クラスメンバ」とは

この章ではPHPにおける「クラスメンバ」の意味や使い方を学習します。用語の解説が不要な方はここをクリックして練習問題へ飛びましょう。




PHPではオブジェクト指向プログラミングを利用することで、データや処理を効率的に管理できます。

その中でも「クラスメンバ」は、クラスに属するプロパティやメソッドを指します。

本記事ではクラスメンバの種類とそれらの使い方について、具体例を交えながら分かりやすく解説します。

クラスメンバとは?

クラスメンバとはクラス内で定義される変数や関数のことです。

これらは主に以下の2種類に分類されます。

  1. 静的メンバ:クラスそのものに属し、インスタンス化しなくても利用可能なプロパティやメソッドです。
  2. インスタンスメンバ:インスタンスごとに独立して管理されるプロパティやメソッドで、オブジェクトを生成して使用します。

これらを適切に使い分けることで、効率的で柔軟なプログラムを作成できます。

次に具体例を見ていきましょう。

静的プロパティと静的メソッド

静的プロパティとは?

静的プロパティはクラスに直接紐づく変数です。

キーワードstaticを使用して宣言し、アクセス時にはスコープ解決演算子::を用います。

class Example {
    public static $staticProperty = "静的プロパティ"; // 静的プロパティ定義
}

// インスタンス生成せずに静的プロパティにアクセス
echo Example::$staticProperty . PHP_EOL; // 出力: 静的プロパティ

静的メソッドとは?

静的メソッドは、インスタンスを生成せずに直接呼び出せるメソッドです。

静的プロパティと同様にstaticキーワードで宣言します。

class Example {
    public static function staticMethod() {
        return "静的メソッド";
    }
}

// インスタンス生成せずに静的メソッドを呼び出す
echo Example::staticMethod() . PHP_EOL; // 出力: 静的メソッド

静的メンバは、ユーティリティ関数や共有データを扱う際に便利です。

インスタンスプロパティとインスタンスメソッド

インスタンスプロパティとは?

インスタンスプロパティは、各オブジェクトごとに独立した値を保持する変数です。

class Example {
    public $instanceProperty; // インスタンスプロパティ定義
    
    public function __construct($value) {
        $this->instanceProperty = $value; // プロパティに値を設定
    }
}

// インスタンスを作成してプロパティにアクセス
$obj = new Example("インスタンスプロパティ");
echo $obj->instanceProperty . PHP_EOL; // 出力: インスタンスプロパティ

インスタンスメソッドとは?

インスタンスメソッドは特定のオブジェクトに対して動作するメソッドです。

$thisキーワードを使用してインスタンスのプロパティにアクセスします。

class Example {
    private $message;

    public function __construct($msg) {
        $this->message = $msg;
    }

    public function getMessage() {
        return $this->message; // インスタンスのデータを返す
    }
}

// インスタンスを作成してメソッドを呼び出す
$obj = new Example("こんにちは!");
echo $obj->getMessage() . PHP_EOL; // 出力: こんにちは!

インスタンスメンバは、データごとに異なる状態を管理するのに役立ちます。

まとめ

この記事ではクラスメンバについて静的メンバとインスタンスメンバの違いを説明しました。

静的メンバはクラス全体で共有される機能を提供し、インスタンスメンバはオブジェクトごとに異なる状態を管理します。

これらを使い分けることで、より柔軟で効率的なプログラムを作成できます。次回は「クラスの継承」について学習します。

クラスメンバの練習問題:静的プロパティとメソッドを活用してユーザー情報を管理しよう!

クラスメンバを活用して、ユーザー管理システムを作成しましょう。

このシステムではユーザーごとの名前を管理しながら、登録されたユーザーの総数を記録します。

また静的プロパティとメソッドを使ってユーザー数を管理し、インスタンスプロパティとメソッドでユーザー名を表示できるようにします。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • クラス User を作成すること。
  • 静的プロパティ $userCount を定義し、ユーザーの数を管理すること。
  • インスタンスプロパティ $name を定義し、ユーザー名を管理すること。
  • コンストラクタを作成し、ユーザー名を設定すると同時に $userCount を増やすこと。
  • 静的メソッド getUserCount を作成し、登録ユーザー数を表示すること。
  • インスタンスメソッド getName を作成し、ユーザー名を表示すること。
  • 新しいユーザーを2人登録し、それぞれのユーザー名と登録ユーザー数を表示すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

ユーザー名は 田中 です。  
ユーザー名は 佐藤 です。  
現在のユーザー数は 2 人です。

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:PHPのコード開始を宣言
2:Userクラスを定義
  □ 静的プロパティ$userCountを0で初期化(クラス全体で共有されるカウンター)
  □ インスタンスプロパティ$nameを定義(各インスタンスごとのユーザー名)
  □ コンストラクタ__construct($name)を定義
  □ □ $nameをインスタンスプロパティ$this->nameに代入
  □ □ 静的プロパティself::$userCountをインクリメント
  □ 静的メソッドgetUserCount()を定義
  □ □ 現在のユーザー数を返す文字列を出力
  □ インスタンスメソッドgetName()を定義
  □ □ ユーザー名を返す文字列を出力
3:インスタンス$user1を「田中」で生成
4:インスタンス$user2を「佐藤」で生成
5:インスタンスメソッド$user1->getName()を呼び出し、ユーザー名を出力
6:インスタンスメソッド$user2->getName()を呼び出し、ユーザー名を出力
7:静的メソッドUser::getUserCount()を呼び出し、現在のユーザー数を出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

<?php
// クラスの定義
class User {
    // 静的プロパティ - クラス全体で共有されるカウンター
    /*【穴埋め問題1】ここに静的プロパティを宣言し、初期値を0に設定するコードを書いてください。*/

    // インスタンスプロパティ - 各ユーザーごとに異なる名前
    /*【穴埋め問題2】ここにインスタンスプロパティ$nameを宣言するコードを書いてください。*/

    // コンストラクタ - インスタンスの作成時に名前を設定
    /*【穴埋め問題3】ここにコンストラクタを定義し、名前を設定し、ユーザーカウンターを増やすコードを書いてください。*/

    // 静的メソッド - ユーザー数を返す
    /*【穴埋め問題4】ここに静的メソッドgetUserCountを定義し、現在のユーザー数を返すコードを書いてください。*/

    // インスタンスメソッド - ユーザー名を返す
    /*【穴埋め問題5】ここにインスタンスメソッドgetNameを定義し、ユーザー名を返すコードを書いてください。*/
}

// インスタンスの作成
/*【穴埋め問題6】ここにUserクラスのインスタンスを2つ作成するコードを書いてください。*/

// インスタンスメソッドの呼び出し
/*【穴埋め問題7】ここにインスタンスメソッドを呼び出し、ユーザー名を表示するコードを書いてください。*/

// 静的メソッドの呼び出し
/*【穴埋め問題8】ここに静的メソッドを呼び出し、現在のユーザー数を表示するコードを書いてください。*/

以上がこの問題の穴埋めコードです。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

<?php
// クラスの定義
class User {
    // 静的プロパティ - クラス全体で共有されるカウンター
    public static $userCount = 0;

    // インスタンスプロパティ - 各ユーザーごとに異なる名前
    public $name;

    // コンストラクタ - インスタンスの作成時に名前を設定
    public function __construct($name) {
        $this->name = $name; // インスタンスプロパティに名前を設定
        self::$userCount++;  // 静的プロパティのカウンターをインクリメント
    }

    // 静的メソッド - ユーザー数を返す
    public static function getUserCount() {
        return "現在のユーザー数は " . self::$userCount . " 人です。" . PHP_EOL;
    }

    // インスタンスメソッド - ユーザー名を返す
    public function getName() {
        return "ユーザー名は " . $this->name . " です。" . PHP_EOL;
    }
}

// インスタンスの作成
$user1 = new User("田中"); // 1人目のユーザー
$user2 = new User("佐藤"); // 2人目のユーザー

// インスタンスメソッドの呼び出し
echo $user1->getName(); // 出力: ユーザー名は 田中 です。
echo $user2->getName(); // 出力: ユーザー名は 佐藤 です。

// 静的メソッドの呼び出し
echo User::getUserCount(); // 出力: 現在のユーザー数は 2 人です。

正解コードの解説

今回作成したコードはクラスメンバを利用してユーザー管理システムを作成するプログラムです。

このコードの詳細な解説を、ブロックごとに見ていきましょう。

クラスの定義

class User {
  • class User {}:PHPではクラスを定義するために class キーワードを使用します。この例では、User というクラスを定義しています。
  • クラスはオブジェクトを作成するための設計図のようなものです。ユーザー情報を管理する機能をまとめて提供します。

静的プロパティの定義

public static $userCount = 0;
  1. 静的プロパティとは?
    静的プロパティはクラスに直接紐づけられる変数で、インスタンスを作成しなくてもアクセスできます。
  2. コードの意味:
    • public:このプロパティはどこからでもアクセス可能であることを示します。
    • static:静的プロパティであることを示します。
    • $userCount:ユーザー数を記録する変数です。初期値は0に設定されています。
  3. 使いどころ:
    静的プロパティはクラス全体で共有したい情報(例:ユーザーの合計数)を管理するのに便利です。

インスタンスプロパティの定義

public $name;
  1. インスタンスプロパティとは?
    インスタンスプロパティは、インスタンスごとに独立して保持される変数です。
  2. コードの意味:
    • $name:ユーザーごとの名前を管理します。各インスタンスごとに異なる値を持つことができます。
  3. 使いどころ:
    インスタンスごとの固有の情報(例:ユーザー名)を管理する場合に利用します。

コンストラクタの定義

public function __construct($name) {
    $this->name = $name; 
    self::$userCount++;
}
  1. コンストラクタとは?
    オブジェクトが作成されたときに自動的に呼び出される特別なメソッドです。
  2. コードの意味:
    • $this->name = $name;:渡された引数 $name をインスタンスプロパティ $name に代入します。
    • self::$userCount++;:静的プロパティ $userCount を1増やします。
  3. ポイント:
    • $this は現在のインスタンスを指します。
    • self:: は静的プロパティや静的メソッドにアクセスするために使います。

静的メソッドの定義

public static function getUserCount() {
    return "現在のユーザー数は " . self::$userCount . " 人です。" . PHP_EOL;
}
  1. 静的メソッドとは?
    インスタンスを作成しなくてもクラスから直接呼び出せるメソッドです。
  2. コードの意味:
    • self::$userCount:クラスに紐づく静的プロパティにアクセスします。
    • メッセージを組み立てて、ユーザー数を表示します。
  3. 使いどころ:
    データの集計やクラス全体に関する操作を行う際に便利です。

インスタンスメソッドの定義

public function getName() {
    return "ユーザー名は " . $this->name . " です。" . PHP_EOL;
}
  1. インスタンスメソッドとは?
    インスタンスごとに異なるデータを操作するメソッドです。
  2. コードの意味:
    • $this->name:現在のインスタンスに紐づく $name プロパティの値を取得します。
  3. 使いどころ:
    インスタンスごとに異なる処理やデータを操作する場合に便利です。

インスタンスの作成とメソッドの呼び出し

$user1 = new User("田中");
$user2 = new User("佐藤");
  • インスタンスの作成とは?
    クラスを基に具体的なオブジェクトを作成する作業です。
  • コードの意味:new User("田中"):名前が「田中」のユーザーを作成します。この時にコンストラクタが呼び出されます。

出力結果の表示

echo $user1->getName();
echo User::getUserCount();
  • インスタンスメソッドの呼び出し:
    $user1->getName():インスタンスのプロパティを使って名前を表示します。
  • 静的メソッドの呼び出し:
    User::getUserCount():クラスに直接アクセスし、ユーザー数を表示します。

まとめ

このプログラムでは、PHPの「クラスメンバ」について学習しました。

  1. 静的プロパティと静的メソッド:クラス全体で共有するデータや処理に使用する。
  2. インスタンスプロパティとインスタンスメソッド:オブジェクトごとに異なるデータや処理を管理する。

これらの機能を適切に使い分けることで、効率的で拡張性の高いプログラムを作成できます。

ぜひ、自分でも新しいクラスを作成し、練習を重ねて理解を深めてください!

<<前のページ PHP記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    PHPのテキスト&問題集トップへ戻る
    トップページへ戻る