PHP魔术方法的总结

PHP规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。PHP中的魔术方法有 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone, __autoload

(1) __get、__set

这两个方法是为在类和他们的父类中没有声明的属性而设计的:

__get( $property ): 当访问未定义的属性时,此方法会被触发,传递的参数是被访问的属性名。

__set( $property, $value ): 给未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。

这里的没有声明包括当使用对象调用时,访问控制为protected、private的属性(即没有权限访问的属性)。

(2) __isset、__unset

__isset( $property ): 对未定义的属性上调用isset()函数时调用此方法。

__unset( $property ): 对未定义的属性上调用unset()函数时调用此方法。

与__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为protected、private的属性(即没有权限访问的属性)

(3) __call

__call( $method, $arg_array ): 调用未定义的方法时调用此方法。

这里的未定义的方法包括没有权限访问的方法;如果方法不存在就去父类中找这个方法,如果父类中也不存在就去调用本类的__call()方法,如果本类中不存在__call()方法就去找父类中的__call()方法。

(4) __autoload

__autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

如果要定义一个全局的自动加载类,则必须用spl_autoload_register()方法将处理类注册到PHP标准库:

<?php
class Loader
{  static function autoload_class($class_name)  {  //寻找正确的$class_name类,并引入,没有则抛出异常  }
}  /**
*   设置对象的自动载入
*   spl_autoload_register — Register given function as __autoload() implementation
*/
spl_autoload_register(array('Loader', 'autoload_class'));  $a = new Test();
//Test没用require就实例化,实现自动加载,很多框架就用这种方法自动加载类
?>  

注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误,所以应该在函数本身做捕获。

(5) __construct、__destruct

__construct 构造方法,当对象创建时调用此方法,相对于PHP4使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么,这样你在改变类的名称时,就不需要改变构造方法的名称。

__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法。默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源,析构函数允许你在使用一个对象之后执行任意代码来清除内存。当PHP决定你的脚本不再与对象相关时,析构函数将被调用。

在一个函数的命名空间内,这会发生在函数return的时候。对于全局变量,这发生于脚本结束的时候。如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值。通常将变量赋值勤为NULL或者调用unset。

(6) __clone

PHP5中的对象赋值是使用的引用赋值,如果想复制对象则需要使用clone方法,在调用此方法时对象会自动调用__clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。

(7) __toString

__toString方法在将对象转化成字符串时自动调用,比如使用echo打印对象时。

如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in

此方法必须返回一个字符串。在PHP 5.2.0之前,__toString方法只有结合使用echo() 或 print()时才能生效。PHP 5.2.0之后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但不能用于非字符串环境(如使用%d修饰符)。从PHP 5.2.0,如果将一个未定义__toString方法的对象转换为字符串,会报出一个E_RECOVERABLE_ERROR错误。

(8) __sleep、__wakeup

__sleep:序列化的时候用

__wakeup:反序列化的时候调用

serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。

使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。

相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

(9) __set_state

当调用var_export()时,这个静态方法会被调用(自PHP 5.1.0起有效)。

本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。

(10) __invoke

当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。PHP5.3.0以上版本有效。

(11) __callStatic

它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,PHP5.3.0以上版本有。PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。

PHP魔术方法的总结相关推荐

  1. PHP中魔术方法的用法

    PHP中魔术方法的用法 /** PHP把所有以__(两个下划线)开头的类方法当成魔术方法.所以你定义自己的类方法时,不要以 __为前缀. * */// __toString.__set.__get__ ...

  2. python 类的魔术方法_python中类的魔术方法

    目的:学习python中class的magic methods,提高编程效率. 环境:ubuntu 16.4   python 3.5.2 在学习class时一定会接触到它的magic methods ...

  3. python魔术方法call_php魔术方法__call

    __call是魔术方法中的一个,当程序调用到当前类中未声明或没权限调用的方法时,就会调用__call方法 class test { public function emptyFunc(){ $getA ...

  4. php 魔术方法 说明

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的. ◆__get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名. ◆_ ...

  5. php 魔术方法 多继承,day23:单继承多继承菱形继承__init__魔术方法

    原文:https://www.cnblogs.com/libolun/p/13434675.html 单继承 关于继承的一些基本概念 1.什么是子类?什么是父类?如果一个类继承另外一个类,该类叫做子类 ...

  6. Python最会变魔术的魔术方法,我觉得是它

    在上篇文章中,我有一个核心的发现:Python 内置类型的特殊方法(含魔术方法与其它方法)由 C 语言独立实现,在 Python 层面不存在调用关系. 但是,文中也提到了一个例外:一个非常神秘的魔术方 ...

  7. php5中魔术方法函数有哪几个,php中的类魔术方法有哪些

    php中的类魔术方法有:1.__sleep,返回一个包含对象中所有应被序列化的变量名称的数组:2.__tostring,返回一个类被当作字符串时要输出的内容:3.__construct,构造方法:4. ...

  8. python 运算符重载_零基础小白Python入门必看:面向对象之典型魔术方法

    魔术方法 查看类的魔术方法 class A: passdir(A) # 可以得到类所有公有成员复制代码 输出结果如下 ['__class__', '__delattr__', '__dict__', ...

  9. php 5.3 construct_PHP 5.3新增魔术方法__invoke概述

    PHP自从5.3版以来就新增了一个叫做__invoke的魔术方法,使用该方法就可以在创建实例后,直接调用对象.如下示例所示: class testClass { public function __i ...

  10. php超全局变量,魔术常量,魔术方法

    整理了下关于php的基础知识,参考了些资料,如下: 超全局变量 超全局变量 - 超全局变量是在全部作用域中始终可用的内置变量: $GLOBALS $GLOBALS - 引用全局作用域中可用的全部变量 ...

最新文章

  1. linux下sort命令使用详解---linux将文本文件内容加以排序命令
  2. JavaSE教程-03深入探究原码,反码,补码-扩展
  3. Angular中父组件通过ViewChild调用子组件的方法
  4. ustc小道消息20211227
  5. php 连续点击事件,javascript设置连续两次点击按钮时间间隔的方法_javascript技巧...
  6. 算法练习:将字符串中所有的空格替换为'%20'(只用基本数据结构)
  7. struts1.x心得1--struts入门介绍
  8. LVS(12)——sh
  9. 2019/2/18 Python今日收获
  10. Spring Boot jackson配置使用详解
  11. C语言如何生成随机数
  12. 5号字对应的数字字号_5号字体是多少pt-字号,尺寸
  13. 成都Uber优步司机奖励政策(3月4日)
  14. dts同步常见问题_阿里云DTS数据同步常见问题(一)
  15. 主流操作系统的开发语言
  16. thinkphp5 关联预载入怎么用
  17. windows禁用屏幕旋转_如何在Windows 10中禁用屏幕自动旋转
  18. Android使用MediaCodec和OpenGL对多段视频画面进行裁剪和拼接
  19. OUC2022秋软件工程第14小组作业
  20. java内部类规则_Java内部类规则

热门文章

  1. 【电气专业知识问答】问:异步电动机的调速方法有几种?
  2. 金融工程期末考试简答题
  3. armbian在玩客云玩法
  4. 快速搭建个人MQTT服务器(基于EMQX)
  5. 大于2t的硬盘分区 lvm
  6. 关于torch.cumprod()累积连乘
  7. 有种中年危机,叫“过了35岁还没副业”,3种方法让你下班赚到钱
  8. gp服务发布服务的地图,web客户端显示的位置跟arcgis中显示的位置不一致,不相符(我的是等值面发布的gp服务)
  9. 基于BS结构下的邮件系统设计开发
  10. oracle时间倒序查询_Oralce 复杂查询