PHP学习——PHP中常用魔术方法

魔术方法是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(),打印所需调试信息


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值