PHP中的魔术方法和魔术常量

魔术方法

 

__construct()构造方法

在实例化一个对象的时候,顺便在类名的后面增加一些用括号括起来的参数列表(可以理解为构造方法的实参)

 

__destruct()析构方法

与构造方法是一对,构造方法是在一个对象“出生”的时候自动调用的,而析构方法是在一个对象“消失”的时候由系统自动调用的!

析构方法是在对象消失之前调用

对象消失的几种情况

1, 明确的使用unset函数销毁一个变量

2, 脚本运行结束之后,也会自动销毁

3, 改变对象变量的值,也会自动销毁

析构方法的作用

主要的作用就是用于释放对象所占用的额外的资源!而不是对象本身!

 


注意:

析构方法通常不太需要额外的定义,只有当释放额外资源(不属于这个对象资源)的时候才需要定义!

 

总结一下构造方法和析构方法的特点:

 

1, 都以__开头

2, 都是自动调用

3, 都是某个特定情况发生的时候才调用相应的方法

 

同时满足以上三个特点的方法在php中还有很多,被称之为“魔术方法”!

__clone()克隆一个对象的时候自动调用该魔术方法

就是在克隆一个对象的时候自动调用该魔术方法!负责对克隆出来的新对象进行相关的初始化!

 

 

 

__set()为不可访问的属性赋值

为不可访问的属性赋值: __set()

一旦定义了__set()魔术方法,为不可访问的属性赋值的时候,就会自动的执行该方法,此时,处理权就交给用户自己了!

该魔术方法需要两个参数:

一个是该不可访问的属性的属性名

一个是该不可访问的属性的值

 


 

__get()获得不可访问的属性的值

获得不可访问的属性的值:  __get()

 

一旦定义了__get()魔术方法,获取不可访问的属性的值的时候,就会自动的执行该方法,此时,处理权就交给用户自己了!

 

该魔术方法,只需要一个参数,就是该属性的属性名!

 

 


 

 

注意:

__get__set两个方法往往在真实的项目中都是成对出现的!而且,往往就是利用这两个方法批量的对对象的私有属性进行处理!

 


 

 

以上的代码还可以限制用户增加属性,以保证属性的原有的内部结构不发生改变!

 


 

 

 

__unset()删除不可访问的属性

删除不可访问的属性:  __unset()

一般来说,可以通过unset函数删除对象的某个公开的属性:

 

但是,如果该属性是不可访问的(比如private或不存在),则会自动执行__unset方法,究竟是否可以删除成功,还是取决于__unset的内部实现!

 

该方法也只需要一个参数,就是当前删除的属性名!

 


 

 

假如__unset里面什么都没做,默认的就是不可删除(当然也不会报错!)

 

 

 

__isset()判断不可访问的属性是否存在

判断不可访问的属性是否存在:  __isset()

如果该属性是不可访问的属性,判断这个属性是否存在的时候,会自动触发该方法的执行!

 

同样的,该方法也需要一个参数,技术当前需要判断的属性名!

 

 

 

 

__call()当调用一个不可访问的对象方法(非静态方法)

当调用一个不可访问的对象方法(非静态方法),会自动的执行该魔术方法!

 

思考:

此时的这个魔术方法需要几个参数?

 

参数一:方法名,string

参数二:array型,因为参数的个数不确定,只能把所有的参数都放到一个数组里面

假如这个方法什么都不做:

 

 

 

 

__callstatic()调用一个不可访问的类方法(静态方法)

当调用一个不可访问的类方法(静态方法)的时候,会自动执行该魔术方法,定义这个方法的时候,需要在方法名的前面加上static关键字,因为该方法应该是一个静态方法!

 

 

一个小案例

设计一个数学类,达到以下的目的:

 

调用方法f1:

1, 如果传入的是1个参数,返回其平方的值

2, 如果传入的是2个参数,返回其平方之和

3, 如何传入的是3个参数,返回其立方之和

 

就是利用方法重载来完成:

 

 

 

__invoke()

当我们把对象当做一个函数(或方法)来调用的时候,会自动执行该魔术方法!目前而不是很常用!

 

 

 

 

回忆一下前面学过的匿名函数:

 

 

注意:

之所以可以使用$func闭包对象成功的调用函数,就是因为闭包对象里面有一个__invoke魔术方法

 

__toString()

当我们把一个对象当成是一个字符串来使用的时候,会自动的执行该模仿方法!

而且该方法的返回值,一般可以是该对象序列化成字符串的结果!

 

 

事实上,此时系统会自动触发执行__toString这个方法:

 

魔术常量

__CLASS__

代表的是当前的类名!

 

注意与self的区别:

self是指该类的本身(一种结构,不仅仅包括类名),而__CLASS__只是一个类名(类名只是类的一部分!)

 

 

__METHOD__

代表当前的方法名!

 

几个 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__

当前命名空间的名称(区分大小写)。

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值