php对象魔术方法,php学习之类与对象的魔术方法的使用

原标题:php学习之类与对象的魔术方法的使用

魔术方法有哪些

__construct:构造方法

__destuct:析构方法

__call:在对象中调用一个不可访问的方法时。__call()会被调用

__callStatic:

__get:调用不可访问的属性

__set:给不可访问的属性赋值或修改值

__isset:

__unset:

__sleep:串行化的时候用,涉及到序列化

__wakeup:反串行化的时候用,涉及到序列化

__toString:

__set_state:

__clone:对象克隆前被调用

说明:

魔术方法都是系统提供的

所有的魔术方法,前面都是以__两个下划线

我们在自定义函数时,不建议已经能用两个_开始

魔术方法是在满足某个条件时,系统自动调用

访问控制修饰符的基本知识

访问修饰符包括:

public:公有,被定义该修饰的成员可以在任何地方被访问

protected:受保护的,被定义该修饰符的成员可以被自身及其子类和父类访问

private:私有。被定义该修饰符的成员只能被其定义所在的类中访问

访问修饰符既可以修饰成员属性,也可以修饰成员方法

访问protected,private不可以直接访问,解决方法是编写一个public的成员方法,来操作protected和private属性

<?phpclass Person{public $name;protected $age;private $sex;//构造方法public function __construct ($name,$age,$sex){$this->name = $name;$this->age = $age;$this->sex = $sex;} //访问protected属性public function get_age(){return $this->age;} //访问private属性public function get_sex(){return $this->sex;}}//创建对象$p1 = new Person('张三',23,'男');//访问各个属性//访问公共属性public ,则可以直接访问echo $p1->name;//访问protected,不可以直接访问,解决方法是编写一个public的成员方法,来操作protected属性echo $p1->get_age();//访问private,不可以直接访问,解决方法是编写一个public的成员方法,来操作private属性echo $p1->get_sex();

魔术方法之 __get函数和__set函数

当开发者去使用不可以访问的属性时,系统就会调用__get方法

不可访问的属性指:

属性不存在

直接访问protected属性

直接访问private属性

当去给不可访问的属性直接赋值时,系统会调用__set方法

案例:

成员属性不可访问或者被私有,希望用对象名->变量名来赋值和取值

<?php class Monkey{public $name;protected $food;//构造方法,public function __construct($name,$food){$this->name = $name;$this->food = $food;}//魔术方法—__get()//$monkey_name代表形参,传过来的被私有或者受保护的属性名这里指的是$foodpublic function __get($monkey_name){//做一个判断if(property_exists($this,$monkey_name)){return $this->$monkey_name;}else{return '没有该属性值';}}//魔术方法- __set()public function __set($monkey_name,$monkey_val){if(property_exists($this,$monkey_name)){$this->$monkey_name = $monkey_val;}else{return '该属性不存在';}}}//创建对象$monkey1 =new Monkey('小白','胡萝卜');echo $monkey1->name;echo $monkey1->food;//修改属性值$monkey1->name = '程序猿';//公共属性直接可以修改赋值echo $monkey1->name;//默认protected的属性赋值时,会调用set方法$monkey1->food = '夜宵';$monkey1->food;

7bcd5a9f2d30051f0045470ecc908540.png

魔术方法之 __isset和__unset方法

当对不可访问的属性进行isset($对象名->属性),empty($对象名->属性)操作时,系统就会调用__isset函数

当对不可访问的属性进行unset($对象名->属性),系统就会调用__unset()函数

案例:unset($house->name);//Fatal error: Cannot access private property House::$name in D:\wamp64\www\issetunset.php on line 40

直接访问会提示不能调用被私有的属性,此时会自动调用__unset()魔术方法,在魔术方法中执行删除,然在打印,就会被删除掉

<?php //定义一个房子类Houseclass House {//定义三个成员属性,价格Price、地址add、姓名name其中姓名私有privatepublic $price;public $add;private $name;//定义构造方法public function __construct ($price,$add,$name){$this->price = $price;$this->add = $add;$this->name =$name;//魔术方法}public function __isset($name1){//property_exists()判断对象的属性或方法是否存在if(property_exists($this,$name1)){echo '存在';}else{echo 2;}}//魔术方法—__unset()public function __unset($name){//判断成员属性是否存在if(property_exists($this,$name)){unset($this->$name);}else{echo '不存在';}}}$house = new House(1000,'陕西西安','张三');//直接调用name返回的是2,被私有了无法赋值,用isset判断时要想用$对象名->属性名访问,就要使用魔术方法__isset(); if(isset($house->name)){echo $house->name;}else{echo 2;}//add属性是公开的,所以可以直接打印出来值if(isset($house->add)){echo $house->add;}else{echo 2;}//unset()销毁成员属性unset($house->name);//Fatal error: Cannot access private property House::$name in D:\wamp64\www\issetunset.php on line 40直接访问会提示不能调用被私有的属性,此时会自动调用__unset()魔术方法,在魔术方法中执行删除,然在打印,就会被删除掉var_dump($house);?>

abe8eabdb346cab0b1f22e1d5a7f54f5.png

魔术方法之__toString

当我们希望将一个对象当作字符串输出时,就会触发__toString魔术方法

魔术方法tostringtostring没有形式参数debug调试时,需要查看对象信息

案例:

<?phpclass Dog{private $name;private $age;private $benling;//构造方法public function __construct($name,$age,$benling){$this->name = $name;$this->age = $age;$this->benling = $benling;}//魔术方法tostring//tostring没有形式参数//debug调试时,需要查看对象信息public function __toString(){return '小狗的名字是 '. $this->name . '年龄为 ' . $this->age . '爱好为 ' . $this->benling; }}$dog = new Dog('藏獒',5 ,'看家');//直接打印输出会触发toString魔术方法,如果不写会报错echo $dog;?>

魔术方法之__clone

当我们需要将一个对象完全的复制一份,保证两个对象的属性和属性值一样,但他们的数据空间是独立的,则可以使用对象克隆

说明:

当我们$对象1 = $对象2时会触发__clone方法

如果我们希望克隆,修改某个属性则在__clone方法中去修改即可

如果我们希望阻止克隆,只需要将__clone魔术方法申明为private即可

案例:

<?phpclass Sheep{public $name;protected $food;public function __construct($name,$food){$this->name = $name;$this->food = $food;}//__clone 魔术方法//如果希望阻止克隆,则将__clone 申明为privatepublic function __clone(){//在克隆一个对象时,可以在这个__clone 函数中去修改某个属性,如果有必要的话echo '复制一个';}}$sheep1 = new Sheep('喜羊羊', '灰太狼');//对象克隆会触发__clone的魔术方法,克隆只是值拷贝$sheep2 = clone $sheep1;if($sheep1==$sheep2){echo '相等';}if($sheep1===$sheep2){echo '全等';}

352ecec3a4f34f5b1939a31c945338e1.png

魔术方法之__call函数

当我们调用要给不可访问的成员方法时,__call魔术方法就会被调用(不可访问即该成员方法不存在,成员访问被protected和private修饰)

__call魔术方法中,有两个参数

函数名:$mathod

参数 类型数组:$parameters

案例:

在类的外部调用不可访问的成员方法

<?phpheader ('content-type:text/html; charset=utf-8');class Sheep{public $name;protected $food;//构造方法public function __construct($name,$food){$this->name = $name;$this->food = $food;}//展示对象都有哪些信息public function show(){echo '
小羊的名字是 ' . $this->name;foreach($this->food as $food){echo '食物是 ' . $food;}}//定义一个受保护的方法protected function hoddy($hoddy1,$hoddy2){echo '
喜羊羊的第一个爱好是 ' . $hoddy1;echo '
喜羊羊的第二个爱好是 ' . $hoddy2;}//编写一个__call魔术方法,__call魔术方法会接收两个参数/*@param $mathod_name 函数名@param $parameters 就是参数,类型为array*/public function __call($method_name,$parameters){//判断$this中是否有$method_name函数,if(method_exists($this,$method_name)){return $this->$method_name($parameters[0],$parameters[1]);}else{echo '没调用该函数';} }}$sheep = new Sheep('喜羊羊' , array('青草','灰太狼'));$sheep->show();//当我们直接调用受保护的方法时,会触发__call魔术方法$sheep->hoddy('玩','打灰太狼');?>

efdd09a723bf1cb5ada6af723c153d3e.png

实战:

有一个cat类,有年龄和名字两个属性,要求这两个属性全部都是public,cat类有一个方法jisuan($n1,$n2,$oper)可以计算+-*/,该方法是私有的,在类的外部$对象名->play('jisuan',$n1,$n2,$oper)得到结果,该方法在类中没有定义

要求play是固定的,如果没有按规定写,则给出相应的错误提示

<?phpheader ('content-type:text/html; charset=utf-8');class Cat{public $name;public $age;//构造方法public function __construct($name,$age){$this->name = $name;$this->age = $age;}//定义一个jisuan方法private function jiSuan($n1,$n2 ,$oper){$res = 0;//判断符号并计算switch($oper){case '+':$res = $n1 + $n2;break;case '-':$res = $n1 - $n2;break;case '*':$res = $n1 * $n2;break;case '/':$res = $n1 / $n2;break;default:echo '输入的符号错误,请重新输入';}return $res;}//编写要给__call魔术方法public function __call($method_name,$parameters){//判断是否通过play方法调用if($method_name == 'play'){//判断jisuan()方法是否存在if(method_exists($this,$parameters[0])){return $this->$parameters[0]($parameters[1],$parameters[2],$parameters[3]);}else{echo '你调用的'.$patameters[0].'不存在';}}else{echo '你调用的方式有问题';}}}$cat = new Cat('tom',23);echo $cat->play('jiSuan',1,2,'*');

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux查看发起ddos攻击的ip,在Linux上使用netstat命令查证DDOS攻击的方法

导读DOS攻击或者DDOS攻击是试图让机器或者网络资源不可用的攻击。这种攻击的攻击目标网站或者服务通常是托管在高防服务器比如银行&#xff0c;信用卡支付网管&#xff0c;甚至根域名服务器。服务器出现缓慢的状况可能由很多事情导致&#xff0c;比如错误的配置&#xff0c;脚本…

linux应用程序逆向,Linux下查看并下载命令源码包(根据命令/应用程序逆向获取并且安装其所属源码包)...

使用linux的过程中&#xff0c;我们会熟悉各种命令&#xff0c;偶尔我们不禁会问&#xff0c;这些命令是怎么实现的&#xff0c;学习他们其实是学习linux高级系统编程很快捷的方法。这些命令的源码肯定是存放在相应的包里面&#xff0c;但是是哪些包呢&#xff1f;发行版的包管…

linux windows变色龙,体验开源变色龙SUSE Linux Enterprise Server 11

体验开源变色龙SUSE Linux Enterprise Server 11SUSE Linux Enterprise Server 11主要针对的是企业用户&#xff0c;SUSE产品分为SUSE Linux Enterprise Desktop(SLED)和SUSE Linux Enterprise Server(SLES)两个版本。笔者测试的版本为Server版本&#xff0c;主要面向SMB甚至是…

c语言数组下标越界检查程序,数组下标越界

已结贴√问题点数&#xff1a;20 回复次数&#xff1a;11数组下标越界题目是一个有10个元素的数组&#xff0c;存有10个考生的分数&#xff0c;写5个函数&#xff0c;分别计算总分&#xff0c;最高分&#xff0c;最低分&#xff0c;平均分&#xff0c;分数升序排列。我写了5函数…

weex android 性能,跨越适配性能那道坎,企鹅电竞Android weex优化

作者&#xff1a;龙泉&#xff0c;腾讯企鹅电竞工程师商业转载请联系腾讯WeTest获得授权&#xff0c;非商业转载请注明出处。WeTest 导读企鹅电竞从17年6月接入weex&#xff0c;到现在已经有一年半的时间&#xff0c;这段时间里面&#xff0c;针对遇到的问题&#xff0c;企鹅电…

华为5g鸿蒙折叠,华为5G折叠概念新机:内折叠+麒麟9000+鸿蒙OS 这才是华为的实力...

从手机二十多年的发展历史来看&#xff0c;现在很多形态各异的智能手机&#xff0c;其设计思路与功能机时代一样&#xff0c;比如三星Fold的折叠手机&#xff0c;就和功能机时代的翻盖手机类似&#xff0c;又或者OPPO的X 2021卷轴屏概念机&#xff0c;则和功能机时代的滑屏设计…

iis7.5配置 html,windows server 2008R2系统 IIS7.5配置伪静态的方法(urlrewrite)

这篇文章主要介绍了windows server 2008R2系统 IIS7.5配置伪静态页面 ,需要的朋友可以参考下从网上找了一下&#xff0c;原来微软IIS官方网站给IIS7及以后续版本提供了个URL重写组件。下载地址&#xff1a;http://www.iis.net/download/URLRewrite或者//www.iis7.com/softs/479…

cad多线段长度计算总和_没想到啊,我平时用的CAD多段线有这么多学问

很多人都说&#xff0c;CAD用多段线来代替直线绘图会比较方便&#xff0c;因为多段线除了常规直线功能之外&#xff0c;也能画弧线&#xff0c;更重要的是&#xff0c;一次命令执行的线条为一个整体&#xff0c;操作方便。难道多段线PL仅仅只有这明面上的实力吗&#xff1f;当然…

毕业与计算机专业,电子与计算机工程专业毕业后干什么

学分网给各位考生筛选整理了&#xff1a;电子与计算机工程专业毕业后能做什么&#xff0c;电子与计算机工程专业的就业去向&#xff0c;电子与计算机工程专业毕业后干什么&#xff0c;电子与计算机工程专业主要学习哪些课程&#xff0c;希望对大家有所帮助&#xff0c;更多的资…

网站备案靠谱吗_网站外包靠谱吗目前都是什么价位

网站外包靠谱吗先要防坑再说行情。说下网站外包那些容易入的坑&#xff0c;如果避开这些坑才能更好的做网站。经常遇到的问题如下假案例&#xff0c;吹牛逼&#xff1a;拿着别人的案例来忽悠&#xff0c;压根不是自己做的&#xff01;消极怠工&#xff0c;拖延工期&#xff1a;…

浪潮n系列服务器指示灯_【科恩电气】通用薄型区域传感器 NA2N系列

强烈推荐NA2-N系列通用薄型区域传感器&#xff0c;用作保障人身安全的检测装置时&#xff0c;请务必使用光幕传感器。垂询电话&#xff1a;400-867-5758NA2-N8/NA2-N12/NA2-N16/NA2-N20/NA2-N24/NA2-N28全系列现货供应产品详细参数如下&#xff1a;最大检测高度540mm(28光轴)实…

品质主管每日工作需要做哪些_做微信社群运营需要用到哪些工具来铺助工作呢?...

对社群工作进行运营并不是人们想象的那般不需要风吹日晒&#xff0c;只需要待在房间里就能够轻松工作了。虽然这些工作人员不需要每天风吹日晒的&#xff0c;但是工作起来一点都不轻松&#xff0c;而且还非常的繁琐。其实对微信社群运营是需要采取一些辅助工具来帮忙的&#xf…

蚂蚁森林快捷指令_iPhone「快捷指令」怎么玩?玩法太多,别让这个功能吃灰

自iOS 12.1.4 系统更新之后&#xff0c;苹果就增加了「快捷指令」这一功能。熟练使用这个功能的小伙伴&#xff0c;可以让平时的生活工作效率大大提升&#xff0c;将一系列复杂的流程变得简单化&#xff1b;对于不熟悉这个功能的小伙伴而言&#xff0c;它只藏在手机角落的一个小…

分享按钮 html代码,超简洁微博分享按钮代码

摘要由于本站实现了全站https&#xff0c;百度分享的js就失效了&#xff0c;虽然用的不多但总还是少了点什么。本来打算把百度分享的所有资源下载到我的服务器上调用&#xff0c;但转念一想我就用一个微博分享和百度分享啊&#xff0c;干嘛如此麻烦&#xff01;由于本站实现了全…

.rdlc 文件设置方向_在Word里面怎么设置把字竖着打出来?

如果是整篇的文字需要竖排&#xff0c;可以在菜单中依次打开【文件】-【页面设置】&#xff0c;找到【文字排列】设置为【垂直】。如果是部分竖排&#xff0c;则选中文字之后选择【插入】-【文本框】-【竖排】即可。操作步骤如下&#xff1a;1、整篇文档中的文字竖排&#xff1…

antd table排序会触发到分页怎么解决_多年管理系统开发经验总结~代码解决方案...

来源 | juejin.im/user/870468939940184 作者 | 前端小月月背景最近的你有没有接手的新项目&#xff0c;对这个有什么感觉&#xff1f;我最近接手了一个项目&#xff0c;先不论是否代码行数的多少&#xff0c;仅是思路就很混乱&#xff0c;像是一件衣服在打补丁&#xff0c;而…

如何占用计算机内存,电脑内存占用太高怎么办 教你电脑内存不够用解决方法...

现在很多白领买电脑&#xff0c;都会优先考虑电脑的续航和便捷&#xff0c;因为他们买电脑主要也就办办公&#xff0c;看看电影&#xff0c;又不玩大型游戏&#xff0c;所以高性能对他们来说也没什么必要。笔记本电脑但现在市面上续航久&#xff0c;便携性比较高的Intel电脑&am…

3d怎么把两个面拼接在一起_vr全景看房用什么软件做的?3D看房是怎么拍摄的?...

以往“看房跑断腿”的时代在vr全景看房出现后就得到了很大的解决&#xff0c;如今疫情和“宅经济”的双重影响下&#xff0c;各行各业不得不寻求线上转型&#xff1b;而vr全景对于房地产等行业便是一个很好的转型方式。vr全景看房也被一些朋友称之为是3D看房和VR看房&#xff0…

蓝牙小电池图标_提高MacBook电池寿命的15个技巧

苹果的MacBook系列以其电池寿命著称。它们的电池续航时间一般都很好&#xff0c;按照苹果公司的标准&#xff0c;所有型号的电池续航时间都保证为10小时。然而&#xff0c;这里有很多附加的条款和条件&#xff0c;如果你想延长你的MacBook Pro或MacBook Air的电池寿命&#xff…

html转word 时 字体颜色,【Web前端问题】文字大小和颜色随着热度改变如何做?...

回答&#xff1a;提供一个思路&#xff1a;可以根据热度设置一个倍率&#xff0c;然后字体大小和背景透明度根据倍率设置回答&#xff1a;使用websocket,热度变化时,数据自动改变回答&#xff1a;回答&#xff1a;我提供一个我自己写的小demo我猜楼主的问题是不知道如何把颜色亮…