|
マジックメソッドマジックメソッドは、 ある動作がオブジェクトに対して行われた場合に、 PHP のデフォルトの動作を上書きする特別なメソッドです。 警告
以下の関数名は、マジックメソッドと見なされます: __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __serialize(), __unserialize(), __toString(), __invoke(), __set_state(), __clone(), __debugInfo() 警告
__construct(),
__destruct(),
__clone() を除く全てのマジックメソッドは、
警告
マジックメソッドの定義で型宣言が使われている場合、 それらは、このマニュアルで説明しているシグネチャと同じでなければいけません。 そうでない場合、致命的なエラーが発生します。 PHP 8.0.0 より前のバージョンでは、 エラーは全く発生していませんでした。 但し、__construct() と __destruct() については、戻り値の型を宣言してはいけません。 宣言してしまうと、致命的なエラーが発生します。 __sleep() と __wakeup()
public array __sleep()
public void __wakeup()
serialize は、クラスに特殊な名前
__sleep() の関数があるかどうかを調べます。
もしあれば、シリアル化の前にその関数を実行します。
この関数で、オブジェクトをクリアすることができます。
またこの関数は、シリアル化するオブジェクトについて、
すべての変数の名前を配列で返すことが前提となっています。
このメソッドが何も返さなかった場合は、
典型的な __sleep() の使用法は、 途中のデータをコミットしたり、 似たようなタスクのクリアを行うといったものです。 また、オブジェクトが非常に大きく、かつ、完全に保存する必要がない場合、 この関数が有用です。 逆に、unserialize は、 特殊な名前 __wakeup() を有する 関数の存在を調べます。 もし存在する場合、この関数は、オブジェクトが有する可能性が あるあらゆるリソースを再構築することができます。 __wakeup() の使用目的は、 シリアル化の際に失われたデータベース接続を再度確立したり、 その他の再初期化を行うことです。 例1 sleep と wakeup __serialize() と __unserialize()
public array __serialize()
public void __unserialize(array
$data)serialize は、クラスが 特殊な名前 __serialize() を持つかを調べます。 もしあれば、シリアル化の前にその関数を実行します。 この関数は、オブジェクトをシリアル化した状態を示すキー/値のペアを連想配列にして返さなければなりません。 配列を返さなかった場合、TypeError がスローされます。
__serialize() の目的は、 任意のオブジェクトの表現をシリアライズしやすいように定義することです。 配列の要素はオブジェクトのプロパティに対応していても構いませんが、必須ではありません。 逆に、unserialize は 特殊な名前 __unserialize() を持つかを調べます。 もしあれば、__serialize() が返した配列を復元し、この関数に渡します。 この関数では、その配列から必要に応じてオブジェクトのプロパティを復元して構いません。
例2 Serialize と unserialize __toString()
public string __toString()
__toString() メソッドにより、
クラスが文字列に変換される際の動作を決めることができます。たとえば
警告
PHP 8.0.0 以降では、戻り値は PHP で標準的な型のセマンティクスに従います。 つまり、厳密な型付け が無効になっている場合、可能であれば文字列型に強制されます。 厳密な型付け が有効になっている場合、string 型を宣言していても Stringable は受け入れられ ません。 受け入れさせたい場合、Stringable と string を union 型を使って型宣言しなければいけません。 PHP 8.0.0 以降では、 __toString() メソッドを含む全てのクラスは、 暗黙のうちに Stringable インターフェイスも実装するようになりました。 よって、このインターフェイスの型チェックは通過することになります。 いずれにせよ、明示的にこのインターフェイスを実装することを推奨します。 PHP 7.4 では、戻り値は文字列でなければいけません。 そうでない場合、Error がスローされます。
PHP 7.4.0 より前のバージョンでは、
戻り値は文字列でなければいけません。
そうでない場合、 警告
PHP 7.4.0 より前のバージョンでは、__toString() メソッド内から例外をスローすることはできません。そうした場合、致命的なエラーが発生します。 例3 簡単な例 上の例の出力は以下となります。 Hello __invoke()
mixed __invoke(
...$values)__invoke() メソッドは、 スクリプトがオブジェクトを関数としてコールしようとした際にコールされます。 例4 __invoke() の使用 上の例の出力は以下となります。 int(5) bool(true) 例5 __invoke() の使用 上の例の出力は以下となります。
Array
(
[0] => Array
(
[id] => 3
[first_name] => Alice
[last_name] => Gustav
)
[1] => Array
(
[id] => 2
[first_name] => Bob
[last_name] => Filipe
)
[2] => Array
(
[id] => 1
[first_name] => John
[last_name] => Do
)
)
Array
(
[0] => Array
(
[id] => 1
[first_name] => John
[last_name] => Do
)
[1] => Array
(
[id] => 2
[first_name] => Bob
[last_name] => Filipe
)
[2] => Array
(
[id] => 3
[first_name] => Alice
[last_name] => Gustav
)
)
__set_state()
static object __set_state(array
$properties)この static メソッドは、 var_export によって エクスポートされたクラスのためにコールされます。
このメソッドの唯一のパラメータは、エクスポートされたプロパティを
例6 __set_state() の使用法 上の例の出力は以下となります。
string(60) "A::__set_state(array(
'var1' => 5,
'var2' => 'foo',
))"
object(A)#2 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}
__debugInfo()
array __debugInfo()
このメソッドは、var_dump がオブジェクトをダンプするときに、 プロパティの情報を取得するために呼ばれます。 もしオブジェクトにこのメソッドが定義されていなければ、 すべての public, protected, private プロパティを表示します。 例7 __debugInfo() の使用法 上の例の出力は以下となります。
object(C)#1 (1) {
["propSquared"]=>
int(1764)
}
|