マジックメソッドを巡る旅 その14
- 編集部の見解や意向と異なる内容の場合があります
- 編集部は内容について正確性を保証できません
- 画像が表示されない場合、編集部では対応できません
- 内容の追加・修正も編集部では対応できません
ヒューマンリソシア株式会社はコラム「マジックメソッドを巡る旅 その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/
ソーシャルもやってます!