マジックメソッドを巡る旅 その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/

この記事が役に立ったらシェア!
メルマガの登録はこちら Web担当者に役立つ情報をサクッとゲット!

人気記事トップ10(過去7日間)

今日の用語

PV
アクセス解析指標の 1 つ。Web サイトの特定のページが表示された回数を示す指 ...→用語集へ

インフォメーション

RSSフィード


Web担を応援して支えてくださっている企業さま [各サービス/製品の紹介はこちらから]