※この記事は読者によって投稿されたユーザー投稿のため、編集部の見解や意向と異なる場合があります。 また、編集部はこの内容について正確性を保証できません。
ヒューマンリソシア株式会社はコラム「マジックメソッドを巡る旅 その14」を公開しました。 _get()と__set()の使い方、前回少し見ていきましたが。 __get()と__set()には、今ひとつ、個人的には「特に最近、割と意識している」使い方があります。 毎度ながら「困っている状況」という、ニーズの根っこからゆっくりと、状況をたどってみる事にしましょう。 まずは、「困っている状況」を、サンプルコードで。 // エラー出力制御 ini_set(‘display_errors’, ‘on’); error_reporting(E_ALL); // class hoge { public $data_; } // $obj = new hoge(); $obj->date_ = ‘hoge data'; var_dump($obj); コードとしては「をっとtypoしている」状況、なのですが。 ………期待した動きになりません。 期待していた動き、を、例えばC++のコードで簡単に見てみましょう。 #include // class hoge { public: int data_; }; // int main() { hoge h; h.date_ = 10; return 0; } コンパイルの時点で 「t.cpp:10: error: ‘class hoge’ has no member named ‘date_’」 というエラーが発生します。 そりゃそうですね「存在しないプロパティにアクセスしようとしている」訳ですし。 …そのエラーが、PHPだと、発生しません。 いやまぁだから個人的には「プロパティ直接扱うな必ずアクセサを経由しろ」って話になるのですが。 ちなみにアクセサ経由を前提にtypoすると、こうなります。 // エラー出力制御 ini_set(‘display_errors’, ‘on’); error_reporting(E_ALL); // class hoge { public function set_data($v) { $this->data_ = $v; } private $data_; } // $obj = new hoge(); $obj->set_date(‘hoge data’); var_dump($obj); 「Fatal error: Call to undefined method hoge::set_date() in 」 メソッドがないんで、ちゃんとエラーが出てくれます。 さて。 では「プロパティを直接触ってたらあきらめるしかないのか?」というお話になるのですが。 あきらめてもいいのですが結果的に「ステキで壮絶なバグが発生する」可能性が十分に想起されてしまう… ところで、__set()と__get()を使います! 早速、サンプルを書いてみましょう。 この続きは以下をご覧くださいhttp://resocia.jp/column/2180/
この記事のキーワード

人気記事トップ10

人気記事ランキングをもっと見る