博主信息
博文 35
粉丝 0
评论 0
访问量 33865
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
面向对象魔术方法之__isset(),__unset(),__toString(),__invoke,__clone()
小的博客
原创
902人浏览过

一:下面涉及魔术方法:

  1,__isset();在类外部检测一个属性是否存在时自动调用:

 2,__unset();在类外部销毁一个私有或者受保护的属性时自定调用;

3,__toString();将对象当做字符串来访问时候自动调用;

4,__invoke();将对象当做函数来执行时自动调用:

5,__clone();对象克隆时候自动调用;

class Demo{
 private $name;
 private $age;
 public $site='PHP中文网';
 function __construct($name,$age){
  $this->name=$name;
  $this->age=$age;
 }
 
 function __isset($proName){//在类外部检测一个不存在的属性是就会显示有;
  return isset($proName);
 }
 function __unset($proName){
  if($this->name=='Peter Zhu'){//如果当前name 是Peter Zhu 不允许销毁
   echo '<h3 style="color:red">不允许注销</h3>';
  }
  unset($proName);
 }
 function __toString(){
  return  '<h2 style="color:green">我是一个对象不能当做字符串来访问~~~</h2>';
 }
 function __invoke($value){
  return '<h2 style="color:green">我是一个对象不能当做函数来调用~~~'.$value.'</h2>';
 }
 public function __clone(){//禁用克隆
 }
}
$obj=new Demo('Peter Zhu',39);
echo isset($obj->name)?'有':'无'.'<br>';//直接输出页面会显示无,这个时候需要使用__isset()方法
echo isset($obj->age)?'有':'无';
 unset($obj->name);//直接销毁会报错,这个时候需要用到方法__unset();使用__unset()方法后会弹出红色字///体不允许注销
 /*__toString():对象当做字符串来访问;
 * __invoke():对象当做函数来访问:
 * __clone():对象克隆时自动调用 
 */
 $obj1=$obj;
 //对象的复制相当于给这个对象起了个别名,在$obj1中修改对象的属性,$obj中的对象属性也随之改变
 $obj1->site='www.php.cn/php2/';
 echo $obj->site,'<br>';
 //演示对象克隆
 echo '<h2>对象克隆值传递</h2><br>';
 echo $obj->site='PHP中文网';
 $obj2=clone($obj);
 $obj2->site='www.php.cn/php2.cn/';
 echo $obj2->site,'<br>';
 echo $obj->site,'<br>';//$obj中的site 属性值没有被改变
 echo $obj;//把对象当做字符串来访问,将对象当字符串来访问,会提示错误,不允许将对象当字符串输出
           //如果在类中有一个__toString()方法来处理就不会了
 echo $obj('php.cn');//把对象当做函数来执行会报错,如果类中有__invoke()方法就不会了;
 $obj3=clone(new Demo('Peter Zhu',30));
 //echo $obj3->name;//克隆失效

  总结:克隆对象,就是给当前对象创建一个双胞胎,尽管看上去一样,但却是二个完全独立互不影响的实体
   克隆有时很有用,但更多的时候,会带来一些副作用,例如对于一个类来说,创建太多的实例是没有意义的,
  所以需要禁用对象克隆,例如常用用的:单例模式,就必须禁用克隆的方式来创建新对象
  这时可以给当前类添加一个魔术方法:__clone(),使类外部克隆对象操作失效

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学