PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。 魔术方法包括:
__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类

__debugInfo(),打印所需调试信息

从本片文章开始,我和大家一起来学习一下上面的这些魔术方法。

一、__construct

php中构造方法是对象创建完成后第一个被对象自动调用的方法。在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法。

1、 构造方法的作用

通常构造方法被用来执行一些有用的初始化任务,如对成员属性在创建对象时赋予初始值。

2、 构造方法的在类中的声明格式

function __constrct([参数列表]){
            方法体 //通常用来对成员属性进行初始化赋值
        }

3、代码实例

  class Student {private $name;private $age;private $sex;/*** 构造函数*/public  function __construct($name,$age,$sex){$this->sex=$sex;$this->age=$age;$this->name=$name;}public function __destruct(){echo "this is the destruct function!";}
}
$stu=new Student('lily',20,0);
var_dump($stu);

延伸:关于类的构造函数,我们还可以自定义,具体如下:

 public  function Student($name,$age,$sex){$this->sex=$sex;$this->age=$age;$this->name=$name;}   

如果在上面的Student类定义中同时包含了两个构造函数,那当类实例化的时候会调用哪一个呢?修改一下代码。

 public  function __construct($name,$age,$sex){echo "this is __construct function!\r\n";$this->sex=$sex;$this->age=$age;$this->name=$name;}public  function Student($name,$age,$sex){echo "this is Student function!";$this->sex=$sex;$this->age=$age;$this->name=$name;}   

运行效果如下:

OK,看到结果了,还是调用了系统默认的构造函数。

总结:

(1)系统默认构造函数和用户自定义的构造函数只能存在一个,只要显示定义了__construct构造函数,就会调用它,不论你是否定义了其他的构造函数。

(2)php不支持方法的重载,同样是类的构造函数。

二、__destruct

析构方法是PHP5才引进的新内容。
析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。
析造方法的声明格式与构造方法 __construct() 比较类似,也是以两个下划线开始的方法 __destruct() ,这种析构方法名称也是固定的。

(1) 析构方法的声明格式

function __destruct()
{//方法体
}

注意:析构函数不能带有任何参数。

(2) 析构方法的作用

一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。

(3)代码实例

 public function __destruct(){echo "this is the destruct function!";}

具体效果可以看上面的图片,末尾已经进行了输出。

总结:php中有垃圾回收机制,可以结合析构函数使用。

三、__call

有时候,我们不确定某个类中是否存在某方法(面向对象的封装),可是我们又想调用,同时在改方法不存在时不能报错,程序可以继续运行下去,那如何操作呢?没错,这个时候就需要__call()函数了。
该方法有两个参数,第一个参数 $function_name 会自动接收方法名,第二个 $arguments 则以数组的方式接收方法的多个参数。

(1) __call() 方法的格式:

function __call(string $function_name, array $arguments)
{// 方法体
}

(2) __call() 方法的作用

避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用 __call() 方法来避免。该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。

(3)代码实例

 class Student {private $name;private $age;private $sex;/*** 构造函数*/public  function __construct($name,$age,$sex){echo "this is __construct function!\r\n";$this->sex=$sex;$this->age=$age;$this->name=$name;}public  function Student($name,$age,$sex){echo "this is Student function!";$this->sex=$sex;$this->age=$age;$this->name=$name;}   public function __destruct(){echo "this is the destruct function!";}public function Read(){echo "this is read function!\r\n";  }public function __call($functionname,$arguments){echo "您调用的".$functionname."方法不存在\r\n";}private function Hello(){echo "this is Hello function!\r\n"; }protected function Smile(){echo "this is Smile function!\r\n";   }
}
$stu=new Student('lily',20,0);
$stu->Read();
$stu->Smile();
$stu->Hello();
$stu->Talk();

总结:__call()函数对于严谨的开发是必要的

OK,今天先学习一下上面的三个函数,剩余的会在下面的文章中共同学习。

PHP 十六大魔术方法学习相关推荐

  1. php5的魔术方法,php5中魔术方法学习笔记

    1.__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用. PHP实例代码如下: classTest {function__construct() {echo"b ...

  2. mysql 魔术设置_PHP之十六个魔术方法详细介绍

    PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct ...

  3. PHP十六个魔术方法

    PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct ...

  4. php对象魔术方法,php学习之类与对象的魔术方法的使用

    原标题:php学习之类与对象的魔术方法的使用 魔术方法有哪些 __construct:构造方法 __destuct:析构方法 __call:在对象中调用一个不可访问的方法时.__call()会被调用 ...

  5. jQuery学习(十)—替换方法

    jQuery学习(十)-替换方法 一. replaceAll方法 作用:用jQuery对象替换掉所有的元素 格式:元素1.replaceAll(元素2); 注意:元素2可以是jQuery对象或者选择器 ...

  6. python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)

    python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...

  7. 2021小白Python学习记录Day7 面向对象基础(上) (定义类和对象、__init__传参、self、魔术方法)

    目录 一.定义类和对象 1.定义类 2.创建一个对象 2.1 创建一个实例对象并调用实例方法 2.2 创建另一个实例对象: 2.3 添加实例属性 二.__init__(self) 1. __init_ ...

  8. PHP之十六个魔术方法详解 转自:青叶

    目录 PHP之十六个魔术方法详解 前言 范例 〇.__serialize() 和 __unserialize() 一. __construct(),类的构造函数 二.__destruct(),类的析构 ...

  9. 《Python进阶系列》十二:最全魔术方法整理

    Python中的魔术方法 所谓魔法函数(Magic Methods),是Python的一种高级语法,允许你在类中自定义函数,并绑定到类的特殊方法中.比如在类A中自定义__str__()函数,则在调用s ...

最新文章

  1. centos误删除文件如何恢复
  2. linux乌邦图更改ip,Linux系统下图形界面更改IP地址分享
  3. [react] 举例说明React的插槽有哪些运用场景
  4. [修正] Firemonkey Windows 控件有虚线残影问题
  5. 10本最值得推荐的区块链书
  6. 用数组建立二叉树(LeetCode二叉树测试)
  7. BZOJ1076: [SCOI2008]奖励关【状压DP+期望DP】
  8. 数学建模线性规划实例及详细解答(MATLAB代码)
  9. Java解析魔兽争霸3录像W3G文件(一):Header
  10. Cisco路由器VLan隔离局域网广播包的配置实验
  11. 2022年高考送祝福,金秋9月,CSDN等你哦!
  12. 汽车辅助驾驶系统中的图像处理算法
  13. oracle密码锁屏时间,OPPO用户怎么让手机变流畅?花1分钟关闭这4个设置,瞬间变流畅...
  14. Prometheus + Grafana 图形化监控实践
  15. 无符号数和带符号整数的表示
  16. 数据结构c语言程序杨辉三角,杨辉三角 --- C语言程序
  17. Android JNI开发入门与实战
  18. 通信电子电路(二十) 第一章复习+习题讲解
  19. 扩展kmp入门+比赛模板
  20. CLIP-Adapter:利用Adapter微调CLIP适配下游任务

热门文章

  1. AUTOCAD——螺旋
  2. html界面等待状态,html页面Loading效果实现:加载新页面前的等待过渡画面
  3. 长短期记忆网络 Long Short-Term Memory
  4. 最小化函数minimize
  5. 2019上海埃森哲软件开发面试
  6. ASPICE SWE3之——模型生成软件详细设计2 注释格式
  7. 【智能卡】智能卡之ISO7816
  8. 企业级数据中台应用架构和技术架构
  9. 格里高利历java_格里高利历java错误
  10. Vue 响应式实现原理深入浅出