在一些小的專案中,會頻繁接觸到類的繼承、封裝和多型等特性,利用的是的類本身的功能。
但是在大型專案中,經常會採用類介面來實現,因為介面不涉及類的具體功能實現,但是介面會限制類的功能。
一個複雜大型的軟體涉及中,需要由眾多的功能類構成,這些功能類需要由多個程式設計師共同完成,其中軟體架構師需要指定涉及模式、團隊分工等工作。
這就帶來程式設計統一性的問題,如何保證關鍵的功能能夠很好地實現,這就需要一個能夠統籌兼顧的設計介面,通常使用的是類介面,雖然PHP能夠採用多種方法。
類的封裝、基礎和多型等特性,涉及到的都是類的功能,一般在小型專案中使用類的功能來實現。
但是在大型專案中,軟體需要由眾多的功能,那就需要有眾多的功能類,而這些功能類通常由多個程式設計師共同來完成,那麼眾多的程式設計師之間,就出現了程式設計統一的問題,如何保證軟體的功能能夠很好地實現?
這就需要在軟體設計之前,事先定義好一組功能,然後程式設計師按照這些功能,來逐個實現。
在PHP中能夠採用的方法有很多種,通常使用類介面來實現。在介面中定義一組功能,但是功能的實現,需要程式設計師逐個來實現,從而保障了軟體功能的完整性。
1、介面的定義
介面不是功能類,因此不能在介面類中定義具體的功能實現方法。
介面定義時使用interface關鍵字,命名格式:I+介面名稱。
通常介面中定義的成員必須為功能類的方法,不能是功能類的成員屬性。
需要注意幾點:
①介面成員必須具有全域性存取許可權,因此不能新增存取修飾符;
②介面成員不能使用常數、靜態方法等類屬性;
③介面成員不能定義構造方法。
④介面可以像類一樣被繼承,繼承之後,子介面就會得到父介面的全部成員。
2、介面的實現
介面只能進行功能定義,而不能實現具體的功能,如果要實現介面中定義的功能,必須通過普通的功能類來實現。
格式:implements +介面名稱
注意:在功能類中必須要定義介面中所有的成員方法,不能遺漏一個。
下面通過簡單的範例來演示
在介面檔案中,定義兩個介面Imyinterce,Imys(Imyinterface子介面)
<?php /** * 定義介面Imyinterface */ interface Imyinterface{ function add1(); function add2($s); function add3($t=0); } //介面的繼承 interface Imys extends Imyinterface{ function del(); function edit(); function update($str); function select($id,$str); } ?>
然後定義一個功能類,來實現介面,如果還沒想好功能如何實現,可以通過空方法來實現,不能遺漏,否則會報錯,提示功能類包含一個抽象方法,該抽象方法必須要實現。
這裡僅實現子介面Imy中的update和select兩個方法,其餘方法暫未實現,使用空方法來代替。
<?php require "./Imyinterface.interface.php"; class MyClass implements Imys{ function add1(){ //空方法,暫無具體實現方法,雖然功能類繼承Imys,但是介面Imys又繼承Imyinterface,因此Imyinterface裡的方法也必須要實現 } function add2($str){ //同上 } function add3($t=0){ //同上 } function del(){ //空方法,暫無具體實現方法 } function edit(){ //空方法,暫無具體實現方法 } function update($str="字串"){ return $str; } function select($id=0,$str="字串"){ return $id.$str; } } ?>
測試程式碼
<?php require "./MyClass.class.php"; header("Content-type:text/html;charset=utf-8"); $mys =new MyClass(); echo $mys->select(); ?>
瀏覽效果
上面介紹了在大型軟體設計中,為了規範和統一程式,通常使用介面。但是介面只能定義程式抽象的功能,而不提供具體的功能,在介面中不能定義普通的類成員,如常數、靜態屬性等普通成員。
抽象類是為類繼承而設計的,可以在抽象類中定義普通的類成員,在這一點上抽象類就比介面靈活多了。
在定義抽象類時,需要加上abstract關鍵字,然後在抽象類中定義普通的成員方法,該普通方法不需要具體的功能程式碼。
大多數MVC框架都是採用PHP抽象類來構建的,抽象類可以簡單理解為普通類與介面的組合,即abstract=class+interface。
介面與抽象類的共同點:
①介面和抽象類都不能被範例化,介面需要使用implements關鍵字實現,而抽象類使用普通類的extends關鍵字繼承。
②介面和抽象類都包著尚未實現的方法宣告。
③派生類必須實現未實現的方法,抽象類是抽象方法,介面則是所有成員。
介面與抽象類的區別:
①抽象類不能被密封,但介面可以。
②抽象類實現的具體方法預設是虛的,但實現介面的類方法預設為實的。
③抽象類必須為在該類的基礎類別列表中列出所有成員以便讓實現類實現,但介面允許空方法。
了解了介面與抽象類概念之後,下面我們具體來看看抽象類的定義和實現。
在PHP中,抽象類不能為空類或普通類,至少需要提供一個抽象方法,而抽象類和抽象方法都需要關鍵字abstract。
例如,定義一個簡單的CURD抽象類(資料庫的增刪改查)
<?php /** * 抽象類的定義 */ abstract class BaseClass{ //查詢,抽象方法 abstract function query($sql); //插入,抽象方法 abstract function insert($sql); //更新,抽象方法 abstract function update($sql); //刪除,抽象方法 abstract function delete($sql); //資料庫連線,普通類方法 protected $link; //sql語句 protected $sql; //結果 protected $arr; protected function Conn(){ $this->link=mysql_connect("localhost","root","123") or die("資料庫連線失敗").mysql_error(); if($this->link){ mysql_select_db("db_match",$this->link) or die("資料庫選擇失敗").mysql_error(); } return $this->link; } //關閉資料庫連線,普通類方法 protected function CloseConn(){ mysql_close($this->link); } } ?>
抽象類的實現
<?php require "./BaseClass.class.php"; //引入抽象類 /** * 實現抽象類 */ class MyClass extends BaseClass { //實現抽象中的抽象方法,抽象類中抽象方法:query()、insert()、update()、delete() function query($sql){ $this->Conn($this->link); $this->sql=$sql; $result=mysql_query($this->sql); while($row=mysql_fetch_assoc($result)){ $this->arr=$row; } $this->CloseConn($this->link); //關閉連線 return print_r($this->arr); } function insert($sql){ $this->Conn($this->link); $this->sql=$sql; mysql_query($this->sql,$this->link); $this->CloseConn($this->link); //關閉連線 } function update($sql){ $this->Conn($this->link); $this->sql=$sql; mysql_query($this->sql,$this->link); $this->CloseConn($this->link); //關閉連線 } function delete($sql){ $this->Conn($this->link); $this->sql=$sql; mysql_query($this->sql,$this->link); $this->CloseConn($this->link); //關閉連線 } } ?>
測試程式碼
<?php require "./MyClass.class.php"; header("Content-type:text/html;charset=utf-8"); $mys =new MyClass(); $mys->query("select * from `match`"); //輸出結果:Array ( [m_id] => 8 [t1_id] => 5 [t2_id] => 6 [t1_score] => 2 [t2_score] => 1 [m_time] => 1421571600 ) $mys->insert("insert into `match`(m_id,t1_id,t2_id,t1_score,t2_score,m_time) values(9,5,3,3,3,1451571600)"); //新增成功 $mys->update("update `match` set m_time =1111111111 where m_id=9"); //修改成功 $mys->delete("delete from `match` where m_id=9"); //刪除成功 ?>
相關教學:PHP視訊教學
以上就是聊聊php物件導向的程式設計基礎(二)的詳細內容,更多請關注TW511.COM其它相關文章!