魔术方法是php中预定义的具有特殊用途的函数(在一定条件下会被触发),是一种语法转换的约定。
魔术方法都是由双下划线开始的。
__construct(),类的构造函数
- 作用:初始化类的对象
- 调用:创建类的对象时被调用
- 参数:自定义
__destruct(),类的析构函数
- 作用:销毁类的对象
- 调用:当指向类的对象的所有引用都无效时满足被调用条件,等待php解析器的调用
- 参数:对象名
<?php
/**
* 清晰的认识__construct() __destruct
*/
class Example {
public static $link;
//在类实例化的时候自动加载__construct这个方法
public function __construct($localhost, $username, $password, $db) {
self::$link = mysql_connect($localhost, $username, $password);
if (mysql_errno()) {
die('错误:' . mysql_error());
}
mysql_set_charset('utf8');
mysql_select_db($db);
}
/**
* 通过__construct链接好数据库然后执行sql语句......
*/
//当类需要被删除或者销毁这个类的时候自动加载__destruct这个方法
public function __destruct() {
echo '<pre>';
var_dump(self::$link);
mysql_close(self::$link);
var_dump(self::$link);
}
}
$mysql = new Example('localhost', 'root', 'root', 'test');
?>
__call(),当调用类实例中不存在的函数时自动执行
- 如果试图调用类中不存在的函数,会出现语法错误,为了能够友好的提示
Function __call($funName,$argv)
{
Echo "名为".$funName."参数为".printf($argv)."的函数不存在",
}
__callStatic(),当调用类实例中不存在的静态方式时自动执行
- 作用:调用不存在的静态成员方法时起保护作用
- 调用:调用不存在的静态成员方法时被调用
- 参数:函数名,参数类表(枚举数组)
__set(),设置一个类的私有成员变量时调用
__get(),获得一个类的私有成员变量时调用
- 如果类中的属性设置为私有属性,在类的实例中是无法访问的,但怎样才能访问呢?
我们就可以使用__SET() / __GET()
Class person
{
Private $name;
Private $age;
/*给类私有属性赋值*/
Function __SET($proName,$value){
this->$proName=$value;
}
/*获取类私有属性的值*/
Function __GET($proName){
Return this->$proName;
}
}
__isset(),调用isset()或empty()判断类中私有属性或方法是否存在时自动调用
- 首先我们先介绍一下isset 方法,该方法用于判定属性和方法是否存在,但是我们无法通过类类实例判断类中的某个私有属性是否存在 ,如果我们使用isset(per->$name);//返回值是false,但是$name属性的确存在,怎么解决呢?
- 解决方法:
- 1.将$name定义为私有属性
- 2.在类定义中添加
Function __isset($proName){
Return isset(this->$proName);//在类内部是可以访问私有属性的
}
- 这样的话我们再次调用isset($name);返回值就为true了;
__unset(),当对不可访问属性调用unset()时被调用。
- 与之结合的是unset() unset方法可以删除属性,当我们需要删除类中属性的时候,如果是公有属性我们可以直接删除,但是如果是私有我们只通过该方法就无法实现了
- 怎样实现呢我们可以使用__unset()方法实现该功能我们需要在类中添加
Function __unset($proName){
Unset(this->$proName);
}
- 现在我们再调用unset( name);就可以删除类中的私有属性 n a m e ) ; 就 可 以 删 除 类 中 的 私 有 属 性 name了
__sleep(),执行serialize()序列化数组时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息