Rumah > Artikel > pembangunan bahagian belakang > PHP中的魔术方法和魔术常量
这篇文章主要介绍了关于PHP中的魔术方法和魔术常量,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
在实例化一个对象的时候,顺便在类名的后面增加一些用括号括起来的参数列表(可以理解为构造方法的实参)
与构造方法是一对,构造方法是在一个对象“出生”的时候自动调用的,而析构方法是在一个对象“消失”的时候由系统自动调用的!
析构方法是在对象消失之前调用
对象消失的几种情况
1, 明确的使用unset函数销毁一个变量
2, 脚本运行结束之后,也会自动销毁
3, 改变对象变量的值,也会自动销毁
析构方法的作用
主要的作用就是用于释放对象所占用的额外的资源!而不是对象本身!
注意:
析构方法通常不太需要额外的定义,只有当释放额外资源(不属于这个对象资源)的时候才需要定义!
总结一下构造方法和析构方法的特点:
1, 都以__开头
2, 都是自动调用
3, 都是某个特定情况发生的时候才调用相应的方法
同时满足以上三个特点的方法在php中还有很多,被称之为“魔术方法”!
就是在克隆一个对象的时候自动调用该魔术方法!负责对克隆出来的新对象进行相关的初始化!
为不可访问的属性赋值: __set()
一旦定义了__set()魔术方法,为不可访问的属性赋值的时候,就会自动的执行该方法,此时,处理权就交给用户自己了!
该魔术方法需要两个参数:
一个是该不可访问的属性的属性名
一个是该不可访问的属性的值
获得不可访问的属性的值: __get()
一旦定义了__get()魔术方法,获取不可访问的属性的值的时候,就会自动的执行该方法,此时,处理权就交给用户自己了!
该魔术方法,只需要一个参数,就是该属性的属性名!
注意:
__get和__set两个方法往往在真实的项目中都是成对出现的!而且,往往就是利用这两个方法批量的对对象的私有属性进行处理!
以上的代码还可以限制用户增加属性,以保证属性的原有的内部结构不发生改变!
删除不可访问的属性: __unset()
一般来说,可以通过unset函数删除对象的某个公开的属性:
但是,如果该属性是不可访问的(比如private或不存在),则会自动执行__unset方法,究竟是否可以删除成功,还是取决于__unset的内部实现!
该方法也只需要一个参数,就是当前删除的属性名!
假如__unset里面什么都没做,默认的就是不可删除(当然也不会报错!)
判断不可访问的属性是否存在: __isset()
如果该属性是不可访问的属性,判断这个属性是否存在的时候,会自动触发该方法的执行!
同样的,该方法也需要一个参数,技术当前需要判断的属性名!
当调用一个不可访问的对象方法(非静态方法),会自动的执行该魔术方法!
思考:
此时的这个魔术方法需要几个参数?
参数一:方法名,string型
参数二:array型,因为参数的个数不确定,只能把所有的参数都放到一个数组里面
假如这个方法什么都不做:
当调用一个不可访问的类方法(静态方法)的时候,会自动执行该魔术方法,定义这个方法的时候,需要在方法名的前面加上static关键字,因为该方法应该是一个静态方法!
一个小案例
设计一个数学类,达到以下的目的:
调用方法f1:
1, 如果传入的是1个参数,返回其平方的值
2, 如果传入的是2个参数,返回其平方之和
3, 如何传入的是3个参数,返回其立方之和
就是利用方法重载来完成:
当我们把对象当做一个函数(或方法)来调用的时候,会自动执行该魔术方法!目前而不是很常用!
回忆一下前面学过的匿名函数:
注意:
之所以可以使用$func闭包对象成功的调用函数,就是因为闭包对象里面有一个__invoke魔术方法
当我们把一个对象当成是一个字符串来使用的时候,会自动的执行该模仿方法!
而且该方法的返回值,一般可以是该对象序列化成字符串的结果!
事实上,此时系统会自动触发执行__toString这个方法:
代表的是当前的类名!
注意与self的区别:
self是指该类的本身(一种结构,不仅仅包括类名),而__CLASS__只是一个类名(类名只是类的一部分!)
代表当前的方法名!
几个 PHP 的"魔术常量" | |
名称 |
说明 |
__LINE__ |
文件中的当前行号。 |
__FILE__ |
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。 |
__DIR__ |
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。 |
__FUNCTION__ |
函数名称。本常量返回该函数被定义时的名字(区分大小写)。 |
__CLASS__ |
类的名称,本常量返回该类被定义时的名字(区分大小写)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。 |
__TRAIT__ |
Trait 的名字。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。 |
__METHOD__ |
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。 |
__NAMESPACE__ |
当前命名空间的名称(区分大小写)。 |
Atas ialah kandungan terperinci PHP中的魔术方法和魔术常量. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!