ホームページ >バックエンド開発 >PHPチュートリアル >php_PHP チュートリアルのマジック メソッドに関する研究メモ
php5 ではマジック メソッドは __ で始まり、マジック関数があり、開発に多くのメリットをもたらします。ここで、マジック メソッドの使用法と、php にどのようなマジック メソッドがあるかを紹介します。
マジックメソッドは2つのアンダースコア「__」で始まり、PHPの「糖衣構文」とみなすことができる特別な機能を持つメソッドです。
構文シュガーとは、コンピューター言語に新しい機能を追加するのではなく、人間にとって単に「甘い」構文を指します。構文シュガーは多くの場合、より実践的なプログラミング方法やいくつかのスキルの使用をプログラマーに提供します。これは、より良いコーディング スタイルに有益であり、コードをより読みやすくします。しかし、それは言語に何も新しいものを追加しません。 php の参照、SPL などはすべて糖衣構文です。
コードは次のとおりです | コードをコピー |
$tom = 新しい家族($student,'北京'); |
上記のファミリー クラスの構築メソッドは標準のマジック メソッドです。この魔法の方法は構築方法とも呼ばれます。コンストラクター メソッドがある場合、対応する Xigou メソッド、つまり destruct メソッドが存在します。Xigou メソッドは、オブジェクトへの参照がすべて削除されるか、オブジェクトが明示的に破棄されるときに実行されます。これら 2 つの方法は、最も一般的で最も人気のある魔法の方法です。
1、__get、__set
これら 2 つのメソッドは、クラスとその親クラスで宣言されていないプロパティ用に設計されています。
◆__get( $property ) このメソッドは、未定義のプロパティが呼び出されたときにトリガーされ、渡されるパラメータはアクセスされるプロパティの名前です。
◆__set($property, $value) 未定義のプロパティに値を割り当てる場合、このメソッドがトリガーされ、渡されるパラメータは設定するプロパティ名と値です。
ここでの非宣言には、オブジェクトを使用して呼び出されたときにアクセス制御が保護されプライベートである属性(つまり、アクセス権限を持たない属性)が含まれます。
2. __isset、__unset
◆__isset( $property ) このメソッドは、未定義のプロパティに対して isset() 関数が呼び出されたときに呼び出されます。
◆__unset( $property ) このメソッドは、未定義のプロパティに対して unset() 関数が呼び出されたときに呼び出されます。
ここでの未宣言には、__getメソッドや__setメソッドと同様に、オブジェクトを使って呼び出した場合にアクセス制御が保護されプライベートになっている属性(つまり、アクセス権限を持たない属性)が含まれます。
3.__電話
__call( $method, $arg_array ) このメソッドは、未定義のメソッドを呼び出すときに呼び出されます。
ここでの未定義のメソッドには、アクセス権限を持たないメソッドも含まれます。メソッドが存在しない場合は、親クラスに移動してメソッドを見つけます。親クラスに存在しない場合は、このメソッドの __call() メソッドを呼び出します。このメソッドがクラスに存在しない場合は、親クラスの __call() メソッドに移動します。
4.__オートロード
まだ定義されていないクラスを使用しようとしたときに自動的に呼び出される__autoload関数。この関数を呼び出すことにより、スクリプト エンジンは、PHP がエラーで失敗する前に、必要なクラスをロードする最後のチャンスを得ることができます。
グローバル オートロード クラスを定義したい場合は、 spl_autoload_register() メソッドを使用して、処理クラスを PHP 標準ライブラリに登録する必要があります。
コードは次のとおりです | コードをコピー |
クラスローダー 注: __autoload 関数でスローされた例外は、catch ステートメント ブロックではキャッチできず、致命的なエラーの原因となるため、関数自体でキャッチする必要があります。 5. __construct、__destruct ◆__construct コンストラクター、このメソッドはオブジェクトの作成時に呼び出されます。PHP4 と比較して、このメソッドを使用する利点は、クラスの名前に関係なく、コンストラクターに一意の名前を付けることができることです。クラスを変更しているので、コンストラクターの名前を変更する必要はありません。 ◆__destruct デストラクター メソッドでは、PHP はオブジェクトが破棄される前 (つまり、メモリからクリアされる前) にこのメソッドを呼び出します。デフォルトでは、PHP はオブジェクトのプロパティによって占有されているメモリのみを解放し、オブジェクト関連のリソースを破棄します。デストラクタを使用すると、オブジェクトの使用後に任意のコードを実行してメモリをクリアできます。スクリプトがオブジェクトに関連付けられなくなったと PHP が判断すると、デストラクターが呼び出されます。 関数の名前空間内では、関数が返されたときにこれが発生します。グローバル変数の場合、これはスクリプトの最後に行われます。オブジェクトを明示的に破棄したい場合は、そのオブジェクトを指す変数に他の値を割り当てることができます。通常は、変数に NULL を割り当てるか、unset を呼び出します。 6.__クローン PHP 5 のオブジェクト割り当ては参照割り当てを使用します。オブジェクトをコピーする場合は、このメソッドを呼び出すときにオブジェクトが自動的に __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 (PHP 5.3.0以降で有効) 関数を呼び出してオブジェクトを呼び出そうとすると、__invokeメソッドが自動的に呼び出されます。 11. __callStatic (PHP 5.3.0以降で有効) __call() マジックメソッドと同様に動作し、__callStatic() は静的メソッド呼び出しを処理します。 PHP は __callStatic() メソッドの定義を厳格化しています。このメソッドは public でなければならず、static として宣言する必要があります。同様に、__call() マジック メソッドは、他のすべてのマジック メソッドと同様に、パブリックとして定義する必要があります |