logo

マジックメソッドを巡る旅 その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/
本プレスリリースは発表元企業よりご投稿いただいた情報を掲載しております。
お問い合わせにつきましては発表元企業までお願いいたします。

今日の主要記事