php中的常用魔术方法汇总


Posted in PHP onFebruary 14, 2016

这篇文章详细的对php中的常用魔术方法进行了整理归纳,分享给大家供大家参考,具体内容如下

1、PHP把所有”__”开头的方法当做魔术方法,所以任何自定义的方法都不能是”__”开头
php提供的重载,是指动态的创建属性或方法。重载是通过魔术方法来实现的。这些魔术方法的参数不能饮用传递,__get(),__set(),__isset(),__unset(),实现类属性重载。
2、当访问类中不可访问的属性时,将调用__get()方法
3、当访问类中不可访问的属性时,根据不同的情况会调用__get(),__set(),__isset(),__unset(),其中当访问属性 时,使用函数isset()或empty()时,将调用__isset()方法使用unset()函数时,将调用__unset()方法。
4、这四个方法不能使用static关键词定义,在php5.3.0后,一个warning级别的警告将发生,当使用static方法定义这4个方法。
5、何谓不可访问的属性:(1)类中没有的属性,(2)私有变量在类外被访问。方法重载,通过__call()和__callstatic()来实 现,两者的区别是一个上下文环境是否是静态方法,后者在调用不可访问的静态方法时会被调用。__callstatic()是在php5.3.0中才被添 加。
6、__sleep()和__wakeup()
serialize()序列化时,会先检查是否存在__sleep()函数,如果存在,则先调用__sleep(),返回一个包含所有变量名称的数组,如果该方法不返回任何内容,则null被序列化,并产生一个notice级别的错误。
__wakeup()方法和__sleep()相反,在调用unserialize()时被调用
7、__toString(),让一个类决定它如何转换成字符串,在php5.2.0之前,这个方法只能结合echo或print方法生效,php5.2.0之后,可以结合printf()修饰,但修饰的时候也不能用类似%d之类的非字符修饰符。
8、__invoke(),当尝试以调用函数的方式调用对象时,将出发这个函数,只在php5.3之后生效。
9、__set_state()静态方法,当调用var_export()的时候,才会调用这个静态方法,php5.1.0之后生效。唯一参数是接收一个数组。
10、__construct()和__destruct(),构造函数和析构函数,构造函数主要用于类的初始化,析构函数在某个对象的所有引用都 删除后或者对象被显示的销毁时运行。在析构函数中不允许抛出异常,否则会出发一个fatal error,析构函数在脚本结束时调用,此时所有的http header都已经发出.
11、__clone(),对象复制,此方法不能直接被调用,必须通过clone关键字显示调用

代码:

//实例化对象时,会调用对象的__construct方法
$obj = new Object();
//给对象不存在的属性赋值时,会调用对象的__set方法
$obj->title = "hello";
//使用对象不存在的属性时,会调用对象的__get方法
echo $obj->title;
//调用对象不存在的方法时,会调用对象的__call方法
$obj->test("hello",123,567);
//调用不存在的类静态方法时,会调用类的__callStatic方法
Object::staticMethod("static","not found method");
//直接输出对象时,会调用对象的__toString方法
echo $obj;
//将一个对象当作函数一样使用时,会调用对象的__invoke方法
echo $obj("test");
//克隆对象时,会调用对象的__clone方法
$obj2 = clone $obj;
//判断对象属性是否存在时,会调用对象的__isset方法
var_dump(isset($obj->aaa));
//销毁对象属性时,会调用对象的__unset方法
unset($obj->aaa);
 
 
class Object{
 
  protected $array = array();
 
  function __construct()
  {
    echo __METHOD__."你正在实例化对象<br>";
  }
 
  function __set($name, $value)
  {
    $this->array[$name]=$value;
  }
 
  function __get($name)
  {
    return $this->array[$name];
  }
 
  function __call($name, $arguments)
  {
    var_dump($name,$arguments);
    return "magic function\n";
  }
 
  static function __callStatic($name, $arguments)
  {
    var_dump($name,$arguments);
    return "magic static function";
  }
 
  function __toString()
  {
    return __CLASS__.'<br>';
  }
 
  function __invoke($arguments)
  {
    var_dump($arguments);
    return __METHOD__.'<br>';
  }
 
  function __clone()
  {
    echo __METHOD__."你正在克隆对象<br>";
  }
 
  function __isset($name)
  {
    echo __METHOD__."你想判断有没有属性".$name."<br>";
    return 1;
  }
 
  function __unset($name)
  {
    echo __METHOD__."你想删除属性".$name."<br>";
  }
 
 
  function __destruct()
  {
    echo __METHOD__."你正在注销对象<br>";
  }
 
 
 
}

以上就是关于php中的常用魔术方法的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP has encountered an Access Violation 错误的解决方法
Jan 17 PHP
一步一步学习PHP(2)――PHP类型
Feb 15 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
Aug 07 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
一键生成各种尺寸Icon的php脚本(实例)
Feb 08 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
Jul 03 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
Sep 01 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
Nov 20 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
Oct 11 PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 #PHP
PHP浮点比较大小的方法
Feb 14 #PHP
PHP魔术方法使用方法汇总
Feb 14 #PHP
PHP函数超时处理方法
Feb 14 #PHP
PHP使用file_get_content设置头信息的方法
Feb 14 #PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
Feb 14 #PHP
PHP缓冲区用法总结
Feb 14 #PHP
You might like
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
php 魔术方法使用说明
2009/10/20 PHP
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
php图像验证码生成代码
2017/06/08 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
利用js的闭包原理做对象封装及调用方法
2017/04/07 Javascript
js断点调试经验分享
2017/12/08 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
JavaScript中Object值合并方法详解
2017/12/22 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
Python常见文件操作的函数示例代码
2011/11/15 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
使用pandas的DataFrame的plot方法绘制图像的实例
2018/05/24 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
python判断正负数方式
2020/06/03 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
AmazeUI框架搭建的方法步骤(图文)
2020/08/17 HTML / CSS
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
小学教师节活动总结
2015/03/20 职场文书
小鞋子观后感
2015/06/05 职场文书
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL