クラス

オブジェクトとクラス

なぜ「オブジェクト指向」と呼ぶのでしょうか。
その名の通り、「オブジェクト」が中心概念となるからです。

「オブジェクト」を英和辞書で調べると「物体, もの, 実物, 対象」という感じで訳されます。また辞書によっては「独自のデータと処理手続きをもつソフトウェアの単位」と、まさにオブジェクト指向におけるオブジェクトを指す説明がなされていたりします。

オブジェクト指向ではこのオブジェクト(物または事)を中心概念として処理が流れます。例えばあるシステムで「車」が登場するとしましょう。これをプログラミングでは車をひとつのオブジェクトとしてとらえます。

それでは「クラス」とは何でしょうか。
クラスはオブジェクトの「設計図」と考える事ができます。

現実世界では車という「もの」は車の設計図をもとに作られます。何もなしにいきなり作ることは出来ません。プログラミングでも同じようにオブジェクトの設計図として「クラス」を作らなければなりません。

そして辞書の訳どおり、オブジェクトは「独自のデータ」と「処理手続き」を持ちます。
これは言い換えれば、「変数」と「関数」です。オブジェクトとしてどんなデータや処理を持つかは、設計図としてのクラスに「変数」や「関数」という形で定義します。


クラスの定義

まずはクラスの作り方を見てみましょう。

<?php

class Product
{

}

?>

クラス定義にはまず「class」というキーワードの後ろに好きなクラス名を記述します。
そしてクラスの開始と終了を表す「{ }」で囲った範囲がクラス定義になります。

しかし上のように中身が空っぽでは単にクラスを定義しただけで何の機能ももちません。
まずはクラス独自の変数である「フィールド」(メンバ変数ともいう)を定義しましょう。

<?php

class Product
{
    private $name;  // 商品名
    private $price;   // 価格
}

?>

「$name」と「$price」という二つのフィールドを定義しました。
private」の部分は修飾子と呼び、そのフィールドがクラス外部からのアクセスが可能かどうかをあらわします。

次は関数を作ってみます。クラスにおける関数は「メソッド」と呼ばれます。

<?php

class Product
{
    private $name;  // 商品名
    private $price;   // 価格
    
    // 商品名を取得する
    public function getName()
    {
        return $this->name;
    }    
    
    // 商品名を設定する
    public function setName($name)
    {
        $this->name = $name;
    }    
}

?>

書き方は関数の定義とほぼ同じですが、先頭に「public」ってのがついています。
フィールドの「private」と同じで修飾子です。
「public」は外部よりのアクセスが可能であることを表します。

メソッドの中で「$this」という表現が出てきました。
$this」とはクラスの中に記述する事で、クラス自身を指します。

「$this」の後ろに「->」という見慣れない記号が出てきました。これは「アロー演算子」と呼ばれ、
クラスのメンバにアクセスする場合に使用します。(ちなみにメンバとはクラスのフィールドやメソッドなどのクラス構成物を表します。)
日本語で「の」にあたるというくらいに考えてください。

「$this->name」で「Productクラス自身の$nameフィールド」といった意味になります。
このとき、「$this->$name」のように「->」の後に「$」を付けないように注意してください。


クラスの基本構造はこれだけのことです。
「フィールド」と呼ばれる変数と、「メソッド」と呼ばれる関数を持つ。
それぞれのフィールドやメソッドはクラスの外部からアクセスが可能かどうかの設定をする。

ただしあくまでクラスは設計図です。
こんなデータを持っていますよ、とか、こんな処理ができますよ、って言うのを定義しただけのものです。

クラスの変数と関数の性質

クラスは変数と関数を持つと言いましたが、通常の変数や関数とは少し果たす役割が違うことにお気づきでしょうか。
普通の変数は値を一時的に保管しておく箱に過ぎません。また関数は引数として受け取った情報をもとに、それを加工して返すようなものです。

対してクラスの持つメンバ変数はクラスの性質を表します。またメソッドはクラスの性質ともいうべきメンバ変数の状態を変化させる、またはメンバ変数の状態を情報として返すという役割を持っています。

ここは大きな違いです。重要なのはクラスは「性質」を持つということです。これを中心にクラスが構成されていると言っても過言ではありません。