PHP5のコンストラクタ関数は__construct()

PHP5のコンストラクタ関数について、慣れないことをするとハマるという例です。

今まで、PHPでオブジェクト指向プログラミングと言えば、せいぜい、できもののクラスライブラリを使うか、なんとなくクラスにしている程度だったので、オブジェクト指向に多少のメリットを感じることはあっても、絶対的なメリットを感じることはありませんでした。今回、結構、複雑なことをやろうとしていて、これって、オブジェクト指向の威力が発揮されるケースでは?と思い、PHP5の練習がてらにクラスを作成していました。

調べながら、書きながら、今回のケースでは、オブジェクト指向プログラミングに絶対的なメリットを感じたわけですが、案の定、慣れないことをしたのでハマりました。わかってしまえば本当に単純すぎる間違いで、かなり笑えるわけですが、しばらくハマっていたので記録しておきます。こんな間違いをする人はいないでしょうけど :(

最初に書いたのは次のようなものです。

abstract class Product
{
    protected $db;

    protected function __constructor()
    {
        $this->db = new Database();
    }

    abstract public function getDetail();
    // 以下、省略
}

abstract class Snack extends Product
{
    protected function __constructor() {
        parent::constructor();
    }

    public function getDetail() {
        $this->db->connect();
        // 例なので適当です。
    }
    // 以下、省略
}

final class UmaiBou extends Snack
{
    public function __constructor()
    {
        parent::constructor();
    }
    // 以下、省略
}

$MyUmaiBou = new UmaiBou();

いきなりエラーが発生するわけです。今、見れば、本当にすぐわかる間違いですね。ところが慣れないことをしている上に複雑なことになっているわけで、しばらく悩んだ後に気づいて、constructor()__constructor()に直しました。

これでうまくいったかに見えたものの、今度はUmaiBou->db->connect()が見つからないと言われるわけです。Productクラスのコンストラクタでインスタンスを生成しているはずなのに、どうやってもエラーが消えません。継承の仕方が間違っているのか、Databaseクラスが間違っているのかと見てみても、おかしなところは見つかりません。

ようやく気づいたのは、散々、あちこち見回した後に、UmaiBouクラスのコンストラクタ関数が呼び出されていないのを確認したときです。PHP5のコンストラクタ関数は__construct()です。__constructor()で統一していたせいで、間違いに気づくのに時間がかかりました。紛らわしい :X

最終的に次のようになりました。

abstract class Product
{
    protected $db;

    protected function __construct()
    {
        $this->db = new Database();
    }

    abstract public function getDetail();
    // 以下、省略
}

abstract class Snack extends Product
{
    protected function __construct() {
        parent::__construct();
    }

    public function getDetail() {
        $this->db->connect();
        // 例なので適当です。
    }
    // 以下、省略
}

final class UmaiBou extends Snack
{
    public function __construct()
    {
        parent::__construct();
    }
    // 以下、省略
}

$MyUmaiBou = new UmaiBou();

PHP4の中途半端なオブジェクト指向は、面倒くさいだけであまりメリットを感じられませんでしたが、これからは積極的にオブジェクト指向で作っていこうかなあと思いました。メリットを活かせる規模のものを作ることはほとんどないですけど :p

コメント (1)

はまりました! 参考になりました! ありがとうございます!

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/109/trackback/
この記事のURI
http://dxd8.com/archives/109/