PHP には、バージョン 5.3 以降、__invoke と呼ばれる新しいマジック メソッドが追加されました。このメソッドを使用すると、インスタンスの作成後にオブジェクトを直接呼び出すことができます。次の例に示すように:
実行結果は次のとおりです:
phpの公式サンプルは以下の通りです:
添付ファイル: PHP のその他のマジック メソッドの詳細な説明:
PHP のクラスではマジック メソッドを使用できます。 2 つのアンダースコア (__) で始まるメソッドはマジック メソッドとして予約されると規定されているため、既存のマジック メソッドをオーバーロードする場合を除き、関数名を __ で始まらないことが推奨されます。
関数名 __construct、__destruct、__call、__callStatic、__get、__set、__isset、__unset、__sleep、__wakeup、__toString、__invoke、__set_state、__clone は PHP クラスでは魔法のようなものです。それらに関連付けられた機能性の魔法が欲しいです。
次の 2 つのメソッドは、クラスとその親クラスで宣言されていないプロパティ用に設計されています。
__get($property) このメソッドは、未定義のプロパティが呼び出されたときにトリガーされ、渡されるパラメーターはアクセスされるプロパティの名前です。
__set($property,$value) 未定義のプロパティに値を割り当てる場合、このメソッドがトリガーされ、渡されるパラメータは設定されるプロパティ名と値です。
ここでの非宣言には、オブジェクトを使用して呼び出されたときにアクセス制御が保護されプライベートである属性 (つまり、アクセス許可がない属性) が含まれます。
__get メソッドおよび __set メソッドと同様に、ここでの no 宣言には、オブジェクトを使用して呼び出すときにアクセス制御が保護されプライベートである属性 (つまり、アクセス許可がない属性) が含まれます。
ここでの未定義メソッドには、アクセス権限を持たないメソッドが含まれます。メソッドが存在しない場合は、親クラスに移動してメソッドを見つけます。親クラスに存在しない場合は、 の __call() メソッドを呼び出します。このクラスの場合 __call() メソッドがクラスに存在しない場合は、親クラスの __call() メソッドに移動します。
__autoload 関数。まだ定義されていないクラスを使用しようとすると自動的に呼び出されます。この関数を呼び出すことにより、スクリプト エンジンは、PHP がエラーで失敗する前に、必要なクラスをロードする最後のチャンスを得ることができます。
注: __autoload 関数でスローされた例外は、catch ステートメント ブロックではキャッチできず、致命的なエラーを引き起こすため、関数自体でキャッチする必要があります。
__construct コンストラクター メソッド、このメソッドは、オブジェクトの作成時に呼び出されます。php4 と比較して、このメソッドを使用する利点は、コンストラクター メソッドが、クラスの名前に関係なく、一意の名前を持つことができることです。このように、クラスの名前が使用されている場合は、コンストラクター メソッドの名前を変更する必要はありません。
__destruct デストラクター メソッド では、PHP はオブジェクトが破棄される前 (つまり、メモリからクリアされる前) にこのメソッドを呼び出します。デフォルトでは、PHP はオブジェクトのプロパティによって占有されているメモリのみを解放し、オブジェクト関連のリソースを破棄します。デストラクタを使用すると、オブジェクトの使用後に任意のコードを実行してメモリをクリアできます。スクリプトがオブジェクトに関連付けられなくなったと PHP が判断すると、デストラクターが呼び出されます。
関数の名前空間内では、関数が返されたときにこれが発生します。グローバル変数の場合、これはスクリプトの最後に行われます。オブジェクトを明示的に破棄する場合は、そのオブジェクトを指す変数に他の値を代入するか、通常はその変数を null に割り当てるか、unset を呼び出します。
php5 のオブジェクト割り当ては参照割り当てを使用します。オブジェクトをコピーする場合、このメソッドを呼び出すときにオブジェクトは自動的に __clone マジック メソッドを呼び出します。オブジェクトのメソッド実装を __clone できます。
__tostring メソッド は、echo を使用してオブジェクトを出力するときなど、オブジェクトを文字列に変換するときに自動的に呼び出されます。
php5.2.0 より前では、__tostring メソッドは echo() または print() と組み合わせて使用した場合にのみ有効でした。 php5.2.0 以降では、任意の文字列環境 (たとえば、%s 修飾子を使用した printf() 経由) で有効になりますが、非文字列環境 (%d 修飾子の使用など) では使用できません。 php5.2.0以降、__tostringメソッドを定義していないオブジェクトを文字列に変換すると、e_recoverable_errorエラーが報告されるようになりました。
__wakeup逆シリアル化中に呼び出されます
serialize() は、クラス内にマジック名 __sleep を持つ関数があるかどうかを確認します。その場合、関数はシリアル化の前に実行されます。これはオブジェクトをクリアし、シリアル化する必要があるオブジェクト内のすべての変数の名前を含む配列を返す必要があります。
__sleep を使用する目的は、オブジェクトが持つデータベース接続を閉じたり、保留中のデータを送信したり、同様のクリーンアップ タスクを実行したりすることです。さらに、この機能は、完全に保存する必要のない非常に大きなオブジェクトがある場合に便利です。
PHP 逆に、unserialize() はマジック名 __wakeup を持つ関数の存在をチェックします。この関数は、オブジェクトが持つ可能性のあるリソースが存在する場合、それを再構築できます。 __wakeup を使用する目的は、シリアル化中に失われた可能性のあるデータベース接続を再確立し、他の再初期化タスクを処理することです。
関数を呼び出してオブジェクトを呼び出そうとすると、__invoke メソッドが自動的に呼び出されます。
それは __call() マジック メソッドのように動作し、__callstatic() は静的メソッド呼び出しを処理します。
PHP は実際に __callstatic() メソッドの定義を厳格化しました。メソッドは public でなければならず、static として宣言する必要があります。同様に、__call() マジック メソッドは、他のすべてのマジック メソッドと同様に、パブリックとして定義する必要があります。
この迂回はオブジェクト指向におけるカプセル化の概念である安全のためであり、Public を直接設定すると、すべてのオブジェクトがこのプロパティの値を自由に設定できるため、タスクのロジック判断がなくなり、セキュリティが向上します。
多くの PHP プログラマーは、オブジェクトを処理する古い方法を知らないかもしれません。実際、ほとんどの PHP アプリケーションは問題なく動作します。または、最小限の変更のみが必要です。
プライベート メンバーと保護されたメンバー
PHP5 では、プライベート メンバー変数と保護されたメンバー変数の概念が導入されました。これを使用して、クラス メンバーの可視性を定義できます。
例
保護されたメンバーにはサブクラスからアクセスできますが、プライベート メンバーにはクラス自体からのみアクセスできます。
コード:---------------------------------------------- -- ----------------------------------
class MyClass {
private $Hello = " Hello, World!\n";
protected $Bar = "Hello, Foo!\n";
protected $Foo = "Hello, Bar!\n";
function printHello() {
print "MyClass: :printHello () " . $this->gt;Hello;
print "MyClass::printHello() " . $this->Bar;
print "MyClass::printHello() " . $this->Foo;
}
}
class MyClass2 extends MyClass {
protected $Foo;
function printHello() {
MyClass::printHello(); /* 出力する必要があります */
print "MyClass2::printHello() " . > /* 何も出力しません */
print "MyClass2::printHello() " . $this->Bar; /* 出力しません (宣言されていません) */
print "MyClass2:: printHello( ) " . $this->Foo; /* 出力する必要があります */
}
}
$obj = new MyClass();
print $obj->Hello; /* 何も出力しません * /
print $obj->Bar; /* 何も出力しません */
print $obj->Foo /* 残りのテキストを出力する必要があります>>