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 相关文章推荐
一个用于mysql的数据库抽象层函数库
Oct 09 PHP
从网上搜到的phpwind 0day的代码
Dec 07 PHP
php读取html并截取字符串的简单代码
Nov 30 PHP
php smarty模版引擎中的缓存应用
Dec 02 PHP
php自动加载的两种实现方法
Jun 21 PHP
PHP分多步骤填写发布信息的简单方法实例代码
Sep 23 PHP
PHP中ob_start函数的使用说明
Nov 11 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 PHP
PHP函数func_num_args用法实例分析
Dec 07 PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 PHP
PHP unset函数原理及使用方法解析
Aug 14 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
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
php简单实现查询数据库返回json数据
2015/04/16 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
JavaScript Date对象使用总结
2009/05/14 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
THREE.JS入门教程(1)THREE.JS使用前了解
2013/01/24 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
深入理解react-router 路由的实现原理
2018/09/26 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
[00:23]DOTA2群星共贺开放测试 25日无码时代来袭
2013/09/23 DOTA
Scrapy框架CrawlSpiders的介绍以及使用详解
2017/11/29 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
Django中的session用法详解
2020/03/09 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
英国假睫毛购买网站:FalseEyelashes.co.uk
2018/05/23 全球购物
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
门卫班长岗位职责
2013/12/15 职场文书
基层干部十八大感言
2014/01/19 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
迎新生欢迎词
2015/01/23 职场文书
工作推荐信模板
2015/03/25 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
68句权威创业名言
2019/08/26 职场文书
Python编解码问题及文本文件处理方法详解
2021/06/20 Python