面向对象
OOP简介
函数是PHP中用来实现结构化编程的一个很重要的方式,但是由于函数与变量是分离的,当系统过于宠大或者要处理的数据量特别大的时候,往往会带来很多麻烦。使用面向对象可以很有效的解决这个问题。
- 具有独立性,这样使程序的各个模块能够各自独立,不互相牵制。有利于后期的维护和调试。
- 具有灵活性,提供了继承的功能,新模块可以方便地继承已有对象的功能。
- 具有通用性,如果某几个对象具有相同的特征,则可以通用地定义为一个对象,然后各自根据区别进行继承。
- 具有重用性,如果新的对象与已有对象功能相同,即使不在一个项目中,也可以简单地将对象复制过来,而不需要很麻烦地删减代码。
类简介
类是变量与作用于这些变量函数的集合。一个类可以简单地看作是一个对象源头。有时在没有声明任何实例的情况下,访问类中的函数或者基类中的函数和变量的功能也很有用处。使用这样的方法可以不需要创建没有意义的对象,这就是静态类。静态类中的变量和函数可以直接用类名进行调用。
PHP5 VS PHP4
- PHP5 可以使用
public
、private
、protected
对类中元素的访问范围进行限定 - PHP5 对构造函数和析构函数的支持
- PHP5 接口的应用
- PHP5 可以通过
instanceof
操作符进行对象类型的判断 - PHP5 支持类的克隆
- PHP5 支持静态类及静态方法
- PHP5 支持抽象类及抽象方法
创建类
class className{
// code...
}
类和方法的可见性
public
公开private
私有,只能在本类中可见protected
保护,只能在本类或子类中才可见
类和方法的形态
static
声明类属性或方法为static
(静态),就可以不实例化类而直接访问。PHP没有静态类,只有静态方法和静态属性final
如果父类中的方法被声明为final
,则子类无法覆盖该方法。如果一个类被声明为final
,则不能被继承。
定义属性和方法
属性的定义
var variable_name;
方法的定义
function getName(){
// code...
}
构造函数
- 构造函数是类中的一个特殊函数,当创建一个类的实例时,将会自动调用构造函数。在类中定义的函数与类同名时,这个函数将会被认为是一个构造函数
- 构造函数的函数名和类名必须完全相同。
- 构造函数没有返回类型和返回值。
- 构造函数的主要功能通常是对类中的对象完成初始化工作。
- 构造函九与类中的其他函数一样,可以是有参数的函数,也可以是无参数的函数。
特殊方法
__construct()
除了与类名相同的函数来创建构造函数外,使用PHP提供的__construct()方法,也可以作为类的构造函数
__destruct()
与构造函数相反,析构函数是在对象被销毁的时候自动调用的。
__toString()
对象转换成字符串函数
__clone()
在执行克隆操作时,这个函数将自动调用。
类的引用
使用new
关键字,进行创建一个类的对象,使用->
符号,可以访问对象的属性和方法
类的扩展与继承
一个类可以使用extends继承自另外一个类,这种方式叫类的扩展
class myClass extends BaseClass{
// code...
}
- 子类继承自父类,拥有父类的方法和属性,子类需要访问父类的方法或属性可以使用
parent
关键字 - 子类可以重写父类的方法,方法名和方法参数类型和个数需要跟父类一样。在调用子类的方法时,如果此方法是重写父类的方法,父类的方法不会执行。
- 一个类中如果有两个及两个以上的方法名称相同,但参数的个数不同,称之为方法的重载。
class myClass{
function show(){
// code...
}
function show($name){
// code...
}
}
操作与调用
静态方法和属性的调用
静态方法和属性的调用使用::
实现,静态类不需要创建对象,因此不能像对象一样使用->
调用。
实例类型的判断方法
通过类来创建对象,但是当系统过大的时候,需要判断某个对象是否是某个类创建出来的。可以使用instanceof
方法来进行$obj instanceof className
对象克隆
除了通过类创建对象外,还可以使用克隆的方式创建一个对象,新的对象会拥有被克隆对象的全部属性。$newObj = clone $obj;
接口
接口是为了实现一种特定功能而预留的类似类的一种类型。在接口中,只允许定义常量和函数。这里的函数没有任何函数体来表示函数的功能,只有函数声明,主要目的是提供给类一种类似于模板的框架,以方便构建。
接口定义
interface interfaceName{
// code...
}
接口的实现
实现接口与扩展一个类的形式类似,不同的是在定义的时候用关键字implements
表示。
class className extends baseClass implements interfaceName{
// code...
}
class className implements interfaceName1,interfaceName2{
// code...
}
抽象类
抽象类的定义方法是在一般类定义时的class
关键字的前面添加abstract
关键字
abstrace class className{
// code...
}
抽象类与接口的区别
- 抽象类不能够用来创建对象,只能够用于继承。
- 接口使用
interface
来定义,抽象类使用abstract class
来定义 - 实现接口使用
implements
,实现抽象类使用extends
- 可以实现多个接口,只能实现一个抽象类
- 在接口中不可以有函数的实现代码,在抽象类中可以有具体的函数实现代码。抽象类可以包括非抽象的方法。只有抽象方法不需要实现代码。
抽象方法
抽象方法只能存在于抽象类中,在关键字function
前加abstract
关键字