1. 程式人生 > >淺談php 抽象類abstract和接口interface

淺談php 抽象類abstract和接口interface

存在 應用場景 進行 聯系 常量 多個 上啟 以及 能夠

一、抽象類(abstract)

抽象類定義的規範

1、php5支持抽象類和抽象方法

2、定義得抽象類無法被實例化

3、任何一個類裏面聲明了抽象方法,那麽這個類必須聲明為抽象類

4、被定義得抽象方法只能聲明其調用方式(參數),不能定義其具體得功能實現

5、繼續抽象類的子類必須定義父類(抽象類)所有的抽象方法,並且訪問控制(public、protected)必須一致,或者更為寬松 如:父類protected,子類可以protected、public。父類是public,那麽子類就只能是public,不能是protected

6、抽象類訪問控制不能定義private

7、抽象類可以定義非抽象方法

8、抽象類可以定義屬性

代碼示例

<?php
	
	abstract class UserAbstract
	{
		protected $value1 = 0;  
	    private $value2 = 1;  
	    public $value3 = 2;  

		//定義一個受保護的抽象方法
		abstract protected function register();

		//定義一個公有屬性的抽象方法
		abstract public function login();

		//不能定義一個私有屬性的抽象方法
		// abstract private login();

		protected function read()
		{
			return $this->value2;
		}
	}

	/**
	* 
	*/
	class ClassName extends UserAbstract
	{
		
		public function login()
		{
			echo ‘這是一個登陸‘;
		}

		public function register()
		{
			echo ‘這是一個註冊‘;
		}

		public function visit()
		{
			//訪問抽象類公有的屬性
			echo $this->value3;

			//私有屬性的不能訪問
			// echo $this->value2;
			
			//訪問抽象類受保護的屬性
			echo $this->value1;

			//訪問抽象受保護的非靜態方法
			echo $this->read();
		}


	}


	$obj = new ClassName();
	$obj->login();
	$obj->register();
	$obj->visit();

  

二、接口(interface)

接口規範

1、使用接口可以規定某些類實現哪些方法,但接口不需要定義這些方法的具體內容

2、接口是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。

3、接口中定義的所有方法都必須是公有,這是接口的特性。

4、要實現一個接口,使用 implements 操作符。類可以實現多個接口,用逗號來分隔多個接口的名稱。

5、實現多個接口時,接口中的方法不能有重名。

6、接口也可以繼承,通過使用 extends 操作符。

7、類要實現接口,必須使用和接口中所定義的方法完全一致的方式。否則會導致致命錯誤。

8、接口中也可以定義常量。接口常量和類常量的使用完全相同,但是不能被子類或子接口所覆蓋。

代碼示例

<?php
	interface iTemplate
	{
		public function login($user,$pwd);

		public function register($user,$pwd);
	}

	interface iTemplateExt extends iTemplate
	{
		const READ = ‘read‘;
		public function read($content);
	}
	interface iTemplate2 
	{
		public function goods();
	}

	/**
	* 
	*/
	class ClassName implements iTemplateExt,iTemplate2
	{
		public function login($user,$pwd)
		{
			echo ‘登陸‘;
		}
		public function register($user,$pwd)
		{
			echo ‘這是一個註冊‘;
		}
		public function read($read)
		{
			echo ‘閱讀‘;
			// echo self::READ;
		}

		public function goods()
		{
			echo ‘商品‘;
		}

	}
	
	$obj = new ClassName();
	$obj->login(‘name‘,‘pwd‘);
	$obj->register(‘name‘,‘pwd‘);
	$obj->read(‘pwd‘);
	$obj->goods();
	echo ClassName::READ;

  

三、接口與抽象的區別以及相同點、應用場景

1、相同點

1、兩者都是抽象類,都不能實例化。

2、interface 實現類及 abstract class 的子類都必須要實現已經聲明的抽象方法。

2、區別

1、 interface 需要實現,要用 implements ,而 abstract class 需要繼承,要用 extends 。

2、一個類可以實現多個 interface ,但一個類只能繼承一個 abstract class 。

3、interface 強調特定功能的實現,而 abstract class 強調所屬關系。(作用的區別)

4、盡管 interface 實現類及 abstract class 的子類都必須要實現相應的抽象方法,但實現的形式不同。 interface 中的每一個方法都是抽象方法,都只是聲明的 (declaration, 沒有方法體 ) ,實現類必須要實現。而 abstract class 的子類可以有選擇地實現。這個選擇有兩點含義: a) abstract class 中並非所有的方法都是抽象的,只有那些冠有 abstract 的方法才是抽象的,子類必須實現。那些沒有 abstract 的方法,在 abstract class 中必須定義方法體; b) abstract class 的子類在繼承它時,對非抽象方法既可以直接繼承,也可以覆蓋;而對抽象方法,可以選擇實現,也可以留給其子類來實現,但此類必須也聲明為抽象類。既是抽象類,當然也不能實例化。

5、 abstract class 是 interface 與 class 的中介。 abstract class 在 interface 及 class 中起到了承上啟下的作用。一方面, abstract class 是抽象的,可以聲明抽象方法,以規範子類必須實現的功能;另一方面,它又可以定義缺省的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己的實例變量,以供子類通過繼承來使用。

6、接口中的抽象方法前不用也不能加 abstract 關鍵字,默認隱式就是抽象方法,也不能加 final 關鍵字來防止抽象方法的繼承。而抽象類中抽象方法前則必須加上 abstract 表示顯示聲明為抽象方法。

7、接口中的抽象方法默認是 public 的,也只能是 public 的,不能用 private , protected 修飾符修飾。而抽象類中的抽象方法則可以用 public ,protected 來修飾,但不能用 private 。

3、應用場景

interface 的應用場合

1、類與類之間需要特定的接口進行協調,而不在乎其如何實現。

2、作為能夠實現特定功能的標識存在,也可以是什麽接口方法都沒有的純粹標識。

3、 需要將一組類視為單一的類,而調用者只通過接口來與這組類發生聯系。

4、需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯系。

5、規定類的實現規範

6、強迫某個類要實現的方法

abstract class 的應用場合

1、當沒想到完整的類實現,此時可以使用抽象類進行實現

2、定義了一組接口,但又不想強迫每個實現類都必須實現所有的接口

3、某些場合下,只靠純粹的接口不能滿足類與類之間的協調,還必需類中表示狀態的變量來區別不同的關系。 abstract 的中介作用可以很好地滿足這一點。

4、規定類的實現規範

2者之間應用場景的淺談

個人使用的方法:當接口能滿足需求的時候使用接口即可,當接口不滿足的時候,就需要使用抽象類。

淺談php 抽象類abstract和接口interface