マジックメソッド

関数

マジックメソッドとは?

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

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

__construct


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

呼び出される具体例


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


__destruct()メソッド

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

__destruct


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

呼び出される具体例


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


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

 閲覧数:446 投稿日: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 プロパティ名)メソッド

 閲覧数:434 投稿日: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)メソッド

 閲覧数:501 投稿日: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()メソッド

 閲覧数:467 投稿日: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()メソッド

 閲覧数:502 投稿日: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()メソッド

 閲覧数:486 投稿日: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()メソッド

 閲覧数:442 投稿日: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)

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



週間人気ページランキング / 6-7 → 6-13
順位 ページタイトル抜粋 アクセス数
1 PHPで定数を定義する方法は2種類ある / 配列定数の定義 9
2 コード例 … 「例外処理」はネストすることができる 5
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 5
3 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 4
4 ガベージコレクション | 機能 3
4 Warning: Unexpected character in input: '\' (ASCII=92) state=1 in ○○.php on line △△ | Warning(エラーメッセージ) 3
4 curl で Cookie を使用する 3
4 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 3
4 Catchable fatal error: Object of class DateTime could not be converted to string | Fatal error(エラーメッセージ) 3
4 Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Connection refused | Fatal error(エラーメッセージ) 3
4 Warning: include() [function.include]: Failed opening '**.php' for inclusion (in | Warning(エラーメッセージ) 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
5 Fatal error: Wrong parameters for Exception([string $exception [, long $code ]]) | Fatal error(エラーメッセージ) 2
5 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 2
5 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 2
5 Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): failed to open stream: Permission denied in | Fatal error(エラーメッセージ) 2
5 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'カラム名' cannot be null | Fatal error(エラーメッセージ) 2
5 session_start() | セッション 2
5 @ | 演算子 2
5 Parse error: syntax error, unexpected T_REQUIRE_ONCE, expecting T_FUNCTION | Parse error(エラーメッセージ) 2
2024/6/14 1:01 更新