この記事で共有する内容は、[php クラスとオブジェクト] のマジック メソッドに関するもので、必要な友人は参照できます
マジック メソッド (マジック メソッド)
1 | __construct()__destruct()__callStatic()__set()__isset()__unset()__wakeup()__invoke()__clone() __debugInfo()
|
ログイン後にコピー
__sleep() と。 __wakeup()
1 | public array __sleep ( void )void __wakeup ( void )
|
ログイン後にコピー
__sleep() は、コミットされていないデータ、または同様のクリーンアップ操作を送信するために使用されます。たとえば、非常に大きなオブジェクトがいくつかありますが、それらをすべて保存する必要はありません。
__wakeup() は逆シリアル化操作に使用されます。たとえば、データベース接続を再確立するか、その他の初期化操作を実行します。
serialize() は、クラスにマジックメソッド __sleep() があるかどうかをチェックします。存在する場合、このメソッドが最初に呼び出され、次にシリアル化操作が実行されます。この関数を使用すると、オブジェクトをクリーンアップし、シリアル化する必要があるオブジェクト内のすべての変数の名前を含む配列を返すことができます。メソッドが何も返さない場合、NULL がシリアル化され、E_NOTICE レベルのエラーが発生します。
unserialize() は、__wakeup() メソッドがあるかどうかを確認します。存在する場合、__wakeup メソッドが最初に呼び出され、オブジェクトに必要なリソースが事前に準備されます。
上記の概念の説明
シリアル化は、オブジェクトを含む変数を連続バイト データに変換し、シリアル化した変数をファイルに保存したり、ネットワーク経由で送信したりして、元のデータに復元することができます。クラスのオブジェクトを逆シリアル化する前に定義したクラスを使用すると、PHP はそのオブジェクトのプロパティとメソッドを正常に保存できます。この目的のために、PHP は自動的に __sleep を検索します。
オブジェクトがシリアル化されると、PHP は __sleep メソッドを呼び出します (存在する場合)。どちらのメソッドもパラメータを受け取る必要はありません。 __sleep メソッドがない場合、PHP はすべての属性を保存します。プログラムが実行される前に、serialize() 関数が最初にチェックします。マジックメソッド __sleep があるかどうか。存在する場合は、__sleep() メソッドが最初に呼び出され、次にシリアル化 (シリアル化) 操作が実行されます。この関数を使用すると、オブジェクトをクリーンアップし、オブジェクト内のすべての変数の名前を含む配列を返すことができます。メソッドが何も返さない場合、NULL がシリアル化され、E_NOTICE エラーが発生します。対照的に、unserialize() は __wakeup メソッドがあるかどうかを確認します。存在する場合は、最初に __wakeup メソッドが呼び出され、オブジェクト データが事前に準備されます。
__sleep メソッドは、コミットされていないデータや同様の操作を送信するためによく使用されます。同時に、この機能は、保存する必要のない大きなオブジェクトがある場合に非常に便利です。 __wakeup は、データベース接続の再確立やその他の初期化操作の実行など、逆シリアル化操作でよく使用されます。
__toString()
は、文字列として扱われる場合にクラスがどのように応答するかに使用されます。たとえば、 echo $obj; は何かを表示するはずです。 このメソッドは文字列を返す必要があります。そうでない場合は、E_RECOVERABLE_ERROR レベルの致命的なエラーが発行されます。 __toString() メソッドでは例外をスローできません。致命的なエラーが発生します。
1 2 3 4 5 | Example #2 简单示例<?php
public function __toString() {
return '类被当成字符串时tostring返回字符串';
}
} $class = new TestClass(); echo $class ;
|
ログイン後にコピー
PHP 5.2.0 より前では、__toString() メソッドは echo または print で直接使用された場合にのみ有効であることに注意してください。
PHP 5.2.0 以降では、任意の文字列環境 (%s 修飾子を使用した printf() 経由など) で使用できますが、非文字列環境 (%d 修飾子の使用など) では使用できません。
PHP 5.2.0 以降、__toString() メソッドを定義していないオブジェクトを文字列に変換すると、E_RECOVERABLE_ERROR レベルのエラーが生成されます。
__invoke()
1 | mixed __invoke ([ $... ] )
|
ログイン後にコピー
関数を呼び出してオブジェクトを呼び出そうとすると、__invoke() メソッドが自動的に呼び出されます。 (PHP 5.3.0)
1 2 3 4 5 6 | <strong>Example #3 使用 __invoke()<?phpclass CallableClass {
function __invoke( $x ) {
var_dump( $x );
}
} $obj = new CallableClass; $obj (5);
var_dump( is_callable ( $obj ));
|
ログイン後にコピー
__set_state()
関連推奨事項:
[php クラスとオブジェクト] traversal
[php クラスとオブジェクト] 匿名クラス
[php クラスオブジェクト付き] オーバーロード
以上が[phpのクラスとオブジェクト] マジックメソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。