接口
使用接口,你可以指定某個類必須實現那些方法,但是不需要定義這些方法的具體內容,我們可以通過interface來定義一個接口,就像定義標准類一樣,但其中定義所有的方法都是空的,接口中定義的所有的方法都必須是public
實現一個接口,可以使用implement操作符,類中必須實現接口中定義的所用的方法,如果實現多個接口,可以用逗號來分割多個接口的名稱
注意
- 實現多個接口時,接口中的方法不能有重名
- 接口也可以繼承,通過使用extends操作符
- 接口中可以定義常量,接口常量和類常量的使用完全相同,他們都是定值,不能被子類或子接口修改
例子:
//聲明接口 interface Itemplate{ public function setVariable($name,$var); public function getHtml($template); } //實現接口 class Template implements Itemplate{ private $vars=array(); public function setVariable($name,$var){ $this->vars[$name]=$var; } public function getHtml($template){ foreach($this->vars as $names=>$value){ $template=str_replace('{'.$names.'}',$value,$template); } return $template; } }
例子2:
interface a{ public function foo(); } interface b{ public function bar(); } //繼承接口 interface c extends a,b{ public function baz(); } //實現接口 class d implements c{ public function foo(){ } public function bar(){ } public function baz(){ } } interface a{ const b="hello"; }
抽象類
php5支持抽象類和抽象方法。抽象類不能直接被實例化,必須先繼承該抽象類,然后再實例化子類,任何一個類,如果他里面至少有一個方法是被聲明為抽象的,那這個類就必須被聲明為抽象的,如果類方法被聲明為抽象的,那么其中就不能包括具體的功能實現
繼承一個抽象類的時候,子類必須實現抽象類中的所有的抽象方法,另外,這些方法的可見性必須和抽象類中一樣(或更輕松),如果抽象類中的某個抽象方法被聲明為proteected,那么子類中實現的方法應該聲明為pritected或者public
例子:
abstract class AbstractClass{ //抽象方法 abstract protected function getValue(); abstract protected function prefieValue($p); //普通方法(非抽象方法) public function printOut(){ print $this->getValue(); } } class ConcreteClass1 extends AbstractClass{ protected function getValue(){ return "ConcreteClass1"; } public function prefieValue($p){ return "{$p}concreteclass1"; } } class ConcreteClass2 extends AbstractClass{ protected function getValue(){ return "ConcreteClass2"; } public function prefieValue($p){ return "{$p}concreteclass2"; } } $class1=new ConcreteClass1(); $class1->printOut(); echo $class1->prefieValue('FOO_'); /*
打印結果:ConcreteClass1
FOO_concreteclass1
2. 調用靜態方法的抽象類仍然可行的 類常量不可以的
abstract class Foo { const a="hello"; static function bar() { echo "test\n"; } } Foo::a;//沒有輸出 Foo::bar();//test