抽象类
PHP5.0起支持抽象类和抽象方法,抽象类不能被实例化。任何一个类,如果包含至少一个被声明为抽象的方法,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类时,子类必须定义父类中的所有抽象方法,并且这些方法的访问控制必须和父类中一样或者更为宽松。此外,子类实现父类抽象方法时,可以在抽象方法的参数的基础上添加一些可选的参数。
<?php
abstract class A {
protected abstract function foo();
public abstract function bar($arg1);
public function test(){
return get_class($this);
}
}
class B extends A {
public function foo(){
echo "foo".$this->test()."\n";
}
public function bar($arg1,$arg2="option"){
echo "bar".",".$arg1.",".$arg2."\n";
}
}
$b=new B();
$b->foo();
$b->bar("b");
$b->bar("b","bb");
?>
接口
接口通过interface关键字定义,其中的方法没有实现,只有方法的定义,接口中所有的方法都必须是public的,一个类要实现一个接口,需要通过implements关键字,类必须实现接口中定义的所有方法,且和接口中所定义的方法完全一致,否则会报一个致命错误,类可以实现多个接口,接口用逗号分隔。一个类实现多个接口时,接口中不能重名方法。一个接口也可以通过extends关键字继承另一个接口。接口中也可以定义常量,与类常量的使用完全相同,但是不能被子类或子接口覆盖。
<?php
interface A{
const t = 'constant t ';
public function fooA();
}
interface B{
public function fooB();
}
interface SubA extends A{
public function barA($var);
}
class C implements SubA,B{
public function fooA(){
echo "C:fooA() implements from SubA\n";
}
public function barA($var){
echo "C:barA() implements from SubA $var\n";
}
public function fooB(){
echo "C:fooB() implements from B \n";
}
}
$c=new C();
$c->fooA();
$c->barA("test");
$c->fooB();
echo C::t;
?>