PHP抽象類和物件介面
阿新 • • 發佈:2019-02-12
抽象類
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; ?>