热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php面相对象的魔术方法总结

PHP面向对象有哪些魔术方法,每个魔术方法如何如何,请写个测试类并运行
非空的字符串,非零,true,有单元的数组将会转化为true;0,"0",空*字符串,NULL,没有单元的数组将会转化为false);
*参数:$name为试图检测的成员变量的名称,这个参数的传递是PHP自动完成的;
*返回值:类型(不确定)注意该方法可以设置成私有的(构造方法不要设置成私有的),当用isset()函数检测的是
*公有的成员变量的时候可以直接检测,如果没有__isset()方法而直接检测私有成员会得到不准确的结果即isset()
*会始终返回false;
*__unset($name)
*功能:当用unset($name)撤销一个私有的成员变量的时候就会自动调用该方法;
*参数:$name为试图撤销的成员变量的名称,这个参数的传递是PHP自动完成的;
*返回值:不能返回值,强制返回值将会出错,当用unset()函数撤销的是公有
*的成员变量的时候可以直接撤销,如果没有__unset()方法而直接撤销私有成员不会成功;
*__toString()
*功能:当程度试图输出一个对象类型的变量的时候PHP会自动调用该方法;
*参数:没有参数,如果有会提示出错;
*返回值:字符型(该方法必须通过return返回一个字符串);
*__clone()
*功能:在用clone关键字克隆一个对象的时候PHP会自动调用这个方法,是为了给克隆出来的对象增添自己的属
*性和方法;
*参数:不用传递参数;
*返回值:不用返回值;
*__call($name,$argument)
*功能:当程序试图调用一个不存在的成员方法的时候会自动调用该方法;
*参数:PHP将自动将调用的不存在的方法名传递给$name,不存在的方法中的参数整合为一个数组传递给*$argument;
*返回值:不用返回值;
*__sleep()
功能:使用serialize()函数时,如果实例化的对象中包含__sleep()方法,则会先执行__sleep()方法,该方法可以清除
*对象并返回该对象中所有变量的数组。使用__sleep()方法的目的是关闭对象可能具有的数据库连接等类似的
*善后工作
*参数:无需要传递参数
*返回值:数组类型(Array)该对象中所有变量的数组
*__wakeup()
*功能:使用unserialize()函数重新还原一个被serialize()函数序列化的对象,__wakeup()方法则是恢复序列化中可能
*丢失的数据库连接及相关工作
*参数:无需要传递参数
*返回值:----------------------------
*__set_state($arr)
*功能:可以通过var_export()来访问类的静态方法__set_state(),该方法必须是静态的且必须返回一个对象
*参数:$arr为一个数组
*返回值:为一个对象
*
*__autoload($class_name)
*功能:在指定的路径下自动查找并导入实例化需要使用的类
*参数:$class_name为类名
*返回值:*__callStatic($name,$argument)
*功能:当程序试图在静态方法中调用一个未定义或者不可见的成员方法的时候会自动调用该方法;
*参数:PHP将自动将调用的不存在的方法名传递给$name,不存在的方法中的参数整合为一个数组传递给$argument;
*返回值:不用返回值;*注意:PHP5.3以上的版本支持该魔术方法
*注意:__classStatic()方法必须被申明为public并且为static,否则会产生一个warning错误
*__invoke($x,$y,...)
*功能:当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
*参数:以函数调用方法调用一个对象时传递的任意多个参数
*返回值:不确定*注意:PHP5.3以上的版本支持该魔术方法
**/
class XuDianYang{
 public $sex;
 public $age;
 private $girlfriend='xx';
 public function __construct($sex,$age){
  $this->sex=$sex;
  $this->age=$age;
 }
 public function __get($name){
  echo __class__."::".$name."不存在或者不可见";
 }
 public function __set($name,$value){
  echo __class__."::".$name."由于不在在或者不可见,赋值失败";
 }
 public function __isset($name){
  if(isset($this->$name)){
   echo 1;
  }else{
   echo 0;
  }
 }
 public function __unset($name){
  unset($this->$name);
 }
 public function __toString(){
  return __class__;
 }
 public function __clone(){
  $this->sex='女';
 }
 public function __call($name,$argument){
  echo "方法".__class__."::".$name."不存在";
 }
 public function __sleep(){
  echo "I'm sleeping";
  foreach($this as $key=>$value){
   $arr[]=$key;
  }
  return $arr;
 }
 public function __wakeup(){
  echo "I wake up";
 }
 public function __set_state($arr){
  $obj=new CheShi();
  $obj->var1=$arr['sex'];
  $obj->var2=$arr['age'];
  return $obj;
 }
}
function __autoload($name){
 $class_path="./";
 include_once($class_path.$name.".class.php");
}
$xudianyang=new XuDianYang("男",21);
echo "
"; //正常访问sex属性 echo $xudianyang->sex; echo "
"; //由于不存在weight属性,将自动调用__get()方法 echo $xudianyang->weight; echo "
"; //由于不可见(即私有),将自动调用__get()方法 $xudianyang->girlfriend; echo "
"; //由于不存在,赋值失败,自动调用__set()方法 $xudianyang->shengao="172cm"; echo "
"; //检测sex属性是否存在,由于sex公有直接检测 var_dump(isset($xudianyang->sex)); echo "
"; //检测girlfriend是否存在,由于girlfriend私有,所以自动调用__isset()方法 isset($xudianyang->girlfriend); echo "
"; //撤消girlfriend,由于girlfriend私有,所以自动调用__unset()方法 //unset($xudianyang->girlfriend); isset($xudianyang->girlfriend); echo "
"; //直接输出一个对象,自动调用__toString()方法 echo $xudianyang; echo "
"; $xu=clone $xudianyang; echo $xu->sex; echo "
"; //由于调用不存在的方法,自动调用__call()方法 $xudianyang->walk(); echo "
"; //序列化对象,自动调用__sleep()方法 $a=serialize($xudianyang); echo "
"; echo "序列化的结果为:".$a; //反序列化对象,自动调用__wakeup()方法 echo "
"; $b=unserialize($a); //反序列化的结果 echo $b->sex; echo "
"; eval('$c='.var_export($xudianyang,true).";"); echo $c->var1; ?> CheShi.class.php

 


推荐阅读
  • LeetCode 540:有序数组中的唯一元素
    来源:力扣(LeetCode),链接:https://leetcode-cn.com/problems/single-element-in-a-sorted-array。题目要求在仅包含整数的有序数组中,找到唯一出现一次的元素,并确保算法的时间复杂度为 O(log n) 和空间复杂度为 O(1)。 ... [详细]
  • 如何在Faceu激萌中设置和使用妆容切换特效?
    本文将详细介绍如何在Faceu激萌应用中设置和使用妆容切换特效,帮助用户轻松实现创意拍摄。无论是新手还是有经验的用户,都能从中受益。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 探讨一个老旧 PHP MySQL 系统中,时间戳字段不定期出现异常值的问题及其可能原因。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 郑州大学在211高校中的地位与排名解析
    本文将详细解读郑州大学作为一所位于河南省的211和双一流B类高校,在全国211高校中的地位与排名,帮助高三学生更好地了解这所知名学府的实力与发展前景。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 优化ASM字节码操作:简化类转换与移除冗余指令
    本文探讨如何利用ASM框架进行字节码操作,以优化现有类的转换过程,简化复杂的转换逻辑,并移除不必要的加0操作。通过这些技术手段,可以显著提升代码性能和可维护性。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 电子元件封装库:三极管、MOS管及部分LDO(含3D模型)
    本资源汇集了常用的插件和贴片三极管、MOS管以及部分LDO的封装,涵盖TO和SOT系列。所有封装均配有高质量的3D模型,共计96种,满足日常设计需求。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
author-avatar
芬妮Iris_150
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有