电力出版社《PHP+MySQL开发实例教程》全套课件(第4章)_第1页
电力出版社《PHP+MySQL开发实例教程》全套课件(第4章)_第2页
电力出版社《PHP+MySQL开发实例教程》全套课件(第4章)_第3页
电力出版社《PHP+MySQL开发实例教程》全套课件(第4章)_第4页
电力出版社《PHP+MySQL开发实例教程》全套课件(第4章)_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

PHP+MySQL开发实例教程ISBN号:978-7-5083-7194-8作者:毛书朋聂庆鹏653工程指定教材第4章PHP5面向对象编程4.1PHP面向对象概述4.2类与对象4.3构造函数与析构函数4.4类的继承4.5覆盖与重载4.6self、parent与::关键字4.7本章小结4.8练习题4.1PHP面向对象概述面向对象程序设计(Object-OrientedProgramming,OOP)是近代程序设计领域的一大革命。它提高了程序设计者的产能,提高了软件的重复使用率,并且降低维护成本。面向对象程序设计将要解决的实际问题抽象成程序中的一个个对象,并赋予对象特殊的性质,这样可以克服许多传统的面向过程的编程语言(或称程序性语言)的许多缺点。是一种更新、更先进的编程方式。也是目前已经大规模实用的最先进的编程思想。4.2类与对象4.2.1类面向对象的一个重要理念就是:万事万物皆对象。客观世界中的任何事物,一个人,一辆车,一种物体,都可以视为一个对象。对象还可以是抽象的概念,如天气变化、鼠标事件等。联系客观世界的事物,我可以很容易归纳出对象的两个特征:状态和行为。每个对象都有自身的状态(或称属性),也有自己的行为(操作)。例如一个人有身高、体重、性别等自然属性,也有姓名、职业等逻辑属性。人还有自己的行为范围,如走、立、坐、跑等等。一辆车有颜色、型号、价格、时速等属性,也有起步、换档、刹车、转弯等行为。如图4-1所示。4.2类与对象4.2.1类身高体重性别状态(属性)行走奔跑起立/坐下行为(操作方法)4.2类与对象4.2.1类类的概念是从真实世界的对象中抽象来的。人类很善于对客观世界进行观察、总结和分类。对于具有相同或相似属性的事物,将其归为一类。许多小类又可以进一步抽象成大类。如“动物”可以分为“哺乳动物”、“非哺乳动物”,人就是哺乳动物的一种。“人”是一种具体的事物,而“动物”就是对一类事物的归纳统称。4.2类与对象4.2.1类到了程序中,我们对一类事物或者一个逻辑实体进行抽象提取,将其状态和行为提取出来,封装在一段独立的代码块中。给这个代码块命一个名字,便有了一个“类”。提取出来的状态称之为“属性”,或称“成员变量”,具体用一个变量来表示。而提取出来的行为,称之为“操作”或者“方法”。具体用一个子代码段(类似于一个函数)来表示,这称为类的一个“方法”。于是这就得出了“类”、“变量”和“方法”的概念。4.2类与对象4.2.2类的成员既然一个类是由一类事物或者逻辑抽象而来,其中必然包含了这类事物或者逻辑的基本要素和区别于其他种类的特性。一个内容为空的类虽然是合法的但是是毫无意义的。一个类除了一个名称的声明——也就是类声明之外,其内容由两部分组成:变量和方法。这两个概念我们在上一节已经进行了阐述。而类的变量和方法统称为类的成员。4.2类与对象4.2.2类的成员我想大概很多读者已经迫不及待的想知道PHP中一个类的代码如何书写。下面我们就给出图4-1中所表示的关于“人”的类的简单抽象后的PHP代码:4.2类与对象<!--文件4-1.php:一个“人”的类示例-->1:<?php2:classPerson{3:var$shengao;4:var$tizhong=60;5:var$xingbie="男";6:functionwalk($speed){7://具体代码8:}9:functionrun(){10://具体代码11:}12:functionsitdown(){13://具体代码14:}15:}16:?>类声明变量方法类的成员4.2类与对象4.2.2类的成员本例中,用class关键字声明了一个类Person表示“人”。在类的语句体中定义了3个变量,分别表示身高、体重、性别的属性。定义了3个方法分别表示行走、奔跑、坐立的行为。这样,一个“人”就被我们抽象到了程序中,并用具体的代码表示出来。当我们在程序中需要用到和此类事物有关的操作时,可以使用这个类的代码。4.2类与对象4.2.2类的成员程序4-1如果直接运行不会有任何输出,因为我们在这个程序中只是定义了一个“类”。就相当于我们只定义了一个函数而没有使用它,当然不会有任何输出。要让这个类在我们的程序中发挥作用,需要首先将其“实例化”。这就是下一节要讲的——类的实例化:对象。4.2类与对象4.2.3类的实例化:对象“实例化”是一个术语,实际上我们可以理解为“具体化”。通过上面的学习我们知道,类是我们抽象出来的一个逻辑单位。虽然我们用具体的代码书写出来了,这个类仍然只是一个某类事物的“定义”而不是这种事物本身。要在程序中使用这类事物,首先要创建出这类事物的一个实体——这就是类的实例化。而创建出来的实体,在面向对象的程序设计中,称为对象。4.2类与对象4.2.3类的实例化:对象那么这个所谓的“实例化”具体如何进行呢?在PHP中,将一个类实例化成一个对象非常简单,只需要使用new关键字进行实例化即可。$var=new类名();具体到例4-1中,则为:$p1=newPerson();4.2类与对象4.2.3类的实例化:对象这时候变量$p1就不是一个普通的变量了,而变成了一个对象(Object)类型。对象类型的使用和其他普通类型如字符、整型不同。如我们无法将其直接输出或者进行算术运算,因为这是一个特殊的变量类型——它其中包含了一些“属性”和“方法”。那么我们如何使用这个对象呢?例:4-2.php:类成员的调用4.2类与对象4.2.3类的实例化:对象有一点需要指出的是,在类的方法中访问自身的其他成员时,需要用“$this->成员名”的方式。classtest{//类定义

varvar1;//变量定义

varvar2;functionfun1(){//方法定义

//具体代码}functionfun2(){$this->var1=1;//访问成员$var1$this->var2=2;//访问成员$var2$this->fun1();//访问成员fun1()}}4.2类与对象4.2.3类的实例化:对象实际上一个类可以创建出多个对象,甚至理论上讲可创建的对象的个数是无限的。类就相当于一张产品的设计图,根据设计图可以制作出无数的产品。而且创建出来的每一个产品都是独立的,也就是根据同一张设计图制造出来的产品之间是相互独立、互不影响的。同理用同一个类生成的多个对象在计算机中也是相对独立、互不影响的。他们各自占据各自的内存空间,相互之间并无干扰。例:文件4-3.php:创建多个对象4.2类与对象4.2.4访问控制通过例4-2我们可以看到,同一个类的成员,可以在不同的场合以不同的方式调用。如我们要设置$name变量的值,可以使用类自身提供的setName()方法,也可以直接通过“对象名->name”的方法。这看似是一种灵活性的表现,但是对于一个健壮的、安全的程序而言,这种很随意的访问方式很容易带来负面问题。我们不妨举一个简单的例子。

4.2类与对象4.2.4访问控制例:4-5.php:成员的随意性访问带来混乱

4.2类与对象4.2.4访问控制在PHP中,对属性或方法的访问控制,是通过在前面添加关键字public、protected或private来实现的。由public所定义的类成员可以在任何地方被访问;由protected所定义的类成员则可以被其所在类及其子类访问(关于子类的概念我们将在本章的后面介绍);而由private定义的类成员则只能被其所在类访问。4.2类与对象4.2.4访问控制例:4-5.php:用访问控制符控制成员的访问权限4.2类与对象4.2.4访问控制学过了访问控制之后,我们就可以来澄清一个前面章节中的问题:在前面的小节中,我们在定义类的变量时一般使用var作为关键字,实际上这是PHP4中的写法,到了PHP中,虽然仍然保持兼容,但是推荐使用public、protected、private之一来修饰变量。4.2类与对象4.2.4访问控制public、protected、private关键字同样可以应用于方法,来实现对方法的访问控制。其控制原理与变量相同,因此不再给出具体例子,请读者自行设计一个程序来验证。当一个方法没有使用访问控制修饰符修饰时,则默认为public。4.3构造函数与析构函数4.3.1构造函数的使用所谓构造函数,是指类中的一个特殊的方法,在PHP中,这个方法以__construct()为方法名。而且此方法没有返回值。构造函数的实质仍然是类中的一个方法,也就是类的一个成员。只不过这个方法和其他方法相比有其特殊性。其特殊性主要表现在以下方面:4.3构造函数与析构函数4.3.1构造函数的使用1)构造函数必须命名为__construct()。在PHP5以前版本中构造函数名必须与类名一致。PHP5以后改为__construct()(注意construct前面是连续2条下划线“_”)。2)构造函数在类被实例化时自动调用(用new创建对象时自动运行此方法)。3)构造函数没有返回值。4)构造函数一般不被“显式”调用。也就是说构造函数在创建对象时自动运行,而不需要去人为调用。4.3构造函数与析构函数4.3.1构造函数的使用构造函数作为类的一个基本特性之一,必然有其用途。构造函数的最主要用途就是用来实现类的初始化。即我们往往需要在创建一个对象的同时就对这个对象进行一些初始化操作,而不是等到对象创建完成后再逐个设置。这时构造函数就派上了用场。例:文件4-6.php:构造函数的使用4.3构造函数与析构函数4.3.1构造函数的使用其实,所谓“构造函数”,仍然是一个方法。在面向对象编程中,已经基本废弃了“函数”这个称呼,类中的函数称为“方法”。之所以仍然将构造器称为“构造函数”,只是一种习惯上的作法。在许多资料中都这么称呼,本书仍然沿用这一称呼。4.3构造函数与析构函数4.3.2析构函数析构函数是与构造函数相对应的另一个特殊方法。它仍然是类中的一个方法,不过有其特殊性:1)析构函数必须命名为__destruct()。2)析构函数没有参数。3)析构函数没有返回值。4)析构函数在对象被销毁时自动调用,一般不需要显式调用。4.3构造函数与析构函数4.3.2析构函数析构函数是PHP5以后引入的新概念。学习了构造函数之后,析构函数便十分好理解,我们直接来看一个例子:例:4-7.php:析构函数的使用4.4类的继承继承(inheritance)是面向对象程序设计的三大特性之一。所谓继承,就是指一些类可以从另外一些已有的类中派生而来。如类B派生自类A,则我们称A为“父类”或“超类”,B为“子类”或“次类”。4.4类的继承到了程序设计中,如果一个类具有了另一个类的特征,那么这两个类也可以建立这种层级关系,也可以分出“父类”和“子类”。那么两个类之间的特征如何体现呢?我们可以使用继承。继承是面向对象编程语言提供的机制,借此我们可以让一个类B具备另一个类A的全部特征。并且B仍然可以有自己的特征,如牧羊犬虽然是狗,但是它又不同于其他的狗,有其自身的特征。4.4类的继承在PHP中,要实现继承,只需要在类定义时使用extends关键字,即可让该类继承自另外一个类,从而拥有它所继承的类的全部特征。我们看一个示例:例:文件4-8.php:类的继承4.4类的继承我们一旦使用extends关键字声明一个类B继承自另外一个类A,那么类B就继承了类的所有成员(父类中声明为private的除外)。其中包括类A从它的父类中继承下来的成员。这就是继承的核心特点。掌握了继承的概念,我们就可以在很多场合灵活加以使用,来解决编程中的实际问题。4.4类的继承最后需要说明的一点是,并不是所有的类都可以被其他类继承。如果一个类不希望被其他类继承,可以在声明此类时在前面增加final关键字。如下列写法:finalclassBaseClass{//此类声明为final最终类

publicfunctiontest(){echo"justatest";}}classChildClassextendsBaseClass{//报错,因为声明为final的类不能被继承}4.5覆盖与重载4.5.1覆盖在一个类B继承另外一个类A时,如果B中定义的成员与A中定义的成员发生重名,则产生覆盖。即B中的成员覆盖掉A中的同名成员。这就是覆盖。覆盖可以覆盖变量,也可以覆盖方法,故称成员覆盖。例:文件4-9.php:成员的覆盖4.5覆盖与重载4.5.2重载重载(Overloading)是面向对象的编程语言三大特性之一“多态”的重要表现形式。重载可以用一句话简单概括:在同一个类中出现同名的变量或方法。4.5覆盖与重载4.5.2重载实际上纯粹的面向对象编程语言,都对重载有良好的支持。PHP作为一门Web编程语言,对重载的支持并不理想。甚至可以说PHP根本不支持真正的重载。因为PHP不允许一个类中出现两个同名的变量或者同名的方法,否则会报错。但是PHP通过几个所谓的“Magicmethods”(魔法方法)实现了变相的重载。在PHP手册关于PHP5面向对象编程的介绍中,就有重载一节。但是很明显这种重载方法只是低层次的。4.5覆盖与重载4.5.2重载虽然有一些拐弯抹角的方式可以实现一定意义上的重载,但由于PHP在重载方面并不成熟,我们在这里不再进行讨论。对此感兴趣的读者可以参阅PHP手册,或者登陆本书作者的PHP论坛,里面可以找到一些这方面的资料。4.6self、parent与::关键字self是指向类本身,也就是self并不是指向已经实例化的对象。self用来引用类中的静态(static)变量,普通变量无法用SELF引用。而且SELF在引用时后面不用->而是用双冒号操作符(::)。看下面的一个例子:例:4-10.php:成员的覆盖4.6self、parent与::关键字parent关键字表示对父类的引用。该关键字一般用在子类中,用来调用父类的构造函数。比如下面的代码片断:classAnimal{public$name;//父类的构造函数

publicfunction__construct($name){$this->name=$name;}}classPersonextendsAnimal{public$personSex;4.6self、parent与::关键字

public$personAge;//子类的构造函数

function__construct($personSex,$personAge){

parent::__construct("

温馨提示

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

评论

0/150

提交评论