一、接口 (Interface)
使用接口(Interface)可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口通过(Interface)关键字来定义,接口中多有方法必须都是公有的。
实现接口用(implements)操作符。类中必须实现接口中所有方法。一个类可以实现多个接口,逗号分隔。接口可以继承。
// 示例
<?php
interface a
{
public function test1();
}
interface b
{
public function test2();
}
interface c extends a,b
{
public function test3();
}
interface d
{
const d = 'CONST';
public function test4();
}
// 四个方法必须都实现,否则报致命错误
class test implements c,d
{
public function test1() {}
public function test2() {}
public function test3() {}
public function test4() {}
}
$obj = new test();
$obj->test1();
echo d::d; // 或者 echo $obj::d 或者 test::d
二、抽象类 (abstract)
php5 支持抽象类和抽象方法。抽象类不能实例化。任何一个类只要它有一个抽象方法,那么该类就必须被声明为抽象的。抽象类必须有一个抽象方法。
继承抽象类的类必须实现父类中所有的抽象方法。此外若抽象类中的方法被声明为受保护的,那么子类中该方法就应该声明为受保护的或者公有的。而不能定义为私有的
// 示例
<?php
abstract class a
{
const a = 'CONST';
protected $a = "nnn";
abstract protected function test1();
public function test2() { echo 'a-test2';}
}
// 四个方法必须都实现,否则报致命错误
class test extends a
{
public function test1() {echo "test1";}
public function test2() {echo "test2";}
public function test3() {echo "test3";}
public function test4() {echo "test4";}
public function echoA() {echo $this->a;}
}
$obj = new test();
$obj->test1();
$obj->test2();
$obj->echoA();
$obj::a // 或者 test::a, a::a
使用场景:接口主要用于表现事物的行为;抽象类主要用于不同事务的行为,抽象类中可以根据需要添加成员以支持更多功能,接口中不可以
// 示例
<?php
// 接口中名称不能跟抽象类名称相同
interface b
{
public function iTest1();
}
abstract class a implements b
{
const a = 'CONST';
protected $a = "nnn";
abstract protected function test1();
public function test2() { echo 'a-test2';}
// 该方法也可以在子类中实现
public function iTest1(){}
}
// 四个方法必须都实现,否则报致命错误
class test extends a
{
protected $a = "mmm";
public function test1() {echo "test1";}
public function test2() {echo "test2";}
public function test3() {echo "test3";}
public function test4() {echo "test4";}
public function echoA()
{
var_dump($this->a);
}
}
$obj = new test();
$obj->test1();
$obj->test2();
$obj->echoA();
var_dump($obj::a,test::a,a::a);