1. 程式人生 > >PHP抽象類和物件介面

PHP抽象類和物件介面

抽象類

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;
?>