原创,转载请注明出处
在 PHP 中以两个下划线开头的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup(), __toString(), __set_state,() __clone() __autoload()等,被称为"魔术方法"(Magic methods)。注意:这些方法在类中定义
下面举一个例子:
class Magic { public $var = 'test'; private $msg;//详细信息 private $test ="测试私有属性"; //构造函数,在创建对象的时候被调用 function __construct() { echo '__construct called'.PHP_EOL; echo "构造函数,在创建对象的时候被调用"; } //析构函数,某个对象在被删除,或者被销毁,调用exit()后,脚本关闭时被调用 public function __destruct(){ echo "析构函数,某个对象在被删除,或者被销毁,调用exit()后,脚本关闭时被调用"; } //当给一个不可访问或者不存在的属赋值时候被调用 public function __set($name,$value){ echo "__set()当给一个不可访问或者不存在的属性赋值时候被调用,调用的属性为:".$name."要赋值为:".$value; } //读取不可访问或者不存在属性时被调用 public function __get($name){ return $this->test = "这个是私有属性不能访问赋值后的值"; echo "__get()读取不可访问或者不存在属性时被调用;要读取的属性为:".$name; } //调用不可访问或不存在的方法是被调用 public function __call($name,$arguments){ echo $name."--".implode(",",$arguments); $this->msg = "_call()方法,调用的方法名为:".$name."调用时候传递的参数是一个数组为".$arguments."调用不可访问或不存在的方法是被调用"; print_r($this->msg) ; } //调用不可访问或不存在的静态方法是被调用 static public function __callStatic($name,$arguments){ $this->msg = "__callStatic()调用名为:".$name."调用时候传递的参数为一个数组为:".$arguments."调用不可访问或不存在的静态方法是被调用"; print_r($this->msg); } //调用不可访问或者不存在的属性调用isset()或者empty()时被调用 public function __isset($name){ echo "__isset()调用不可访问或者不存在的属性调用isset()或者empty()时候被调用"; } } $obj = new Magic(); $obj->not_exist_property = test; //__set()被调echo $m->not_exist_property;//__get()被调用 $obj->not_exist_property; echo $obj->test;
__get,__set
1. 从一个难以访问的属性读取数据的时候 __get() 方法被调用
2. 向一个难以访问的属性赋值的时候 __set() 方法被调用
3. 难以访问包括:(1)私有属性,(2)没有初始化的属性
4. __isset() __unset() 也类似
__call,__callStatic
__call调用不可访问或不存在的方法时被调用
__callStatic调用不可访问或不存在的静态方法时被调用
__construct,__destruct
__constuct构建对象的时被调用;
__destruct明确销毁对象或脚本结束时被调用;