抽象类
- 定义:一个抽象的不能被实例化的类。
定义形式(
abstract
关键字):abstract class 类名{ // ... }
抽象方法
定义:一个只有方法头,没有方法体的方法
定义形式(用
abstract
修饰方法)abstract class 类名{ abstract function 方法名(形参列表); // 没有方法体,结尾分号不能省略 }
抽象类和抽象方法的细节:
- 一个抽象方法必须在抽象类中,即方法为抽象的,那么其所在的类也不是是抽象的;
- 抽象类中可以没有抽象方法;
- 子类继承了父类,那么要么实现(“重写”)父类的抽象方法,要么在次定义为抽象的。
重载
含义:在“通常面向对象语言”中是指一个类可以名字相同但形参不同的方法的现象(如
java
)。如:
class A{ function f(){ } function f($a){ } function f($a,$b){ } }
php中的重载
含义:是指当对一个对象或类使用其未定义的属性或方法的时候,其中的一些“处理机制”。
属性重载:
- 含义:对一个对象的不存在的属性进行使用的时候,这个类种预先设定好的应对方法(处理机制)
属性,本质就是一个变量,其有4个操作:
- 取值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:
__get()
; - 赋值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:
__set()
; - 判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:
__isset()
; - 判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:
__unset()
。
- 取值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:
__set($属性名,值):
含义:当对一个对象的不存在属性进行“赋值”的时候就会自动调用这个内部的魔术方法,它有两个形参,分别代表对不存在的属性进行赋值的时候的“属性名”和“属性值”。
这个方法结合
__get()
方法,往往可以使我们定义的类,就有一种“可简便扩展属性”的特性,即类(或对象)的属性,可以更为方便自由,如下所示:class A{ protected $prop_list = array(); function __set($p,$v){ $this->prop_list[$p] = $v; } function __get($p){ return $this->prop_list[$p]; } }
__isset()
- 含义:当对一个对象的不存在属性进行“判断”的时候就会自动调用这个内部的魔术方法。
__unset()
- 含义:当对一个对象的不存在属性进行“销毁”的时候就会自动调用这个内部的魔术方法。
方法重载
当对一个对象的不存在的实例方法进行“调用”的时候会自动调用类中的
__call()
这个魔术方法;当对一个对象的不存在的静态方法进行“调用”的时候会自动调用类中的
__callstatic()
这个魔术方法。php中实现通常的面向对象语言的“方法重载”(利用
__call()
和__callstatic()
方法),如:<?php class A{ function __call($methodName,$arguments){ switch ($methodName) { case 'f1': // 调用了f1这个不存在的方法 # 调用了方法名为f1的这一系列重载方法 if(count($arguments) == 0){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 1){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 2){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 3){ // 这里拿这些参数做这个方法的事情... } // ... break; case 'f2': // 调用了f2这个不存在的方法 # 调用了方法名为f2的这一系列重载方法 if(count($arguments) == 0){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 1){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 2){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 3){ // 这里拿这些参数做这个方法的事情... } // ... break; default: break; } } } ?>
接口
定义形式
interface 接口名{ 常量1; 常量2; ... 抽象方法1; 抽象方法2; ... }
说明:
- 接口中只有常量(接口常量)和抽象方法两种成员;
- 接口常量的使用形式为:
接口名称::常量名称
; - 接口中的抽象方法,不要使用
abstract
修饰,也需要使用访问控制修饰符,因为其天然就是Public
; php
中接口和类一样也可以继承(接口继承接口)。
还谈php和java面向对象
相同点:
- 抽象类和抽象方法,及它们之间的细节都一样;
- php的接口和java的接口都一样。
不同点:
- 重载不一样,php重载和其他面向对象语言的重载不同,而java和其他面向对对象语言的重载一样。