魔术方法及魔术常量详解
魔术方法
魔术方法中充当了举足轻重的作用,大部分魔术方法起着报错补救措施的作用
-
__construct()
类的构造函数,在类实例化前调用
-
__destruct()
类的析构函数,在类对象销毁时调用
-
__callStatic($method,$arg)
当调用一个没有在类中声明的方法时,可以调用__call()方法代替声明一个方法。接受方法名和数组作为参数。
public static function __callStatic($method,$arr) { echo "不存在静态方法".$method."你还传参"; print_r($arr); }
-
__call($method,$arg)
当调用一个没有在类中声明的方法时触发
public function __call($method,$agr){ echo "不存在成员方法".$method."你还传参"; print_r($agr); }
-
__get($name)
尝试获取一个没有权限的成员属性,或不存在的成员属性时调用
public function __get($name) { echo $name."属性值获取".$this->age; //age为private }
-
__set($name,$value)
尝试设置一个没有权限的成员属性,或不存在的成员属性时调用
public function __set($name,$value) { $this->$name=$value; }
-
__isset($property_name)
用于检测私有属性值是否被设定;如果对象里面成员是公有的,可以直接使用 isset() 函数。如果是私有的成员属性,那就需要在类里面加上一个 __isset() 方法
private function __isset($property_name) { return isset($this->$property_name); }
-
__unset($property_name)
方法用于删除私有属性;同 isset() 函数一样,unset() 函数只能删除对象的公有成员属性,当要删除对象内部的私有成员属性时,需要使用__unset() 方法
private function __unset($property_name) { unset($this->$property_name); }
-
__sleep()
执行serialize()时,先会调用这个函数
public function __sleep() { echo "当在类外部使用serialize()时会调用这里的__sleep()方法<br>"; $this->name = base64_encode($this->name); return array('name', 'age'); // 这里必须返回一个数值,里边的元素表示返回的属性名称 }
-
__wakeup()
执行unserialize()时,先会调用这个函数
public function __wakeup() { echo '反序列化时调用'; }
-
__toString()
当我们尝试将一个对象或者数组当成字符串输出时调用
function __tostring(){//在类中定义一个__toString方法 return "Hello,".$this->name."!<br/>"; }
-
__invoke($x)
当尝试以调用函数的方式调用一个对象时,该方法会被自动调用
public function __invoke($param1, $param2) { var_dump($param1,$param2); }
-
__set_state($array)
当调用 var_export() 导出类时,此静态 方法会被调用
class A { public $var1; public $var2; public static function __set_state($an_array) // As of PHP 5.1.0 { $obj = new A; $obj->var1 = $an_array['var1']; $obj->var2 = $an_array['var2']; return $obj; } } $a = new A; $a->var1 = 5; $a->var2 = 'foo'; eval('$b = ' . var_export($a, true) . ';');//调用__set_state $b成为一个新的A的对象; var_dump($b);
-
__clone()
当对象复制完成时调用
public function __clone() { #复制方法,可在里面定义再clone是进行的操作 $this->id = 0; $this->account = clone $this->account; #不加这一句,account在clone是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改 } $person2 = clone $person;
-
__autoload()
尝试加载未定义的类
public function __autoload($classname) { include_once($classname.'.php'); }
-
__debugInfo()
打印所需调试信息;由var_dump()、print_r()打印对象体的时候,控制对象体要输出的属性和值
public function __debugInfo() { //使用数组来返回需要打印的属性和值; return []; }
魔术常量
-
__LINE__
文件中的当前行号 -
__FILE__
文件的完整路径和文件名 -
__DIR__
文件所在的目录 -
__FUNCTION__
函数名称 -
__CLASS__
类名 -
TRAIT
实现了代码复用的一个方法 -
__METHOD__
类的方法名 -
__NAMESPACE__
当前命名空间的名称