PHP の学習を進めると出てくるのが「クラス」や「オブジェクト指向(OOP)」です。WordPress の WP_Query や WP_User もクラスで、これらを理解するとコードの読み書きがぐっと楽になります。この記事では、クラスの定義からインスタンスの作成、コンストラクタ、アクセス修飾子までを、初心者向けに基本から解説します。
目次
オブジェクト指向(OOP)とは
オブジェクト指向とは、関連するデータ(プロパティ)と処理(メソッド)を「クラス」という設計図にまとめて扱う考え方です。たとえば「ユーザー」という概念を、名前やメールアドレス(データ)と、あいさつする(処理)をまとめて1つのクラスとして表現できます。
クラスはあくまで「設計図」で、それを元に作る実体を「インスタンス(オブジェクト)」と呼びます。設計図から、いくつでも実体を作れるイメージです。
クラスを定義する
クラスは class キーワードで定義します。クラスが持つデータを「プロパティ」、処理を「メソッド」と呼びます。メソッドの中から自分自身のプロパティを参照するときは $this を使います。
class User {
// プロパティ(クラスが持つデータ)
public $name;
public $email;
// メソッド(クラスが持つ処理)
public function greet() {
return 'こんにちは、' . $this->name . 'さん';
}
}
クラス名は慣習として大文字始まり(User のように)にします。$this->name は「このインスタンスの name プロパティ」という意味です。
インスタンスを作成して使う
定義したクラスから実体(インスタンス)を作るには new を使います。プロパティやメソッドには ->(アロー演算子)でアクセスします。
$user = new User(); // インスタンスを作成
$user->name = '山田太郎';
$user->email = 'taro@example.com';
echo $user->name; // 山田太郎
echo $user->greet(); // こんにちは、山田太郎さん
同じクラスから $user2 = new User(); のように、別のインスタンスをいくつでも作れます。それぞれが独立した name や email を持ちます。
コンストラクタで初期化する
毎回プロパティを1つずつ代入するのは手間です。__construct()(コンストラクタ)を定義すると、インスタンス作成と同時に値をセットできます。コンストラクタは new したときに自動で呼ばれる特別なメソッドです。
class User {
public $name;
public $email;
// new したときに自動で呼ばれる
public function __construct( $name, $email ) {
$this->name = $name;
$this->email = $email;
}
public function greet() {
return 'こんにちは、' . $this->name . 'さん';
}
}
// 作成と同時に値を渡せる
$user = new User( '山田太郎', 'taro@example.com' );
echo $user->greet(); // こんにちは、山田太郎さん
アクセス修飾子(public / private)
プロパティやメソッドには「どこからアクセスできるか」を表す修飾子を付けられます。代表的なのは次の2つです。
| 修飾子 | アクセスできる範囲 |
|---|---|
public | クラスの外からも自由にアクセスできる |
private | そのクラスの中からだけアクセスできる(外から直接触れない) |
大事なデータを private にして、決められたメソッド経由でのみ操作させることで、予期しない書き換えを防げます。
class BankAccount {
private $balance = 0; // 外部から直接触れない
public function deposit( $amount ) {
$this->balance += $amount;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit( 1000 );
echo $account->getBalance(); // 1000
// echo $account->balance; // エラー:privateなので直接アクセス不可
残高(balance)を直接書き換えられないようにし、deposit() を通してのみ増やせるようにしています。これがオブジェクト指向の「カプセル化」という考え方です。
エラーや動作がおかしいときは
クラスを書き始めたころは、次のようなところでつまずきがちです。エラーが出たり思った値が取れなかったりするときは、ここを見直してみてください。
メソッド内で $this を付け忘れている
メソッドの中から自分のプロパティを使うときは、$this->name のように必ず $this を付けます。$this を付けずに $name と書くと、プロパティではなく「メソッド内のローカル変数」として扱われ、意図した値が取れません。値が空になるときは、まずここを疑いましょう。
クラスとインスタンスを混同している
クラスはあくまで「設計図」で、実際にデータを持つのは new で作った「インスタンス」です。クラスを定義しただけでは何も起きません。プロパティに値を入れて使うには、new でインスタンスを作る必要がある、という点を押さえておきましょう。
private なプロパティに外からアクセスしている
private を付けたプロパティやメソッドは、クラスの外から直接触るとエラーになります。これは「外から勝手に書き換えられないようにする」ための仕組みです。外部から値を取得・変更したい場合は、getBalance() のような public なメソッドを用意して、そこ経由でアクセスするようにします。
まとめ
クラスは「データ+処理」をまとめた設計図で、new で作ったインスタンスを通して使います。
classでクラスを定義し、プロパティとメソッドを持たせる- メソッド内では
$thisで自分のプロパティを参照する newでインスタンスを作り、->でアクセスする__construct()で作成時に初期化、public/privateでアクセス範囲を制御する
まずは User クラスのような小さな例を自分で書いて、new して動かしてみると、オブジェクト指向の感覚がつかめます。