マジックメソッドを巡る旅 その14

ヒューマンリソシア 1/10(日) 11:34 tweet17このエントリーをはてなブックマークに追加 印刷用
※この記事は読者によって投稿されたユーザー投稿のため、編集部の見解や意向と異なる場合があります。また、編集部はこの内容について正確性を保証できません。

ヒューマンリソシア株式会社はコラム「マジックメソッドを巡る旅 その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/

tweet17このエントリーをはてなブックマークに追加
用語集 PHP
日本赤十字社 東日本大震災 義援金募集
Web担メルマガでラクラク情報ライフを
注目記事が毎週手もとに届いて見逃さない
要チェックのセミナー情報もゲットできる
編集長コラムを一足先に読める
―― 10万人が読んでいる、Web担必読メルマガです

今日の用語

3Bの法則
広告表現の中で、美人(Beauty)、赤ちゃん(Baby)、動物(Beast)を ... →用語集へ

連載/特集コーナーから探す

インフォメーション

Web担のメルマガを購読しませんか?
Web担の記事がコンパクトに毎週届くメールマガジン「Web担ウィークリー」は、10万人が読んでいる人気メルマガ。忙しいあなたの情報収集力をアップさせる強い味方で、お得な情報もいち早く入手できます。

Web担に広告を掲載しませんか?
購読者数10万人のメールマガジン広告をはじめとする広告サービスで、御社の認知向上やセミナー集客を強力にお手伝いいたします。

サイトマップ
RSSフィード


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

GOLD SPONSOR
さくらインターネット株式会社株式会社KDDI ウェブコミュニケーションズ株式会社日本レジストリサービスHP Softwareトランスコスモス株式会社株式会社ハイパーボックスDomain Keeperアドビ システムズ 株式会社
SPONSOR
株式会社キノトロープ株式会社アイレップ株式会社ニューズ・ツー・ユーシックス・アパート株式会社ウェブアンテナ株式会社サイバーエージェント富士通株式会社SitecoreYahoo!プロモーション広告Oracle