面向对象

OOP简介

函数是PHP中用来实现结构化编程的一个很重要的方式,但是由于函数与变量是分离的,当系统过于宠大或者要处理的数据量特别大的时候,往往会带来很多麻烦。使用面向对象可以很有效的解决这个问题。​

  • 具有独立性,这样使程序的各个模块能够各自独立,不互相牵制。有利于后期的维护和调试。
  • 具有灵活性,提供了继承的功能,新模块可以方便地继承已有对象的功能。
  • 具有通用性,如果某几个对象具有相同的特征,则可以通用地定义为一个对象,然后各自根据区别进行继承。
  • 具有重用性,如果新的对象与已有对象功能相同,即使不在一个项目中,也可以简单地将对象复制过来,而不需要很麻烦地删减代码。

类简介

类是变量与作用于这些变量函数的集合。一个类可以简单地看作是一个对象源头。有时在没有声明任何实例的情况下,访问类中的函数或者基类中的函数和变量的功能也很有用处。使用这样的方法可以不需要创建没有意义的对象,这就是静态类。静态类中的变量和函数可以直接用类名进行调用。

PHP5 VS PHP4

  • PHP5 可以使用publicprivateprotected对类中元素的访问范围进行限定
  • 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关键字​​

results matching ""

    No results matching ""