PHP のマジック メソッドの概要: __construct、__destruct、__call、__callStatic、__get、__set、__isset、__unset、__sleep、__wakeup、__toString、__set_state、__clone、__autoload
1. __get、__set
これら 2 つのメソッドは、クラスとその親クラスで宣言されていないプロパティ用に設計されています
__get( $property ) は、未定義のプロパティを呼び出すときにこのメソッドにアクセスします
未定義のプロパティに値を割り当てるときに __set( $property, $value ) が呼び出されます
ここでの no 宣言には、オブジェクトを使用して呼び出されたときにアクセス制御が保護されプライベートである属性 (つまり、アクセス許可のない属性) が含まれます
2. __isset、__unset
__isset( $property ) このメソッドは、未定義のプロパティに対して isset() 関数が呼び出されたときに呼び出されます
__unset( $property ) このメソッドは、未定義のプロパティに対して unset() 関数が呼び出されたときに呼び出されます
__get メソッドや __set メソッドと同様に、ここでの未宣言には、オブジェクトを使用して呼び出した場合にアクセス制御が保護されプライベートである属性 (つまり、アクセス許可のない属性) が含まれます
3.__電話
__call( $method, $arg_array ) この呼び出しは未定義のメソッドを呼び出すときに呼び出されます
ここでいう未定義メソッドには、アクセス権限を持たないメソッドも含まれます
4.__オートロード
まだ定義されていないクラスを使用しようとしたときに自動的に呼び出される__autoload関数。この関数を呼び出すことにより、スクリプト エンジンは、PHP がエラーで失敗する前に、必要なクラスをロードする最後のチャンスを得ることができます。
注: __autoload 関数でスローされた例外は、catch ステートメント ブロックではキャッチできず、致命的なエラーが発生します。 5. __構築、__破壊
__construct コンストラクター、このメソッドはオブジェクトの作成時に呼び出されます。このメソッドを使用する利点は、クラスの名前に関係なく、コンストラクターに一意の名前を付けることができることです。クラス名、コンストラクター名を変更する必要はありません
__destruct デストラクター メソッド、PHP はオブジェクトが破棄される前 (つまり、メモリからクリアされる前) にこのメソッドを呼び出します
デフォルトでは、PHP はオブジェクトのプロパティによって占有されているメモリのみを解放し、オブジェクト関連のリソースを破棄します。
デストラクターを使用すると、オブジェクトの使用後に任意のコードを実行してメモリをクリアできます。スクリプトがオブジェクトに関連付けられていないと PHP が判断すると、デストラクターが呼び出されます。
関数の名前空間内では、関数が返されるときにこれが発生します。グローバル変数の場合、これはスクリプトの最後で行われます。オブジェクトを明示的に破棄する場合は、通常、その変数を NULL に割り当てるか、unset を呼び出します。
6.__クローンPHP5でのオブジェクトの割り当ては参照割り当てを使用します。オブジェクトをコピーしたい場合は、cloneメソッドを使用する必要があります。このメソッドが呼び出されるとき、オブジェクトは自動的に__cloneマジックメソッドを呼び出します。
オブジェクトのコピー中に初期化操作を実行する必要がある場合は、__clone メソッドで実装できます
7.__toString
__toString メソッドは、echo を使用してオブジェクトを出力する場合など、オブジェクトを文字列に変換するときに自動的に呼び出されます
クラスがこのメソッドを実装していない場合、オブジェクトを echo で出力することはできません。そうでない場合は、次のメッセージが表示されます: キャッチ可能な致命的なエラー: クラス テストのオブジェクトを文字列に変換できませんでした
このメソッドは文字列を返す必要があります。PHP 5.2.0 より前では、__toString メソッドは echo() または print() と組み合わせて使用した場合にのみ有効です。 PHP 5.2.0 以降では、任意の文字列環境 (たとえば、%s 修飾子を使用した printf() 経由) で使用できますが、非文字列環境 (%d 修飾子の使用など) では使用できません。 PHP 5.2.0 以降、__toString メソッドが定義されていないオブジェクトが文字列に変換されると、E_RECOVERABLE_ERROR エラーが報告されます。
8. __寝て、__起きる
シリアル化中に__sleepを使用します
デシリアライゼーション中に__wakeupが呼び出されます
Serialize()はクラス内に__sleepというマジック名を持つ関数があるかどうかをチェックします。その場合、関数はシリアル化の前に実行されます。これはオブジェクトをクリアし、シリアル化する必要があるオブジェクト内のすべての変数の名前を含む配列を返す必要があります。
__sleep を使用する目的は、オブジェクトが持つデータベース接続を閉じたり、保留中のデータを送信したり、同様のクリーンアップ タスクを実行したりすることです。さらに、この機能は、完全に保存する必要のない非常に大きなオブジェクトがある場合に便利です。
対照的に、unserialize() は、__wakeup というマジック名を持つ関数の存在を確認します。この関数は、オブジェクトが持つ可能性のあるリソースが存在する場合、それを再構築できます。
__wakeup を使用する目的は、シリアル化中に失われた可能性のあるデータベース接続を再確立し、他の再初期化タスクを処理することです。
9.__set_state
この静的メソッドは、var_export() が呼び出されたときに呼び出されます (PHP 5.1.0 以降有効)。
このメソッドの唯一のパラメータは配列であり、array('property' => value, ...) の形式で配置されたクラス プロパティが含まれます。
10.__invoke
関数を呼び出してオブジェクトを呼び出そうとすると、__invokeメソッドが自動的に呼び出されます。
PHP5.3.0以上が有効です
11.__callStatic
__call() マジック メソッドと同様に動作します。__callStatic() は静的メソッド呼び出しを処理します。
PHP5.3.0以上が有効ですPHP は __callStatic() メソッドの定義を厳格化しています。このメソッドは public でなければならず、static として宣言する必要があります。同様に、__call() マジック メソッドは、他のすべてのマジック メソッドと同様に、パブリックとして定義する必要があります。