zoukankan      html  css  js  c++  java
  • PHP类的魔术方法详解

    构造方法和析构方法(__construct、__destruct

    __construct 在类实例化的时候会调用。
    __destruct 对象被手动销毁或垃圾回收机制收回前会被调用。
    unset() ,对象=null


    属性重载(__set、__get、__isset、__unset

    public __set ( string $name , mixed $value ) : void
    public __get ( string $name ) : mixed
    public __isset ( string $name ) : bool
    public __unset ( string $name ) : void
    

    在给不可访问或不存在属性赋值时,__set 会被调用。
    读取不可访问或不存在属性的值时,__get 会被调用。
    当对不可访问或不存在属性调用 isset() 或 empty() 时,__isset 会被调用。
    当对不可访问或不存在属性调用 unset() 时,__unset 会被调用。
    参数中 name 是调用的属性名,value 是给属性指定的值。


    方法重载(__call、__callStatic

    public __call ( string $name , array $arguments ) : mixed
    public static __callStatic ( string $name , array $arguments ) : mixed
    

    在对象中调用一个不可访问或不存在方法时,__call() 会被调用。
    在类中调用一个不可访问或不存在的静态方法时,__callStatic 会被调用。
    参数中 name 是调用的方法名,arguments 是传递给方法的参数,一个索引数组。


    __toString

    public __toString ( void ) : string
    

    一个类被当成字符串时应怎样回应。例如 echo 或print 应该显示些什么。
    此方法必须返回一个字符串,否则会发出一条 E_RECOVERABLE_ERROR 级别的致命错误。


    __invoke

    __invoke ([ $... ] ) : mixed
    

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


    __sleep__wakeup

    public __sleep ( void ) : array
    public __wakeup ( void ) : void
    

    对一个对象进行序列化serialize()操作时, __sleep会被调用,返回一个包含对象希望被序列化的属性名的数组。
    对象被序列化,即睡觉sleep前的操作,常用于清理数据。
    对应的,一个对象醒来unserialize()时会自动调用__wakeup,用于重新做些初始化工作。
    一个典型应用是,数据库连接对象的序列化,醒来时需要重新connect,如下面的例子。

    <?php
    class Connection
    {
        protected $link;
        private $dsn, $username, $password;
    
        public function __construct($dsn, $username, $password)
        {
            $this->dsn = $dsn;
            $this->username = $username;
            $this->password = $password;
            $this->connect();
        }
    
        private function connect()
        {
            $this->link = new PDO($this->dsn, $this->username, $this->password);
        }
    
        public function __sleep()
        {
            return array('dsn', 'username', 'password');
        }
    
        public function __wakeup()
        {
            $this->connect();
        }
    }?>
    

    __serialize__unserialize


    public __serialize ( void ) : array
    public __unserialize ( array $data ) : void
    

    PHP 7.4.0.新增加的特性,作用跟sleep和wakeup差不多,但优先级更高,且参数和返回值稍有差异,__serialize是返回一个键值对的关联数组,此数组将作为参数 data 传递给__unserialize
    示例如下:

    <?php
    class Connection
    {
        protected $link;
        private $dsn, $username, $password;
    
        public function __construct($dsn, $username, $password)
        {
            $this->dsn = $dsn;
            $this->username = $username;
            $this->password = $password;
            $this->connect();
        }
    
        private function connect()
        {
            $this->link = new PDO($this->dsn, $this->username, $this->password);
        }
    
        public function __serialize(): array
        {
            return [
              'dsn' => $this->dsn,
              'user' => $this->username,
              'pass' => $this->password,
            ];
        }
    
        public function __unserialize(array $data): void
        {
            $this->dsn = $data['dsn'];
            $this->username = $data['user'];
            $this->password = $data['pass'];
    
            $this->connect();
        }
    }?>
    

    __set_state


    static __set_state ( array $properties ) : object
    

    自 PHP 5.1.0 起,当调用 var_export() 导出类时,此静态方法会被自动调用。
    本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性。
    关于这个方法,有很多困惑,下面提供几个链接,可以参看。

    class Dummy {
      private $value1_;
      private $value2_;
    
      function __construct() {
        $this->value1_ = 100;
        $this->value2_ = "100";
      }
    }
    $aDummy = new Dummy();
    var_export($aDummy);
    

    输出

    Dummy::__set_state(array( 'value1_' => 100, 'value2_' => '100', ))
    

    加上state方法后

    class Dummy {
      private $value1_;
      private $value2_;
    
      function __construct() {
        $this->value1_ = 100;
        $this->value2_ = "100";
      }
    
      static function __set_state(array $array) {
        foreach($array as $k => $v) {
          echo("$k ==> $v <br/>");
        }
      }
    }
    

    输出为

    value1_ ==> 100
    value2_ ==> 100
    

    __clone


    __clone ( void ) : void
    

    当对象复制完成时调用


    __debugInfo


    __debugInfo ( void ) : array
    

    打印所需调试信息,当用 var_dump() 打印一个对象时,此方法会被调用。


    参看

  • 相关阅读:
    JavaScript学习笔记--this全面解析
    CSS3学习笔记--animation和transition
    HTML5学习笔记--HTML5新增的常用标签
    布局学习笔记--flex布局
    布局学习笔记--rem布局
    HTML5学习笔记--Canvas
    react-pdf插件实现pdf预览功能
    postman基础使用——调试接口
    react 实现复制copy文本内容
    react 移动端签名实现
  • 原文地址:https://www.cnblogs.com/jiaoran/p/12641351.html
Copyright © 2011-2022 走看看