マジックメソッドとは?
状態:確認中
閲覧数:3,682
投稿日:2010-05-17
更新日:2018-06-24
特殊メソッド、特殊関数
“呼ばれ時”になると勝手にコールされる
・「__construct()」(コンストラクタ)や「__destruct()」(デストラクタ)も、この仲間
定義方法
・「__(アンダーライン2本)」で始まるメソッド名または関数名
・「引数の数と返り値の型を決められた形態通りに定義」しなくてはならない
特殊メソッド | 「特殊メソッド」がコールされるタイミング | 具体例 |
---|---|---|
__construct() | 新規オブジェクト 生成 | |
__destruct() | exit()をコールなど | |
__call() | 未定義メソッドをコール | |
__get() | 未定義プロパティを参照 | |
__set() | 未定義プロパティに値を代入 | |
__clone() | 「clone」でクローンが生成された時 | |
__sleep() | オブジェクトが「serialize()」関数によってシリアル化されようとした時 | $b=serialize($a); |
__wakeup() | シリアル化されたオブジェクトが「unserialize()」関数によって非シリアル化 されようとした時 | unserialize($b); |
特殊関数 | 「関数」がコールされるタイミング |
---|---|
__autoload | クラスが未定義であった時 |
__construct()メソッド
__construct
新たにオブジェクトが 生成される度に、実行されるメソッド
__construct ([ mixed $args = "" [, $... ]] )メソッド
呼び出される具体例
class C {
function __construct() {
}
$obj = new C();
__destruct()メソッド
__destruct
以下の何れかの条件を満たす際、実行されるメソッド
・特定のオブジェクトを参照するリファレンスがひとつもなくなったとき
・スクリプトの終了時
・exit() でスクリプトの実行を止めた時
__destruct( )メソッド
呼び出される具体例
class C {
function __destruct() {
}
}
$obj = new C();
__call(string メソッド名, array 引数)メソッド
__call
未定義のメソッドをコールした際、代わりにコールされるメソッド
・未定義のメソッドをコールすると「E_ERROR」エラーを発して終了するが、「__call()」メソッドが定義されていると、エラーを発せず代わりにこのメソッドがコールされる
__call(string メソッド名, array 引数)メソッド
第1引数
・コールされたメソッド名
第2引数
・コール時の実引数を格納した配列
呼び出される具体例
未定義のメソッドを呼出
・m
class C{
public function __call($name, $arguments){ //string(1) "m",array(0) {}
}
}
$obj = new C;
$obj->m();
__get(string プロパティ名)メソッド
__get
未定義のプロパティを参照した際、代わりにコールされるメソッド
・未定義のプロパティを参照しようとすると「E_NOTICE」通知を発し「NULL」を得るが、「__get()」メソッドが定義されていると、代わりにこのメソッドがコールされる
__get(string プロパティ名)メソッド
第1引数・参照しようとしたプロパティ名
呼び出される具体例
未定義のプロパティを参照
・p
class C{
public function __get($name){ //string(1) "p"
}
}
$obj = new C;
$obj->p;
__set(string プロパティ名 , mixed $value)メソッド
__set
未定義のプロパティ値を代入しようとした際、代わりにコールされるメソッド
・未定義のプロパティに値を代入しようとすると、自動的にそのプロパティを定義するが、「__set()」メソッドが定義されていると、代わりにこのメソッドがコールされる
__set(string プロパティ名 , mixed $value)メソッド
第1引数
・代入しようとしたプロパティ名
第2引数
・代入しようとした値
呼び出される具体例
未定義のプロパティに値を代入
・p
class C{
public function __set($name, $value){ //string(1) "p",string(3) "あ"
}
}
$obj = new C;
$obj->p='あ';
__toString()メソッド
__toString
オブジェクトを文字列として評価(文字列として出力)しようとした際にコールされる
・「echo()」もしくは「print()」で出力しようとした時にコールされるため、処理としては、このメソッドが返した文字列を出力することになる
※このメソッドの返り値の型は必ず文字列型である必要があるため、返り値を型キャストするとよい。ex) return (string)$str;
__toString( )メソッド
呼び出される具体例
オブジェクトを単独で出力
class C{
public function __toString(){
}
}
$obj = new C;
echo $obj;
__clone()メソッド
__clone
__clone()メソッド(を定義している場合)
・オブジェクトのクローンを生成した際コールされる
・そのオブジェクトの __clone() メソッドがある場合、呼び出す
・オリジナルのオブジェクト側でなく生成されたクローン側でコールされるので、意味合いとしては“クローンのコンストラクタ”のようなもの
__clone()メソッド
呼び出される具体例
clone キーワード使用
class C{
public function __clone(){
}
}
$obj = new C;
clone $obj;
__clone()メソッド内でプロパティを更新すると?
反映されるのはクローン側のみ
・コールされる「__clone()」メソッドは、オリジナルのオブジェクト側のものではなく生成されたクローン側のものだから
__destruct()メソッドを定義している場合
exit実行すると
・クローンオブジェクトに対してもデストラクタ処理を実行
・クローンオブジェクトに対してデストラクタ処理を実行した後、元オブジェクトに対してデストラクタ処理を実行
__sleep()メソッド
__sleep()
__sleep()メソッド(を定義している場合)
・オブジェクトが「serialize()」関数によってシリアル化されようとした時、シリアル化する前にコールされる
・このメソッドは、“シリアル化させたいプロパティ名を格納した配列を返す”必要がある
・返された配列に格納された名前のプロパティのみシリアル化される
・なお、このメソッドが存在しない場合は全てのプロパティがシリアル化される
__sleep ()メソッド
呼び出される具体例
Noticeが発生する例
class C{
public function __sleep(){
$pAry = array('a','b','c','d');
return $pAry;
}
}
$obj = new C;
var_dump(serialize($obj));
PHP Notice: serialize(): "a" returned as member variable from __sleep() but does not exist in /workspace/Main.php on line 10
PHP Notice: serialize(): "b" returned as member variable from __sleep() but does not exist in /workspace/Main.php on line 10
PHP Notice: serialize(): "c" returned as member variable from __sleep() but does not exist in /workspace/Main.php on line 10
PHP Notice: serialize(): "d" returned as member variable from __sleep() but does not exist in /workspace/Main.php on line 10
string(52) "O:1:"C":4:{s:1:"a";N;s:1:"b";N;s:1:"c";N;s:1:"d";N;}"
PHP Notice: serialize(): "b" returned as member variable from __sleep() but does not exist in /workspace/Main.php on line 10
PHP Notice: serialize(): "c" returned as member variable from __sleep() but does not exist in /workspace/Main.php on line 10
PHP Notice: serialize(): "d" returned as member variable from __sleep() but does not exist in /workspace/Main.php on line 10
string(52) "O:1:"C":4:{s:1:"a";N;s:1:"b";N;s:1:"c";N;s:1:"d";N;}"
メンバ変数を格納した配列を返すよう修正した例
class C{
private $server, $username, $password, $db;
public function __sleep(){
$pAry = array('server', 'username', 'password', 'db');
return $pAry;
}
}
$obj = new C;
var_dump(serialize($obj));
string(86) "O:1:"C":4:{s:9:"Cserver";N;s:11:"Cusername";N;s:11:"Cpassword";N;s:5:"Cdb";N;}"
__wakeup()メソッド
__wakeup()
シリアル化されたオブジェクトが「unserialize()」関数によって非シリアル化されようとした時、このメソッドが存在すれば非シリアル化後にコールされる
__wakeup ()メソッド
呼び出される具体例
class C{
public function __wakeup(){
}
}
$obj = new C;
$serialObj =serialize($obj);
unserialize($serialObj);