PHP网站开发项目式教程(微课版)(第2版)任务12 使用PHP面向对象程序设计方法_第1页
PHP网站开发项目式教程(微课版)(第2版)任务12 使用PHP面向对象程序设计方法_第2页
PHP网站开发项目式教程(微课版)(第2版)任务12 使用PHP面向对象程序设计方法_第3页
PHP网站开发项目式教程(微课版)(第2版)任务12 使用PHP面向对象程序设计方法_第4页
PHP网站开发项目式教程(微课版)(第2版)任务12 使用PHP面向对象程序设计方法_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

单击此处添加副标题PHP网站开发项目式教程(微课版)(第2版)任务12

使用PHP面向对象程序设计方法任务12-1理解面向对象

需要解决的核心问题面向对象的基本特征有哪些?它们各自的含义是什么?

PHP是同时支持面向过程和面向对象的编程语言。PHP开发者可以在面向过程和面向对象两种方式中自由选择其一或是混合使用。面向过程开发周期短、发布速度快、效率较高;面向对象开发周期长、效率较低,但易于维护、改进、扩展和开发API(ApplicationProgrammingInterface,应用编程接口)。在PHP开发中,很难说哪一种方式更优异,应尽量在开发过程中发挥出两种编程方式各自的优势。12.1.1面向对象程序设计概念

在面向对象的语言中,除了事物的内部状态数据需要使用类进行封装之外,在类中往往还需要提供两种方法,一种是操作这些状态数据的方法,另一种是为实现这类事物的行为特征而定义的方法,这些方法使用函数来实现。

即在面向对象的程序设计中,开发者希望直接对客观世界进行模拟:定义一个类,对应客观世界的某种事物;实际业务中需要关心这个事物的哪些状态,程序就为这些状态定义属性;实际业务中需要关心这个事物的哪些行为,程序就为这些行为定义方法函数。12.1.2面向对象的基本特征

面向对象的方式有3个基本特征:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。

封装指的是将对象的实现细节隐藏起来,然后通过一些公用方法来展示该对象的功能,封装是通过类来实现的。

继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类将直接继承父类的属性和方法,除此之外,子类还可以修改或额外添加新的行为。

多态就是把子类对象赋值给父类引用,然后调用父类的方法去执行子类覆盖父类的方法。在PHP中,对象引用并不明确区分是父类引用还是子类引用。任务12-2使用类和对象

需要解决的核心问题如何创建类?类的属性和方法如何定义?如何对类进行实例化?对类进行访问控制时,可以使用哪几个关键字?它们各自的含义是什么?类的静态属性和方法如何定义?如何访问?

构造函数和析构函数的作用是什么?PHP5及之后的版本中,构造函数和析构函数的名称分别是什么?如何实现类的继承和重载?抽象类如何定义?如何使用?PHP中接口的概念是什么?魔术方法有哪几个?它们各自的作用是什么?

面向对象的程序设计中有两个重要概念——类(Class)和对象(Object),对象也被称为实例(Instance)。其中类是对某一批对象的抽象描述,可以把类理解成某种概念;对象则是一个具体存在的实体。一个类的所有对象都具有相同的数据结构,并且共享相同的实现操作的代码;各个对象又可以拥有各自不同的状态,即私有数据。12.2.1类的创建与实例化

类由变量和函数等组成,在类中,变量可称为属性,函数可称为方法。1.定义类

PHP面向对象中定义类的简单语法如下。[修饰符]class类名{零到多个属性零到多个方法}

每个类的定义都以关键字class开头,后面依次跟类名和一对花括号,花括号中包含对类的属性与方法的定义。

修饰符可以是public、final和abstract。public是默认值,其对应的类权限最大;final类不可被继承;abstract类是一个抽象类,抽象类不能被实例化,但是使用extends关键字继承抽象类之后得到的public类是可以被实例化的。

类名可以是任何非PHP保留字的合法标签。一个合法类名以字母或下画线开头,后面跟若干字母、数字或下画线。2.类的实例化与访问

在声明一个类之后,该类只存在于文件中,程序不能直接调用它。需要对该类创建一个对象,在程序中才可以使用该类,创建一个类的对象的过程称为类的实例化。类的实例化需要使用new关键字,关键字后面需要指定实例化的类名,格式如下。$obj=newclassname;12.2.2类的访问控制

类的访问控制是指对属性或方法的访问控制,是通过在前面添加关键字public(公有的)、protected(受保护的)或private(私有的)来实现的。public:被定义为公有的类成员可以在类的外部或内部被访问。protected:被定义为受保护的类成员可以被其自身及其子类和父类访问。

private:被定义为私有的类成员只能被其定义所在的类访问,即私有成员将不会被继承。

属性必须定义为公有的、受保护的、私有的之一。如果用var定义,则被视为公有的,可以将var看作public关键字的别名形式。

在设计类时,通常可将类的属性设为私有的,而将大多数方法设为公有的。这样,类以外的代码不能直接访问类的私有数据,从而实现了数据封装;而公有的方法可为内部的私有数据提供外部接口,但接口实现的细节在类的外面又是不可见的。12.2.3静态的属性和方法

在类中还可以定义静态的属性和方法,所谓“静态”,是指所定义的属性和方法与类的实例无关,只与类本身有关。静态的属性和方法一般用来包含类要封装的数据和功能,可以由所有类的实例共享。在类中可以使用static关键字定义静态的属性和方法。

访问静态的属性和方法时,需要使用范围解析符“::”,格式如下。classname::$attribute;//访问静态属性classname::Cfunction();//访问静态方法12.2.4构造函数和析构函数

构造函数是类中的一个特殊函数,创建类的实例时,构造函数将被自动调用,其主要功能是对类中的对象完成初始化操作。与构造函数相对的是析构函数,析构函数在类的对象被销毁时自动调用。1.构造函数

PHP4中,在类的内部与类同名的函数都被认为是构造函数,该函数在创建类的对象时自动执行。PHP5以及之后的版本中,构造函数用__construct()方法来声明(注意,construct前面是两条下画线),这样做的好处是可以使构造函数名称与类名区分开,当类名发生改变时,不需要修改相应的构造函数名称。

在PHP5及之后的版本中,为了向下兼容,如果一个类中没有名为__construct()的方法,则PHP将搜索一个与类名同名的方法作为构造方法。如果__construct()方法和与类名同名的方法同时存在,则优先将__construct()作为构造方法。2.析构函数

类的析构函数是__destruct(),析构函数不能使用参数。若在类中声明了该函数,则PHP将在对象被销毁前调用该函数,将对象从内存中销毁,节省服务器资源。

执行结果如图12-1所示。

将数字1作为实参创建对象$a时,自动执行构造函数,输出结果“执行构造函数1”;将数字2作为实参创建对象$b时,自动执行构造函数,输出结果“执行构造函数2”。对象$a和$b分别访问了类的函数res(),根据传递的实参计算并输出结果。在所有内容执行完毕之后,分别访问对象$a和对象$b的析构函数销毁对象,并输出“执行析构函数”。图12-1

构造函数和析构函数的执行结果12.2.5类的继承1.子类访问父类

在PHP中,允许通过继承其他类的方式来调用这些类中已经定义的属性和方法。PHP不支持多继承,因此一个子类只能继承一个父类。可以使用extends关键字指明类与类之间的继承关系,格式如下。classSubclassextendsParclass{}

其中,Subclass表示子类,Parclass表示父类。2.重定义

方法的重载是指在一个类中可以定义多个同名的方法,通过参数个数和类型来区分这些方法。PHP并不支持这一特性,但可以通过类的继承在子类中定义与父类中同名的方法来实现类似于方法重载的特性,即重定义。

子类中重定义父类中的属性和方法,并不改变父类中的属性和方法。3.关键字final

从PHP5开始引入final关键字,在声明类时,若使用这个关键字,则该类将不能被继承。另外,若是将关键字final用于声明类中的方法,则该方法将不能在子类中重载。12.2.6抽象类和接口1.抽象类

抽象类是从PHP5开始引入的新特性,它是一种特殊的类,使用关键字abstract定义,不能被实例化。一个抽象类中至少包含一个抽象方法,抽象方法也是由abstract关键字定义的。抽象方法只提供方法的声明,不提供方法的具体实现。例如:abstractfunctionfunc($name,$num);

包含抽象方法的类必须是抽象类。

抽象类只能通过继承来使用。继承抽象类的子类必须重载抽象类中的所有抽象方法才能被实例化。2.接口

PHP只能进行单继承,即一个类只能有一个父类。当一个类需要继承多个类的功能时,单继承将无法实现。为了解决这个问题,从PHP5开始引入接口的概念。

接口是通过interface关键字而不是class关键字定义的,虽然像定义标准的类一样,但其中定义的所有方法都是空的。

接口中定义的所有方法都必须是公有方法,这是接口的特性。另外,接口中不能使用属性,但可以使用const关键字定义常量。

接口也支持继承,接口之间的继承也使用关键字extends来实现。

定义接口之后,可以将其实例化,接口的实例化称为接口的实现。实现一个接口需要一个子类来实现接口中的所有抽象方法。定义接口的子类必须使用关键字implements。一个子类可以实现多个接口,通过这种形式可解决多继承的问题。12.2.7类的魔术方法

因为PHP规定以双下画线“__”开头的方法都保留为“魔术方法”,所以在定义函数名时尽量不要使用“__”开头,除非是为了重载已有的魔术方法。前面介绍的构造函数__construct()和析构函数__destruct()都是魔术方法。除此之外,PHP还有另外几个魔术方法。1.克隆对象

在PHP中可使用clone关键字建立与原对象拥有相同属性和方法的对象,若需要改变这些属性,则可以使用PHP提供的魔术方法__clone(),这个方法在“克隆”对象时会自动调用。2.方法重载

魔术方法__call()可以用于实现方法的重载。使用该方法的格式如下。function__call(arg1,arg2){}

参数arg1,表示被调用的方法名称。

参数arg2,表示传递给该方法的参数数组,当对象访问类中不存在的方法时,__call()方法将被调用。3.访问类的属性

通常情况下为了实现类的封装,会将类的属性定义为private(私有的),此时从类的外部直接访问类的私有属性是不允许的。在PHP中定义了两个魔术方法__set()和__get(),在读取不存在的属性时,会自动调用方法__set()和__get()。

__set()方法需要两个参数,分别是将要设置的属性名称和取值;__get()方法只需要属性名称一个参数,该方法会返回属性的值。4.字符串转换

由类创建的对象,其数据类型是对象,不能直接使用print或者echo语句输出。在要输出对象时,可以在类中定义__toString()方法,在该方法中会返回可输出的字符串。5.自动加载对象

__autoload()方法用于自动加载对象,它不是一个类方法,而是一个单独的函数。如果脚本中定义了__autoload()函数,则使用new关键字实例化没有声明的类时,这个类的名称将作为实参传递给__autoload()函数,该函数会根据实参类名自动确定类文件名,并加载类文件中的同名类。6.对象序列化

对象序列化是指将对象转换成字节流的形式,并将序列化后的对象在文件或网络中传输,然后将其反序列化还原为原数据。

对象序列化使用函数serialize()来实现,反序列化使用函数unserialize()来实现。在进行对象序列化时,如果存在魔术方法__sleep(),则PHP会调用该方法,用于清除数据提交、关闭数据库连接等,并返回一个数组,该数组包含需要序列化的所有变量。在反序列化对象后,PHP调用__wakeup()方法,用于重建对象序列化时丢失的资源。方法__sleep()和__wakeup()都不需要接收参数。12.2.8实例——使用类和对象的方式实现邮箱登录功能1.创建数据库操作类Database

创建文件db_class.php,在其中创建类Database,在类中定义下面的属性。$conn,用于表示数据库连接。$result,用于保存查询结

温馨提示

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

评论

0/150

提交评论