PHP 面向对象技术(全面讲解)
Ø 主要内容
v 1.面向对象的概念
v 2.什么是类,什么是对象,类和对象之间的关系
v 3.什么是面向对象编程呢?
v 4.如何抽象出一个类?
v 5.如何实例化对象?
v 6.如何去使用对象中的成员?
v 7.特殊的引用“$this”的使用
v 8.构造方法与析构方法
v 9.封装性
v 10.__set()、__get()、__isset()、__unset()四个方法的应用
v 11.类的继承
v 12.多态的应用
v 13.重载新的方法
v 14.访问类型
v 15.静态成员的使用
v 16.final 关键字的应用
v 17.__toString()方法
v 18.克隆对象
v 19.__call 处理调用错误
v 20.自动加载类
v 21.把对象串行化
v 22.抽象方法和抽象类
v 23.php5 接口技术
Ø 内容笔记
面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成,OOP达到了软件工程的三个目标:重用性、灵活性和扩展性。
类的概念:类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。
对象概念:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。
关系:类的实例化结果就是对象,而对一类对象的抽象就是类。
类的定义:
class 类名{
}
成员从定义的角度分两部分,一是从静态上描述,二是从动态上描述。
class 人{
成员属性:姓名、性别、年龄、身高、体重、电话、家庭住址
成员方法:可以开车, 会说英语, 可以使用电脑
}
使用new 关键字生成一个对象。
$对象名称= new 类名称();
内存大体上分为4 段,栈空间段、堆空间段、代码段、初始化静态段。
使用一个特殊的操作符“->”来完成对象成员的访问:
对象->属性 $p1->name; $p2->age; $p3->sex;
对象->方法 $p1->say(); $p2->run();
提供了一个本对象的引用$this,$this 就是对象内部代表这个对象的引用。
在对象内部和调用本对象的成员和对象外部调用对象的成员所使用的方式是一样的
$this->属性 $this->name; $this->age; $this->sex;
$this->方法 $this->say(); $this->run();
构造函数:当创建一个对象时,使用new 关键字来实例化对象的时候自动调用的方法。
格式:function __construct ( [参数] ) { ... ... }
析构函数:允许在销毁一个类之前执行的一些操作或完成一些功能。
格式:function __destruct ( ) { ... ... }
封装性是面向对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节。
包含两个含义:
1. 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位。
2. 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外接口使之与外部发生联系。
使用private 这个关键字来对属性和方法进行封装。
私有的成员是不能被外部访问的,因为私有成员只能在本对象内部自己访问。
注:总是把类的属性定义为private,这更符合现实的逻辑
继承作为面向对象的三个重要特性的一个方面,继承性是子类自动共享父类的数据结构和方法的机制,这是类之间的一种关系。
类的继承性使所建立的软件具有开放性、可扩充性。
类通过使用“extends”关键字把父类里的所有成员属性和成员方法都继承过来。
重载新的方法就是子类覆盖父类的已有的方法。
子类方法中调用父类被覆盖的方式:
一种是使用父类的“类名::”来调用父类中被覆盖的方法;
一种是使用“parent::”的方试来调用父类中被覆盖的方法;
类型的访问修饰符允许开发人员对类成员的访问进行限制,支持如下访问修饰符:
public(公有的、默认的),private(私有的)和protected(受保护的)三种。
final这个关键字只能用来定义类和定义方法,不能使用final这个关键字来定义成员属性,因为final是常量的意思,所以不能使用final 来定义成员属性。
使用final 关键标记的类不能被继承。
Static 关键字是在类中描述成员属性和成员方法是静态的。
static 成员能够限制外部的访问,因为static 的成员是属于类的,是不属于对象实例。
在类的外部不需要对象而使用类名就可以访问的到静态的成员; 类名::成员属性
类里面的静态方法只能访问类的静态的属性.
在静态方法中访其它静态成员我们使用的是一个特殊的类“self”.
self 和$this 相似,只不过self 是代表这个静态方法所在的类。 self::成员属性
在非静态方法里也可以访问静态成员,但是也不能使用“$this”引用,而要使用类名或是“self::成员属性的形式”。
const 是一个定义类常量的关键字,用“const”修饰的成员属性的访问方式和“static”修饰的成员访问的方式差不多,也是使用“类名”,在方法里面使用“self”关键字。但是不用使用“$”符号,也不能使用对象来访问。
__toString()方法 是在直接输出对象引用时自动调用的。
__clone()方法,是在对象克隆时自动调用的方法,__clone()方法可以没有参数,它自动包含$this 指针,$this 指向复本。
__call()对象调用对象内部方法时候,调用的这个方法不存在时程序自动调用的方法。
在OOP 语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法做为外部代码访问其的接口。
在类里面定义的没有方法体的方法就是抽象方法,所谓的没有方法体指的是,在方法声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时还要加一个关键字“abstract”来修饰。
一个类里面有一个方法是抽象方法,那么这个类就要定义为抽象类,抽象类也要使用“abstract”关键字来修饰。
抽象类不能产生实例对象,所以也不能直接使用,子类必须把父类中的抽象方法全部都实现后才可以使用。
接口的思想是指定了一个实现了该接口的类必须实现的一系列方法。接口是一种特殊的抽象类,抽象类又是一种特殊的类,所以接口也是一种特殊的类。
抽象类里面的所有的方法都是抽象方法,就称盖类为“接口”;也就是说接口里面所有的方法必须都是声明为抽象方法,另外接口里面不能声明变量,而且接口里面所有的成员都是public 权限的。所以子类在实现的时候也一定要使用public 权限实限(子类权限大于等于父类属性的权限)。
使用的关键字是“interface”来申明一个接口。
类的定义:class 类名{ … }, 接口的声明:interface 接口名{ … }
可以使用“extends”关键字让一个接口去继承另一个接口;
可以使用“implements”关键字让接口的子类去实现接口中全部抽象方法。
PHP 是单继承的,一个类只能有一父类,但是一个类可以实现多个接口;
也可以在继承一个类的同时实现多个接口, 一定要先继承类再去实现接口;
多态是除封装和继承之外的另一个面向对象的特性之一,PHP 中虽然可以实现多态,但和其他面向对象的语言相比,多态性并不是那么突出,因为PHP 本身就是一种弱类型的语言,不存在父类对象转化为子类对象或者是子类对象转化为父类对象的问题,所以多态的应用并不是那么的明显;
所谓多态性是指一段程序能够处理多种类型对象的能力。
有两种情况我们必须把对象串行化
第一种情况就是把一个对象在网络中传输的时候要将对象串行化;
第二种情况就是把对象写入文件或是数据库的时候用到串行化。
串行化有两个过程,一个是串行化,就是把对象转化为二进制的字符串,我们使用serialize()函数来串行化一个对象,另一个是反串行化,就是把对象转化的二进制字符串再转化为对象, 我们使用unserialize()函数来反串行化一个对象.
在对象串行化的时候,会调用一个__sleep()方法来完成一些睡前的事情;而在重新醒来,即由二进制串重新组成一个对象的时候,则会自动调用PHP 的另一个函数__wakeup(),做一些对象醒来就要做的动作。
很多开发者写面向对象的应用程序时,对每个类的定义建立一个PHP 源文件代码。
function __autoload($classname){ // 自动加载类文件
require_once $classname . '.php';
}
还有一种自动加载类的方法
spl_autoload_register('myloader');
function myloader($classname) {
return @include str_replace('_', DIRECTORY_SEPARATOR, $classname).'.php';
}
可以回调函数来处理加载文件类机制,速度比__auroload快。