www.baike369.com
百科369 > PHP教程 > PHP面向对象编程

PHP面向对象编程



PHP面向对象编程

面向对象是一种计算机编程架构(或者称为模型或者框架),比面向过程编程具有更强的灵活性和扩展性。面向对象编程也是一个程序员发展的“分水岭”,很多的初学者和略有成就的开发者,就是因为无法理解“面向对象”而放弃。这里想提醒一下初学者:要想在编程这条路上走得比别人远,就一定要掌握面向对象编程技术。

PHP面向对象基础

面向对象编程(OOP)起源于20世纪60年代,直到20世纪90年代才成为应用软件开发的主流,如今从应用软件时代过渡到Web,面向对象思想仍然具备极大的应用价值。


PHP面向对象的基本概念

PHP面向对象的基本概念

这里所指的面向对象,准确地说应该叫做面向对象编程(OOP),是面向对象的一部分。

PHP类的封装

面向对象编程的一个重要思想就是封装。

PHP类的继承

继承是面向对象编程的一个较大特性之一,使用继承可以:实现系统扩展性。

PHP对象

面向对象开发与功能性的程序开发的最大区别是,数据与代码都被捆绑在一个实体中。


PHP类的声明

在创建类名称时必须对类进行声明。

PHP类的定义(class)

在PHP中,通过class关键字加类名来定义类。

PHP类的成员属性

在类中声明的变量称为成员变量,也称为成员属性。

PHP类常量及常量的输出(::)

在PHP中,可以把在类中始终保持不变的值定义为常量。

PHP类常量(const与self::)

类常量是定义在类中的常量,如果我们使用const关键字来修饰该常量,那么该常量就被称为类常量。

PHP类的成员方法

函数如果出现在类中,就被称为成员方法。

PHP类的静态成员方法(static、self::与parent::)

PHP也支持成员方法声明为静态。


PHP类的实例化

PHP类的实例化——创建对象

类的方法已经添加,接下来就可以使用类的方法了,但使用方法不像使用函数那么简单。

PHP访问类中的成员(->)

在类中包括成员属性和成员方法,访问类中的成员包括访问成员属性和访问成员方法两种形式。

PHP类中的$this关键字

在一个类中,$this是一个特殊的属性,并且只能在类的内部使用,用以获取类中某个成员属性的值。

PHP类的特殊访问方法——$this和::

我们在定义类时,根本无法得知对象的名称是什么。

PHP类的构造方法(__construct())和析构方法(__destruct())

当我们将一个类实例化一个对象时,可能需要随着对象初始化一些成员变量。

PHP类的构造方法(__construct())

当创建一个新的类调用即声明新对象时,PHP会根据我们的请求在内存区域中创建和分配该类和该类属性的副本,供开发者在PHP脚本中进行调用。

PHP类的析构方法(__destruct())

析构方法(destructor)与构造方法(constructor)的功能正好是相反的。

PHP对象传递

PHP 5.1以上版本中使用了Zend引擎2.x(PHP 5.2.3使用的是2.2版本)。


PHP面向对象的封装特性——数据隐藏

是将类中的成员属性和方法结合成一个独立的相同单位,并尽可能隐藏对象的内容细节。其目的就是确保类以外的部分不能随意存取类的内部数据(成员属性和成员方法),从而有效地避免外部错误对类的内部数据的影响。
类的封装是通过关键字public、private、protected、static和final来实现的。成员属性(成员变量)和成员方法在关键字的使用上都是一样的。

PHP访问类的成员属性的约束

如果在一个类中定义了一个成员属性,我们可以通过public、protected和private等关键字,来设置访问成员属性的权限。

PHP类的public(公共成员)

类的公共成员,就是可以公开的、没有必要隐藏的数据信息。

PHP类的private(私有成员)

被private关键字修饰的属性(变量)和方法,都是私有成员。

PHP类的protected(保护成员)

对于有些类来说,需要做到封装,这时,就可以使用protected关键字了。

PHP在类中设置访问成员的方法

PHP对类中的方法的访问限制和对成员属性的访问限制的关键字的描述是相同的,即也是public、protected和private等。


PHP面向对象的继承特性

面向对象编程的特点之二是继承性,使一个类继承并拥有另一个已存在类的成员属性和成员方法,其中被继承的类称为父类,继承的类称为子类。通过继承简化了对象、类的创建,能够提高代码的重用性和可维护性。但是,PHP只支持单继承。

PHP类的继承——extends关键字

子类继承父类的所有成员变量和方法,包括构造函数,当子类被创建时,PHP会先在子类中查找构造方法。

PHP类的继承(extends)

面向对象编程(OOP)的一大好处就是。

PHP通过extends关键字声明类的继承的实例

本例使用SportObject类生成了两个子类:BeatBasketBall和WeightLifting。

PHP类的继承——parent关键字

通过parent关键字也可以在子类中调用父类中的成员方法。

PHP覆盖父类的方法

覆盖父类的方法就是使用子类中的方法将从父类中继承的方法进行替换,也叫方法的重写。


PHP抽象类和接口类

抽象类(Abstract)和接口类(Interface)都是不能被实例化的特殊类。它们都是配合面向对象的多态性一起使用的。

PHP使用abstract关键字声明抽象类

抽象类是一种不能被实例化的类,只能作为其它类的父类来使用。

PHP抽象类与抽象方法(abstract)

抽象类(Abstract Classes)是一种不能被实例化的类,它主要用于为继承的子类定义界面,在抽象类里面的成员方法都是没有具体实现的方法。

PHP使用interface关键字声明接口类

继承特性简化了对象、类的创建,增加了代码的可重性,但PHP只支持单继承。

PHP接口的实现(interface与implements)

我们已经了解,通过类的继承可以实现一个父子关系的描述。

PHP实现多个接口(interface)

接口的最大特点是还可以从其它接口继承。

PHP抽象类(abstract class)与接口(interface)的区别

抽象类(abstract class)与接口(interface)之间有什么不同呢?我们可以通过两个方面区别两者。


PHP面向对象的多态性

面向对象编程的特点之三是多态性,是指一段程序能够处理多种类型对象的能力。例如有一个成员方法让大家去游泳,这个时候有的人带游泳圈,还有人拿浮板,还有人什么也不带。虽然是同一种方法,却产生了不同的形态,这就是多态。

PHP类的多态性

我们知道,多态性是面向对象开发的重要标志之一。

PHP类的覆盖——通过继承实现多态性

所谓覆盖就是在子类中重写父类的方法,而在两个子类的对象中虽然调用的是父类中相同的方法,但返回的结果不同。

PHP通过接口类实现类的多态性

在PHP中,也可以通过接口类来实现类的多态性。

PHP使用__call()方法实现类的重载

重载,是类的多态的另一种实现。


PHP面向对象的关键字

PHP使用clone关键字复制对象

在PHP中,通过clone关键字可以复制一个对象。

PHP final关键字

在PHP中,被final关键字修饰过的类和方法就是“最终的版本”。

PHP final方法

我们已经掌握如何扩展一个类(或继承一个类),可以覆盖继承的方法,使用一个新的逻辑实现。

PHP final类

final类有点类似于final方法。

PHP使用static关键字声明静态属性和静态方法

在PHP中,通过static关键字修饰的成员属性和成员方法被称为静态属性和静态方法。

PHP使用static关键字声明的静态属性和方法及调用

不是所有的属性(变量)和方法都要通过创建对象来调用。

PHP类的静态成员属性(static与self::)

我们知道,在类中需要声明它的属性,当类被实例化成对象后,这个实例的成员变量就是该类的属性的复制。

PHP比较静态变量(static)和普通变量的区别

静态变量在很多地方都能用到。例如,在博客中使用静态变量记录浏览者的人数,每一次用户访问和离开时,都能够保留目前浏览者的人数。

PHP类中的parent::与self::关键字

在PHP的面向对象开发中支持两个关键字:parent::和self::,用于在类中引用自身的成员方法和属性。


PHP面向对象的魔术方法

在PHP中有很多以两个下划线开头的方法,这些方法被称为魔术方法。这些魔术方法的参数都不能通过引用传递。另外,只能使用在PHP文档中已有的这些方法,不要自己创建。
    如果希望PHP调用这些魔术方法,首先必须在类中进行定义,否则PHP不会执行未创建的魔术方法。

PHP使用clone关键字复制对象

在PHP中,通过clone关键字可以复制一个对象。

PHP使用clone关键字克隆一个对象

在PHP5中,创建好一个对象(使用new关键字)后,如果要引用该对象,PHP返回的将是这个对象的ID号。

PHP使用clone关键字克隆一个成员方法

要实现对象的克隆,但还想有自己的成员方法时,应该怎么办?这种情况应该使用__clone方法实现。

PHP魔术方法之__clone()方法复制对象

在PHP中,有时除了单纯地克隆对象外,还需要克隆出来的对象可以拥有自己的属性和行为。

PHP魔术方法之__set()方法和__get()方法

在PHP中,__set()方法和__get()方法对私有成员进行赋值或者获取值的操作。

PHP __get()方法与__set()方法

我们可以通过__get()和__set()方法来存取或调用未经定义的成员方法和属性。

PHP魔术方法之__call()方法

在PHP中,当程序在对象中试图调用类中一个不存在或不可见的成员方法时,PHP会先调用__call()方法来存储方法名及其参数。

PHP __call()方法

当我们试图调用类中一个不存在或不可见的方法时,PHP 5会执行该类中的__call()方法。

PHP魔术方法之__callStatic()方法

在PHP中,当使用“::”操作符调用类中一个不可访问的方法时,__callStatic()方法会被调用。

PHP魔术方法之__sleep()方法和__wakeup()方法

__sleep()方法使用serialize()函数可以实现序列化对象。

PHP魔术方法之__isset()方法和__unset()方法

__isset()方法在面向对象中。

PHP魔术方法之__toString()方法

在PHP中使用魔术方法__toString(),可以在使用echo或print输出对象时,将对象转化为字符串。

PHP魔术方法之__invoke()方法

在PHP中,当试图以调用函数的方式调用一个对象时,__invoke()方法会被自动调用。


PHP面向对象的应用

PHP使用instanceof操作符检测对象类型

在PHP中,使用instanceof操作符可以检测当前对象是属于哪一个类。

PHP对象类型的检测——instanceof

instanceof操作符用于检测当前对象实例是否属于某一个类的类型。

PHP使用__autoload()函数自动加载类

将一个独立、完整的类保存到一个PHP页中,并且文件名和类名保持一致,这是每个开发人员都需要养成的良好习惯。

PHP __autoload()方法

在编写面向对象的程序时,常规做法是将每一个类保存为一个PHP源文件,这样做的好处是很容易找到一个类在什么地方,并且在需要调用某个类的时候。

PHP对象比较

在PHP 5中比较对象,所期望的结果更符合一个面向对象语言。

PHP对象的比较

要进行对象的比较,我们可能会想到使用==和===两个比较运算符。

PHP中文字符串的截取类

在截取英文字符串时,可以使用substr()函数来完成。

PHP例外与异常处理(try/catch)

在网站运营中,有时我们无法控制错误与故障的发生,例如数据库服务器宕机,网络故障或软件出现bug。

PHP方法中声明类的类型

虽然PHP不是一个强类型的语言,即无需在使用变量时声明它的类型,但有时在一个指定的类中,我们希望接收的参数必须是指定的类型,以便做严格的处理。

Copyright© 2011-2016 www.baike369.com All Rights Reserved