php抽象類和接口


接口
使用接口,你可以指定某個類必須實現那些方法,但是不需要定義這些方法的具體內容,我們可以通過interface來定義一個接口,就像定義標准類一樣,但其中定義所有的方法都是空的,接口中定義的所有的方法都必須是public

實現一個接口,可以使用implement操作符,類中必須實現接口中定義的所用的方法,如果實現多個接口,可以用逗號來分割多個接口的名稱

注意

  1. 實現多個接口時,接口中的方法不能有重名
  2. 接口也可以繼承,通過使用extends操作符
  3. 接口中可以定義常量,接口常量和類常量的使用完全相同,他們都是定值,不能被子類或子接口修改

例子:

//聲明接口
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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM