PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods)
魔术方法包括:
- __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、 构造方法的在类中的声明格式
?1234function__constrct([参数列表]){方法体//通常用来对成员属性进行初始化赋值}3、 在类中声明构造方法需要注意的事项
1、在同一个类中只能声明一个构造方法,原因是,PHP不支持构造函数重载。
2、构造方法名称是以两个下画线开始的__construct()
下面是它的例子:
?1234567891011121314151617181920212223242526<?phpclassPerson{public$name;public$age;public$sex;/*** 显示声明一个构造方法且带参数*/publicfunction__construct($name="",$sex="男",$age=22){$this->name =$name;$this->sex =$sex;$this->age =$age;}/*** say 方法*/publicfunctionsay(){echo"我叫:".$this->name .",性别:".$this->sex .",年龄:".$this->age;}}创建对象$Person1且不带任参数
?12$Person1=newPerson();echo$Person1->say();//输出:我叫:,性别:男,年龄:27创建对象$Person2且带参数“小明”
?12$Person2=newPerson("小明");echo$Person2->say();//输出:我叫:张三,性别:男,年龄:27创建对象$Person3且带三个参数
?12$Person3=newPerson("李四","男",25);echo$Person3->say();//输出:我叫:李四,性别:男,年龄:25二、__destruct(),类的析构函数
通过上面的讲解,现在我们已经知道了什么叫构造方法。那么与构造方法对应的就是析构方法。
析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。
析构方法是PHP5才引进的新内容。
析造方法的声明格式与构造方法 __construct() 比较类似,也是以两个下划线开始的方法 __destruct() ,这种析构方法名称也是固定的。
1、 析构方法的声明格式
?1234function__destruct(){//方法体}注意:析构函数不能带有任何参数。
2、 析构方法的作用
一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。
举例演示,如下:?123456789101112131415161718192021222324252627282930313233<?phpclassPerson{public$name;public$age;public$sex;publicfunction__construct($name="",$sex="男",$age=22){$this->name =$name;$this->sex =$sex;$this->age =$age;}/*** say 说话方法*/publicfunctionsay(){echo"我叫:".$this->name.",性别:".$this->sex.",年龄:".$this->age;}/*** 声明一个析构方法*/publicfunction__destruct(){echo"我觉得我还可以再抢救一下,我的名字叫".$this->name;}}$Person=newPerson("小明");unset($Person);//销毁上面创建的对象$Person上面的程序运行时输出:
我觉得我还可以再抢救一下,我的名字叫小明
三、 __call(),在对象中调用一个不可访问方法时调用。
该方法有两个参数,第一个参数 $function_name 会自动接收不存在的方法名,第二个 $arguments 则以数组的方式接收不存在方法的多个参数。
1、 __call() 方法的格式:
?1234function__call(string$function_name,array$arguments){// 方法体}2、 __call() 方法的作用:
为了避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用 __call() 方法来避免。
该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。
请参考如下代码:
?1234567891011121314151617181920212223<?phpclassPerson{functionsay(){echo"Hello, world!<br>";}/*** 声明此方法用来处理调用对象中不存在的方法*/function__call($funName,$arguments){echo"你所调用的函数:".$funName."(参数:";// 输出调用不存在的方法名print_r($arguments);// 输出调用不存在的方法时的参数列表echo")不存在!<br>\n";// 结束换行}}$Person=newPerson();$Person->run("teacher");// 调用对象中不存在的方法,则自动调用了对象中的__call()方法$Person->eat("小明","苹果");$Person->say();运行结果:
你所调用的函数:run(参数:Array ( [0] => teacher ) )不存在!
你所调用的函数:eat(参数:Array ( [0] => 小明 [1] => 苹果 ) )不存在!
Hello, world!
四、 __callStatic(),用静态方式中调用一个不可访问方法时调用
此方法与上面所说的 __call() 功能除了 __callStatic() 是未静态方法准备的之外,其它都是一样的。
请看下面代码:
?1234567891011121314151617181920212223<?phpclassPerson{functionsay(){echo"Hello, world!<br>";}/*** 声明此方法用来处理调用对象中不存在的方法*/publicstaticfunction__callStatic($funName,$arguments){echo"你所调用的静态方法:".$funName知识推荐
- 简单实现iframe的高度根据页面内容自适应(jQuery方式)
- iframe伪造ajax
- vue.js入门
- js获取各种宽高
- WEB安全番外第二篇--明日之星介绍HTML5安全问题介绍
- 18.2.26深信服Web实习生补坑(已拿到offer)----持续更新中,还没写完
- JQuery事件——绑定多事件.on()和卸载事件.off()
- jquery插件实现分页
- 使用js实现html锚功能,可以任意定位锚的位置,比锚更加灵活
- linux快速部署Web,Ftp
- CSS3动画中的animation-timing-function效果演示
- 对html语义化的理解
- 采用CSS制作的图书堆叠
- css基础 float ul中li水平排列
- Linux关于yum命令Error: Cannot retrieve repository metadata (repomd.xml) for repository:xxxxxx.
- 不一样的日期、时间转换(moment.js)
- JS 变量作用域
- HTML学习第一天
我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved