PHP程序设计基础 课件 单元6 面向对象程序设计_第1页
PHP程序设计基础 课件 单元6 面向对象程序设计_第2页
PHP程序设计基础 课件 单元6 面向对象程序设计_第3页
PHP程序设计基础 课件 单元6 面向对象程序设计_第4页
PHP程序设计基础 课件 单元6 面向对象程序设计_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

第六单元

面向对象程序设计课程内容01面向对象基础02类的封装03类的继承04接口与多态05综合案例目录

导入项目概述面向对象程序设计作为一种重要的编程方式,在PHP程序设计中占据着核心地位。它以对象为基础,将数据和操作数据的方法封装在一起,通过类的定义来创建对象,从而实现对现实世界中各种实体和关系的模拟与处理。在本项目中,我们将深入探究面向对象程序设计的各个方面。首先,从概念入手,清晰地理解什么是类,什么是对象,以及它们之间的关系。类就像是一个模板,规定了对象所具有的属性和方法;而对象则是类的实例化,是具体存在的实体。封装性是其中的关键特性之一,它将类的内部实现细节隐藏起来,只对外提供公共的接口,这样可以提高代码的安全性和可维护性。继承特性则允许一个类从另一个类中获取属性和方法,这大大提高了代码的复用性。多态性使得相同的操作在不同的对象上可以有不同的表现形式。通过本项目的学习,学生将能够熟练掌握面向对象程序设计在PHP中的应用,能够运用这些知识构建出结构清晰、易于维护和扩展的程序,为后续开发更复杂的项目奠定基础。

思维导图任务描述使用面向对象技术实现学生类的定义及实例化,实现类的属性及方法的定义与引用,实现构造函数、析构函数的定义及引用。任务6.1PHP设计学生类1.1面向过程开发软件的缺点1.面向对象技术简介在程序设计中,有两种典型的编程技术,面向过程编程(ProcedureOrientedProgramming,POP)与面向对象编程(ObjectOrientedProgramming,OOP)技术。1.1面向过程开发软件的缺点主要体现在以下几个方面:(1)代码重用性较低,因为面向过程以函数开发为主,缺乏模块化的结构,使得代码难以在不同项目中复用。(2)扩展性差,当需要添加新功能时,往往需要修改大量的现有代码,这不仅增加了开发时间,也提高了出错的风险。(3)面向过程的软件维护难度较大,随着软件规模的扩大,代码的复杂度和相互依赖关系会迅速增长,导致维护成本急剧上升。(4)面向过程开发在应对复杂问题时可能显得力不从心,因为它更侧重于步骤和算法,而非问题的整体结构和对象间的交互。1.2面向对象编程技术介绍1.面向对象技术简介面向对象程序设计就是要解决事物的归类,分析每类事物的特点,找出各类事物之间的联系及相互作用。在面向对象程序中的一切事物产生的个体都视为“对象”,将具有相同的属性和行为的对象归纳成“类”,这个过程叫做抽象。在面向对象程序设计中,对象的特点包括:属性和方法。属性指的是对象的特征,如学生的学号、姓名、性别等,可以用变量来表示;方法指的是对象的行为及相关操作,如学生修改个人信息、查询成绩、请假等,可以用函数来表示。1.3面向对象程序开发技术的特点1.面向对象技术简介对象:对象是现实世界或抽象思维中的实体在计算机中的表示,是面向对象编程的核心。对象具有状态(属性)和行为(方法)。类:类是对象的模板或蓝图,它定义了一组对象共有的属性和方法。通过类可以创建类的实例,即对象。1.3面向对象程序开发技术的特点---主要特性1.面向对象技术简介类的封装封装是面向对象编程的核心思想之一。它将对象的属性和方法结合成一个独立的单元,并尽可能隐藏对象的内部细节,只对外提供与对象交互的接口。封装的好处是提高了代码的安全性和可维护性。类的继承继承允许定义一个类(称为父类或基类)作为另一个类(称为子类或派生类)的基础,子类可以继承父类的属性和方法。继承提高了代码的复用性和可维护性。多态多态指的是同一个方法调用在不同的对象上可能产生不同的结果。多态性允许以统一的接口处理不同类型的对象,从而提高了代码的灵活性和可扩展性。1.3面向对象程序开发技术的特点1.面向对象技术简介优点代码重用性高:通过继承,子类可以重用父类的属性和方法,封装好的对象也可以在多个地方重复使用。降低了系统的复杂性:面向对象编程将复杂的系统分解成多个相对简单的对象,使得代码更加易于理解和维护。提高了系统的可维护性:封装隐藏了对象的内部实现细节,降低了模块之间的耦合度。易于扩展:通过继承和多态性,可以方便地扩展已有类的功能。更加灵活:面向对象编程支持动态绑定和多态性,使得程序在运行时可以根据需要动态地改变对象的类型和行为。2.类的定义<?php[权限修饰符]class类名

{//类体(属性和方法)}?>权限修饰符:可用的权限修饰符包括public、protected、private等,默认是public。class:创建类的关键字。类名:遵循PHP的命名规则,通常使用大写字母开头的驼峰式命名法,在类名之后必须加一对花括号{}。类体:定义类共同具有的属性和方法,这些属性和方法是类的成员。2.1类属性的定义2.类的定义例6-1:定义Student类并进行实例化<?php//学生类定义classStudent{public$name;//姓名属性public$stuId;//学号属性}//实例化对象并赋值$stu1=newStudent();$stu1->name="李红";$stu1->stuId="2025001";//输出属性echo$stu1->name."<br>";echo$stu1->stuId;?>定义一个学生(Student)类包含公共属性姓名、学号public(默认):定义公共属性,可以在类的外部被访问和修改。protected:定义受保护属性,只能在类内部、子类以及同一个命名空间内的其他类中访问。private:定义私有属性,只能在类内部访问,不能在类的外部或子类中直接访问。使用new关键字创建对象,语法格式如下。对象名=new类名([参数1],[参数2],...);通过“对象->成员”的方式访问成员属性。如$stu1->name、$stu1->stuId,成员名称前不需要加$符号。2.2类方法的定义2.类的定义例6-2:给Student类的内部增加一个输出学生信息的方法。<?php//学生类定义classStudent{public$name;//姓名属性public$stuId;//学号属性//输出学生信息的方法publicfunctionshowInfo(){echo"姓名:{$this->name}<br>学号:{$this->stuId}";}}//实例化对象并赋值$stu1=newStudent();$stu1->name="李红";$stu1->stuId="2025001";//调用方法输出信息$stu1->showInfo();?>通过function关键字定义的,但与普通函数不同的是,方法必须定义在类的花括号{}内部。方法可以用public(可以从类的外部访问)、protected(只能在类的内部以及继承类中访问)、private(只能在类的内部访问)等修饰符,用于控制方法的访问权限。在类的成员方法中使用该类的成员属性时,此时应使用“$this->成员属性”的格式进程成员变量的引用。3.1构造方法3.类构造方法与析构方法构造方法的定义格式如下:function__construct(参数列表){//函数体(一般完成初始化操作)}构造方法必须命名为__construct()。每个类都有一个构造方法,用于在创建对象时自动调用。如果在类中没有显式的声明它,PHP会自动生成一个没有参数,没有任何操作的默认构造方法。2.2类方法的定义2.类的定义例6-3:为Student类创建构造方法并完成相关数据的初始化<?phpclassStudent{public$name;//姓名public$stuId;//学号//构造方法:创建对象时自动调用,用于初始化属性publicfunction__construct($name,$stuId){$this->name=$name;$this->stuId=$stuId;}publicfunctionshowInfo(){echo"姓名:{$this->name}<br>学号:{$this->stuId}";}}//实例化对象时直接传入参数(自动调用构造方法)$stu1=newStudent("李红","2025001");$stu1->showInfo();?>创建构造方法,完成属性的初始化赋值操作Student类实例化对象时,直接在类名后面加上了参数列表,参数列表的数量和顺序是根据构造函数的参数列表设置。创建类的对象时自动调用构造函数完成对象的初始化工作。注意事项:•构造方法不能被显式调用,只能由new操作符自动调用。•一个类只能有一个构造方法。3.2析构方法3.类构造方法与析构方法析构方法的定义格式如下:publicfunction__destruct(){//析构函数内容(完成清理任务等)}析构方法是对象被销毁之前最后被对象自动调用的方法,以在销毁一个对象之前完成一些特定的操作,关闭文件句柄、释放数据库连接等。例6-4:使用析构方法销毁Student对象classStudent{publicfunction__destruct(){echo"Student对象已销毁";}}$stu=newStudent();unset($stu);//触发析构方法,输出"Student对象已销毁"注意事项:•析构方法不能被显式调用。•如果在对象被销毁前已经手动释放了资源(例如关闭了文件句柄),析构方法中不应再尝试释放这些资源,以避免错误。任务实施<?phpclassStudent{//类的属性public$name;//姓名public$student_id;//学号//1.构造方法:创建对象时自动调用,初始化属性publicfunction__construct($name,$student_id){$this->name=$name;$this->student_id=$student_id;echo"对象创建成功:{$this->name}({$this->student_id})<br>";}//2.信息展示方法:输出学生完整信息publicfunctionshowInfo(){echo"学生信息:<br>";echo"姓名:{$this->name}<br>";echo"学号:{$this->student_id}<br>";}//3.析构方法:对象销毁时自动调用,释放资源publicfunction__destruct(){echo"对象已销毁:{$this->name}({$this->student_id})<br>";}}//测试代码$stu1=newStudent("李红","2025001");//创建对象(自动触发构造方法)$stu1->showInfo();//调用方法展示信息unset($stu1);//手动销毁对象(会触发析构方法)?>任务描述使用三个权限修饰符public、protected、private对类中的成员属性、成员方法进行封装。任务6.2类的封装知识准备在PHP面向对象开发中,封装是面向对象编程的三大基本特性之一(另外两个是继承和多态)。封装的主要目的是隐藏类的内部实现细节,仅对外暴露必要的公共接口,从而保护对象的状态和行为不被外部随意修改,增强代码的安全性和可维护性。在PHP中类的封装通过访问控制符实现,分别为public(公开的)、protected(受保护的)、private(私有的)。知识准备1.public公共成员•定义:使用public关键字定义的类成员,可以在类的外部被访问和修改。•访问范围:public成员对类的实例、子类以及类外部的代码都是可见的。•用途:通常用于那些需要被类的用户直接访问和修改的成员。2.protected受保护成员•定义:使用protected关键字定义的类成员。•访问范围:protected成员只能在本类及其子类中被访问和修改,其他地方不可以被调用。•用途:protected成员可以在定义它们的类内部被访问和修改,任何继承该类的子类都可以访问protected成员,类的实例外部的代码无法直接访问protected成员。3.private私有成员•定义:使用private关键字定义的类成员。•访问范围:private成员只能被其所在类的内部方法访问的成员变量或方法,其他地方都不可以被调用。•用途:private成员可以在定义它们的类内部被访问和修改,不能从类的外部直接访问,也不能被该类的子类访问。类的封装使用public修饰的公共成员定义及调用<?phpclassMyClass{public$public_A;publicfunctionpublicMethod()//公共方法{ echo"这是一个公共方法。";}}$obj=newMyClass();//创建类的实例$obj->public_A="Hello,World!<br>";echo$obj->public_A;//输出:Hello,World!$obj->publicMethod();//输出:这是一个公共方法。?>公共属性公共方法使用protected修饰的受保护成员的定义及调用<?phpclassMyClass{protected$protected_A="Hello,World!";publicfunctionpublicMethod()//公共方法{echo$this->protected_A;}}$obj=newMyClass();//$obj->$protected_A="Hello,PHP!";//echo$obj->$protected_A;$obj->publicMethod();?>受保护属性

公共方法试图修改和访问类的受保护成员,运行程序会出现错误提示注意事项:在类的内部,公共方法publicMethod()可以访问protected属性$protected_A,而在类的外部则没有权限访问protected属性$protected_A。使用private修饰的私有成员的定义及调用<?phpclassMyClass{private$privateVar='Iamprivate';public$publicVar='Iampublic';publicfunctionshowVars(){echo$this->privateVar."<br>";//可以访问echo$this->publicVar."<br>";//可以访问}}$obj=newMyClass();echo$obj->publicVar."<br>";//可以访问//echo$obj->privateVar."<br>";$obj->showVars();?>私有成员属性

公共方法不能从类的外部访问私有成员可以使用函数访问私有成员公共成员属性注意事项:综合可知,public修饰的成员是完全没有被封装的,private修饰的成员封装的最严密的,所有成员只能在所在类中被访问,protected修饰的成员则介于二者之间,可以在自己类和其子类中被访问。大家可以根据实际的需求情况来定义类成员的修饰符。任务6.2类的封装任务实施classStudent{private$stuId;//私有成员:仅类内部可直接访问protected$name;//受保护成员:类内部和子类可直接访问public$age;//公共成员:任何地方可直接访问//构造方法初始化数据publicfunction__construct($id,$name,$age){$this->stuId=$id;//类内部给私有成员赋值$this->name=$name;//类内部给受保护成员赋值$this->age=$age;//公共成员直接赋值}publicfunctiongetstuId()//公共方法:获取私有学号(外部唯一访问途径){return$this->stuId; }publicfunctionsetName($newName)//公共方法:修改受保护姓名(外部修改途径){$this->name=$newName;}publicfunctiongetName()//公共方法:获取受保护姓名(外部读取途径){return$this->name;}}任务实施$stu=newStudent("2025001","李红",20);//测试代码//1.访问公共成员:直接操作echo"年龄:{$stu->age}<br>";//读取$stu->age=21;//修改echo"修改后年龄:{$stu->age}<br><br>";//2.访问受保护成员:通过公共方法//echo$stu->name;//错误:外部不能直接访问echo"姓名:{$stu->getName()}<br>";//通过方法读取$stu->setName("李小红");//通过方法修改echo"修改后姓名:{$stu->getName()}<br><br>";//3.访问私有成员:通过公共方法//echo$stu->stuId;//错误:外部不能直接访问echo"学号:{$stu->getstuId()}<br>";//只能通过方法读取

任务描述使用类的继承实现子类的定义,实现成员的继承。定义一个父类Person,再定义一个子类Student,子类Student继承父类Person的属性和方法,并使用子类实例化对象任务6.3类的继承类的继承class子类名extends父类名{//定义子类成员变量//定义子类成员方法}子类定义在class后的类名后加了extends关键字,extends后面指明父类名。在子类定义中,父类已有的变量、函数一般不再重新定义,在子类中只定义跟父类不同的变量与函数,如果需要也可以对父类中已有的函数进行修改。任务实施父类的定义classPerson{//父类的属性public$name;public$age;publicfunction__construct($name,$age)//构造函数

{$this->name=$name;$this->age=$age;}publicfunctionintroduce()//父类的方法

{ echo"Hello,mynameis".$this->name."andIam".$this->age."yearsold.<br/>";}}任务实施定义子类Student,继承自PersonclassStudentextendsPerson{//子类特有的属性public$stuId;public$major;//子类的构造函数publicfunction__construct($name,$age,$stuId,$major){//调用父类的构造函数来初始化继承的属性parent::__construct($name,$age);$this->stuId=$stuId;$this->major=$major;}publicfunctionstudy()//子类特有的方法

{ echo$this->name."isstudying".$this->major.".";}}任务实施使用子类创建一个Student对象$stu1=newStudent("Alice",20,"S12345","ComputerScience");$stu1->introduce();$stu1->study();

任务描述使用类的继承实现子类方法的重写,以完善该方法在子类中的功能。根据任务6.3,把子类Student从父类Person继承来的方法introduce()进行重写。任务6.4重写父类方法任务实施publicfunctionintroduce(){echo"Iamastudentmajoringin".$this->major.".<br/>";}把上面代码加入到“任务6.3”子类(Student)定义的代码中,则在子类中重写introduce()函数,函数在执行的时则调用了子类重写的introduce()函数,而不会调用父类的introduce()函数。

任务描述使用类的接口技术,实现类的多重继承功能。定义一个接口,接口名为接口命名为StudentTask(学生任务),里面只定义了attendClass()(上课)和doHomework()(做作业)两个方法,将来可以创建大学生、中学生、小学生等不同的类,这些学生上什么课、做什么作业可以不同(类的具体实现),但都逃不掉这两项任务。任务6.5使用接口拓展功能1.接口的定义在PHP中,类的继承是单向性的,如果要实现类的多重继承,就需要用到接口。例如:“手机”可以看作一个接口,它规定了所有手机必须能“打电话”和“发短信”(这是接口里的方法),但具体是老年按键机、智能手机,还是用什么技术实现打电话(是4G还是5G),接口不管——只要能完成这两个功能就行。接口用interface关键字定义,里面只写方法名,不写具体代码(没有方法体)。语法格式:interface接口名

{publicfunction方法1();//只规定有这个方法publicfunction方法2();}2.接口的实现类必须通过implements关键字“遵守”接口,并且必须实现接口中所有的方法(少一个都报错)。语法格式为:class类名implements接口名

{publicfunction方法1(){//具体实现代码}publicfunction方法2(){//具体实现代码}}接口不能创建对象,它只是给类定规则。3.接口的用途统一规范:比如规定“支付接口”必须有pay()方法,不管是微信支付、支付宝支付,都得实现这个方法,调用时就可以统一用pay(),不用管具体是哪种支付。灵活扩展:后续新增支付方式(如银联),只要遵守接口规则实现pay(),就能直接用,不用改原来的代码。一句话总结:接口就是“我不管你怎么做,但你必须能做到这些事”的规则,让不同的类能按照统一的方式工作,同时保持各自的实现灵活性。任务实施interfaceStudentTask//接口{publicfunctionattendClass();publicfunctiondoHomework();}classPerson//父类:人{public$name;publicfunction__construct($name){$this->name=$name;}}规定必须有"上课"方法规定必须有"做作业"方法//学生类:继承“人”类,完成接口规定的任务classStudentextendsPersonimplementsStudentTask

{publicfunctionattendClass(){echo"{$this->name}正在上大学课程<br>";}publicfunctiondoHomework(){echo"{$this->name}在做大学作业<br>";}}父类接口实现“上课”方法

温馨提示

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

评论

0/150

提交评论