PHP のクラス(class)とオブジェクトの基本
新人
「PHPでクラスやオブジェクトってよく聞くけど、どういう意味なんですか?」
先輩
「クラスは、PHPでオブジェクト指向を実現するための設計図のようなものだよ。そして、オブジェクトはその設計図を元に実際に作られたものだ。」
新人
「設計図って言われても、少し分かりにくいですね。」
先輩
「では、具体的にクラスとオブジェクトについて、基本から説明していこう。」
1. PHPのクラス(class)とは?(基本的な説明)
PHPのクラスとは、一言で言うと「オブジェクト指向プログラミングの設計図」のことです。プログラミング未経験の方には、「たい焼きの型」や「料理のレシピ」をイメージすると分かりやすいでしょう。
クラスの中には、データ(状態)を保存するための「プロパティ(変数)」と、何らかの処理を行う「メソッド(関数)」という2つの要素をひとまとめにして定義します。これにより、複雑なプログラムも「モノ(オブジェクト)」として整理して扱えるようになります。
例えば「車」を作る場合、設計図(クラス)には「色」や「車種名」というデータ項目と、「走る」「止まる」という動かし方が書かれています。この設計図があるおかげで、同じ仕様の車を何台でも効率よく作ることができるのです。
それでは、実際にPHPで最もシンプルな「車」のクラスを作成してみましょう。以下のコードは、クラスの基本的な書き方のルールを示しています。
// 「Car」という名前の設計図(クラス)を定義する
class Car {
// プロパティ:車が持つデータ(変数の前にpublicなどをつけるのがルール)
public $color; // 車の色
public $model; // 車種名
// メソッド:車ができること(関数)
public function startEngine() {
echo "エンジンがスタートしました!";
}
}
上記のコードでは、Carという名前のクラスを定義しました。この中には、車の情報を保持する2つのプロパティ($color、$model)と、画面にメッセージを表示するstartEngine()というメソッドが含まれています。
このように、関連するデータと機能を一つのパッケージ(クラス)にまとめることが、PHPのオブジェクト指向における第一歩となります。この設計図をどのようにして「本物の車(オブジェクト)」として動かすのかについては、次の章で詳しく解説します。
2. PHPのオブジェクトとは?(クラスとオブジェクトの関係)
プログラミングの世界で「オブジェクト」という言葉を聞くと難しく感じるかもしれませんが、実はとても身近な考え方です。一言でいうと、オブジェクトとは、クラスという「設計図」から実体化した「具体的なモノ(インスタンス)」のことです。
よく例えられるのが「車の設計図」と「実際の車」の関係です。設計図(クラス)だけでは道を走ることはできませんよね?その設計図を元に、工場で組み立てられて初めて、私たちが運転できる「実物の車(オブジェクト)」が誕生します。
それでは、プログラミング未経験の方でも分かりやすい簡単なサンプルで、実際にオブジェクトを作ってみましょう。ここでは「Car」という設計図から、自分だけの車を作ってみる流れをイメージしてください。
// 1. $myCarという変数に、設計図(Carクラス)から「新しい実体」を作成して代入します
$myCar = new Car();
// 2. 作成したオブジェクトに、具体的なデータ(プロパティ)をセットします
$myCar->color = "赤";
$myCar->model = "トヨタ";
// 3. オブジェクトに備わっている機能(メソッド)を実行します
$myCar->startEngine();
上記のコードにある new Car() という記述が、まさに設計図から実物を作り出す「召喚の呪文」のようなものです。これにより、メモリ上に $myCar という名前の具体的なオブジェクトができあがります。
一度クラス(設計図)を作っておけば、同じ設計図を使って「青色のホンダ」や「白色の日産」など、異なる特徴を持ったオブジェクトをいくつでも量産できるのが、PHPにおけるオブジェクト指向の大きなメリットです。このように、「型(クラス)」と「実体(オブジェクト)」を切り分けて考えることが、効率的な開発の第一歩となります。
3. クラスのプロパティとメソッド(データと機能)
オブジェクト指向プログラミングにおいて、クラスの役割を理解する最大のポイントは「データ(プロパティ)」と「機能(メソッド)」の組み合わせにあります。これらはよく、現実世界の「名詞」と「動詞」に例えられます。
プロパティとは?(状態やデータ)
プロパティとは、そのオブジェクトが持っている「属性」のことです。例えば「車」というクラスなら、色、モデル名、現在の燃料残量などがこれにあたります。プログラム上では変数として定義され、オブジェクトごとに異なる値(赤色のプリウス、青色のテスラなど)を保持できます。
メソッドとは?(振る舞いや機能)
メソッドとは、そのオブジェクトができる「操作」のことです。「エンジンをかける」「ブレーキを踏む」といった動作を関数として定義します。メソッドを使うことで、プロパティ(データ)を書き換えたり、特定の処理を実行したりできるようになります。
class Car {
// プロパティ(データ:名詞的な情報)
public $color;
public $model;
// メソッド(機能:動詞的なアクション)
public function startEngine() {
echo "エンジンがスタートしました!";
}
public function stopEngine() {
echo "エンジンが停止しました!";
}
// 応用:プロパティを利用したメソッド
public function showDetails() {
echo "この車は " . $this->model . " の " . $this->color . " です。";
}
}
このコードでは、新たにstopEngine()やshowDetails()を追加しました。車がただ存在するだけでなく、「停止する」というアクションを起こしたり、「自分の情報を教える」といった複雑な動きができるようになっているのが分かります。
未経験者の方は、まずは「プロパティ = 設定値(データの入れ物)」、「メソッド = 命令ボタン(処理の実行ユニット)」というイメージを持つことから始めてみましょう。この2つをひとまとめに管理できるのが、クラスを利用する最大のメリットです。
4. オブジェクトの作成方法(インスタンス化)
クラスはあくまで「設計図」に過ぎません。実際にプログラムの中で動かすには、その設計図を元に「実体」を作る必要があります。この作業を「インスタンス化」と呼びます。
インスタンス化を行うには、newというキーワードを使います。例えば、$myCar = new Car();と記述することで、Carという設計図から、あなた専用の1台の車(オブジェクト)がメモリ上に誕生します。
プログラミング未経験の方にとって、「変数にクラスを入れる」という感覚は少し不思議かもしれません。しかし、これは「金型(クラス)」から「たい焼き(インスタンス)」を焼いて、それをお皿(変数)に載せるようなイメージだと考えると分かりやすくなります。
作成したオブジェクトには、クラスで定義した「プロパティ(特徴)」や「メソッド(動き)」を自由に追加・操作できます。以下のコードで、実際にオブジェクトを動かす流れを見てみましょう。
// 1. インスタンス化(設計図から実体を作る)
$myCar = new Car();
// 2. プロパティに値を代入(車の特徴を決める)
$myCar->color = "青";
$myCar->model = "ホンダ";
// 3. メソッドを呼び出す(車を操作する)
$myCar->startEngine(); // エンジンをかける
$myCar->stopEngine(); // エンジンを止める
このコードでは、まず$myCarという名前の車を作り、その色を「青」、モデルを「ホンダ」に設定しました。その後、定義された機能を使ってエンジンを操作しています。
このように、newを使ってインスタンス化することで、同じ設計図から「赤いトヨタの車」や「白い日産の車」など、個別のデータを持ったオブジェクトをいくつでも作り出すことが可能になります。
5. クラス内でのデータの扱い方(アクセス修飾子)とカプセル化
オブジェクト指向プログラミングにおいて、クラスの中にある大切なデータを「誰が触れるか」を決めるルールがアクセス修飾子です。これは、プログラムの安全性を守るための「鍵」のような役割を果たします。
アクセス修飾子には、主に以下の3つの種類があります。初心者の方は、まずは「public」と「private」の違いをしっかり押さえましょう。
- public(公開): クラスの外からでも、自由に中身を見たり書き換えたりできます。
- protected(制限付き公開): そのクラス自身と、そのクラスを「継承(コピーして作成)」した子クラスからのみアクセスできます。
- private(非公開): そのクラスの中でしか使えません。外部からは一切見えなくなります。
なぜわざわざ制限をかけるのでしょうか?例えば、銀行口座の「残高」を誰でも自由に書き換えられたら困りますよね。必ず「暗証番号の確認」や「ATMの操作」という手順を通すはずです。このように、データを隠して決まった窓口からのみ操作させる仕組みを「カプセル化」と呼びます。
以下のPHPコードで、privateを使った具体的な守り方を見てみましょう。
class BankAccount {
// 残高をprivateにして、外から直接書き換えられないように保護する
private $balance = 0;
// お金を預けるための「窓口(メソッド)」
public function deposit($amount) {
if ($amount > 0) {
$this->balance += $amount;
echo $amount . "円を入金しました。";
}
}
// 現在の残高を確認するための「窓口(メソッド)」
public function getBalance() {
return "現在の残高は " . $this->balance . "円です。";
}
}
$myAccount = new BankAccount();
$myAccount->deposit(1000); // メソッド経由なら操作可能
echo $myAccount->getBalance();
// $myAccount->balance = 1000000; // これはエラーになります!直接は触れません。
このコードでは、変数$balance(残高)をprivateに設定しています。これにより、悪意のある操作やうっかりミスで、外部から勝手に残高を書き換えられるリスクを防いでいます。
アクセス修飾子を適切に使い分けることで、バグが少なく、大人数での開発でも壊れにくい「堅牢なプログラム」を組むことができるようになります。
6. PHPのクラスとオブジェクトの使い方の例(初心者向けの簡単な実装例)
PHPのオブジェクト指向を理解する一番の近道は、現実世界の仕組みをコードに置き換えてみることです。ここでは、プログラミング未経験の方でもイメージしやすい「銀行口座の管理」を例に、具体的なプログラムの書き方を解説します。
クラスは「設計図」、オブジェクトは「実体(通帳そのもの)」だと考えてください。この「銀行口座クラス」では、口座番号や残高といった「データ」と、預金や引き出しといった「操作」をひとまとめにして管理します。
class BankAccount {
// プロパティ(データ):外部から直接書き換えられないように保護(private)します
private $accountNumber;
private $accountHolder;
private $balance;
// コンストラクタ:新しい口座(オブジェクト)を作るときに最初に実行される初期設定
public function __construct($accountNumber, $accountHolder, $initialBalance) {
$this->accountNumber = $accountNumber;
$this->accountHolder = $accountHolder;
$this->balance = $initialBalance;
}
// 預金メソッド:お金を預ける操作
public function deposit($amount) {
if ($amount > 0) {
$this->balance += $amount;
echo "<p>【預金完了】{$amount}円を預け入れました。現在の残高は{$this->balance}円です。</p>";
} else {
echo "<p>エラー:0円以上の金額を指定してください。</p>";
}
}
// 引き出しメソッド:お金を下ろす操作
public function withdraw($amount) {
if ($amount > 0 && $amount <= $this->balance) {
$this->balance -= $amount;
echo "<p>【払出完了】{$amount}円引き出しました。現在の残高は{$this->balance}円です。</p>";
} else {
echo "<p>エラー:残高不足、または無効な金額です。</p>";
}
}
// 残高照会メソッド:現在の残高を返す
public function getBalance() {
return $this->balance;
}
}
次に、この設計図(クラス)を使って、実際に「山田さんの口座」を作って操作してみましょう。newというキーワードを使うことで、メモリ上に実体としてのオブジェクトが生成されます。
// 1. 山田さんの口座を「10,000円」入った状態で作成(インスタンス化)
$myAccount = new BankAccount("123-4567", "山田 太郎", 10000);
// 2. 5,000円を預ける
$myAccount->deposit(5000);
// 3. 3,000円を引き出す
$myAccount->withdraw(3000);
// 4. 最後に現在の残高を確認する
echo "<strong>最終的な口座残高: " . $myAccount->getBalance() . "円</strong>";
このコードのポイントは、$balance(残高)という重要なデータをクラス内部に隠し、必ずdepositやwithdrawという「正しい手続き(メソッド)」を通さないと操作できないようにしている点です。これを「カプセル化」と呼びます。
このように、クラスとオブジェクトを活用することで、複雑なプログラムも「誰が」「何を」「どうする」という直感的な構造で整理でき、メンテナンスが非常に楽になります。まずはこの「作って、動かす」という流れに慣れていきましょう。
7. クラスを使うメリット(再利用性、コードの整理など)
クラスを使うことで、コードをより整理し、再利用可能にすることができます。以下のようなメリットがあります。
- 再利用性: クラスは一度作成すれば、何度でもインスタンス化して使うことができ、同じコードを繰り返し書く必要がありません。
- 保守性: クラス内で変更があった場合、そのクラスだけを修正すれば済むため、コードの保守が容易です。
- 整理整頓: クラスはデータと機能を一つにまとめて整理することができ、コード全体の見通しが良くなります。
例えば、先ほどの銀行口座の例では、預金や引き出しの操作を管理するクラスを使うことで、複数の場所で同じ操作を繰り返す必要がなくなります。また、口座番号や残高などの情報もクラス内で整理され、他の場所で使う際にはインスタンス化して操作するだけで済みます。
このように、クラスを使うことでコードの整理が進み、保守性が向上するだけでなく、開発が効率的になります。
8. 初心者におすすめのPHPクラス学習方法
PHPでクラスを学ぶ際には、以下のステップを踏むことをおすすめします。
- 基本を理解する: まずは、クラスの定義方法、プロパティとメソッドの使い方、インスタンス化の仕方を理解しましょう。
- 簡単なクラスを作る: 初めてのクラスは、実生活に関連するもの(例えば、銀行口座や学生など)を作成して、クラスを使う実感を得ましょう。
- アクセス修飾子やコンストラクタを学ぶ: クラス内のデータのアクセス方法や、インスタンス化時に初期化を行うコンストラクタを学ぶことで、より高度なクラスを作成できるようになります。
- 継承を学ぶ: 他のクラスから機能を引き継ぐ「継承」の概念を学ぶことで、コードの再利用性がさらに向上します。
- 練習問題を解く: クラスを使った練習問題を解いて、実践的なスキルを磨きましょう。
PHPのクラスは、少し理解が難しく感じるかもしれませんが、基本をしっかりと学び、実際に手を動かしてコードを書いていくうちに、自然と理解できるようになります。
学習を進める中で、PHPのクラスの強力な機能を活用できるようになれば、より効率的で整理されたコードを書くことができ、開発が楽になります。
まとめ
PHPのクラスとオブジェクトは、オブジェクト指向プログラミングの基本的な考え方であり、開発をより効率的かつ柔軟にするために欠かせない重要な機能です。この記事では、クラスの定義、オブジェクトの生成、プロパティとメソッドの使い方、アクセス修飾子によるデータの制御、そして現実的な銀行口座クラスの実装例まで、PHPにおけるクラスとオブジェクトの使い方を段階的に解説しました。
クラスはあらゆるデータや機能を「ひとつのまとまり」として整理できる構造であり、コードの再利用性や保守性を高める上で大きな役割を果たします。プロパティは「状態(データ)」を、メソッドは「動作(処理)」を表現し、それぞれのオブジェクトごとに値や振る舞いを持たせることが可能です。
PHPのクラスでは、コンストラクタを使ってオブジェクト生成時に初期値を設定することも重要です。__construct()という特別なメソッドを使うことで、オブジェクトを作成したときに自動的に処理を実行できます。
また、getterとsetterを活用することで、クラスの外部からプロパティに安全にアクセスしたり変更したりできます。
クラスのメソッド内で$thisというキーワードを使うと、そのオブジェクト自身を指すことができます。これにより、同じオブジェクト内のプロパティやメソッドにアクセスできるようになります。
さらに、PHPのクラスでは静的メソッド(static)という考え方もあります。これは、インスタンス化せずにクラスから直接呼び出せるメソッドです。例えば、共通処理や定数値の取得に使われます。
実際の開発現場では、PHPのクラスを活用することで、MVCモデルのコントローラやモデルを定義したり、データベースとのやり取りを分離した設計ができるようになります。こうした技術は、LaravelやCakePHPなどのフレームワークでも応用されており、クラス設計の理解はPHP開発の基盤となるスキルです。
例えば、オンラインショップを構築する場合、「商品」クラス、「ユーザー」クラス、「注文」クラスなどを作成することで、役割ごとに機能を分け、保守性や再利用性を高めることができます。
商品名や価格といった情報は「商品」クラスのプロパティに、カートに追加する機能は「ユーザー」クラスのメソッドに、注文履歴の記録は「注文」クラスで処理することで、ロジックを整理することができます。
さらに、クラス同士を組み合わせて使う「コンポジション(合成)」の概念を知っておくと、より柔軟な設計が可能になります。
たとえば、ユーザーが複数の注文を持つという構造では、「ユーザー」クラスが「注文」クラスの配列を持つような構成にすることで、実世界の関係性をプログラムに自然に落とし込むことができます。
PHPではクラスを使って例外処理クラスやユーティリティクラスを作ることも一般的です。これにより、システム全体の一貫性を保ちつつ、エラー処理や共通処理を効率化できます。
最後に、オブジェクト指向を学ぶ際は、実際のコードを書いて試すことが一番の近道です。短いクラスでも良いので、自分の手で設計して、動かして、失敗して、直していく経験が、スキルの定着につながります。
実践例:簡単な「商品」クラスの構造
以下は、商品名と価格を管理し、税込価格を計算するシンプルなPHPクラスです。
class Product {
private $name;
private $price;
public function __construct($name, $price) {
$this->name = $name;
$this->price = $price;
}
public function getPriceWithTax() {
return $this->price * 1.1;
}
public function getInfo() {
return $this->name . "(税込価格: " . $this->getPriceWithTax() . "円)";
}
}
$product = new Product("マグカップ", 1500);
echo $product->getInfo();
このように、PHPのクラスをうまく使うことで、状態と振る舞いを持った部品化されたコードを書くことができ、開発効率が向上します。小さな構造から始めて、徐々に自分なりの設計に挑戦していきましょう。
生徒
「クラスとオブジェクトの関係がやっと分かってきました。最初は設計図とかインスタンスとか難しく感じましたけど、実際にコードを書いてみるとイメージしやすくなりました。」
先生
「その調子です!現実の物に置き換えて考えると、プログラムの設計もわかりやすくなります。次は、継承やオーバーライドにもチャレンジしてみると、より高度な設計ができるようになりますよ。」
生徒
「やってみます!あと、privateやgetter・setterを使ってデータを守る仕組みも実感できました。」
先生
「うん、そうした意識は実際の開発現場でもとても大事です。クラスの設計力は今後の成長に直結しますよ。」