• 技术文章 >后端开发 >php教程

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

    不言不言2018-06-01 16:30:02原创792
    这篇文章主要介绍了关于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__

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

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

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:php 常量 方法
    上一篇:基于PHP实现清除MySQL死连接的方法 下一篇:PHP微信支付实例详解
    大前端线上培训班

    相关文章推荐

    • 带你分清类中的构造函数与析构函数• PHP中的命名空间定义与使用(实例详解)• PHP中clone关键字和__clone()方法的使用(实例详解)• 怎样去搞定PHP类的继承?(总结分享)• 五分钟带你了解PHP中的魔术方法(实例详解)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网