PHPのオブジェクト指向

うわー、2週間も更新が止まってしまったorz
というわけで、久々の更新はPHPのオブジェクト指向について。

PHPはオブジェクト指向のプログラミング言語です・・・って、今時使われる言語でオブジェクト指向じゃない言語って、C(C++じゃないC)の他に思い浮かばなかったり。Cでも構造体とか使ってオブジェクト指向っぽくできないこともないし。

なので、PHPのオブジェクト指向で他の言語と違うところを中心に簡単にまとめてみようかと。
例としてお客さんを表すCustomerというクラスを考えてみることにする。

 
class Customer
{
    private $age;
    private $purchase:
    public function __construct() {
        $this->purchase = 0;
    }
    public function setAge($age) {
        $this->age = $age;
    }
}

$customer = new Customer();
$customer->setAge(25);

メンバー変数、メソッドをpublic(どこからでもアクセス可能), protected(そのクラスと子クラスからのみアクセス可能), private(そのクラスからのみアクセス可能)の修飾子を付けて定義するというのは他の言語と変わらないかと。
上の例ではCustomerクラスの変数$customerを最初に宣言して、$customerの年齢ageに25を入れています。
気を付けるのは、コンストラクタを__construct()で定義すること。C++やJavaから来た人だと、慣れないうちはついpublic Customer()と書こうとしちゃうかもしれないですね(自分の事です)。
後はクラス内のメンバーやメソッドを呼び出すときでも$this->を忘れないようにしましょう(結構これでエラーになることは多いです)。

後は、通常のメンバー変数やメソッドの他に静的(static)なプロパティやメソッドというものもあります。

public static function outputAge() {
    echo $this->age;
}

Customer::outputAge();

staticなプロパティやメソッドはクラス名::を付けることでオブジェクトを生成しなくても呼び出すことができます。
なお、クラス内でstaticなプロパティやメソッドを呼び出すときはself::を頭につけます。

次は、継承についてです。

class ForeignCustomer extends Customer {
    private $country;
    public function setCountry($country) {
        $this->country = $country;
    }
}

見てのとおり、extendsを付けて継承します。Javaもそうでしたね。オーバーライトなんかも他の言語と同様にできます。
ちなみに、PHPでは多重継承は不可です。が、トレイトというものを使うことで多重継承のようなことができるようです。自分は使ったことはないので、こちらあたりを見てみてください。

後はabstractをつけて抽象クラスを定義できたり、interfaceをつけてインタフェースを定義できたりします。

フレームワークなんかはバリバリにオブジェクト指向を使っているので、フレームワークのソースを見てみると、オブジェクト指向の有用性を実感できると思います。

Javascriptのオブジェクト指向は普通のクラスベースではなくプロトタイプベースという独特なものなので、どこかでそれについても紹介しようと思います。

 

投稿日:
カテゴリー: PHP

1件のコメント

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です