php从入门到精通,潘凯华编著。本次上传是第四部分内容。第14章面向对象class subclass implements Interface Name1, Interface[function interface Name1X∥功能实现function interface Name2(X能实现例1414】本例首先声明了两个接口 POpedom和 PUrview,接着声明了两个类 Membe和 Manager,其中 Member类继承了 POpedom接口; Manager继承了 POpedom和 MPurview接口。分别实现各自的成员方法后,实例化两个对象$ member和 Manager。最后调用实现后的方法。实例代码如下;(实例位道:光盘IMsN414php广声朝接口 POpedominterface MPopedomfunction popedom声明口 PUrviewnterface mPurview【unction purview);芦创建子类 Membe,实现一个技口 PUrviewclass Member implements MPurviewfunction purviewecho会员拥有的权限。刨魂子类 Manager,实现多个整口 PUrvEy和 MPopedonclass Manager implements MPurview, MPopedomfunction purview(echo管理员拥有会员的全部权限。;function popedom(Mecho理员还有会员没有的权限Smember new member o:∥类 Member实例化manager new Manager(类 Manager实例化Smember→ purview()∥调用$ member对象的 purview方法echo
'.Smanager-> purview (:调用$ anager对象的 purview方法Smanager->popedom:调用$ manage对象的ppem方法运行结果如图148所示。289PHP从入门到精通(第2版文件销看的收羸工具⑦”翻员用有的权限首理员有会的全部视限,管理员还育会员没有的限省溶平可信点图148应用接口通过上面的实例可以发现,抽象类和接口实现的功能十分相似。抽象类的优点是可以在抽象类中实现公共的方法,而接口则可以实现多继承。至于何时使用抽象类和接口就要看具体实现了。1434克隆对象1.克隆对象在PHP4中,对象被当作普通的数据类型来使用。如果想引用对象,需要使用“&”来声明,否则会按照PHP4的默认方式来按值传递对象。下面结合实例说明。【例1415】本例首先实例化一个 Sportobject类的对象sbok,$book1的默认值为book,然后将对象$book使用普通数据类型的赋值方式给对象$book2赋值。改变$bk2的值为 computer,再输出对象$book1的值。实例代码如下:(实倒位置:光盘ⅥTM1415)≤?phpclass Sportobjectt类 Sportobjectprivate Object type= 'book:∥声明私有变量$ object type,并赋初值为bokpublic function setType(StypeX∥声明成员方法 setType,为变量 Object_type赋值sthis ->object type Stype,public function getTypeo∥声明成员方法 get Type,返回亚量 Object type的值return $this->object type:sbook1 new Sportobject(∥实例化对象$book1Sbook2 Sbook1∥用普通数据类型的方法给对象$book2赋值book2-> setType(computer);改变对象$book2的值ech时对象$book1的值为: sbook1 getType〔川输出对象$book1的值上面的实例在PHP5中的返回值为“对象$ book1的值为; computer",因为$bok2只是 Shook的一个引用;而在PHP4中的返回值是“对象$book1的值为:bok”,因为对象$bo2是$bok1的一个备份。在PP5中如果需要将对象复制,也就是克隆一个对象。需要使用关键字con来实现。克隆对象的格式为:Sobject1 E new ClassName0Sobject2 clone Objecti第14幸面向对象将例1415中的$book2-$ bookl修改为$book2= clone$ book1,其他不变,即可返回PHP4中的结果。2._cone(方法有时除了单纯地克隆对象外,还需要克隆出来的对象可以拥有自己的属性和行为。这时就可以使用 cloned方法来实现。 clonee方法的作用是:在克隆对象的过程中,调用_ cloned方法,可以使克隆出来的对象保持自已的一些行为及属性。【例1416】本实例将例1415的代码做一些修改。在对象$ book1中创建 clone(方法,该方法实现的功能是将变量$ bject type的默认值从book修改为 computer使用对象$book1克隆出对象bok2,输出$book1和Sbok2的 Object type值,査看最终的结果。实例代码如下:(实例位:光盘ⅥTMs1416)class sportobjectt类 Sportobjectprivate Object_type =book月声明私有变量$ object type,并赋初值为bkpublic function setType(StypeM∥声明成员方法 setType,为变量$ object_ type赋值sthis -> object type= Stypepublic function getT ype(声明成员方法 getType,返回变量 Object_ type的值return $this -> object type:publlc functlon clone(C∥声明cane()方法hlsˉ object_type= computH将变量 Object type的值修改为 computersboak1 new SportobjectoH实例化对象$book1Sbook2=clone book∥使用普通数据类型的方法给对象$book2赋值echo对象$book的变量值为:∵ Sbook1→> getType(;f输出对象$book1的值echo getType(运行结果如图149所!文件))查看凹收露工具”··回/搬索收英对象bk的量为:b9k对象b≌的量值为: computer本地工图149 cloned方法不难看出,对象$bk克隆了对象$ookl的全部行为及属性,也拥有了属于自己的成员变量值。14.35对象比较通过克隆对象相信读者已经理解表达式 Object2=$ect1和 oBject?= clone $object1所表示的29PH从入门到精通〔第2版)不同含义。但在实际开发中,还需判断两个对象之间的关系是克隆还是引用,这时可以使用比较运算符“=”和“一二”。两个等号“=”是比较两个对象的内容,3个等号“=”是比较对象的引用地址【例1417】本例首先实例化一个对象$book,然后分别创建个克隆对象和引用,使用和”判断它们之间的关系,最后输出结果。实例代码如下:(实例住道:光盘TMsI417)r Sportobjec类"class sportobjectprivate Sname:function_ construct(Samex$ths→name=$name;Sbook new SportObject( book∥实例化一个对象$bookScloneBook clone Sbook∥克隆对象$ codebOokSreferBook= Sbook∥用对象$ referBookif(Clone Book== $book∥使用==比较克隆对象和原对象echa两个对象的内容相等?>结果为:两个对象的内容相等两个对象的引用地址相等143.6对象类型检测instanceof操作符可以检测当前对象是属于哪个类。一般格式为:ObjectName instanceof ClassName【例1418】本实例首先创建两个类,一个基类( SportObje)与个子类( MyBook)。实例化个子类对象,判断对象是否属于该子类,再判断对象是否属于基类。实例代码如下:(实例位卫:光盘Ms1418)<7ohclass Sportobjectt∥创建空类 Sportobjectclass MyBook extends Sportobject∥创建子类 MyBookprivate StypeScBook new MyBook()J实例化对象$ cOokif(ScBaok instanceof MyBook)∥判断对象是否属于类 MyBookecho对象$ cOok属于 MyBook类Sname)X判断变量是否被声明echo变量$name的值为:'$this→>$name:
$name=0;∥如果未被声明,则对变量初始化293PHP从入门到精通(第2版)private function_set(Sname, $)∥声明魔术方法setif(isset(Sthis-> Sname)判断变量是否定义sthis→$name=$ value;echo变量!$name值为::$ value
ese〔Sthis->Sname=Svalue∥如果未定义,继续对变量进行赋值echo变量$name被初始化为:",$vaue"
type:∥调用变量sype$ MyComputer→>name;∥调用变量$name运行结果如图14.10所示。生htp//na1hst回划文件2)朝q意哥①收腐Q工具①哪”:>搜囊收意夹撤岱变量ty赋为:叮Y受量为:m1义,初始化为日帖化为:0卷亮毕幕地Ete图140s0和ge0方法2._cal()方法caO方法的作用是:当程序试图调用不存在或不可见的成员方法时,PHP会先调用_《aO方法来存储方法名及其参数。ca0方法包含两个参数,即方法名和方法参数。其中,方法参数是以数组形式存在的。【例1420】本例声明一个类 Sportobject,类中包含两个方法,即 my Dream0和cal(O实例化对象$ MyLife需调用两个方法,一个是类中存在的 my Dreamo方法,一个是不存在的 dReamy方法。实例代码如下:(实倒位:光鑫MN140)类 Sportobjectclass Sportobjecttpublic function my(X∥方法 my Dream)echo调用的方法存在,直接执行此方法。p>';public function call(Method, Sparameter)i∥ca(方法echo如果方法不存在,则执行ca0方法。my Dreamo∥调用存在的方法 myDream()Sexam - mDream' how, what, why)∥调用不存在的方法 dReams运行结果如图14.1所示。:Oxf文件)朝①查看Q收工属帮⑩后·)·!∥攒釁“收限妒蠣体烈{x⑧用的方法存在,直搔执行此方法法不存在,剧行c1法为:nraMar4y)[[0l-)xtr1g(3)"hw”[1]=> string(4)“购ht21= string}"hy"完单!「本增I血r面n图1411calO方法3. sleep(和 wakeup(方法使用 serialize(函数可以实现序列化对象。就是将对象中的变量全部保存下来,对象中的类则只保存类名。在使用 serialized函数时,如果实例化的对象包含 sleep方法,则会先执行slee0方法。该方法可以清除对象并返回一个该对象中所有变量的数组。使用sle0法的目的是关闭对象可能具有的数据库连接等类似的善后工作。unserializeC函数可以重新还原一个被 serialized函数序列化的对象,_ wakeup(方法则是恢复在序列化中可能丢失的数据库连接及相关工作。【例1421】实例首先声明一个类 Sportobject类中有两个方法,即_sep0和 wakeup。实例化对象$ myBook,使用 serialize函数将对象序列化为一个字串$,最后再使用 unserializel(函数将字串$i还原为一个新对象。实例代码如下:(实例位星;光盘 MSl141) getType0;∥调用新对象 RetOok的 getType()法?运行结果如图142所文件q)躺)查藿收藏G)工具①)删助搜索收藏夹的媒体便用 seri alir()函数将对象保存起来,可以存到文本文件、数臀库等地方序列化后的字符串∶08:" bject":1,s:3"Dr”;M当希要该数时使用drd1x()函数对已序列化的字符郾进行操作,将其转换回对象还原后的成员变量:DYg完毕本地工 intranet图14128p0和 wakeup)方法4._ tostring(方法魔术方法 toString的作用是:当使用echo或 print输出对象时,将对象转化为字符串。【例1422】本例输出类 SportObject的对象 Smy Computer,输出的内容为 tostring(O方法返回的内容。实例代码如下:(实倒位置:光盘TMsl1422)class Sportobject∥类 Sportobiprivate Stype=DIY;∥声明私有变量$typepublic function toString ((∥声明 toString()方法return Sthis -> type∥法返回私有变量$type的值Smy Computer new Sportobjecto:实例化对象$ my Computerecho对象 my Computer的值为;echo smy Compute输出对象$ myComputer运行结果为,对象$ my Computer的值为:DY注意(1)如果没有_⑩ Stringl)方法,直接榆出对象将会发生致命错误( fatal error)(2)输出对象时应注意,cho或prin函数后面直接跟要输出的对象,中间不要加多余的字符,否则 toString方法不会被执行.如echo"字串 Smy Computer、echo" Smy Computer等都不可以,定要注意5. autoland)方法将一个独立、完整的类保存到一个PP页中,并且文件名和类名保持一致,这是每个开发人员都需要养成的良好习惯。这样,在下次重复使用某个类时即能很轻易地找到它。但还有一个问题是让开发人员头疼不已的,如果要在一个页面中引进很多的类,需要使用 include_oneO函数或 require once296