「__get()メソッド」とは?
状態:-
閲覧数:2,172
投稿日:2013-12-27
更新日:2013-12-27
未定義プロパティを参照した際、代わりにコールされるメソッド
・通常、未定義プロパティを参照しようとすると「E_NOTICE」通知を発し「NULL」を得るが、「__get()」メソッドが定義されていると、代わりにこのメソッドがコールされる
・通常、未定義プロパティを参照しようとすると「E_NOTICE」通知を発し「NULL」を得るが、「__get()」メソッドが定義されていると、代わりにこのメソッドがコールされる
書式
__get (string プロパティ名);
・第 1 引数 … 参照しようとしたプロパティ名マジックメソッド理解のため、PHPにおけるプロパティ挙動をおさらい
プロパティ挙動
プロパティがなければ作成
・その際のアクセス修飾子はpublic
class Entry {
}
$entry = new Entry();
$entry->title = 'title'; //プロパティがない場合、自動作成される
echo $entry->title;
// 処理結果
// title
publicプロパティを予め用意
・但し、publicなためアクセサ不要(どこからでもアクセス可能なため)
class Entry {
public $title;
}
$entry = new Entry();
$entry->title = 'title';
echo $entry->title;
// 処理結果
// title
protectedプロパティ … 要アクセサ
・protectedプロパティを用意すると、「Fatal error: Cannot access protected property Entry::$title」エラー
・要アクセサ
class Entry {
protected $title;
}
$entry = new Entry();
$entry->title = 'title';
echo $entry->title;
privateプロパティ … 要アクセサ
・privateプロパティでも同様。「Fatal error: Cannot access private property Entry::$title」エラー
・要アクセサ
class Entry {
private $title;
}
$entry = new Entry();
$entry->title = 'title';
echo $entry->title;
privateプロパティに対して、アクセサ用意
・プロパティ直呼び出しから、アクセサ経由の書き方へと変更
class Entry {
private $title;
public function getTitle() {//ゲッター
return $this->title;
}
public function setTitle($title) {//セッター
$this->title = $title;
}
}
$entry = new Entry();
$entry->setTitle("title");
echo $entry->getTitle(); //title
ようやく本題
確認コード例
privateプロパティに対して、マジックメソッドを用意
・privateプロパティに対して、個別指定のアクセサではなく、マジックメソッドを用意(意味合い的にはマジックメソッドのアクセサ)
・プロパティ呼び出し方を、「アクセサ経由の書き方から、直呼び出し」へ戻したことに注意が必要
class Entry {
private $title;
public function __get($key) {
return $this->$key;
}
public function __set($key, $value) {
$this->$key = $value;
}
}
$entry = new Entry();
$entry->title = 'title';
echo $entry->title; //title
privateプロパティに対して無意味な、個別アクセサも追加してみる
・privateプロパティに対して、個別アクセサと「マジックメソッドアクセサ(正式名称不明)」を用意
・「プロパティ直呼び出し」+「アクセサ経由の書き方」を併用
class Entry {
private $title;
private $body;
public function __get($key) {
return $this->$key;
}
public function __set($key, $value) {
$this->$key = $value;
}
public function getBody() { //ゲッター
return $this->body;
}
public function setBody($body) { //セッター
$this->body = $body;
}
}
$entry = new Entry();
$entry->title = 'title';
echo $entry->title; //title
$entry->setBody("body");
echo $entry->getBody(); //body