この記事では、PHP で一般的に使用されるマジック メソッドを詳細に整理してまとめ、参考として共有します。具体的な内容は次のとおりです
1. PHP では、「__」で始まるすべてのメソッドがマジック メソッドとして扱われるため、カスタマイズされたメソッドはすべてマジック メソッドとして扱われます。メソッドを「__」で始めることはできません。PHP が提供するオーバーロードとは、属性またはメソッドを動的に作成することを指します。オーバーロードは魔法の方法によって実現されます。これらのマジック メソッドのパラメータを渡すことはできません。__get()、__set()、__isset()、__unset() はクラス属性のオーバーロードを実装します。
2. クラス内のアクセスできない属性にアクセスする場合、__get() メソッドが呼び出されます。
3. クラス内のアクセスできない属性にアクセスする場合、さまざまな状況に応じて __get()、__set()、__isset(() が呼び出されます。 )、__unset()。関数 isset() または empty() を使用して属性にアクセスすると、__isset() メソッドが呼び出されます。 unset() 関数を使用すると、__unset() メソッドが呼び出されます。
4. これら 4 つのメソッドは static キーワードを使用して定義できません。php5.3.0 以降、これら 4 つのメソッドを静的メソッドを使用して定義すると、警告レベルの警告が発生します。
5. アクセスできない属性とは: (1) クラス内にない属性、(2) プライベート変数はクラス外でアクセスされます。メソッドのオーバーロードは __call() と __callstatic() によって実装されます。この 2 つの違いは、コンテキストが静的メソッドであるかどうかです。後者は、アクセスできない静的メソッドが呼び出されたときに呼び出されます。 __callstatic()はphp5.3.0で追加されました。
6. __sleep() と __wakeup()
serialize() シリアル化するときは、まず __sleep() 関数が存在するかどうかを確認し、存在する場合は __sleep() を呼び出して、すべての変数名を含む配列を返します。メソッドは何も返さず、null がシリアル化され、通知レベルのエラーが生成されます。
__wakeup() メソッドは __sleep() の反対で、unserialize() が呼び出されたときに呼び出されます。
7. __toString() を使用すると、php5.2.0 より前では、このメソッドのみが文字列に変換する方法を決定できます。 echo と組み合わせた場合 または、print メソッドが有効になります。php5.2.0 以降は、printf() と組み合わせて変更できますが、変更中に %d などの非文字修飾子は使用できません。
8. __invoke()、関数を呼び出してオブジェクトを呼び出そうとすると、この関数は php5.3 以降でのみ有効になります。
9. __set_state() 静的メソッド。この静的メソッドは、php5.1.0 以降で有効になります。唯一のパラメータは配列を受け取ることです。
10. __construct() と __destruct()、コンストラクターとデストラクター コンストラクターは主に、オブジェクトへの参照がすべて削除された後、またはオブジェクトが明示的に破棄されたときに実行されます。デストラクターで例外をスローすることはできません。そうしないと、スクリプトの最後でデストラクターが呼び出されます。 __clone()、オブジェクトのコピー。 , このメソッドは直接呼び出すことはできません 直接呼び出すには、clone キーワードを介して呼び出しを表示する必要があります
コード:
//实例化对象时,会调用对象的__construct方法 $obj = new Object(); //给对象不存在的属性赋值时,会调用对象的__set方法 $obj->title = "hello"; //使用对象不存在的属性时,会调用对象的__get方法 echo $obj->title; //调用对象不存在的方法时,会调用对象的__call方法 $obj->test("hello",123,567); //调用不存在的类静态方法时,会调用类的__callStatic方法 Object::staticMethod("static","not found method"); //直接输出对象时,会调用对象的__toString方法 echo $obj; //将一个对象当作函数一样使用时,会调用对象的__invoke方法 echo $obj("test"); //克隆对象时,会调用对象的__clone方法 $obj2 = clone $obj; //判断对象属性是否存在时,会调用对象的__isset方法 var_dump(isset($obj->aaa)); //销毁对象属性时,会调用对象的__unset方法 unset($obj->aaa); class Object{ protected $array = array(); function __construct() { echo __METHOD__."你正在实例化对象<br>"; } function __set($name, $value) { $this->array[$name]=$value; } function __get($name) { return $this->array[$name]; } function __call($name, $arguments) { var_dump($name,$arguments); return "magic function\n"; } static function __callStatic($name, $arguments) { var_dump($name,$arguments); return "magic static function"; } function __toString() { return __CLASS__.'<br>'; } function __invoke($arguments) { var_dump($arguments); return __METHOD__.'<br>'; } function __clone() { echo __METHOD__."你正在克隆对象<br>"; } function __isset($name) { echo __METHOD__."你想判断有没有属性".$name."<br>"; return 1; } function __unset($name) { echo __METHOD__."你想删除属性".$name."<br>"; } function __destruct() { echo __METHOD__."你正在注销对象<br>"; } }
上記はすべて、php の一般的なマジック メソッドについてです。皆さんの学習に役立つことを願っています。
上記では、PHP で一般的に使用されるマジック メソッドの概要を、関連コンテンツも含めて紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。