PHP 面向對象


類的聲明:

 

<?php
    權限修飾符 class 類名{   //權限修士符號:public,protected,private 或者省略3者.
      //類體;        //class 是建類關鍵字
    }             //類名必須跟在class 后面,且跟上{}.{}之間放類的成員.
  ?>
//ps:在class關鍵字前可以加權限修飾符外,還可以加static,abstract等關鍵字.一個類,即一對大括號之間的全部內容都要在一段代碼段中,不允許將類中的內容分割成對塊.
<?php
  class ConnDB{
    //....
?>
<?

    //...
  };
?>

復制代碼
<?php
    權限修飾符 class 類名{   //權限修士符號:public,protected,private 或者省略3者.
      //類體;        //class 是建類關鍵字
    }             //類名必須跟在class 后面,且跟上{}.{}之間放類的成員.
  ?>
//ps:在class關鍵字前可以加權限修飾符外,還可以加static,abstract等關鍵字.一個類,即一對大括號之間的全部內容都要在一段代碼段中,不允許將類中的內容分割成對塊.
<?php
  class ConnDB{
    //....
?>
<?

    //...
  };
?>
復制代碼

 

 

成員屬性:

  在類中直接聲明的變量稱為成員屬性/變量.其類型可以為php中的標量類型和復合類型,使用資源類型和空類型是無效的.

此外,成員屬性的聲明時,必須要有關鍵字來修飾:有特定意義的關鍵字:public,protected,private ;不需要特定意義:var.聲明成員屬性時,沒有必要賦初始值.

 

成員常量:

  以const常量修飾,例如:const PI = 3.1415926;

  常量的輸出不需要實例化,直接由類名+常量名調用即可,格式為: 類名::常量名

ps. 特殊的訪問方法:--------"$this" 和 "::"

1) $"this" 存在於每個成員方法當中,它是一個特殊的對象以用方法.成員方法屬於那個對象,$this應用就代表那個對象,其作用就是專門完成對象內部成員之間的訪問.

2) "::"成為作用域操作符,使用這個操作符可以在不創建對象的情況下調用類中的常量,變量和方法. 其語法格式如下:

  關鍵字::變量名/常量名/方法名

  關鍵字:parent,可以調用父類成員中的成員變量,成員方法和常量;

      self,可以調用當前類中的靜態成員和常量;

      類名,可以調用類中的常量,變量和方法;   

  

成員方法:

  在類中聲明的函數成為成員方法,在一個類中可以聲明多個函數,即對象可以擁有多個成員方法.成員方法的聲明和函數的聲明相同,唯一特殊之處就是成員方法可以有關鍵字對它進行修飾,從而控制其訪問權限.

類的實例化

  創建對象:

    $變量名 = new 類名稱([參數]); //類的實例化.

  訪問類成員:

    $變量名 -> 成員屬性 = 值;

構造方法和析構方法

構造方法是對象創建完成后第一個唄對象自動調用的方法.它存在每個類的聲明當中,是一個特殊的成員方法,一般用來完成一些初始化操作.如果類中沒有構造方法,系統會默認自動生成一個沒有參數的構造方法.

  格式:

function _construct(形參列表){

      //方法體

    };

 

 

析構方法則如構造方法相反,它是在對象被銷毀前最后一個調用的方法.它將完成一個特定的操作,如關閉文件和釋放內存.

  格式:

function _destruct(){

      //方法體 

    };

 

 

面向對象特點:封裝性,抽象性,多態性.

封裝:

  將類中的成員屬性和方法結合成一個獨立的相同單位,並且盡可能的隱藏對象的內容細節.其目的是確保類以外的部分不能隨意存取類的內部數據(成員屬性和成員方法),從而避免外部錯誤對內部數據的影響.

  類的封裝是通過關鍵字public,private,protected,static和final實現的.各關鍵字的作用請查看php相關文檔.

繼承性:

  使一個類繼承並擁有另一個已存在的類的成員屬性和成員方法,其中被繼承的類成為父類,繼承的類成為子類.通過繼承能夠提高代碼的重用性和可維護性.類的繼承用 extends 關鍵字.

  格式: 

class 子類名稱 extends 父類名稱{

      //子類方法體.

    }

 

  通過parent::關鍵字也可以在子類方法中調用父類的成員方法,格式如下:

  parent::父類的成員方法(參數);

 

覆蓋父類的方法:

  所謂的覆蓋父類的方法,也就是使用子類中的方法替換從父類中繼承的方法,也叫方法的重寫.重寫的關鍵就在與子類中創建與父類中相同的方法,g包括方法名稱,參數和返回類型.

 

多態性:

  多態性是指一段程序能夠處理多種類型對象的能力.php多態有兩種實現方法,即通過繼承實現多態和通過接口實現多態.

通過繼承實現多態,即通過重寫繼承的成員方法來達到多態的效果.

  

<?php
   abstract class ParentClass{
          abstract function printMessage();    
    }

    class SubClassA extends ParentClass{
           function printMessage(){
               echo "i am message from class A";
           }
    }

    class SubClassB extends ParentClass{
           function printMessage(){
               echo "i am message from class B";
           }
    }
    
    function printMSG($object){
       if( $object instanceof ParentClass){
           $object->printMessage();
       }else{
            echo "error!";
       }
    }

    $objectA=new SubClassA();
    printMSG($objectA);
    $objectB=new SubClassB();
    printMSG($objectB);
?>   

復制代碼
<?php
   abstract class ParentClass{
          abstract function printMessage();    
    }

    class SubClassA extends ParentClass{
           function printMessage(){
               echo "i am message from class A";
           }
    }

    class SubClassB extends ParentClass{
           function printMessage(){
               echo "i am message from class B";
           }
    }
    
    function printMSG($object){
       if( $object instanceof ParentClass){
           $object->printMessage();
       }else{
            echo "error!";
       }
    }

    $objectA=new SubClassA();
    printMSG($objectA);
    $objectB=new SubClassB();
    printMSG($objectB);
?>        
復制代碼

 

通過接口實現多態,通過定義接口,與空方法.然后類繼承接口.

<?php
    interface interfaceInfo{
           function printMessage();
    }
    
    class ClassA implements interfaceInfo{
         function printMessage(){
                 echo "message form class A";
         }
    }
    
    class ClassB implements interfaceInfo{
         function printMessage(){
                 echo "message form class B";
         }
    }

    function printMSG($object){
             if($object instanceof interfaceInfo){
                       $object -> printMessage();
             }else{
                        echo "error !";
              }
    }
    
    $objectA =new ClassA();
    printMSG($objectA);
     $objectB =new ClassB();
    printMSG($objectB);
?>

復制代碼
<?php
    interface interfaceInfo{
           function printMessage();
    }
    
    class ClassA implements interfaceInfo{
         function printMessage(){
                 echo "message form class A";
         }
    }
    
    class ClassB implements interfaceInfo{
         function printMessage(){
                 echo "message form class B";
         }
    }

    function printMSG($object){
             if($object instanceof interfaceInfo){
                       $object -> printMessage();
             }else{
                        echo "error !";
              }
    }
    
    $objectA =new ClassA();
    printMSG($objectA);
     $objectB =new ClassB();
    printMSG($objectB);
?>
復制代碼

 

ps. 抽象類和接口.

     抽象類和接口都是不能被實例化的特殊類.他們都是能夠配合面向對象多態性一起使用.

抽象類:

  抽象類是一種不能實例化的類,只能作為其他類的父類來使用.抽象類使用abstract 關鍵字來聲明,其格式如下:

    

abstract class 抽象類名{

      abstract function 成員方法(參數);//

    }

 

抽象類和普通類相似,包含成員變量,成員方法.兩者區別在於抽象類至少要包含一個抽象方法.抽象方法沒有方法體,其功能的實現只能在子類中完成.抽象方法也使用關鍵字 abstract 來修飾.

 

接口:

  繼承特性簡化了對象和類的創建,增強了代碼的可重用性.但php只支持單繼承,如果想實現多重繼承,就要使用接口.

接口的聲明:通過interface 關鍵字來實現,接口中聲明的方法必須是抽象方法,接口中不能聲明變量,只能使用const 關鍵字聲明為常量的成員屬性,並且接口中所有成員都必須具備puclic 的訪問權限.ainterface 聲明接口格式如下:

  

復制代碼
inerface 接口名稱{

           //常量成員;//成員只能是常量.

          //抽象方法;

  }
復制代碼

 

 

由於接口不能實現實例化操作,因此只能借助子類繼承接口的形式來實現.實現的格式是:

Class 子類名 implements 接口名1[,接口名2,接口名3,.....]{

  //子類方法體.

}

 

 

常用關鍵字:

  1)  final:final之意為最終的,最后的.這就以為着通過final 關鍵字修飾的類和方法都為最終版本.不能被繼承,也不能有子類.不能重寫,也不能被覆蓋.

  2)  static: 通過static 關鍵字修飾的成員屬性和成員方法稱為靜態屬性和靜態方法.靜態成員屬性和方法不需要被實例化就能直接使用.

   靜態屬性:它屬於類本身,而不屬於類的任何實例.它相當於存儲在類中的全局變量,可以在任何位置通過類來訪問.訪問格式為:

      類名稱::$靜態屬性名稱;

      如果你要在類內部的成員方法中訪問靜態屬性,那么在靜態屬性的名稱前加上操作符: "self::" 即可.

   靜態方法:由於其不受任何對象限制,因此可以不通過類的實例化而直接引用類中的靜態方法.引用格式如下:

      類名稱::靜態方法名(參數);

      如果你要在類內部的成員方法中調用靜態方法,那么在靜態方法的名稱前加上操作符: "self::" 即可.在靜態方法中只能調用靜態變量,而不能調用普通變量;而普通方法中則可以調用靜態變量.

使用靜態成員除了不需要實例化外,另一個作用是在對象被銷毀后,仍然保留唄修改的靜態數據,以便下次調用.

  3) clone.對象的克隆可以通過關鍵字來實現.使用clone對象與原對象沒有任何關系,即克隆對象會重新申請一份存儲空間來存放原對象內容.格式如下:

      $克隆對象 = clone $原克隆對象名稱;

    克隆成功后,他們的n成員方法,屬性以及值完全相等.如果要對副本重新初始化,就要用到 _clone().

     魔術方法_clone()可以對克隆后的副本對象重新初始化.它不需要任何參數,其中自動包含$this (副本對象)和 $that (原對象) 對象的引用.

對象的比較:

  "==" 表示比較兩個對象的內容,"==="表示比較兩個對象的引用地址相等.

對象類型的檢測: instanceof 操作符可以檢測當前對象屬於那個對象.

 

面向對象---常用魔術方法:

以上我們已經了解的常用魔術方法有:_construct(),_destruct(),_clone.下面我們再接着介紹幾個常用魔術方法.

_get(),_set();

  以上兩個方法用於對私有成員精細復制或者獲取值的操作.

  _set()在程序運行中為私有的成員屬性設置值,它不需要任何返回值._set()方法包括兩個不可省略的參數:變量名和變量值.這個方法不需要主動調用,可在方法錢加上prive關鍵字.

  _get():在程序運行中,在對象的外部獲取私有成員的屬性的值.他有一個參數:私有成員屬性名稱.他返回一個允許對象在外部使用的值.此方法同樣不許主動調用.

 

_isset(),_unset():

  isset()函數用於檢測變量是否存在.而在面向對象中可以通過isset()函數對公有的成員屬性進行檢測,但對私有成員屬性,此函數則不起作用.因此,_isset()函數正是為了起到此作用而創建.格式如下:

  bool _isset(string name);

  _unset()則同樣為了刪除制定的變量和對象的私有成員屬性.格式如下:

  void _unset(string name);//

_call():

  _call()方法的作用是當程序試圖調用不存在或不可見的成員方法時,php會先調用_call()方法來存儲方法名及其參數(方法名和方法參數).其中方法參數是以數組的形式存在.

_toString()方法:

  其作用是當使用echo 或者print輸出對象時,將對象轉化為字符串.

  如果沒有_toString()方法,直接輸出對象時將會發生致命錯誤.

  輸出對象時應注意的是,echo 或print 語句后面直接跟要輸出的對象,中間不要加多余的字符,否則_toSting()將不會被執行.

_autoload()方法:

  將一個獨立的,完整的類保存到一個php頁中,並且文件名和類名保持一致,這是每個開發人員都需要養成的良好習慣.這樣下次在使用的時候就能夠輕松的找到它.但有一種情況:如果要在一個頁面中引進很多的類,就需要使用include_once()函數或者require_once()函數一個個地引入.php5中引入_autoload()方法可以自動實例化需要使用的類.當一個類還沒實例化時,_autoload()會自動到指定的路徑下面自動查找和類名相同的文件.找到則繼續執行,否則報錯.

<?php

  function _autoload($class_name){

    $class_path = $class_name.'.class.php';
    if(file_exists($class_path)){

      include_once($class_path);
    }else{

      echo '類不存在或者類路徑錯誤';
    }
}

  $class = new Class(); //將會自動加載.

  echo $class; //輸出類內容.如自定義了_toString()方法;則會輸出_toString()中定義的內容.

?>

復制代碼
<?php

  function _autoload($class_name){

    $class_path = $class_name.'.class.php';
    if(file_exists($class_path)){

      include_once($class_path);
    }else{

      echo '類不存在或者類路徑錯誤';
    }
}

  $class = new Class(); //將會自動加載.

  echo $class; //輸出類內容.如自定義了_toString()方法;則會輸出_toString()中定義的內容.

?>
復制代碼

 

<?php
//接口只能被繼承,不能實例化
//類可以繼承多個接口

interface interfaceInfo
{
	function printMessage();
};

interface interfaceUserinfo
{
	function printUserinfo();
};
class ClassA implements interfaceInfo, interfaceUserinfo
{
	public function printUserinfo()
	{
		echo "ClassA parintUserinfo<BR>";
	}
	public function printMessage()
	{
		echo "ClassA parintMessage<BR>";
	}	
};

class ClassB implements interfaceInfo, interfaceUserinfo
{
	public function printUserinfo()
	{
		echo "ClassB parintUserinfo<BR>";
	}
	public function printMessage()
	{
		echo "ClassB parintMessage<BR>";
	}	
};

function printInterface($obj)
{
	if($obj instanceof interfaceUserinfo)
	{
		$obj->printUserinfo();
	}else{
		echo "error";
	}
}

$classa = new ClassA();
printInterface($classa);
$classb = new classB();
printInterface($classb);

  


免責聲明!

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



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