OHTA412

PHPのオブジェクトの概念、クラスとインスタンスの作り方と使い方

PHPのオブジェクトは、クラスをインスタンス化することで生成されます。生成される流れを知ることは、オブジェクトの仕組みを理解するのに役立ちます。

オブジェクトとは情報や機能をまとめたもの

オブジェクトとは、情報や機能をまとめたものです。例えば、ブログの1記事をオブジェクトで管理すると、そのオブジェクトには下記のような情報が用意されています。

  • 記事ID
  • タイトル
  • 本文
  • 投稿日

そして、下記のような機能も用意されています。

  • 記事IDを出力する
  • タイトルを出力する
  • 本文を出力する
  • 投稿日を出力する

オブジェクト内の情報のことを「プロパティ」といい、機能のことを「メソッド」といいます。プロパティはオブジェクト内の変数、メソッドはオブジェクト内の関数に該当します。

PHPはクラスベースのオブジェクト指向プログラミング言語

PHPは、クラスベースのオブジェクト指向プログラミング言語です。これは、オブジェクトを作るときにクラスを用いるプログラミング言語のことです。

クラスベースと対になるものに、プロトタイプベースがあります。これは、オブジェクトを作るときにクラスを用いないプログラミング言語のことで、JavaScriptなどはこちらに該当します。

先ほどのブログ記事をオブジェクトで管理する例では、「ブログ記事オブジェクトを生成するクラス」を定義する必要があります。そして、そのクラスを実行することでオブジェクトが生成されます。

クラスを作る

クラスとは、オブジェクトを作るときのテンプレート(型枠)のようなものです。

ブログ記事オブジェクトを生成するクラスを定義すると、下記のようになります。説明のために簡略化して、タイトルと本文のみ定義しています。

class Post {
    public $title;
    public $body;

    public function __construct($title, $body) {
        $this->title = $title;
        $this->body = $body;
    }

    public function the_title() {
        echo $this->title;
    }

    public function the_body() {
        echo $this->body;
    }
}

1行目でPostという名前のクラスを宣言しています。classというキーワードの後ろにクラス名を書きます。クラス名はアッパーキャメルケースで記述することが慣習となっています。

アッパーキャメルケースとは?
アッパーキャメルケースとは、最初の文字と各単語の1文字目を大文字で書く命名規則のことです。パスカルケースともいいます。
例:UpperCamelCase

プロパティの定義

2~3行目でプロパティを定義しています。この例では、titleとbodyの2つのプロパティを定義していますが、必要に応じて自由にプロパティを定義できます。変数と同じように先頭に$(ドルマーク)を書きます。

プロパティ名の前にpublicというキーワードが書いてありますが、これはアクセス修飾子といいます。アクセス修飾子は下記の3種類あり、その値をどこからアクセスできるかを定義しています。

アクセス修飾子どこからアクセスできるか
publicクラス内、クラス外どちらからでもアクセス可能
private同じクラス内からアクセス可能
protected同じクラス内と、子クラス内からアクセス可能

今回の例ではpublicにしているので、このクラスからオブジェクトを生成したとき、そのオブジェクト経由でプロパティにアクセスすることができます。privateやprotectedにしていると、オブジェクト経由でそのプロパティにアクセスすることができません。クラス内のメソッドを使ってプロパティを操作することは可能です。

クラスを見てわかるように、タイトルも本文も何も設定されていません。タイトルと本文が入る場所だけが定義された、ただのテンプレート(型枠)です。このクラスにタイトルと本文を指定して実行すると、その度に指定した内容がセットされたオブジェクトが生成されます。

__construct()でプロパティに値をセット

5~8行目で__constructというメソッドを定義しています。これはクラスを実行したときに、プロパティに値をセットする特別なメソッドです。どのような値をセットするかは、引数で指定します。

今回の例ではクラスを実行するときに、第1引数にタイトル、第2引数に本文を指定します。そうすると、その引数の内容を生成するオブジェクトのプロパティに設定してくれます。

$thisとは、生成されたオブジェクトを指しています。プロパティへのアクセスは「->」という矢印のような記号を使用します。6行目は、「そのオブジェクトのtitleプロパティに、クラス実行時に第1引数で指定された値を入れる」という記述になっています。

10~12行目でthe_title()というメソッドを定義しています。the_title()というメソッドを実行すれば、そのオブジェクトのtitleプロパティがechoされます。その下のthe_body()も同じことです。

メソッドもプロパティと同じようにアクセス修飾子を書いて、どこから実行できるかを定義します。

クラスをインスタンス化してオブジェクトを作る

先ほども書いたように、クラスを定義しただけではオブジェクトは生成されていません。クラスを実行することで、初めてオブジェクトが生成されます。クラスを実行してオブジェクトを生成することをインスタンス化といい、生成されたオブジェクトをインスタンスといいます。

クラスを実行するには、クラス名の前にnewを書いてクラス名の後ろに()を書きます。引数を指定する場合は、その括弧内に書きます。

$title = 'タイトルです';
$body = '本文です';

$post = new Post($title, $body);

先ほどのPostクラスをインスタンス化して、そのインスタンスを$postに入れた例です。このインスタンスには、Postクラスで定義したプロパティ2つとメソッド2つが設定されていて、使用可能です。

// プロパティにアクセスする例
echo $post->title; // 「タイトルです」と表示される

// メソッドを実行する例
$post->the_body(); // 「本文です」と表示される

$postに代入されたオブジェクトのプロパティとメソッドにアクセスしています。アクセスするときには、クラスでも書いたように「->」の記号を使います。

今回の例は説明用に簡略化しており、実際に使用するときは無害化処理などを挟む必要があります。