ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

今更ながら、PHP4でのSingletonデザパタで参照絡みで思いっきり嵌った。

。゚(゚´Д`゚)゚。

PHP4の参照機構で嵌ったの、何度目でしょう。
もうね、こうね、本当にね、
PHP4の参照機構って(自主規制)
だと思うの。
いや、reference counterのオーバーフローがどうのとかじゃなくて、なんかもう、
特に代入時の言語仕様として「( ´゚д゚`)えーーー」な部分が多すぎ
だと思うのですよ。っつーか参照機構って代入時か関数引数に渡すときしか使わないから、つまるところ仕組みの半分が「Σ(゚Д゚;エーッ! 」なわけです。


まぁ良いです。どうせあと数年で消え去るバージョンだから。っつーか、マジデRuby or Perlニトウヒシマスヨ?

本題。

PHP4で(くどい)singletonデザパタを適用してたんですよ。

class Hoge {
    function &singleton() {
        static $instance = null;
        if (is_null($instance)) {
            $instance =& new Hoge();
        }
        return $instance;
    }
}

で、メンバ変数とか追加しといてえ本当に一緒かどうか確認したのですが。毎回newされちゃうんだな、これが。

はい、なんでか分かる人、挙手!!

・・・
じゃぁ、正解から。ちゃんと、newされない、singletonとして機能しているコードを示します。

class Hoge {
    function &singleton() {
        static $instance = null;
        if (is_null($instance)) {
            $instance = new Hoge();
        }
        return $instance;
    }
}

どこが違うか分かります?

// 動かない方:
$instance =& new Hoge();
// 動く方:
$instance = new Hoge();
           ^ 注目! "&" 無し!

・・・
・・・
・・・

ね?

(°Д°)ハァ?

でしょ?だよね?・・・すみません。少なくとも自分はもう「(*´д`*)逝ってヨシ!!」モードになりました。

えっと、なんでこれに気づいたかというとですね。ふと検索したところ
http://www.doyouphp.jp/sample/sample_class_dp_singleton.shtml
というのが有りまして。
こちらでは、"&"無しだったんですよ。

・・・すみませんすみません。自分、基本的に「オブジェクトをnewする場合、PHP4では"&"付きで参照で代入しないといけない」と盲目的に信じてました。

これからPHPを始める諸君、ぜひPHP5で行こう!!こんなBad KnowHowに躓く必要はない!!

っつーか、マジでどうなってんのこれ。

・・・キモチワルイ。

というか更にへこんでるのが、これ、自分前にも一回嵌って、同じ経緯で解決してたことがあるのを思い出したからです。

学習してねぇよ、自分。