【PHP】Lesson5-4:クラスメンバを理解しよう

一つ前のレッスンでは アクセス修飾子とカプセル化 について学習しました。
今回は クラスメンバ について見ていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数編
Lesson4:データ構造編
Lesson5:クラス編
・Lesson5-1:クラスを定義しよう
・Lesson5-2:コンストラクタを理解しよう
・Lesson5-3:アクセス修飾子とカプセル化を理解しよう
・Lesson5-4:クラスメンバを理解しよう ◁今回はココ
・Lesson5-5:クラスの継承を理解しよう
・Lesson5-6:メソッドのオーバーライドを理解しよう
・Lesson5-7:抽象クラスを理解しよう
・Lesson5-8:インターフェースを理解しよう
・Lesson5-9:トレイトを理解しよう
・確認問題5-1:モンスター捕獲ゲームを作ろう
・確認問題5-2:マインスイーパを作ろう
クラスメンバの基礎と実践的な使い方解説
PHPのオブジェクト指向を学ぶ上で、「クラスメンバ」は避けて通れない重要なテーマです。
本記事ではクラスメンバの基礎から、静的メンバ(static)とインスタンスメンバの違いについてわかりやすく解説します。
クラスメンバを理解すると、複数のオブジェクト間で共有できる情報や、インスタンスごとに管理したいデータを適切に使い分けられるようになり、より効率的で見通しの良いコードが書けるようになります。
「staticの使いどころがわからない」「クラス内で使う変数やメソッドの違いが知りたい」といった初心者の悩みにも応える内容となっています。
クラスメンバの基本と実践的な使い方を学び、PHPスキルを一段アップさせましょう!

クラスメンバとは?クラス内プロパティ・メソッドの違いと役割
クラスメンバとはクラス内で定義されるプロパティやメソッドのことです。
クラスメンバは大きく静的メンバとインスタンスメンバの2種類があります。
- メンバ:クラスの中に定義されたプロパティとメソッド
- 静的メンバ:クラスそのものに属し、インスタンス化しなくても利用可能なプロパティやメソッド
- インスタンスメンバ:インスタンスごとに独立して管理されるプロパティやメソッドで、オブジェクトを生成して使用される
これらを適切に使い分けることで、効率的で柔軟なプログラムを作成できます。
次に具体例を見ていきましょう。
静的メンバ(static)とは?クラス全体で使うデータの扱い方
静的メンバ はクラスに直接紐づくメンバであり、静的プロパティ と 静的メソッド があります。
どちらも、インスタンス生成をしなくてもクラス外からアクセスすることができます。
静的プロパティの仕組みと使い方
静的プロパティはクラスに直接紐づく変数であり、クラス全体で共有されます(インスタンスごとに別々ではない)。
宣言には static
キーワード を使用し、アクセス時には スコープ解決演算子::
を用います。
class Example { public static $staticProperty = "静的プロパティ"; // 静的プロパティの定義 } // インスタンス生成せずに静的プロパティにアクセス echo Example::$staticProperty; // Exampleクラスの静的変数$staticPropertyにアクセス
静的メソッドの仕組みと使い方
静的メソッドは、インスタンスを生成せずに直接呼び出せるメソッドです。
静的プロパティと同様にstatic
キーワードで宣言し、スコープ解決演算子::
で呼び出します。
class Example { public static function staticMethod() { // 静的メソッドの定義 return "静的メソッド"; } } // インスタンス生成せずに静的メソッドを呼び出す echo Example::staticMethod(); // ExampleクラスのstaticMethod()メソッドを呼び出し
静的メンバは、ユーティリティ関数や共有データを扱う際に便利です。
インスタンスメンバとは?個別のオブジェクトごとのデータ管理
インスタンスメンバ は各オブジェクト(インスタンス)に紐付くメンバであり、インスタンスプロパティ と インスタンスメソッド があります。
Lesson5-3までの学習で見てきたプロパティやメソッドは全てインスタンスメンバになります。
クラスメンバと違い、アクセスするにはインスタンス化が必要です。
インスタンスプロパティの仕組みと使い方
インスタンスプロパティは、各オブジェクトごとに独立した値を保持する変数です。
class Example { public $instanceProperty; // インスタンスプロパティ定義 public function __construct($value) { // コンストラクタ $this->instanceProperty = $value; // プロパティに値を設定 } } // インスタンスを作成してプロパティにアクセス $obj1 = new Example("インスタンスプロパティの例"); echo $obj->instanceProperty . PHP_EOL; // 出力: インスタンスプロパティ $obj2 = 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; // インスタンスのデータを返す } } // インスタンスを作成してメソッドを呼び出す $obj1 = new Example("インスタンスメソッドの例"); echo $obj->getMessage() . PHP_EOL; $obj2 = new Example("オブジェクト毎に違う戻り値を持つ"); echo $obj->getMessage() . PHP_EOL;
インスタンスメンバは、データごとに異なる状態を管理するのに役立ちます。
まとめ|クラスメンバの理解で広がるPHPの設計力
今回の学習で、「静的メンバ」と「インスタンスメンバ」の違いや、それぞれの使いどころを理解できたと思います。
これにより、クラスを設計する際にデータや処理を適切に分けて管理できるようになり、より効率的で保守性の高いコードを書ける力が身につきました。
今回の内容は、PHPのオブジェクト指向プログラミングの土台となる大切な知識です。
クラスメンバを正しく使いこなすことで、今後さらに複雑なアプリケーション開発や、再利用性の高いコード設計にも自信を持って取り組めるはずです。
一歩ずつ理解を深めていけば、確実にPHPのスキルは向上していきます。ぜひこの調子で、次のレッスンにも挑戦してみてください!
演習問題|クラスメンバを使ってユーザー数と名前を管理してみよう

クラスメンバを活用して、ユーザー管理システムを作成しましょう。
このシステムではユーザーごとの名前を管理しながら、登録されたユーザーの総数を記録します。
また静的プロパティとメソッドを使ってユーザー数を管理し、インスタンスプロパティとメソッドでユーザー名を表示できるようにします。
この演習の要件
以下の要件に従ってコードを完成させてください。
- クラス 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;
- 静的プロパティとは?
静的プロパティはクラスに直接紐づけられる変数で、インスタンスを作成しなくてもアクセスできます。 - コードの意味:
public
:このプロパティはどこからでもアクセス可能であることを示します。static
:静的プロパティであることを示します。$userCount
:ユーザー数を記録する変数です。初期値は0に設定されています。
- 使いどころ:
静的プロパティはクラス全体で共有したい情報(例:ユーザーの合計数)を管理するのに便利です。
インスタンスプロパティの定義
public $name;
- インスタンスプロパティとは?
インスタンスプロパティは、インスタンスごとに独立して保持される変数です。 - コードの意味:
$name
:ユーザーごとの名前を管理します。各インスタンスごとに異なる値を持つことができます。
- 使いどころ:
インスタンスごとの固有の情報(例:ユーザー名)を管理する場合に利用します。
コンストラクタの定義
public function __construct($name) { $this->name = $name; self::$userCount++; }
- コンストラクタとは?
オブジェクトが作成されたときに自動的に呼び出される特別なメソッドです。 - コードの意味:
$this->name = $name;
:渡された引数$name
をインスタンスプロパティ$name
に代入します。self::$userCount++;
:静的プロパティ$userCount
を1増やします。
- ポイント:
$this
は現在のインスタンスを指します。self::
は静的プロパティや静的メソッドにアクセスするために使います。
静的メソッドの定義
public static function getUserCount() { return "現在のユーザー数は " . self::$userCount . " 人です。" . PHP_EOL; }
- 静的メソッドとは?
インスタンスを作成しなくてもクラスから直接呼び出せるメソッドです。 - コードの意味:
self::$userCount
:クラスに紐づく静的プロパティにアクセスします。- メッセージを組み立てて、ユーザー数を表示します。
- 使いどころ:
データの集計やクラス全体に関する操作を行う際に便利です。
インスタンスメソッドの定義
public function getName() { return "ユーザー名は " . $this->name . " です。" . PHP_EOL; }
- インスタンスメソッドとは?
インスタンスごとに異なるデータを操作するメソッドです。 - コードの意味:
$this->name
:現在のインスタンスに紐づく$name
プロパティの値を取得します。
- 使いどころ:
インスタンスごとに異なる処理やデータを操作する場合に便利です。
インスタンスの作成とメソッドの呼び出し
$user1 = new User("田中"); $user2 = new User("佐藤");
- インスタンスの作成とは?
クラスを基に具体的なオブジェクトを作成する作業です。 - コードの意味:
new User("田中")
:名前が「田中」のユーザーを作成します。この時にコンストラクタが呼び出されます。
出力結果の表示
echo $user1->getName(); echo User::getUserCount();
- インスタンスメソッドの呼び出し:
$user1->getName()
:インスタンスのプロパティを使って名前を表示します。 - 静的メソッドの呼び出し:
User::getUserCount()
:クラスに直接アクセスし、ユーザー数を表示します。