ホームページ  >  記事  >  バックエンド開発  >  PHP マジック メソッド: __sleep __wakeup

PHP マジック メソッド: __sleep __wakeup

WBOY
WBOYオリジナル
2016-08-08 09:33:091570ブラウズ

php5 以降のバージョンでは、クラスでマジック メソッドを使用できるようになりました。 PHP では、2 つのアンダースコア (__) で始まるメソッドはマジック メソッドとして予約されると規定されているため、既存のマジック メソッドをオーバーロードする場合を除き、関数名を __ で始めないことをお勧めします。

PHP の既存のマジック メソッドには、__construct、__destruct、__call、__get、__set、__isset、__unset、__sleep、__wakeup、__toString、__set_state、__clone などがあります。

PHP マジック メソッドの __sleep __wakeup について話しましょう。

シリアル化では、オブジェクトを含む変数を連続バイト データに変換できます。シリアル化された変数をファイルに保存したり、逆にシリアル化して元のデータに戻したりすることができます。オブジェクトをシリアル化する前に定義すると、PHP はそのオブジェクトのプロパティとメソッドを正常に保存できます。そのような目的で、PHP は自動的に __sleep メソッドと __wakeup メソッドを検索します。

オブジェクトがシリアル化されると、PHP は __sleep メソッドを呼び出します (存在する場合)。オブジェクトを逆シリアル化した後、PHP は __wakeup メソッドを呼び出します。どちらのメソッドも、シリアル化する必要があるプロパティを含む配列を返す必要はありません。 __sleep メソッドがない場合、他のプロパティの値は破棄されます。PHP はすべてのプロパティを保存します。


プログラムが実行される前に、serialize() 関数はまずマジック メソッド __sleep があるかどうかを確認し、存在する場合は __sleep() メソッドが最初に呼び出されます。 その後のみ、シリアル化 (シリアル化) 操作が実行されます。この関数を使用すると、オブジェクトをクリーンアップし、オブジェクト内のすべての変数の名前を含む配列を返すことができます。メソッドが何も返さない場合、NULL がシリアル化され、次のようになります。 E_NOTICE エラー。対照的に、unserialize() は __wakeup メソッドがあるかどうかを確認します。存在する場合は最初に呼び出されます __wakeup メソッドでは、オブジェクトデータを事前に準備します。

__sleep メソッドは、コミットされていないデータや同様の操作を送信するためによく使用されます。また、非常に大きなオブジェクトがある場合は、 保存する必要がなく、非常に便利な機能です。 __wakeup は、データベース接続の再確立やその他の初期化操作の実行など、逆シリアル化操作でよく使用されます。

リーリー

次の例は、 __sleep メソッドと __wakeup メソッドを使用してオブジェクトをシリアル化する方法を示しています。 Id 属性は、オブジェクトに保持されることを目的としていない一時的な属性です。 __sleep メソッドは、シリアル化されたオブジェクトに id 属性が含まれていないことを保証します。 User オブジェクトを逆シリアル化する場合、この例は、リソース (画像やデータ ストリームなど) を含むオブジェクトが自立するように設計されています。これらの方法が必要です。

リーリー

例 3: __wakeup メソッドの欠陥に注意する必要があります。オブジェクトのシリアル化を解除する予定がある場合は、 を実行する必要があります。

リーリー

理由: $b オブジェクトは $name より前にシリアル化されていないため、B::__wakeup が実行されるとき、$a->name には値が割り当てられていません。

したがって、クラス内で変数を定義する順序には注意してください。


上記では、PHP マジック メソッド: __sleep __wakeup を紹介します。PHP マジック メソッドの内容も含めて、PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。