接口
使用接口,你可以指定某個類必須實現那些方法,但是不需要定義這些方法的具體內容,我們可以通過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
