1. ホーム
  2. PHP

【PHP】クラスとオブジェクト指向(OOP)入門|class・プロパティ・メソッドの基本を解説

Share

PHP の学習を進めると出てくるのが「クラス」や「オブジェクト指向(OOP)」です。WordPress の WP_QueryWP_User もクラスで、これらを理解するとコードの読み書きがぐっと楽になります。この記事では、クラスの定義からインスタンスの作成、コンストラクタ、アクセス修飾子までを、初心者向けに基本から解説します。

オブジェクト指向(OOP)とは

オブジェクト指向とは、関連するデータ(プロパティ)処理(メソッド)を「クラス」という設計図にまとめて扱う考え方です。たとえば「ユーザー」という概念を、名前やメールアドレス(データ)と、あいさつする(処理)をまとめて1つのクラスとして表現できます。

クラスはあくまで「設計図」で、それを元に作る実体を「インスタンス(オブジェクト)」と呼びます。設計図から、いくつでも実体を作れるイメージです。

クラスを定義する

クラスは class キーワードで定義します。クラスが持つデータを「プロパティ」、処理を「メソッド」と呼びます。メソッドの中から自分自身のプロパティを参照するときは $this を使います。

User.php
class User {
    // プロパティ(クラスが持つデータ)
    public $name;
    public $email;

    // メソッド(クラスが持つ処理)
    public function greet() {
        return 'こんにちは、' . $this->name . 'さん';
    }
}

クラス名は慣習として大文字始まり(User のように)にします。$this->name は「このインスタンスの name プロパティ」という意味です。

インスタンスを作成して使う

定義したクラスから実体(インスタンス)を作るには new を使います。プロパティやメソッドには ->(アロー演算子)でアクセスします。

index.php
$user = new User(); // インスタンスを作成

$user->name  = '山田太郎';
$user->email = 'taro@example.com';

echo $user->name;    // 山田太郎
echo $user->greet(); // こんにちは、山田太郎さん

同じクラスから $user2 = new User(); のように、別のインスタンスをいくつでも作れます。それぞれが独立した nameemail を持ちます。

コンストラクタで初期化する

毎回プロパティを1つずつ代入するのは手間です。__construct()(コンストラクタ)を定義すると、インスタンス作成と同時に値をセットできます。コンストラクタは new したときに自動で呼ばれる特別なメソッドです。

User.php
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 にして、決められたメソッド経由でのみ操作させることで、予期しない書き換えを防げます。

BankAccount.php
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 して動かしてみると、オブジェクト指向の感覚がつかめます。

参考リンク