PHP魔术方法

概念

  1. 魔术方法,PHP将所有以两个下划线开头的类方法保留为魔术方法(魔术方法即为一个特殊的类方法)
  2. 魔术常量,PHP向他运行的任何脚本提供了大量的预定义变量

__wakeup()

  1. __wakeup(),执行unserialize()时,会先调用这个函数

  2. 当在类的外部调用unserialize()时,会先检查在类的内部是否存在一个__wakeup()方法,如果存在,则会先调用__wakeup方法,预先准备对象需要的资源

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

    public funcion __wakeup(){
    	$this -> connect();
    }

__sleep()

  1. 当对一个对象序列化时,php就会调用__sleep()方法 (如果存在的话)

  2. 和__wakeup()相对,一正一反,__sleep是序列化时自动调用,__wakeup是在反序列化时自动调用

  3. __sleep方法可以用于清理对象,并且返回一个包含对象中所有变量名称的数组,常用于提交未提交的数据,或类似的清理操作

    public funcion __sleep(){
    	return array('server','username','password','db');
    }

__construct()

  1. __construct()函数用于创建一个新的simpleXMLelement对象

  2. __construct():构造方法,在类的实例化的时候,会自动调用该魔术方法,进行类的实例化

  3. 子类继承父类时__construct()的用法

    1. 自己没有,会自动去父类中找
    2. 自己有,自己初始化时会触发自己的__construct方法进行初始化操作
    3. 如果有,还想调用父类中的__construct()方法,语法: parent::__construct
  4. __construct和__destruct相对,__construct构建对象的时候被调用,__destruct明确销毁对象或脚本结束时被调用

invoke()

  1. 当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用,但是如果没有显式地在实例化对象的后面加上参数的话就不会自动调用,类似于

  2. 即在实例化后的类中直接写参数,即为调用函数的方式调用一个对象

    class abc{
    	public function __invoke($x){
    		var_dump($x);
    	}
    }
    $obj = new abc;
    $obj(10);  // 即在实例化后的对象中直接加参数,会默认调用类中的__invoke()
    /*
    将会输出int 10
    */