PHP5のトリックメソッド

WBOY
リリース: 2016-06-13 12:53:49
オリジナル
687 人が閲覧しました

PHP5 のマジック メソッド

PHP 5 以降のバージョンでは、PHP のクラスでマジック メソッドを使用できるようになります。 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() メソッドがこのクラスに存在しない場合は、親クラスの __call() メソッドに移動します。

4. __autoload

__autoload 関数。まだ定義されていないクラスを使用しようとすると自動的に呼び出されます。この関数を呼び出すことにより、スクリプト エンジンは、PHP がエラーで失敗する前に、必要なクラスをロードする最後のチャンスを得ることができます。

グローバル オートロード クラスを定義する場合は、 spl_autoload_register() メソッドを使用して、処理クラスを 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 コンストラクター、このメソッドはオブジェクトの作成時に呼び出されます。PHP4 と比較して、このメソッドを使用する利点は、クラスの名前に関係なく、コンストラクターに一意の名前を付けることができることです。ちなみに、クラスの名前を変更するときに、コンストラクターの名前を変更する必要はありません。

◆__destruct デストラクター メソッド、PHP はオブジェクトが破棄される前 (つまり、メモリからクリアされる前) にこのメソッドを呼び出します。デフォルトでは、PHP はオブジェクトのプロパティによって占有されているメモリのみを解放し、オブジェクト関連のリソースを破棄します。デストラクタを使用すると、オブジェクトの使用後に任意のコードを実行してメモリをクリアできます。スクリプトがオブジェクトに関連付けられなくなったと PHP が判断すると、デストラクターが呼び出されます。

関数の名前空間内では、関数が返されるときにこれが発生します。グローバル変数の場合、これはスクリプトの最後に行われます。オブジェクトを明示的に破棄したい場合は、そのオブジェクトを指す変数に他の値を割り当てることができます。通常は、変数に NULL を割り当てるか、unset を呼び出します。

6. __クローン

PHP 5 のオブジェクトの代入は参照代入を使用します。オブジェクトをコピーする場合は、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 (PHP 5.3.0 以降で有効)

関数を呼び出してオブジェクトを呼び出そうとすると、__invoke メソッドが自動的に呼び出されます。

11. __callStatic (PHP 5.3.0 以降で有効)

__call() マジック メソッドと同様に機能し、__callStatic() は静的メソッド呼び出しを処理します。

PHP は __callStatic() メソッドの定義を厳格化しています。メソッドは public でなければならず、static として宣言する必要があります。同様に、__call() マジック メソッドは、他のすべてのマジック メソッド

と同様に、パブリックとして定義する必要があります。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート