《PHP Web应用开发案例教程》630-9(阮云兰)教案 第15课 高级特性和接口使用_第1页
《PHP Web应用开发案例教程》630-9(阮云兰)教案 第15课 高级特性和接口使用_第2页
《PHP Web应用开发案例教程》630-9(阮云兰)教案 第15课 高级特性和接口使用_第3页
《PHP Web应用开发案例教程》630-9(阮云兰)教案 第15课 高级特性和接口使用_第4页
《PHP Web应用开发案例教程》630-9(阮云兰)教案 第15课 高级特性和接口使用_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE8PAGE8PAGE9PAGE9

课题高级特性和接口使用课时2课时(90min)教学目标知识技能目标:(1)掌握继承及其相关知识的应用(2)掌握面向对象编程的高级特性(3)掌握接口的应用(4)了解PHP中魔术方法的应用素质目标:(1)培养精益求精、科学严谨、追求卓越的工匠精神(2)培养学生的逻辑思维、辩证思维和创新思维能力(3)紧跟时代发展,了解前沿科技,树立科技报国的人生理想教学重难点教学重点:面向对象编程的高级特性教学难点:PHP中魔术方法的应用教学方法案例分析法、问答法、讨论法、讲授法、实践法教学用具电脑、投影仪、多媒体课件、教材教学设计第1节课:→→→传授新知(38min)第2节课:→传授新知(20min)→课堂实训(15min)→课堂小结(3min)→作业布置(2min)教学过程主要教学内容及步骤设计意图第一节课课前任务【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过文旌课堂APP或其他学习软件,预习本节课要学习的知识【学生】完成课前任务通过课前任务,使学生预习本节课要学习的知识,增加学生的学习兴趣考勤(2min)【教师】使用文旌课堂APP进行签到【学生】班干部报请假人员及原因培养学生的组织纪律性,掌握学生的出勤情况问题导入(5min)【教师】提出以下问题:前面的内容中,类被当作模板,对象被当作活动组件,如何对一些类进行重复的使用?如何不实例化而直接访问变量和方法呢?通过问题导入,引导学生主动思考,激发学生的学习兴趣传授新知(38min)【教师】通过学生的回答引入要讲的知识,讲解PHP中的继承8.2继承类可以从其他类中扩展出来,扩展或派生出来的类拥有其基类(也称父类)的所有变量和函数,并包含所有派生类(也称子类)中定义的新功能,这称为继承。继承是面向对象最重要的特点之一,可以实现对类的复用。✈【教师】安排学生扫码观看视频“继承”,讲解知识✈【学生】扫码观看、理解、记忆8.2.1怎样继承一个类PHP是单继承的,一个子类只能继承一个父类,但一个父类却可以派生出多个子类。子类不能继承父类的私有属性和私有方法。在PHP5之后的版本中,类的方法和构造函数均可以被继承。当子类被实例化时,PHP会先在子类中查找构造方法,如果子类有自己的构造方法,PHP会优先调用子类中的构造方法;当子类中没有时,PHP会转而去调用父类中的构造方法。继承使用关键字“extends”来声明,声明继承的格式如下:classextendTestextendstest{ …}extendTest为子类名称,test为父类名称。✈【教师】通过多媒体展示例8-7的代码和运行结果,并进行讲解使用继承类。实例代码如下:<?php//父类classsite{private$url; //私有属性publicfunctionsetUrl($par){return$this->url=$par;}publicfunctiongetUrl(){return$this->url;}}//子类classchild_siteextendssite{publicfunctionoutput(){ //子类新增方法echo"我们网站的URL是:".@$this->url; }}$child_site=newchild_site(); //实例化子类$child_site->setUrl("/");//直接调用继承自父类的方法setUrl()echo$child_site->getUrl()."<br>";//直接调用继承自父类的方法getUrl()echo$child_site->output();?>例8-7中,在实例化子类child_site时,父类site的方法setUrl()和getUrl()被继承,可以直接调用父类的方法设置其属性$url并取得其值。由于子类不能继承父类的私有属性,所以output()方法不能取得父类的$url值,如果将父类的属性$url声明为public或protected,则是可以的,读者可自行尝试。8.2.2重写如果从父类继承的方法不能满足子类的需求,可以对其进行改写,该过程叫作方法的重写(override),也称方法的覆盖。在对父类的方法进行重写时,子类中的方法必须与父类中对应的方法具有相同的名称。✈【教师】通过多媒体展示例8-8的代码和运行结果,并进行讲解使用重写。实例代码如下:<?php//父类classsite{private$url="/";//私有属性private$title="金企鹅联合出版中心";//私有属性publicfunctiongetUrl(){return$this->url;}publicfunctiongetTitle(){return$this->title;}}//子类classchild_siteextendssite{private$title="金企鹅文化发展中心"; //私有属性publicfunctiongetTitle(){ //重写getTitle方法return$this->title;}}$site=newsite(); //实例化父类echo$site->getUrl()."<br>"; //调用父类的方法getUrl()echo$site->getTitle()."<hr>"; //调用父类的方法getTitle()$child_site=newchild_site(); //实例化子类echo$child_site->getUrl()."<br>"; //直接调用继承自父类的方法getUrl()echo$child_site->getTitle(); //调用重写后的方法getTitle()?>在重写方法时需注意以下几点:子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。在声明方法时如果没有定义访问权限,则权限默认为public。子类中的覆盖方法可以拥有与父类中被覆盖方法不同的参数数量,如例8-8中的覆盖方法可以写作:publicfunctiongetTitle($t){ //重写getTitle方法$this->title=$t;return$this->title;}父类中的构造方法也可以重写。8.2.3“$this->”和“::”的使用子类不仅可以调用自己的变量和方法,也可以调用父类的变量和方法。并且对于其他不相关的类成员同样可以调用。PHP是通过伪变量“$this->”和作用域操作符“::”来实现这些调用的。前面的学习中曾简单介绍过这两个字符,本节将详细介绍它们的应用。1.$this->在8.1.3节介绍成员方法时曾简单介绍过“->”符号的应用,就是用“对象名->方法名”的格式来调用成员方法。但一般在定义类时,是无法得知对象的名称是什么的。这样如果想调用本类中的方法,就要使用伪变量$this->。$this就是指本身,所以$this->只能在类的内部使用。✈【教师】通过多媒体展示例8-9的代码和运行结果,并进行讲解当将类实例化后,$this会同时被实例化为本类的对象,此时对$this使用

get_class()函数将返回本类的类名。实例代码如下:<?phpclasscheckout{ //创建类checkout functiontest(){ //创建成员方法 if(isset($this)){ //判断变量$this是否存在 echo'$this的值为:'.get_class($this); //如存在,输出$this所属类的名称 }else{ echo'$this未定义'; } }}$class_name=newcheckout(); //实例化对象$class_name$class_name->test(); //调用方法test()?>get_class()函数返回对象所属的类名,如不是对象,则返回false。2.操作符“::”相对只能在类内部使用的伪变量$this->来说,操作符“::”更为强大。它可以在没有声明任何实例的情况下访问类中的方法或变量。其使用格式如下:关键字::变量名/常量名/方法名此处的关键字分为以下3种情况:parent:用于调用父类中的成员变量、成员方法和常量。self:用于调用当前类中的静态成员和变量。类名:用于调用本类中的变量、常量和方法。✈【教师】通过多媒体展示例8-10的代码和运行结果,并进行讲解本例依次使用了类名、parent关键字和self关键字来调用变量和方法。读者可观察输出结果。实例代码如下:<?phpclasssite{ constTitle='北京金企鹅文化发展中心'; //常量Title function__construct(){ //构造方法 echo'本网站的标题为:'.site::Title.'<br>'; //输出默认值 }}classchild_siteextendssite{ //site类的子类 constTitle='北京金企鹅联合出版中心'; //声明常量 function__construct(){ //子类的构造方法 parent::__construct(); //调用父类的构造方法 echo'本网站的标题为:'.self::Title.''; //输出本类中的默认值 }}$obj=newchild_site(); //实例化对象?>【教师】讲解PHP中的高级特性8.3高级特性8.3.1静态变量(方法)前面的内容中,类被当作模板,对象被当作活动组件,面向对象编程中的操作都是通过类的实例(对象)来完成的。事实上,并不是所有的变量(方法)都要通过创建对象来调用。声明类属性或方法为static(静态),就可以不实例化类而直接访问。调用静态成员的格式为关键字::静态成员此处的关键字分为以下两种情况。self:在类内部调用静态成员时使用。静态成员所在类名,在类外部调用类内部的静态成员时使用。使用静态成员,除了不需要实例化对象外还有一个好处,就是在对象被销毁后,依然保存被修改的静态数据,以便下次继续使用。✈【教师】通过多媒体展示例8-11的代码和运行结果,并进行讲解静态成员的使用。实例代码如下:<?phpclassNote{ //Note类 static$n=1; //声明一个静态变量$n,初值为1 publicfunctionshowMe(){ //申明一个方法 echo'我们一共有'.self::$n.'个人!'; //输出静态变量 self::$n++; //将静态变量加1 }}$notea=newNote(); //实例化类$notea->showMe(); //调用showMe()方法echo"<br>";$noteb=newNote(); //实例化类$noteb->showMe(); //再次调用showMe()方法echo"<br>";echo'我们一共有'.Note::$n.'个人!'; //直接使用类名调用静态变量?>在例8-11中,首先定义一个静态变量$n,接着定义一个方法,在方法内部调用静态变量,之后给变量加1。依次实例化类生成两个对象,并调用类方法。可以发现两个对象中的方法返回的结果是有联系的。最后直接使用类名输出静态变量。静态属性不能通过一个类已实例化的对象来访问,但静态方法可以。静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。静态属性不可以由对象通过->操作符来访问。8.3.2final类和方法继承为类的应用带来了巨大的灵活性。通过覆写类和方法,调用同样的成员方法可以得到完全不同的结果,但有时候,也需要类或方法保持不变,这时就要用到final关键字。如果要声明一个类为final,可以采取如下格式:finalclassSize{//…}声明为final的类不能被继承,也不能有子类。✈【教师】通过多媒体展示例8-12的代码和运行结果,并进行讲解final类的应用。实例代码如下:<?phpfinalclassCount{ //final类Count function__construct(){ //构造方法 echo'我是final类'; }}classCount_aextendsCount{ //创建Count的子类Count_a staticfunctionexam(){ //子类中的方法 echo"我是子类中的方法"; }}Count_a::exam(); //调用子类方法?>例8-12设置了final类Count,并生成了子类Count_a,可以看出程序报错,无法执行。如果要声明一个方法为final,可以采取如下格式:finalfunctionmin()如果父类中的方法被声明为final,则在子类中无法覆盖或重写该方法。当不希望一个类被继承时,可以将该类声明为final;当不希望类中的某个方法被子类重写时,可以设置其为final方法。8.3.3常量属性可以把在类中始终保持不变的值定义为常量。PHP中使用const关键字定义常量,在定义和使用常量时不需要使用$符号。此外,使用const定义的常量名称一般都大写。类中常量的使用方法类似于静态变量,不同的是,它的值不能被改变。调用常量时使用以下格式:类名::常量名✈【教师】通过多媒体展示例8-13的代码和运行结果,并进行讲解常量属性。实例代码如下:<?phpclassMyClass{ //声明类constCONSTANT='常量值'; //声明常量functionshowConstant(){ //成员方法echoself::CONSTANT; //输出常量值}}echoMyClass::CONSTANT."<br>"; //输出常量值$class=newMyClass(); //实例化类$class->showConstant(); //调用成员方法?>常量的值必须是一个定值,不能是变量、类属性、数学运算的结果或函数调用。同静态属性一样,只能通过类本身而不是类的实例访问常量属性。当需要在类的所有实例中都能够访问某属性,并且属性值无须改变时,可以使用常量属性。8.3.4abstract类和方法使用abstract关键字修饰的类或方法称为抽象类或抽象方法。抽象类不能被直接实例化,只能作为其他类的父类来使用。抽象方法只是声明了其调用方式(参数),不能定义其具体的功能实现。子类可以继承它并通过实现其中的抽象方法,来使抽象类具体化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么该类就必须被声明为抽象的。抽象类可以像普通类那样去声明,但必须以分号而不是方法体结束。抽象方法只有方法的声明部分,没有方法体。继承一个抽象类的时候,父类中的所有抽象方法在子类中必须被重写;此外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。✈【教师】通过多媒体展示例8-14的代码和运行结果,并进行讲解抽象类和方法的应用。实例代码如下:<?phpabstractclassTest{ //定义抽象类abstractprotectedfunctiongetValue(); //定义抽象方法abstractprotectedfunctionprin($p); //定义抽象方法//普通方法(非抽象方法)publicfunctionprintOut(){print$this->getValue();}}classTest1extendsTest{ //定义子类,继承抽象类protectedfunctiongetValue(){ //重写抽象方法return"重写抽象方法1!<br>";}publicfunctionprin($p){ //重写抽象方法return"{$p}重写抽象方法2!";}}$class1=newTest1; //实例化子类$class1->printOut(); //调用方法echo$class1->prin('FOO_'); //调用方法?>【学生】聆听、思考、记录通过教师的讲解和演示,使学生了解PHP中的继承和高级特性第二节课问题导入(5min)【教师】提出以下问题:你知道PHP中的接口是什么吗?它有什么作用?【学生】思考、举手回答通过问题导入,引导学生主动思考,激发学生的学习兴趣传授新知(20min)【教师】通过学生的回答引入新知,介绍PHP中接口的使用,以及魔术方法8.4接口的使用前面说过,PHP只支持单继承,父类可以派生出多个子类,但一个子类只能继承自一个父类。但在一些场景中,往往需要用到多继承,即一个子类继承多个父类的方法,接口有效地解决了这一问题。接口是一种类似于类的结构,使用它可以指定某个类必须实现哪些方法。它只包含方法原型,不需要包含方法体。这些方法原型必须被声明为public,不可以为private或protected。接口是通过interface关键字来声明的,声明格式如下:interfaceTest{}与继承使用extends关键字不同的是,实现接口需要使用implements操作符。classcheckoutimplementsTest{}实现接口的类中必须实现接口中定义的所有方法,除非该类被声明为抽象类。类可以实现多个接口,用逗号来分隔多个接口的名称。classcheckoutimplementsinterface1,interface2{functioninterface1(){//功能实现}functioninterface2(){//功能实现}…}✈【教师】通过多媒体展示例8-15的代码和运行结果,并进行讲解接口的使用。实例代码如下:<?php interfacePower{ //定义接口 functionrules(); //定义方法 } interfacePermission{ functionright(); } classUserimplementsPermission{ //创建子类User,实现一个接口Permission functionright(){ echo'实现一个接口'; } } classManagerimplementsPower,Permission{//创建子类Manager,实现多个接口 functionrules(){ echo'实现多个接口中的第一个'; } functionright(){ echo'实现多个接口中的第二个'; } } $user=newUser(); //实例化子类User $manager=newManager(); //实例化子类Manager $user->right(); //调用$user对象的right方法 echo'<p>'; $manager->rules(); //调用$manager对象的rules方法 echo'<p>'; $manager->right(); //调用$manager对象的right方法?>由以上实例可以看出,抽象类和接口实现的功能类似。抽象类可以实现公共的方法,而接口则可以实现多继承。可以根据具体情况决定何时使用抽象类和接口。8.5PHP中的魔术方法在PHP中以两条下画线“__”开头的方法被称为“魔术方法”,是系统预定义的方法。如果需要使用这些魔术方法,必须先在类中定义。前面学过的构造方法“__construct()”和析构方法“__destruct()”都属于魔术方法。魔术方法的作用、方法名、使用的参数列表和返回值都是规定好的,在使用这些方法时,需要用户自己根据需求编写方法体的内容。使用时无须调用,它会在特定情况下自动被调用。PHP将所有以两条下画线开头的类方法保留为魔术方法。所以在定义类方法时,除魔术方法外,建议不要以“__”为前缀。8.5.1__set()方法在PHP程序试图给一个未定义的属性赋值时,就会调用__set()方法。__set()方法包含两个参数,分别表示变量-名称和变量值,两个参数均不可省略。✈【教师】通过多媒体展示例8-16的代码和运行结果,并进行讲解使用__set()方法赋值。实例代码如下:<?phpclassTest{ //定义类Testpublicfunction__set($name,$value){ //声明魔术方法__set()echo"__set函数被调用了<br>"; echo"\$name={$name},\$value={$value}<br>"; $this->$name=$value;}}$a=newTest(); //实例化类Test$a->name="变量值"; //给变量赋值echo$a->name; //调用变量name?>8.5.2__get()方法当需要调用一个未定义或不可见(私有)的成员变量时,可以使用__get()方法读取变量值。__get()方法有一个参数,表示要调用的变量名。✈【教师】通过多媒体展示例8-17的代码和运行结果,并进行讲解使用__get()方法访问私有属性。实例代码如下:<?phpclassTest{ //类Testprivate$data="私有变量"; //私有变量$datapublicfunction__get($value){ //声明魔术方法__get()echo"__get函数被调用了<br>"; return$this->$value;}}$a=newTest(); //实例化类Test()echo$a->data; //调用私有变量$data?>8.5.3__call()方法当程序试图调用不存在或不可见的成员方法时,PHP会自动调用__call()方法来存储方法名及其参数。该方法包含“方法名”和“方法参数”两个参数,其中的“方法参数”以数组形式存在。✈【教师】通过多媒体展示例8-18的代码和运行结果,并进行讲解使用__call()方法。实例代码如下:<?phpclassTest{ //类Test publicfunctionCheckOut(){ //方法 echo'如果调用的方法存在,则执行此方法。<br>'; }publicfunction__call($m,$p){ //__call()方法 echo'当调用的方法不存在时,自动执行__call()方法。<br>';echo'方法名为:'.$m.'<br>'; //输出第一个参数,即方法名echo'参数有:'; var_dump($p); //输出第二个参数}}$Me=newTest(); //实例化类Test()$Me->CheckOut(); //调用存在的方法CheckOut()$Me->Dream('one','two','three','four'); //调用不存在的方Dream()?>8.5.4__toString()方法__toString()方法用于在使用echo或print输出对象时,将对象转化为字符串。✈【教师】通过多媒体展示例8-19的代码和运行结果,并进行讲解使用__toStri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论