PHP では、「__」、つまり 2 つのアンダースコアで始まるすべてのクラス メソッドがマジック メソッドとして予約されています。PHP のマジック メソッドには、「__construct()」、「__destruct()」、「」が含まれます。 __call()」、「__callStatic()」など。
魔法のメソッドは次のとおりです:
1、__get、__set
これら 2 つのメソッドは次のとおりです。クラスとそのスーパークラスで宣言されていないプロパティ用に設計されています。
__get( $property ) このメソッドは、未定義のプロパティが呼び出されたときにトリガーされ、アクセスされているプロパティのパラメータを渡します。 名前
__set( $property ) , $value ) 未定義のプロパティに値を割り当てると、このメソッドがトリガーされます。渡されるパラメータは、設定するプロパティ名と値です。
ここには宣言がありません。アクセス制御が保護されている属性や、オブジェクトを使用して呼び出された場合は、プライベート (つまり、アクセス許可を持たない属性) が返されます。
2, __isset, __unset
__isset( $property ) このメソッドは、isset() 関数が未定義のプロパティに対して呼び出されたときに呼び出されます。
__unset( $property ) unset() 関数が未定義の属性で呼び出されたときに、このメソッドが呼び出されます。 . 属性 (つまり、アクセス許可を持たない属性)
3. __call
__call( $method, $arg_array ) 未定義のメソッドを呼び出す場合、このメソッドが呼び出されます
ここでの未定義メソッドには、アクセス権限のないメソッドも含まれます。メソッドが存在しない場合は、親クラスに移動してメソッドを見つけます。親クラスに存在しない場合は、__call() を呼び出します。このクラスのメソッド。このクラスに存在しない場合、__call() メソッドが存在する場合は、親クラス
4 の __call() メソッドに移動します。__autoload
__autoload 関数では、まだ定義されていない __autoload 関数を使用しようとします。クラスが自動的に呼び出されます。この関数を呼び出すことにより、スクリプト エンジンは、PHP がエラーで失敗する前に、必要なクラスをロードする最後のチャンスを得ることができます。
グローバル オートロード クラスを定義する場合は、 spl_autoload_register() メソッドを使用して、処理クラスを PHP 標準ライブラリに登録する必要があります。
コードは次のとおりです。
<?php class Loader { static function autoload_class($class_name) { //寻找正确的$class_name类,并引入,没有则抛出异常 } } /** * 设置对象的自动载入 * spl_autoload_register — Register given function as __autoload() implementation */ spl_autoload_register(array('Loader', 'autoload_class')); $a = new Test();//Test没用require就实例化,实现自动加载,很多框架就用这种方法自动加载类 ?>
注: __autoload 関数でスローされた例外は、catch ステートメント ブロックではキャッチできず、致命的なエラーの原因となるため、関数自体でキャッチする必要があります。
5, __construct, __destruct
__construct コンストラクター メソッド、このメソッドはオブジェクトの作成時に呼び出されます。PHP4 と比較してこのメソッドを使用する利点は、コンストラクター メソッドに一意の名前を付けることができることです。 . それが含まれるクラスの名前は関係ありません。このようにして、クラスの名前を変更するときに、コンストラクター メソッド
__destruct デストラクター メソッドの名前を変更する必要はありません。PHPオブジェクトが破棄される前にメモリから削除されます。クリアする前に、このメソッドを呼び出します。デフォルトでは、PHP はオブジェクトのプロパティによって占有されているメモリのみを解放し、オブジェクト関連のリソースを破棄します。デストラクタを使用すると、オブジェクトの使用後に任意のコードを実行してメモリをクリアできます。スクリプトがオブジェクトに関連付けられなくなったと PHP が判断すると、デストラクターが呼び出されます。
関数の名前空間では、関数が返されたときにこれが発生します。
グローバル変数の場合、これはスクリプトの最後に発生します。
オブジェクトを明示的に破棄する場合は、オブジェクトを指す変数に他の値を割り当てることができます。通常は、変数を NULL に割り当てるか、unset を呼び出します。
6, __clone
PHP5 のオブジェクトの代入では参照代入が使用されます。オブジェクトをコピーしたい場合は、clone メソッドを使用する必要があります。このメソッドを呼び出すと、オブジェクトは自動的に __clone マジック メソッドを呼び出します。オブジェクトがコピーされると、初期化操作を実行する必要があります。 __clone メソッドで実装できます。
7. __toString
__toString メソッドは、オブジェクトを印刷するために echo を使用するときなど、オブジェクトを文字列に変換するときに自動的に呼び出されます。
クラスがこのメソッドを実装していない場合、オブジェクトはエコーを通じて出力できません。そうでない場合は、「キャッチ可能な致命的なエラー: クラス テストのオブジェクトを
This の文字列に変換できませんでした」と表示されます。メソッドは文字列を返す必要があります。
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
__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() マジック メソッドは、他のすべてのマジック メソッドと同様に、パブリックとして定義する必要があります。プログラミングについてさらに詳しく知りたい場合は、
以上がPHPでマジックメソッドを認識する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。