ホームページ  >  記事  >  バックエンド開発  >  PHP におけるマジック メソッドの定義と使用

PHP におけるマジック メソッドの定義と使用

墨辰丷
墨辰丷オリジナル
2018-06-11 09:40:391645ブラウズ

この記事では、主に PHP におけるマジック メソッドの定義と使用方法を紹介します。マジック メソッドは特定の状況下でトリガーされ、フックについてはすべて理解できます。困っている友達は参照してください。

マジック メソッドは、PHP オブジェクト指向のユニークな機能です。これらは特定の状況でトリガーされ、すべて二重アンダースコアで始まります。パターン メソッドを使用すると、PHP オブジェクト指向でオーバーロードを簡単に実装できます (オーバーロードとは、クラスの属性とメソッドを動的に作成することを意味します)。多くのマジック メソッドはペアで表示されます。以下に、PHP の現在のパターン メソッドをすべてリストします。

1.__construct、__destruct

__construct は、オブジェクトの構築時に呼び出されます。
__destruct は、オブジェクトが明示的に破棄されるか、スクリプトが終了するときに呼び出されます。

#2.__get, __set

set は、アクセスできない属性または存在しない属性に値を割り当てるときに呼び出されます。


get は、アクセスできない属性または存在しない属性を読み取るときに呼び出されます。アクセスできないプロパティまたは存在しないプロパティに対して isset() または empty() が呼び出された場合、attribute

3.__isset、__unset

__isset が呼び出されます。アクセスできない、または存在しないプロパティで呼び出されます。 属性が設定されていない場合に呼び出されます。

#4.__call、__callStatic

#__call は、アクセスできないプロパティまたは存在しないプロパティを呼び出すときに呼び出されます。存在しないメソッド

#callStatic は、アクセスできないか存在しない場合に呼び出されます。 既存の静的メソッドは


5.__sleep、__wakeup

__sleep と呼ばれます。シリアル化を使用する場合。これは、大きなオブジェクトのすべてのデータを保存する必要がない場合に非常に便利です。アンシリアル化を使用すると、wakeup が呼び出され、オブジェクトの初期化に使用できます。 6.__clone


オブジェクトの複製時に呼び出され、オブジェクトの複製動作を調整するために使用されます

7.__toString

次のときに呼び出されます。クラスは文字列に変換されます

8.__invoke

オブジェクトが機能的に呼び出されるときに呼び出されます

9.__set_state

この静的メソッドは、クラスをエクスポートするために var_export() が呼び出されるときに呼び出されます。 __set_state の戻り値を var_export の戻り値として使用します。

10.__debuginfo

オブジェクトを出力するために var_dump() が呼び出されるときに呼び出されます (すべての属性を出力したくない場合) PHP5.6 バージョンに適用されます

PHP マジック メソッドの使用例は次のとおりです:

<?php
 
class Magic
{
  public $var = &#39;test&#39;;
 
  //构造函数,在创建对象的时候调用
  public function __construct()
  {
    echo &#39;__construct called&#39;.PHP_EOL;
  }
 
  //某个对象的引用都被删除、对象被销毁、调用exit()后、脚本关闭时被调用
  public function __destruct()
  {
    echo &#39;__destruct called&#39;.PHP_EOL;
  }
 
  //当给不可访问或不存在属性赋值时被调用
  public function __set($name, $value)
  {
    echo $name.&#39;-&#39;.$value;
    echo &#39;__set called&#39;.PHP_EOL;
  }
 
  //读取不可访问或不存在属性时被调用
  public function __get($name)
  {
    echo $name;
    echo &#39;__get called&#39;.PHP_EOL;
  }
 
  //调用不可访问或不存在的方法时被调用
  public function __call($name, $arguments)
  {
    echo $name . &#39;-&#39; . implode(&#39;,&#39;, $arguments);
    echo &#39;__call called&#39;.PHP_EOL;
  }
 
  //调用不可访问或不存在的静态方法时被调用
  public static function __callStatic($name, $arguments)
  {
    echo $name . &#39;-&#39; . implode(&#39;,&#39;, $arguments);
    echo &#39;__callStatic called&#39;.PHP_EOL;
  }
 
  //对不可访问或不存在的属性调用isset()或empty()时被调用
  public function __isset($name)
  {
    echo $name;
    echo &#39;__isset called&#39;.PHP_EOL;
    return true;
  }
 
  //对不可访问或不存在的属性进行unset时被调用
  public function __unset($name)
  {
    echo $name;
    echo &#39;__unset called&#39;.PHP_EOL;
  }
 
  //serialize时被调用,当你不需要保存大对象的所有数据时很有用
  public function __sleep()
  {
    echo &#39;__sleep called&#39;.PHP_EOL;
    return array(&#39;var1111111111&#39;);
  }
 
  //unserialize时被调用,可用于做些对象的初始化操作
  public function __wakeup()
  {
    echo &#39;__wakeup called&#39;.PHP_EOL;
    $this->var = &#39;test after wakeup&#39;;
  }
 
  //当一个类被转换成字符串时被调用
  public function __toString()
  {
    return &#39;__toString called&#39;.PHP_EOL;
  }
 
  //进行对象clone时被调用,用来调整对象的克隆行为
  public function __clone()
  {
    echo &#39;__clone called&#39;.PHP_EOL;
  }
 
  //当以函数方式调用对象时被调用
  public function __invoke()
  {
    echo &#39;__invoke called&#39;.PHP_EOL;
  }
 
  //当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。
  public static function __set_state($arr)
  {
    return &#39;__set_state called&#39;.PHP_EOL;
  }
 
  //当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本
  public function __debuginfo($arr)
  {
    echo &#39;__debuginfo called&#39;.PHP_EOL;
    return array(
      &#39;var&#39; => &#39;test fro __debuginfo&#39;
    );
  }
}
 
$m = new Magic(); //__construct()被调用
$m->not_exist_property = test; //__set()被调用
echo $m->not_exist_property;//__get()被调用
$m->abc(1,2,3); //__call()被调用
echo isset($m->not_exist_property); //__isset()被调用,返回bool值
unset($m->not_exist_property); //__unset()被调用
echo $tmp = serialize($m); //__sleep()被调用
unserialize($tmp); //__wakeup()被调用
$m1 = clone $m; //__clone()被调用,对象默认是引用传递,使用clone关键词则可实现对象复制
$m(); //__invoke()
eval( &#39;$m2 = &#39; . var_export ( $m , true ) . &#39;;&#39; );var_dump($m2);
var_dump($m);
//最后__destruct()被调用
 
/*
结果:
__construct called
not_exist_property-test__set called
not_exist_property__get called
abc-1,2,3__call called
not_exist_property__isset called
1not_exist_property__unset called
__sleep called
O:5:"Magic":1:{s:13:"var1111111111";N;}__wakeup called
__destruct called
__clone called
__invoke called
string(20) "__set_state called
"
class Magic#1 (1) {
 public $var =>
 string(4) "test"
}
__destruct called
__destruct called
 
 
*/

概要

: 上記がこの記事の全内容です。皆様の学習に役立つことを願っています。

関連する推奨事項:

PHP は単純な GET、POST、Cookie、セッション、その他の関数を実装します

phpデータベースを操作してテーブルが存在するかどうかを確認する方法

phpでファイルのMIMEタイプを取得する方法

以上がPHP におけるマジック メソッドの定義と使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。