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基础知识:类与对象(5) static
Dec 13 PHP
PHP 日志缩略名的创建函数代码
May 26 PHP
php学习之运算符相关概念
Jun 09 PHP
基于PHP array数组的教程详解
Jun 05 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
Jul 15 PHP
codeigniter教程之多文件上传使用示例
Feb 11 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
完整删除ecshop中获取店铺信息的API
Dec 24 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
Mar 25 PHP
PHP编程求最大公约数与最小公倍数的方法示例
May 29 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 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
Windows IIS PHP 5.2 安装与配置方法
2009/06/08 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
DOM精简教程
2006/10/03 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
[03:48]2014DOTA2 TI专访71DK夺冠不靠小组赛高排名
2014/07/11 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
如何利用Python写个坦克大战
2020/11/18 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
家长会演讲稿范文
2014/01/10 职场文书
和平主题的演讲稿
2014/01/12 职场文书
消防安全宣传标语
2014/06/07 职场文书
药品营销专业毕业生自荐信
2014/07/02 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python
Go语言设计模式之结构型模式
2021/06/22 Golang
php去除数组中为0的元素的实例分析
2021/11/17 PHP
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
Python matplotlib 利用随机函数生成变化图形
2022/04/26 Python
Linux磁盘管理方法介绍
2022/06/01 Servers
Python+pyaudio实现音频控制示例详解
2022/07/23 Python