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

Human Resocia Co.,Ltd.

2015-10-30 09:00

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

早速、サンプルを書いてみましょう。

この続きは以下をご覧ください
(リンク »)
本プレスリリースは発表元企業よりご投稿いただいた情報を掲載しております。
お問い合わせにつきましては発表元企業までお願いいたします。

【企業の皆様へ】企業情報を掲載・登録するには?

御社の企業情報・プレスリリース・イベント情報・製品情報などを登録するには、企業情報センターサービスへのお申し込みをいただく必要がございます。詳しくは以下のページをご覧ください。

ZDNET Japan クイックポール

マイナンバーカードの利用状況を教えてください

NEWSLETTERS

エンタープライズ・コンピューティングの最前線を配信

ZDNET Japanは、CIOとITマネージャーを対象に、ビジネス課題の解決とITを活用した新たな価値創造を支援します。
ITビジネス全般については、CNET Japanをご覧ください。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]