欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-03-09 09:17:42
...
这篇文章主要介绍了关于PHP中的魔术方法和魔术常量,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

魔术方法

__construct()构造方法

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

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

__destruct()析构方法

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

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

对象消失的几种情况

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

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

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

析构方法的作用

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

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

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


注意:

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

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

1, 都以__开头

2, 都是自动调用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

注意:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

假如__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__

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

以上就是PHP中的魔术方法和魔术常量的详细内容,更多请关注其它相关文章!

相关标签: php 常量 方法