本篇文章主要講述的是PHP面向對象編程的基礎(二),具有一定的學習價值,感興趣的朋友可以了解一下。
在一些小的項目中,會頻繁接觸到類的繼承、封裝和多態等特性,利用的是的類本身的功能。
但是在大型項目中,經常會采用類接口來實現,因為接口不涉及類的具體功能實現,但是接口會限制類的功能。
一個復雜大型的軟件涉及中,需要由眾多的功能類構成,這些功能類需要由多個程序員共同完成,其中軟件架構師需要指定涉及模式、團隊分工等工作。
這就帶來編程統一性的問題,如何保證關鍵的功能能夠很好地實現,這就需要一個能夠統籌兼顧的設計接口,通常使用的是類接口,雖然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");
- //刪除成功
- ?>
|
新聞熱點
疑難解答