《第12章类与对象精选文档.ppt》由会员分享,可在线阅读,更多相关《第12章类与对象精选文档.ppt(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第12章类与对象本讲稿第一页,共二十一页12.1 面向对象与面向过程本节首先来介绍下什么是面向过程编程、什么是面向对象编程。然后比较二者在:代码执行效率方面、代码可重用方面以及代码扩展性等方面的差异。本讲稿第二页,共二十一页12.1.1 面向对象与面向过程面向对象是以对象和消息为基础的编程方法。面向过程则是以算法过程为基础的编程方法。本书所使用的代码基本上全部采用面向过程的方式。面向过程的代码一般看起来如所下所示。这种方式代码从上到下一句一句的执行。本讲稿第三页,共二十一页12.1.2 两者之间的比较通过上一节的对面向对象与面向过程的介绍,可以发现二者存在以下方面的关系:面向过程程序设计方法采
2、用函数(或过程)来描述对数据的操作,但又将函数与其操作的数据分离开来;面向对象程序设计方法将数据和对数据的操作封装在一起,作为一个整体来处理。面向过程程序设计方法以功能为中心来设计功能模块,难于维护;而面向对象程序设计方法以数据为中心来描述系统,数据相对于功能而言具有较强的稳定性,因此更易于维护。面向过程程序的控制流程由程序中预定顺序来决定;面向对象程序的控制流程由运行时各种事件的实际发生来触发,而不再由预定顺序来决定,更符合实际需要。面向对象程序设计方法可以利用框架产品(如MFC,Microsoft Foundation Classes)进行编程。面向对象的优点有:面向对象技术具有程序结构清
3、晰,自动生成程序框架,实现简单,可有效地减少程序的维护工作量,代码重用率高,软件开发效率高等优点。面向对象技术中的封装性的缺点:封装将对象有关的数据和行为封装成整体来处理,使得对象以外的部分不能随意存取对象的内部属性,从而有效地避免了外部错误对它的影响,大大减小了查错和排错的难度。另一方面,当进行修改对象内部时,由于只有少量的外部接口对外提供服务,因此同样减小了内部的修改对外部的影响。本讲稿第四页,共二十一页12.2 使用类与对象本节来介绍如何在PHP中使用类与对象。在本书第四章曾经提到过,类也属于变量的一种但它不同于一般的变量,和数组一样它是一种特殊的变量。它的定义方法以及它的构成及调用方法
4、都与一般的变量有所不同。要使用对象需要先定义一个类,然后为所定义的类初始化一个对象。然后通过使用对象的属性与方法来实现具体的操作。本节就来介绍如何进行这一过程。本讲稿第五页,共二十一页12.2.1 定义一个类对象是类的实例,类是对象是根本,使用对象必须以类为前提。所以,定义一个类是使用类与对象的一个最基本的前提。PHP中定义一个类要使用这样的语法格式:class classname var$var function functionname()在PHP中定义一个类需要使用“class”关键字,该关键字指定开始定义一个类。后面跟上类的名称。注意类的名称与普通变量命名规则相同,但名称前并不加代表变
5、量的“$”符号。在变量名后面是成对出现的“”大括号标记,在大括号中即为定义的类的具体内容。其中即可以有变名也可以有函数。本讲稿第六页,共二十一页12.2.2 为类初始化一个对象类在创建完成之后,就需要为类初始化对象。如果创建之后而不为类初始化对象就好比手上只有一份汽车的介绍广告,而没有汽车。所以要想操作类的属性方法,就需要对象。本节来介绍如何为类初始化一个对象并操作类的属性与方法。在PHP中创建类之后,为类初始化对象要使用如下语法格式:class classname var$var function functionname()/以上为定义类的代码$myobj=new classname;/初
6、始化对象$myobj-var=value;/调用类的属性$myobj-functionname();/调用类的方法本讲稿第七页,共二十一页12.2.3 类的继承类的继承是指一个类(如类A)可以使用另一个类(如类B)中所有属性与方法。这样就是类B对类A的继承,类B就可以叫做是类A的子类,反过来类A也可以叫做类B的父类。在PHP中要实现类的继承,需要使用以下语法样式:class Aclass B extends A要实现继承最为关键的一步就是在定义子类(即以上代码中的类B)时,在类名后使用extends关键字再加上父类名称(即以上代码中的类A)即可。这样在类B中就可以使用类A中所定义的所有属性与方
7、法,同时在类B中还可以定义自身特有的属性与方法。本讲稿第八页,共二十一页12.2.4 类的重载在进行类的继承时,可能会出现这样的情况:子类中出现了与父类中同名的属性与方法。属性名相同没什么问题,都只是一个变量而已,而方法名相同就不同了,因为两个不同的函数可能会执行不同的内容。所以类的重载其实是指类的方法的重载,如果执行子类中与父类同名的方法,只是执行子类的方法并不影响父类的方法庖还叹徒凶隼嗟闹卦亍在子类中也可以访问父类中的方法,在子类中访问父类中的方法的语法格式如下代码所示。class A function f_name()class B extends A function f_name()
8、parent:f_name()本讲稿第九页,共二十一页12.2.5 类的引用类在定义以后并不是相互独立的,一个类可以调用另一个已知类中的属性与方法。笔者事实上并不提倡这样做,因为使用类的目的就是为了有效的封装变量与函数。如果类与类之间还有着复杂的调用关系,就丧失了使用类的方便之处。反对归反对,但作为知识还是有必要了解一下,在PHP中实现类的引用可以采用这样的形式:class A var$var;function f_name()class B A:f_name();A:$var;本讲稿第十页,共二十一页12.2.6 类的构造函数如果类中定义的方法名即函数名与类的名称相同,则为类初始化对象时与类
9、名相同的函数将会被直接执行。如果类没有构造函数,而类的父类有构造函数则会尝试执行父类的构造函数。与类的名称相同的函数就叫做类的构造函数。通过这些介绍大致可以得出类的构造函数的两大特征:函数名称与类名称完全相同;为类初始化时函数将会被无条件执行。本讲稿第十一页,共二十一页12.3 常用类与对象操作函数除了通过通用的定义与使用类及对象,PHP中还提供了一组类与对象处理函数专门对类与对象进行各种操作。本节向读者介绍一下PHP中常用的类与对象的操作函数。合理使用这些函数可以更进一步提高用户对类与对象的处理效率,为日程编程工作提供便利。本讲稿第十二页,共二十一页12.3.1 检查类是否定义在为类初始化对
10、象时,判断类是否定义在有的情况下是很有必要的。因为只有类存在时才能成功初始化对象,而为不存在的类初始化对象必然会导致错误。PHP中有一个函数可以用来判断指定类是否定义,这个函数就是:class_exists(),该函数使用格式语法如以代码所示。bool class_exists(string class_name,bool autoload)该函数将返回一个布尔值,如果参数class_name指定的类存在(已经定义)函数将会True,反之则会返回False。该函数默认将会尝试调用_autoload()(自动加载对象),如果不想使用此设定,则可以设定可选参数autoload为布尔False值。下
11、面通过一个实例来说明如何使用此函数来判断指定的类是否定义。本讲稿第十三页,共二十一页12.3.2 返回类的方法名在使用PHP进行网络编程中有时只知道存在一个类(如通过上一小节介绍的函数class_exists()获取True值),但并不知道类中的方法情况,还是无法正常使用类。如果能有一个函数返回类中所有的方法名称,就可以在为类初始化对象后,调用这些方法。而PHP的库函数中就有这样的函数:get_class_methods()。该函数的使用格式如以下代码所示。array get_class_methods(string class_name)该函数将以数组的形式返回指定类:class_name中
12、所有的方法名。如果执行过程中出现错误,函数将返回Null。本讲稿第十四页,共二十一页12.3.3 返回类的属性上一节介绍了如何获取已经定义的类中的所有方法名。而通过特定函数也可以获取类中的属性(即类中定义的变量)名称。可以获取类中所有属性名的函数为:get_class_vars(),该函数使用格式如以下代码所示。本讲稿第十五页,共二十一页12.3.4 返回特定对象的类名在实际工作中遇到的问题可能各种各样,比如现在已经为某一个类初始化了一个对象了,可是却不知道该对象所采用的类的类名(这是相当奇怪的现象)。那么如何在知道有对象的情况去获取该对像所从属的类名呢?在PHP中可以通过函数get_clas
13、s()来实现这一功能。函数get_class()的使用格式如以下代码所示。string get_class(object obj)本讲稿第十六页,共二十一页12.3.5 检查类与对象的关系类与对象都存在的情况下,如何判断类与对象是否具有从属关系呢?在PHP中可以通过函数is_a()来检查类与对象的关系。该函数将判断类与对象的关系,如果对象是该类或该类是此对象的父类则返回True,否则返回False。函数is_a()的使用格式如以下代码所示。bool is_a(object object,string class_name)参数object为指定的实例化对象;参数class_name为指定类的名
14、称的字符型变量。该函数将判断类与对象的关系,并根据检查结果返回一个布尔值。如果,如果对象是该类或该类是此对象的父类则返回True,反之则返回False。本讲稿第十七页,共二十一页12.3.6 检查方法是否存在如果事先知道存在一个实例化对象也知道某一个方法,但需要调用此方法又不知它是否存在于特定对象中。这时就需要使用函数method_exists()进行这样的判断。该函数的使用格式如以下代码所示。bool method_exists(object object,string method_name)参数object为实例化的对象型变量,参数method_name为代表方法名称的字符型变量。如果m
15、ethod_name所指的方法在object所指的对象类中已定义,则返回True,否则返回False。本讲稿第十八页,共二十一页12.3.7 检查对象是否具有某个属性和方法与类的关系判断一样,也可以通过函数来判断属性是否存在于某个对象或者类中。如果事先知道存在一个对象或者是对象所属的类,同时也知道某一个属性,不知道该属性是否存在于对象或者类中。这些可以通过函数property_exists()来判断类或对象是否具有某个属性。函数property_exists()的执行语法如下代码所示。bool property_exists(mixed class,string property)参数clas
16、s既可以为实例化的对象型变量,也可以为代表类的类名;参数property为代表属性名称的字符型变量。如果property所代表的属性存在于object对象中函数将返回True值,反之则返回False。本讲稿第十九页,共二十一页12.4 面向对象编程实例购物车是购物类网站中最为常见的也是最基本的功能,用户可以将自己选中的商品的一定数量添加到购物车,也可以从购物车中删除某一商品的指定数量。本节就使用类的知识来创建购物车类。本讲稿第二十页,共二十一页12.5 本章小结本章向读者介绍了在PHP中如何获取客户端及服务器的信息。获取这些信息不管对网络资源提供者还是网络资源使用者都是很重要的。通过获取客户端信息,可以使用服务商为特定客户群提供有针对性的服务。而获取服务端信息,可以使网络使用者合理安排自己网站的代码以使其更好的运行。本章还对服务器中一项重要信息:日期时间的操作进行了简单介绍。合理使用日期、时间函数可以为网络应用程序的编写提供方便。本讲稿第二十一页,共二十一页