《第11章 面向对象编程ppt课件(完整版).pptx》由会员分享,可在线阅读,更多相关《第11章 面向对象编程ppt课件(完整版).pptx(114页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第11章 面向对象编程ppt课件(完整版)第11章 面向对象编程PHP基础案例教程(第2版)学习目标/Target 熟悉面向对象的思想,能够说出什么是类和对象以及面向过程和面向对象的区别 掌握类与对象的使用,能够在程序中定义类和使用对象访问类成员 掌握可变类与可变类成员的使用,能够通过可变的方式对类和成员进行访问 掌握访问控制修饰符的使用,能够为类成员使用合适的访问控制修饰符 掌握对象的链式调用、比较、浅复制和克隆操作,能够完成这些具体操作学习目标/Target 了解常见的魔术方法,能够说出魔术方法的作用 掌握构造方法和析构方法的使用,能够在程序中正确定义构造方法和析构方法 掌握类常量和静态成
2、员的定义,能够灵活使用类常量和静态成员实现类成员的共享 了解面向对象的三大特性,能够说出封装、继承和多态的特点 掌握封装与继承的实现方法,能够熟练运用这两个特性设计程序学习目标/Target 掌握Trait的定义和使用方法,能够使用Trait实现代码复用 掌握抽象类、抽象方法和接口的定义和实现,能够根据实际需求进行使用 掌握多态的实现方法,能够通过类型约束限制对象的类型 掌握设计模式的实现思路,能够使用常用的设计模式完成指定的功能 掌握MySQLi扩展的面向对象语法,能够使用面向对象语法操作数据库章节概述/ Summary与其他面向对象编程语言(如Java)相比,PHP并不是一种纯面向对象编程
3、的语言。但随着PHP的不断发展,PHP中的面向对象语法也在逐步向主流的面向对象编程语言靠拢,使PHP能够处理越来越复杂的需求。因此,对于PHP开发者来说,面向对象编程是必备的重要技能之一,本章将对面向对象编程的相关知识进行讲解。目录/Contents010203初识面向对象类与对象的使用魔术方法04类常量与静态成员目录/Contents050607面向对象三大特性封装与继承Trait代码复用08抽象类、抽象方法与接口目录/Contents091011多态与类型约束设计模式MySQLi扩展面向对象语法初识面向对象 先定一个小目标!熟悉面向过程与面向对象的概念,能够说出面向过程与面向对象的区别11
4、.1.1 面向过程与面向对象11.1.1 面向过程与面向对象在学习面向对象之前,首先要了解什么是面向过程。面向过程就是把要实现的功能分解成具体的步骤,利用函数依次实现这些步骤,使用时按照规定好的顺序调用即可。前面的章节中都是基于面向过程的编程思想进行编程的。11.1.1 面向过程与面向对象下面通过伪代码演示一个面向过程的程序。在面向过程的方式中,主要侧重于完成任务所经历的每一个步骤,将这些步骤定义成函数后,依次调用来完成整个任务。老师布置作业();学生写作业();学生交作业();老师批改作业();老师公布学生成绩();11.1.1 面向过程与面向对象面向对象则是一种更符合人类思维习惯的编程思想
5、,它分析现实生活中存在的各种形态不同的事物,通过程序中的对象来映射现实中的事物。这些事物之间存在着各种各样的联系,使用对象的关系来描述事物之间的联系。使用面向对象思想修改前面的程序,具体如下。老师对象: 布置作业、批改作业、公布学生成绩学生对象: 写作业、交作业 先定一个小目标!熟悉面向对象中的类与对象,能够说出类与对象的概念和区别11.1.2 面向对象中的类与对象11.1.2 面向对象中的类与对象面向对象思想力图使程序对事物的描述与该事物在现实中的形态保持一致。为了做到这一点,面向对象思想提出了两个概念,即类和对象。类是对象的模板,对象是类的实例。类表示一个客观世界的某类群体,类中包含该类群
6、体的一些基本特征。对象表示该类群体中一个具体的东西,对象是以类为模板创建的具体事物,也就是类的实例。11.1.2 面向对象中的类与对象下面以商品为例演示类与对象的关系。类与对象的使用 先定一个小目标!掌握类的定义和实例化,能够根据需要定义类并实例化11.2.1 类的定义和实例化11.2.1 类的定义和实例化类由class关键字、类名和成员组成,类的成员包括属性和方法,属性用于描述对象的特征,例如人的姓名、年龄等。方法用于描述对象的行为,例如说话、走路等。class 类名 类的成员11.2.1 类的定义和实例化 定义类名时需要遵循以下规则。类名不区分大小写,如Student、student等都表
7、示同一个类。推荐使用大驼峰命名法,即每个单词的首字母大写,例如Student。类名要做到见名知义,例如Student表示学生类,Teacher表示教师类。11.2.1 类的定义和实例化$对象名 表示创建的类的实例,通过这个实例可以访问类中的成员。$对象名 遵循PHP中变量的命名规则,尽量做到见名知义。new 表示要创建一个新的对象。类名 表示对象的类名。类名后面括号中的 参数 是可选的,用于初始化类的成员属性。如果在实例化类时,不需要传递参数,则可以省略类名后面的括号。定义类以后,若想要使用类,还需要根据类创建对应的对象,也就是类的实例化。PHP中使用new关键字创建对象,实例化类的基本语法格
8、式如下。$对象名 = new 类名(参数1, 参数2, ); 先定一个小目标!掌握类成员的使用,能够对属性和方法进行操作11.2.2 类成员11.2.2 类成员在定义类时,如果想让类实现具体的功能,还需要在类中定义类成员。1. 属性2. 方法定义类时可以直接为属性赋初始值,实例化类后,可以对属性进行多种操作,包括访问属性、修改属性值、为属性赋值和删除属性等,通过“对象-属性”的方式访问属性。通过对象可以调用方法,只需在对象成员访问符号“-”后面加上方法名和小括号“()”即可,若方法需要传递参数,则将参数写在小括号中。 先定一个小目标!掌握可变类与可变类成员,能够实现用字符串变量作为类名或类成员
9、名使用11.2.3 可变类与可变类成员11.2.3 可变类与可变类成员PHP支持设置可变类和可变类成员。通过可变类可以实现用字符串变量作为类名使用。通过可变类成员可以实现用字符串变量作为类成员名使用。在使用可变类或可变类成员时,对象成员访问符号“-”后跟的是“$变量名称”。在实例化可变类时,PHP会寻找与变量值相同的类进行实例化。 先定一个小目标!掌握访问控制修饰符,能够根据需要为类成员设置合适的访问控制修饰符11.2.4 访问控制修饰符11.2.4 访问控制修饰符在PHP中,可以通过访问控制修饰符来控制类中的属性和方法是否允许被外界访问。访问控制修饰符共有3种,分别是:public(公有修饰
10、符)protected(受保护修饰符)private(私有修饰符)11.2.4 访问控制修饰符在定义类时,需要为属性设置访问控制修饰符,如果没有指定访问控制修饰符,默认为public。访问控制修饰符同一个类内子类类外publicprotectedprivate“”表示允许访问,“”表示不允许访问。 先定一个小目标!掌握对象的链式调用,能够在程序中实现对象的链式调用11.2.5 对象的链式调用11.2.5 对象的链式调用当一个类中方法的返回值是一个对象时,可以继续调用其返回的对象中的方法,形成链式调用。class Dog public function shout() return $this;
11、 public function run() return $this; (new Dog()-shout()-run(); 先定一个小目标!掌握对象的比较,能够比较两个对象是否相等11.2.6 对象的比较11.2.6 对象的比较比较两个对象是否相等,可以使用比较运算符“=” 或“=” 。“=”要求两个对象是同一个类的实例,且两个对象属性和属性值相等。“=” 要求两个变量引用同一个对象。PHP还提供了instanceof关键字判断对象是否是某个类的实例,返回布尔值。$对象名 instanceof 类名 先定一个小目标!掌握对象的浅复制和克隆,能够正确实现浅复制和克隆11.2.7 对象的浅复制和
12、克隆11.2.7 对象的浅复制和克隆在PHP中,对象的赋值类似变量的引用赋值,对象的赋值操作仅实现了两个变量引用同一个对象,并不会复制出一个新的对象,这种操作称为浅复制(Shallow Copy)。要想获取多个相同的对象,并且其中一个对象的成员发生改变不会影响其他对象的成员,这就需要克隆对象,克隆对象使用clone关键字实现。魔术方法 先定一个小目标!熟悉常见的魔术方法,能够说出这些魔术方法的作用11.3.1 常见的魔术方法11.3.1 常见的魔术方法PHP常用的魔术方法如下。魔术方法描述_get()当调用一个未定义或无权访问的属性时自动调用此方法_set()给一个未定义或无权访问的属性赋值时
13、自动调用此方法_isset()当在一个未定义或无权访问的属性上执行isset()操作时调用此方法_unset()当在一个未定义或无权访问的属性上执行unset()操作时调用此方法_construct()构造方法,当一个对象被创建时调用此方法_destruct()析构方法,在对象被销毁(从内存中清除)前调用此方法11.3.1 常见的魔术方法PHP常用的魔术方法如下。魔术方法描述_tostring()当一个类被当成字符串时应怎样处理_invoke()以调用函数的方式调用一个对象时会被自动调用_sleep()可用于清理对象,在serialize()序列化前执行_wakeup()用于预先准备对象需要的
14、资源,在unserialize()反序列化前执行_call()在对象中调用一个不可访问方法时会被调用_callstatic()静态上下文中调用一个不可访问方法时会被调用,该方法需要声明为静态方法 先定一个小目标!掌握构造方法,能够正确定义构造方法11.3.2 构造方法11.3.2 构造方法构造方法用于在创建对象时被自动调用,完成属性的初始化。访问控制修饰符 function _construct(参数列表) 初始化操作_construct()是构造方法的名称,访问控制修饰符可以省略,默认为public。 先定一个小目标!掌握析构方法,能够正确定义析构方法11.3.3 析构方法11.3.3 析构
15、方法析构方法在对象被销毁之前自动调用,执行一些指定的功能或操作(如关闭文件、释放结果集等),其基本语法格式如下。访问控制修饰符 function _destruct() 清理操作一般情况下,析构方法不需要手动调用,在使用unset()或PHP脚本执行结束自动释放对象时,会自动调用析构方法。11.3.3 析构方法多学一招:匿名类从PHP 7版本开始,面向对象编程中支持匿名类的实现,其使用方法与匿名函数类似,通过实例化一个没有名称的类,可以创建一次性的简单对象。 $obj = new class(参数) 类成员 ;类常量与静态成员 先定一个小目标!掌握类常量的使用,能够正确定义与访问类常量11.4
16、.1 类常量11.4.1 类常量在PHP中,类内除了可以定义属性、方法外,还可以定义类常量。类常量定义后其值不会发生改变,可以被所有对象共享。const 类常量名 = 常量值;类常量的命名规则与普通常量一致,通常以大写字母表示类常量名。访问类常量时,需要通过“类名:类常量名”的方式进行访问。“:”称为范围解析操作符,简称双冒号。11.4.1 类常量下面通过代码演示类常量的使用,具体代码如下。在类内访问类常量,使用self关键字代替类名,例如“self:SCHOOL” 。class Student const SCHOOL = 某学院;/ 定义类常量echo Student:SCHOOL; /
17、访问类常量 先定一个小目标!掌握静态成员的使用,能够正确定义与访问静态成员11.4.2 静态成员11.4.2 静态成员除了类常量,若想要类中的某些成员只保存一份,并且可以被所有实例化的对象共享,就可以使用静态成员。静态成员有两种,分为静态属性和静态方法。静态成员使用static关键字修饰,通过类名直接访问静态成员,不需要实例化对象。定义静态成员的基本语法格式如下。public static 属性名;/ 定义静态属性public static 方法名() / 定义静态方法11.4.2 静态成员访问静态成员的基本语法格式如下。静态成员是属于类的,不需要通过对象调用,所以在静态方法中不能使用$thi
18、s。访问静态成员时,通常使用self或static关键字代替类名,配合使用范围解析操作符“:”。类名:属性名;/ 访问静态属性类名:方法名();/ 调用静态方法面向对象三大特性 先定一个小目标!熟悉面向对象三大特性,能够说出封装、继承和多态的含义11.5 面向对象三大特性11.5 面向对象三大特征1. 封装封装就是将对象的属性和行为封装起来,不需要让外界知道具体实现细节。2. 继承继承可以实现代码复用,子类通过继承可以直接使用父类的操作。3. 多态多态是指相同的操作或函数可作用于多种类型的对象上并获取不同的结果,即不同的对象所表现的行为是不一样的。封装与继承 先定一个小目标!掌握封装的实现,能
19、够在程序中实现类的封装11.6.1 封装11.6.1 封装类的封装是为了隐藏程序内部的细节,防止类成员被外界随意访问和修改,通常使用访问控制修饰符限制类成员。使用public修饰的成员,可以在类外访问。针对使用protected和private修饰的成员,PHP中提供了两种方式访问: 在类中定义公有方法访问成员。 通过魔术方法访问成员。11.6.1 封装使用User类中的公有方法getMoney()访问私有属性$money。1. 在类中定义公有方法访问成员class User private $money = 5000; public function getMoney() return $t
20、his-money; $user = new User();echo $user-getMoney(); / 输出结果:5000echo $user-money; / 报错,提示无法访问私有属性11.6.1 封装使用魔术方法可以访问未定义或不可见成员。成员魔术方法描述属性_get($name)读取不可访问属性的值时会被调用_set($name, $value)对不可访问属性赋值时会被调用_isset($name)对不可访问属性调用isset()或empty()时会被调用_unset($name)对不可访问属性调用unset()时会被调用方法_call($name, $args)在对象中调用一个
21、不可访问方法时会被调用_callstatic($name, $args)静态上下文中调用一个不可访问方法时会被调用2. 通过魔术方法访问成员 先定一个小目标!掌握继承的实现,能够在程序中实现类的继承11.6.2 继承11.6.2 继承在生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。11.6.2 继承在PHP中,类的继承是指在一个现有类的基础上构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。PHP提供了extends关键字实现子类与父类之间的继承。class 子
22、类名 extends 父类名 类体 先定一个小目标!掌握重写的实现,能够在子类中重写父类成员11.6.3 重写11.6.3 重写重写是指在子类中定义与父类的同名成员,重写父类成员。如果重写父类属性,则直接覆盖,父类的属性将不存在。如果重写父类方法,则该方法在子类和父类中同时存在。在重写方法时的注意事项如下。保证参数数量必须一致。子类中的方法的访问级别应等于或弱于父类中被重写方法的访问级别。11.6.3 重写子类重写父类的方法后,若想继续使用父类的方法,需要使用parent关键字调用父类的方法,使用方法是parent关键字加上范围解析操作符,具体语法格式如下。多学一招:parent关键字pare
23、nt:父类方法();11.6.3 重写下面演示重写父类方法后,继续访问父类的方法。多学一招:parent关键字 Trait 父类”。抽象类、抽象方法与接口 先定一个小目标!掌握抽象类与抽象方法,能够正确定义抽象类与抽象方法11.8.1 抽象类与抽象方法11.8.1 抽象类与抽象方法抽象类是一种特殊的类,用于定义某种行为,具体的实现需要子类来完成。例如,定义一个运动类,对于跑步这个行为,有基础跑、长距离跑、减速跑等多种跑步的方式。可以使用PHP提供的抽象类和抽象方法来实现,在定义时添加abstract关键字修饰。abstract class 类名 / 定义抽象类 public abstract
24、function 方法名(); / 定义抽象方法11.8.1 抽象类与抽象方法在使用abstract修饰类或方法时还应注意以下几点。抽象方法是只有方法声明而没有方法体的特殊方法。含有抽象方法的类必须被定义成抽象类。抽象类中可以有非抽象方法、属性和常量。抽象类不能被实例化,只能被继承。子类实现抽象类中的抽象方法时,访问控制修饰符必须与抽象类中的一致或者更宽松。子类继承抽象类时必须实现抽象方法,否则也必须定义成抽象方法由下一个继承类实现。 先定一个小目标!掌握接口的定义与实现,能够正确定义接口并实现接口11.8.2 接口11.8.2 接口若抽象类中的所有方法都是抽象方法,可以将其定义为接口。接口用
25、于指定某个类必须实现的功能,通过interface关键字来定义。在接口中,所有的方法只能是公有的,不能使用final关键字来修饰,具体语法格式如下。interface 接口名 const 常量名 = ;/ 接口常量 public function 方法名();/ 接口方法11.8.2 接口接口与类有类似的结构,但是接口不能实例化。接口有两个成员,分别是接口常量和接口方法。实现接口的类可以访问接口常量,但不能在类中定义同名常量。在定义接口中的抽象方法时,由于所有的方法都是抽象的,所以在声明方法时可以省略abstract关键字。接口的使用细节:11.8.2 接口接口的方法体没有具体实现,需要通过某
26、个类使用implements关键字来实现接口。class 类名 implements 接口名 类体多态与类型约束 先定一个小目标!掌握多态的实现,能够在程序中实现多态11.9.1 多态11.9.1 多态PHP中的多态体现在不同对象在调用同名方法时表现出的多种不同行为。例如,要实现一个动物叫声的方法,因为每种动物的叫声是不同的,所以可以在方法中接收一个动物类型的参数。传入猫类对象时就发出猫类的叫声。传入犬类对象时就发出犬类的叫声。 先定一个小目标!掌握类型约束,能够在类中实现类型约束11.9.2 类型约束11.9.2 类型约束使用类型约束可以在程序实现多态时限制传入的参数必须是某个类或接口,其使
27、用方式与设置函数参数的类型相同。将getShout()方法的参数$animal指定为Animal类,具体代码如下。 “Animal $animal”强制规定传入的对象$animal必须是继承了Animal抽象类的对象。function getShout(Animal $animal) return $animal-shout();11.9.2 类型约束调用getShout()方法,具体代码如下。由于Cat类继承Animal类,所以程序会正常输出。$cat = new Cat();getShout($cat); / 输出结果:喵喵11.9.2 类型约束如果传入的对象没有继承Animal类,则程序
28、会报错。下面定义一个Cow类,调用getShout()函数。class Cow public function shout() echo 哞哞.; $cow = new Cow();/ 错误信息:Fatal error: Uncaught TypeError: Argument 1 passed to getShout()/ must be an instance of Animal.getShout($cow);设计模式 先定一个小目标!掌握单例模式,能够在类中实现单例模式11.10.1 单例模式11.10.1 单例模式单例模式用于保证整个程序运行期间一个类只存在一个实例对象。实现数据库连接
29、的单例模式的具体思路:(1)创建一个数据库操作类DB,使用私有的静态属性$instance保存DB类的对象。(2)为了防止在类外创建多个DB类对象,将构造方法和克隆方法都设置为私有的。(3)定义getInstance()静态方法,用于通过类名调用静态方法创建对象。(4)判断$instance是否为空,若为空则创建DB类对象,若不为空则直接返回该对象。 先定一个小目标!掌握工厂模式,能够在类中实现工厂模式11.10.2 工厂模式11.10.2 工厂模式工厂模式的作用就是通过一个函数或类中的方法来“生产”对象,使用户在创建对象时只需要传递不同的参数就可以得到不同的对象。实现数据库操作类的工厂模式的
30、思路:(1)创建数据库操作类文件,用于获取不同类型数据库的具体操作。MySQL.phpOracle.phpSQLite.php(2)定义一个工厂类DBFactory,通过factory()方法返回不同类型的数据库操作对象。MySQLi扩展面向对象语法 先定一个小目标!掌握MySQLi面向对象基本语法,能够使用MySQLi面向对象语法操作数据库11.11.1 MySQLi面向对象基本语法11.11.1 MySQLi面向对象基本语法MySQLi扩展面向对象语法使用的方法和面向过程语法使用的函数名类似。下面对比MySQLi扩展面向对象方法名和面向过程函数名。操作步骤面向对象方法名面向过程函数名连接数
31、据库mysqli:_construct()mysqli_connect()设置字符集mysqli:set_charset()mysqli_set_charset()执行SQL语句mysqli:query()mysqli_query()处理结果集mysqli_result:fetch_all()mysqli_fetch_all()11.11.1 MySQLi面向对象基本语法下面演示MySQLi扩展面向对象语法的使用。/ 连接数据库,并选择mydb数据库$mysqli = new mysqli(localhost, root, 123456, mydb);/ 设置字符集$mysqli-set_ch
32、arset(utf8);/ 执行SQL语句$result = $mysqli-query(SHOW TABLES);/ 处理结果集$data = $result-fetch_all(MYSQLI_ASSOC);/ 输出关联数组结果print_r($data); 先定一个小目标!掌握预处理和参数绑定,能够运用MySQLi面向对象语法实现预处理和参数绑定11.11.2 预处理和参数绑定11.11.2 预处理和参数绑定MySQLi扩展面向对象语法也可以实现预处理操作和参数绑定。下面演示向mydb数据库中的student表添加数据,具体代码如下。/ 连接数据库、选择数据库、设置字符集$mysqli =
33、 new mysqli(localhost, root, 123456, mydb);$mysqli-set_charset(utf8);/ 预处理SQL语句$stmt = $mysqli-prepare(INSERT INTO student(name,gender) VALUES(?,?);11.11.2 预处理和参数绑定/ 准备插入的数据$data = name = Tom, gender = 男, name = Lucy, gender = 女, name = Jimmy, gender = 男, name = Jack, gender = 男;/ 参数绑定$stmt-bind_par
34、am(ss, $name, $gender);/ 执行预处理的SQL语句foreach ($data as $v) $name = $vname; $gender = $vgender; $stmt-execute(); 先定一个小目标!掌握Session入库的实现,能够独立完成代码编写动手实践:Session入库动手实践:Session入库默认情况下Session以文件的形式存储在服务器。当网站的访问量非常大时,服务器中会生成大量的Session文件,这将影响服务器的响应速度,并会造成资源浪费。因此,需要改变Session的存储方式,将Session数据保存到数据库中。在PHP中自定义Ses
35、sion操作,需要实现SessionHandlerInterface接口。SessionHandlerInterface接口中有6个抽象方法,分别为close()、destroy()、gc()、open()、read()和write()。若想改变Session的存储方式,需要重新实现SessionHandlerInterface接口。动手实践:Session入库下面编写代码改变Session存储的默认方式,具体的实现要求如下。创建保存Session数据的数据表。创建SessionDB类实现SessionHandlerInterface接口。实现open()方法,实现连接数据库。实现close(
36、)方法,实现关闭数据库连接。实现write()方法,实现将Session数据保存到数据库中。实现read()方法,实现根据Session的会话ID获取Session数据。实现destroy()方法,实现根据Session的会话ID删除数据库中的Session数据。完成Session入库设置。测试Session入库。本章小结本章主要介绍了PHP面向对象的相关内容,包括初识面向对象、类与对象的使用、魔术方法、类常量与静态成员、面向对象三大特性、封装与继承、Trait代码复用、抽象类、抽象方法、接口、多态与类型约束、设计模式、MySQLi扩展面向对象语法等内容。通过本章的学习,读者应能够理解面向对象思想,熟练运用面向对象相关的语法进行编程。本章小结