PHP中接口与抽象类总结
一、接口
1.接口的定义:
接口是定义,类(抽象类)是实现,interface的目的是建立通用标准,只有实现了这些标准,才能被认为实现了接口
2.接口的特点:
1)上下级接口可以通过extends关键词继承
2)接口的所有方法默认都是public权限(因为具体功能要靠实现类实现)
3)接口可以定义常量,不能定义变量
4)一个类可以同时”implements”(实现)一到多个接口;
5)一个工作类必须将接口中的所有方法按照自己的需求去实现,否则该类要定义成抽象类
6)接口不能实例化操作,所以要使用接口中的成员,就必须借助实现类(implements)实现
示例代码
<?phpinterface Person{public $name; //不能声明变量 报错const NAME='tom'// 可以声明常量function test(); //因为接口中全部是抽象方法 所以 省去 abstract 。function test1();Protect function test3() 报错 只可以是 public}$A=new Person; //报错 不可以 创建实例化 对象 。echo Person:: NAME; 输出常量。?>
二、抽象类
定义
1、抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类。
2、抽象类不能被直接实例化。抽象类中只定义(或部分实现)子类需要的方法。子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化。
3、如果子类需要实例化,前提是它实现了抽象类中的所有抽象方法。如果子类没有全部实现抽象类中的所有抽象方法,那么该子类也是一个抽象类,必须在 class 前面加上 abstract 关键字,并且不能被实例化。
抽象类的特点:
1)定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
2)继承一个抽象类的时候,子类必须定义父类中的所有抽象方法
3)和接口相比,接口只有基本框架,描述了每个方法的功能,相当于一个毛坯房,而抽象类则相当于简装房,实现类就相当于精装房,实现了接口和抽象类的抽象方法的”工作类”。
4)抽象类通常具有抽象方法,方法中没有大括号,抽象类的抽象方法不实现具体功能,由子类完成
5)如果抽象方法有参数,那子类的实现也必须要有相同的参数数量
示例代码
abstract Class AbstractClass
{abstract public function A();//这里不要携带bodyabstract protected function B();//这里不要携带bodypublic function C(){}//这里要携带body
}class ClassA extends AbstractClass
{public function A(){echo "Hello,I'm A <br/>";}protected function B(){echo "Hello,I'm B <br/>";}public function E(){echo "Hello,I'm E <br/>";}
}
三、接口与抽象类的相同点:
1、抽象类和接口都有抽象方法
2、抽象类和接口不能创建实例对象
3、抽象类和接口使用意义相同(定义一种规范)
四、接口与抽象类的不同点:
1、接口中的方法必须全要是抽象方法(不能用不抽象的方法),所以在接口的所有方法中不使用abstract,直接使用分号结束
2、接口中的成员属性,必须是常量(不能有变量)
3、接口所有权限必须是公有的(public)
4、声明接口不使用class,使用interface
补充知识
Abstract关键字
abstract关键字用于定义抽象方法与抽象类。
抽象方法指:没有方法体的方法,具体就是在方法声明的时候没有{},而是直接分号结束。一般用abstract定义的方法被称为抽象方法。在interface中所有的方法都是抽象方法。
定义抽象方法形如:
abstract function func_name();
抽象类指:只要一个类里面有一个方法是抽象方法,那么这个类就定义为抽象类。抽象类同样用abstract关键字来定义。关于抽象类的概念,更多了解可以看上面的解释。
Final关键字
final关键字,如果父类中的方法被声明为final,则子类无法覆盖该方法,如果一个类被声明为final,则不能被继承。
Static关键字
static关键字用来定义静态方法和属性,也可以用来定义静态变量以及后期静态绑定。
静态方法和属性:
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。在没有指定访问控制(public,private,protected)的时候,属性和方法默认public。
静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。
就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。