マジックメソッド

関数

マジックメソッドとは?

 状態:確認中  閲覧数:3,604  投稿日: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()メソッド

 閲覧数:500 投稿日:2018-02-20 更新日:2018-06-23 

__construct


新たにオブジェクトが 生成される度に、実行されるメソッド
__construct ([ mixed $args = "" [, $... ]] )メソッド

呼び出される具体例


class C {
 function __construct() {
 
}
$obj = new C();


__destruct()メソッド

 閲覧数:483 投稿日:2018-02-20 更新日:2018-06-29 

__destruct


以下の何れかの条件を満たす際、実行されるメソッド
・特定のオブジェクトを参照するリファレンスがひとつもなくなったとき
・スクリプトの終了時
・exit() でスクリプトの実行を止めた時
__destruct( )メソッド

呼び出される具体例


class C {
 function __destruct() {
 }
}
$obj = new C();


__call(string メソッド名, array 引数)メソッド

 閲覧数:462 投稿日:2018-02-20 更新日:2018-06-16 

__call


未定義のメソッドをコールした際、代わりにコールされるメソッド
・未定義のメソッドをコールすると「E_ERROR」エラーを発して終了するが、「__call()」メソッドが定義されていると、エラーを発せず代わりにこのメソッドがコールされる
__call(string メソッド名, array 引数)メソッド

引数
・コールされたメソッド名

引数
・コール時の実引数を格納した配列

呼び出される具体例


未定義のメソッドを呼出
・m
class C{
 public function __call($name, $arguments){ //string(1) "m",array(0) {}
 }
}
$obj = new C;
$obj->m();


__get(string プロパティ名)メソッド

 閲覧数:449 投稿日:2018-02-23 更新日:2018-06-16 

__get


未定義のプロパティを参照した際、代わりにコールされるメソッド
・未定義のプロパティを参照しようとすると「E_NOTICE」通知を発し「NULL」を得るが、「__get()」メソッドが定義されていると、代わりにこのメソッドがコールされる
__get(string プロパティ名)メソッド
引数
・参照しようとしたプロパティ名

呼び出される具体例


未定義のプロパティを参照
・p
class C{
 public function __get($name){ //string(1) "p"
 }
}
$obj = new C;
$obj->p;


__set(string プロパティ名 , mixed $value)メソッド

 閲覧数:519 投稿日:2018-02-25 更新日:2018-06-16 

__set


未定義のプロパティ値を代入しようとした際、代わりにコールされるメソッド
・未定義のプロパティに値を代入しようとすると、自動的にそのプロパティを定義するが、「__set()」メソッドが定義されていると、代わりにこのメソッドがコールされる
__set(string プロパティ名 , mixed $value)メソッド

引数
・代入しようとしたプロパティ名

引数
・代入しようとした値

呼び出される具体例


未定義のプロパティに値を代入
・p
class C{
 public function __set($name, $value){ //string(1) "p",string(3) "あ"
 }
}
$obj = new C;
$obj->p='あ';


__toString()メソッド

 閲覧数:483 投稿日:2018-03-01 更新日:2018-06-20 

__toString


オブジェクトを文字列として評価(文字列として出力)しようとした際にコールされる
・「echo()」もしくは「print()」で出力しようとした時にコールされるため、処理としては、このメソッドが返した文字列を出力することになる
 ※このメソッドの返り値の型は必ず文字列型である必要があるため、返り値を型キャストするとよい。ex) return (string)$str;
__toString( )メソッド

呼び出される具体例


オブジェクトを単独で出力
class C{
 public function __toString(){
 }
}
$obj = new C;
echo $obj;


__clone()メソッド

 閲覧数:524 投稿日:2018-03-03 更新日:2018-06-29 

__clone


__clone()メソッド(を定義している場合)
・オブジェクトのクローンを生成した際コールされる
・そのオブジェクトの __clone() メソッドがある場合、呼び出す
・オリジナルのオブジェクト側でなく生成されたクローン側でコールされるので、意味合いとしては“クローンのコンストラクタ”のようなもの
__clone()メソッド

呼び出される具体例


clone キーワード使用
class C{
 public function __clone(){
 }
}
$obj = new C;
clone $obj;


__clone()メソッド内でプロパティを更新すると?


反映されるのはクローン側のみ
・コールされる「__clone()」メソッドは、オリジナルのオブジェクト側のものではなく生成されたクローン側のものだから

__destruct()メソッドを定義している場合


exit実行すると
・クローンオブジェクトに対してもデストラクタ処理を実行
・クローンオブジェクトに対してデストラクタ処理を実行した後、元オブジェクトに対してデストラクタ処理を実行

__sleep()メソッド

 閲覧数:500 投稿日:2018-03-09 更新日:2018-06-30 

__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;}"

メンバ変数を格納した配列を返すよう修正した例
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()メソッド

 閲覧数:461 投稿日:2018-03-09 更新日:2018-06-30 

__wakeup()


シリアル化されたオブジェクトが「unserialize()」関数によって非シリアル化されようとした時、このメソッドが存在すれば非シリアル化後にコールされる
__wakeup ()メソッド

呼び出される具体例


class C{
 public function __wakeup(){
 }
}
$obj = new C;
$serialObj =serialize($obj);
unserialize($serialObj);



シリアライズ(シリアル化)

SHA-1(Secure Hash Algorithm 1)

コメント投稿(ログインが必要)



週間人気ページランキング / 7-20 → 7-26
順位 ページタイトル抜粋 アクセス数
1 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 6
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 5
3 コード例 … 「例外処理」はネストすることができる 4
4 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 3
4 PHPで定数を定義する方法は2種類ある / 配列定数の定義 3
4 Parse error: syntax error, unexpected 'new' (T_NEW) | Parse error(エラーメッセージ) 3
4 ブラウザを閉じたらセッションデータはどうなるの? | セッション 3
4 curl で Cookie を使用する 3
4 ( ! ) Deprecated: implode(): Passing glue string after array is deprecated. Swap the parameters in ★★★ headless-chromium-php/vendor/wrench/wrench/lib/Wrench/Protocol/Protocol.php | エラーメッセージ 3
4 or(||) | 演算子 3
5 Composer | 依存関係マネージャ 2
5 グローバル変数 | 変数 2
5 new clone違い | 演算子 2
5 php-devel とは? 2
5 session_start() | セッション 2
5 Fatal error: Uncaught Error: Class 'Mecab_Tagger' not found in /var/www/★★.php:☆☆ | Fatal error(エラーメッセージ) 2
5 例外処理 | 制御構造 2
5 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined | Fatal error(エラーメッセージ) 2
5 関数 2
6 セッション単位 | セッション 1
2024/7/27 1:01 更新