24:PHP魔术方法

魔术方法

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()等方法在 PHP 中被称为"魔术方法"(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

 

__construct(): 构造方法 ,new 实例时 , 自动调用

__destruct(): 析构方法 , 对象销毁时自动调用

__get( 属性名 ): 当读取对象的一个不可见属性时 , 自动调用 , 并返回值

__set( 属性名 , 属性值 ): 当对一个不可见的属性赋值时 , 自动调用

__isset( 属性名 ): 当用 isset, 或 empty 判断一个不可见属性时 , 自动调用

__unset( 属性名 ): 当 unset 一个不可见属性时 , 自动调用

__call( 参数 1, 参数 2) : 当调用一个不可见的方法时 , 自动调用

Caution

PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。

php魔术方法

__sleep() 和 __wakeup()

public array __sleep ( void )

void __wakeup ( void )

 

serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。

 

Note:

__sleep() 不能返回父类的私有成员的名字。这样做会产生一个 E_NOTICE 级别的错误。可以用 Serializable 接口来替代。

__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。

与之相反, unserialize() 会检查是否存在一个 __wakeup()方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。

__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

  1. <?php
  2.  class  Connection
  3.  {
  4.     protected  $link ;
  5.     private  $server ,  $username ,  $password ,  $db ;
  6.     public function  __construct ( $server ,  $username ,  $password ,  $db )
  7.     {
  8.          $this -> server  =  $server ;
  9.          $this -> username  =  $username ;
  10.          $this -> password  =  $password ;
  11.          $this -> db  =  $db ;
  12.          $this -> connect ();
  13.     }
  14.     private function  connect ()
  15.     {
  16.          $this -> link  =  mysql_connect ( $this -> server ,  $this -> username ,  $this -> password );
  17.          mysql_select_db ( $this -> db ,  $this -> link );
  18.     }
  19.     public function  __sleep ()
  20.     {
  21.         return array( 'server' ,  'username' ,  'password' ,  'db' );
  22.     }
  23.     public function  __wakeup ()
  24.     {
  25.          $this -> connect ();
  26.     }
  27. }

 

__toString()

public string __toString ( void )

__toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。

  1. <?php
  2.  class  TestClass
  3.  {
  4.     public  $foo ;
  5.     public function  __construct ( $foo )
  6.     {
  7.          $this -> foo  =  $foo ;
  8.     }
  9.     public function  __toString () {
  10.         return  $this -> foo ;
  11.     }
  12. }
  13. $class  = new  TestClass ( 'Hello' );
  14. echo  $class ; //Hello

 

__invoke()

mixed __invoke ([ $... ] )

当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

  1. <?php
  2.  class  CallableClass
  3.  {
  4.     function  __invoke ( $x ) {
  5.          var_dump ( $x );
  6.     }
  7. }
  8.  $obj  = new  CallableClass ;
  9.  $obj ( 5 );
  10.  var_dump ( is_callable ( $obj )); //int(5) bool(true)

 

__set_state()

static object __set_state ( array $properties )

自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。

本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性。

  1. <?php
  2. class  A
  3.  {
  4.     public  $var1 ;
  5.     public  $var2 ;
  6.     public static function  __set_state ( $an_array )  // As of PHP 5.1.0
  7.      {
  8.          $obj  = new  A ;
  9.          $obj -> var1  =  $an_array [ 'var1' ];
  10.          $obj -> var2  =  $an_array [ 'var2' ];
  11.         return  $obj ;
  12.     }
  13. }
  14. $a  = new  A ;
  15.  $a -> var1  =  5 ;
  16.  $a -> var2  =  'foo' ;
  17. eval( '$b = '  .  var_export ( $a ,  true ) .  ';' );  // $b = A::__set_state(array(
  18.                                             //    'var1' => 5,
  19.                                             //    'var2' => 'foo',
  20.                                             // ));
  21.  var_dump ( $b );
  22. /**
  23.  以上例程会输出:
  24.   object(A)#2 (2) {
  25.   ["var1"]=>
  26.   int(5)
  27.   ["var2"]=>
  28.   string(3) "foo"
  29. }
  30. **/

 

__debugInfo()

array __debugInfo ( void )

这种方法被称为var_dump()当倾销对象得到应显示的属性。如果方法没有在对象上定义,那么所有公共的、受保护的和私有的属性都将显示出来.。

这个功能是在PHP 5.6.0添加。

  1. <?php
  2.  class  C  {
  3.     private  $prop ;
  4.     public function  __construct ( $val ) {
  5.          $this -> prop  =  $val ;
  6.     }
  7.     public function  __debugInfo () {
  8.         return [
  9.              'propSquared'  =>  $this -> prop  **  2 ,
  10.         ];
  11.     }
  12. }
  13. var_dump (new  C ( 42 ));
  14.  /**
  15.  以上例程会输出:
  16.   object(C)#1 (1) {
  17.   ["propSquared"]=>
  18.   int(1764)
  19. }
  20. **/
    A+
发布日期:2017年01月04日 20:05:13  所属分类:PHP教程
最后更新时间:2017-01-04 20:05:13
评分: (当前没有评级)
付杰
SEO顾问服务 中小型网站 单站/最低99.9元 全方位优化
SEO顾问服务 中小型网站 单站/最低99.9元 全方位优化
  • ¥ 99.9元
  • 市场价:5000元
PHP运行环境 Wamp Lamp Lnmp 安装、配置、搭建服务
PHP运行环境 Wamp Lamp Lnmp 安装、配置、搭建服务
  • ¥ 9.9元
  • 市场价:49.9元
服务器管理面板/主机控制面板“安装”服务
服务器管理面板/主机控制面板“安装”服务
  • ¥ 9.9元
  • 市场价:49.9元
wordpress站群服务 泛解析二级域名站群 二级目录站群
wordpress站群服务 泛解析二级域名站群 二级目录站群
  • ¥ 1999.9元
  • 市场价:4800元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

 

目前评论:1   其中:访客  1   博主  0

  1. 召唤师 1

    仔细一看,魔术方法还是很多的!