PHP的面向對象

PHP的面向對象:

對象是客觀存在的一個實體。
類是對對象抽象的一個描述。

概念:對象(實體)、類、 類與對象的關係。

oop面向對象編程的特點:封裝、繼承、多態

類和對象的關係:
    類的實例化結果就是一個對象(使用new關鍵字)
    對對象的抽象描述就是一個類

一、如何定義一個類,和使用

1.1 語法格式:
    [修飾符] class 類名{
       【成員屬性】定義變量   

       【成員方法】定義函數
    }

    [修飾符] class 類名 [extends 父類] [implements 接口1[,接口2...]]{
       【成員屬性】定義變量   

       【成員方法】定義函數
    }

1.2 其中成員屬性格式:
        修飾符 $變量名[=默認值];  如:public $name="zhangsan";
        注意:成員屬性不可以是帶運算符的表達式、變量、方法或函數的調用。 如:
                public $var3 = 1+2;
                public $var4 = self::myStaticMethod();
                public $var5 = $myVar;
        正確定義方式:
                public $var6 = 100; //普通數值(4個標量:整數、浮點數、布爾、字串)
                public $var6 = myConstant; //常量
                public $var7 = self::classConstant; //靜態屬性
                public $var8 = array(true, false);  //數組

        常用屬性的修飾符:public、protected、private、static、var

1.3 其中成員方法格式:
        [修飾符] function 方法名(參數..){
            [方法體]
            [return 返回值]
        }

        常用的修飾符:public、protected、private、static、abstract、final

1.4 對象: 他是通過new 類()來產生的對象。其中new稱爲實例化
    也就是:類的實例化就會產生一個對象。
    如: $p = new Person();

1.5 $this 關鍵字: 表示自己,表示當前使用對象。
  我們在類中調用自己的成員屬性或函數都是使用 $this->調用。
  注意:非靜態方法中可以使用this關鍵字  

二、構造函數和析構函數

2.1. 構造方法(構造函數):
    當我們通過new關鍵字來創建一個對象時,第一個自動執行的方法稱爲構造方法。
    方法名__construct();  主要用於初始化對象。
    (在php4.0時可使用與類名重名的方法作爲構造方法)

2.2. 析構方法:當這個對象被銷燬時最後自動調用的方法,稱爲析構方法。
     __destruct(); 目的是釋放資源(如關閉連接、文件,釋放資源)

三、封裝(訪問控制)

3.1 封裝:就是將屬性私有,並提供公有的setter放置與getter取值方法

         public(公有)    protected(受保護)    private(私有)
  ===========================================================
   在本類中      Y               Y                   Y
   在子類中      Y               Y                   N 
   在類外邊      Y               N                   N

四、 重載

4.1 屬性重載中的四個魔術方法:__set() __get() __isset() __unset() 

  * __get():當我們直接輸出一個對象中的非公有屬性時會自動調用的方法,
            並將屬性名以第一個參數傳進去。
            __get($name){...}

  * __set(); 當我們直接設置一個對象中的非公有屬性時會自動調用的方法,
            並將屬性名以第一個參數,值作爲第二參數傳進去。
            __set($name,$value){...}

   __isset()當對未定義的變量調用isset() 或 empty()時,__isset() 會被調用。
       //當isset判斷一個對象的非公有屬性是否存在時,自動調用此方法。
       public function __isset($param){
          return isset($this->$param);
       }

   __unset()當對未定義的變量調用unset()時,__unset() 會被調用。
       //當unset銷燬一個對象的非公有屬性時,自動調用此方法。
       public function __unset($param){
          unset($this->$param);
       }

4.2 方法的重載:
    *  mixed __call ( string $name , array $arguments )
      mixed __callStatic ( string $name , array $arguments )  php5.3.0支持

    當調用一個不可訪問方法(如未定義,或者不可見)時,__call() 會被調用。 
    其中第一個參數表示方法名,第二參數表示調用時的參數列表(數組類型)

    當在靜態方法中調用一個不可訪問方法(如未定義,或者不可見)時,__callStatic() 會被調用。 

五、 繼承

5.1. 繼承:extends
     假如B類繼承A類,那麼就繼承了A中所有非私有屬性和方法(函數)。
      其中A叫父類(基類)。 B叫子類(派生類)
     class B extends A{ 
        ....
     }

    在php中類只支持【單一繼承】,就是一類只能繼承一個父類。

    parent關鍵字:若子類出現覆蓋父類的方法,那麼有時還想調用被覆蓋掉了的方法,
    我們就是用關鍵字【parent::父類方法】還有使用類名


    class A{
        public function __construct(){
            //....
        }
    }
    class B extends A{
        public function __construct(){
            parent::__construct();//注意要調用一下父類的構造方法
            //....
        }
    }

六、 final、static和const

6.1 final關鍵字:主要用於修飾類與成員方法(函數)

   使用final關鍵字修飾類,表示這個類不可以有子類。(一般是沒有必要有子類的,防止有子類的覆蓋)
   使用final關鍵字修飾的方法,不可以在子類中被覆蓋(重寫)。
    目的:一是爲了安全,二是沒有必要
*6.2 static關鍵字:表示靜態的意思: 用於修飾類的屬性和方法
   *static關鍵字修飾方法稱爲靜態方法,可以不用new(實例化)就可以直接使用方法:如 類名::方法名
        注意:靜態方法在實例化後的對象也可以訪問  //$對象名->靜態方法名

   static關鍵字修飾屬性稱爲靜態屬性,可以不用new(實例化)就可以直接訪問屬性:如 類名::屬性名
         注意:靜態屬性在實例化後的對象不可以訪問; //$對象名->靜態屬性名

   注意:靜態屬性是共享的。也就是new很多對象也是共用一個屬性
        *在靜態方法中不可以使用非靜態的內容。就是不讓使用$this
         在類的方法中可以使用其他靜態屬性和靜態方法,不過要使用self關鍵字:
             如 【self::靜態屬性名】或【self::靜態方法名】

        (>PHP5.3)在一個類的方法中若沒有出現$this的調用,默認此方法爲靜態方法。

*6.3. const關鍵字: 在類中修飾成員屬性,將其定義成常量(不可修改的),
    一般要求常量名都是大寫的,沒有“$”符 沒有其他修飾符(public)
    在其他方法中使用常量: 【self::常量名】
    定義格式:  const 成員常量名="值"; 
 使用:在類的方法中:   echo self::成員常量名;
         在類的外部:   echo 類名::成員常量名;

6.4. 檢測當前對象是否是屬性指定的類
    instanceof 用於確定一個 PHP 變量是否屬於某一類 class 的實例:

    is_a — 如果對象屬於該類或該類是此對象的父類則返回 TRUE

七、 類型約束

1. 類型約束可以使用的類型是:數組或對象。
    若指定的一個類名,那麼可傳入本類及子類的對象進去。
    可以使用的約束類型:(複合類型)數組array,類名、抽象類名、接口名
//如下面的類
class MyClass
{
    /**
     * 測試函數
     * 第一個參數必須爲類OtherClass的一個對象
     */
    public function test(OtherClass $otherclass) {
        echo $otherclass->var;
    }



    /**
     * 另一個測試函數
     * 第一個參數必須爲數組 
     */
    public function test_array(array $input_array) {
        print_r($input_array);
    }
}

八、其他魔術方法:

1. 對象複製clone 克隆一個對象,因爲對象屬於引用類型,普通的“=”號屬於引用賦值,
    所有需要clone來複制一份。
    魔術方法:__clone() 當執行clone克隆時會自動調用的方法。

2. __toString()方法:魔術方法,當我們直接要輸出一個對象時,如echo $a,print $a,
    那麼會自動調用的方法。
    注意:__toString()方法必須返回一個字串類型的值。


3. *自動加載類函數__autoload(類名): 
    當new 實例化一個對象時,這個類若不存在,則自動調用此函數,並將類名存入參數
    我可以使用這個實現類的自動加載。

九、 對象序列化(串行化)(webservice XML)(在對象持久化存儲、和傳輸中使用)

serialize() -- 串行化       (轉換成一個可儲存的值)
unserialize() -- 反串行化   (從已存儲的表示中創建 PHP 的值)

json_encode() --將數組轉換成字符串
json_decode() --轉換後的字符串 轉換成 數組

php裏面的值都可以使用函數serialize()來返回一個包含字節流的字符串來表示。
unserialize()函數能夠重新把字符串變回php原來的值。 
序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字。

json_encode:對變量進行 JSON 編碼
    //通過json_encode()函數將數組轉換成字符串
    //轉換的字符串只有很用的數據

json_decode:
    //將json_encode()轉換後的字符串 轉換成 數組
    //json_decode()  

__sleep 和 __wakeup 

    __sleep(): 是執行串行化時自動調用的方法,目的是實現資源類型的屬性實關閉操作。
        注意:sleep方法需要返回一個數組,其中數組中的值是串行化時要保留的屬性名

    __wakeup():是在執行反串行化時自動調用的方法,目的是實現資源屬性的打開(sleep方法關閉的資源)

public function __seep(){
    return array('server', 'username', 'password', 'db');
    //此串行化要保留四個屬性
}

十、 抽象類:

  當類中有一個方法,他沒有方法體,也就是沒有花括號,直接分號結束。
如 public abstract function fun();
象這種方法我們叫抽象方法,必須使用關鍵字abstract定義,
包含這種方法的類必須是抽象類也要使用關鍵字abstract加以聲明。

抽象類的特點:
不能實例化,也就new成對象
若想使用抽象類,就必須定義一個類去繼承這個抽象類,並定義覆蓋父類的抽象方法(實現抽象方法)。

其實抽象類對於子類(實現類),有一個約束的作用,

含有抽象方法的類肯定是抽象類,但是不是所有的抽象類都必須包含抽象方法。

十一、 接口:

假如一個抽象類中所有的方法都是抽象的,那麼我們可以使用另外一種方式定義:接口
接口使用關鍵字interface來定義,接口中只能有常量與抽象方法。
格式:
interface 接口名{
[常量定義]
[抽象方法定義] //注意不要有abstract關鍵字
}

實現方式:class 類名 implements 接口名,接口名2{
實現體。。
}

十二、多態

*多態(使用方式):對於同一個方法,傳入不同對象,實現了不同的效果,這個就是多態的意思,
  需要使用的技術:繼承或實現,方法的覆蓋(重寫)。

實例:
主板:mainboard   PCI插槽(規範接口)  

第三方生產
聲卡: soundCard
網卡: networkCard 

設計模式:單例、單態設計模式



http://localhost/.../index.php?m=類名&a=方法名&其他參數

http://localhost/.../user/add.html

http://news.sohu.com/web/123456.html

http://news.sohu.com//find?id=123456

十三、異常處理:

在php5中有一種新的錯誤處理機制--異常處理:(採用面向對象方式的)
涉及的類:Exception異常類
結構:
    <?php
        class Exception
        {
            protected $message = 'Unknown exception';   // 異常信息
            protected $code = 0;                        // 用戶自定義異常代碼
            protected $file;                            // 發生異常的文件名
            protected $line;                            // 發生異常的代碼行號

            function __construct($message = null, $code = 0);

            final function getMessage();                // 返回異常信息
            final function getCode();                   // 返回異常代碼
            final function getFile();                   // 返回發生異常的文件名
            final function getLine();                   // 返回發生異常的代碼行號
            final function getTrace();                  // backtrace() 數組
            final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息

            /* 可重載的方法 */
            function __toString();                       // 可輸出的字符串
        }
    ?> 


使用:
    1. throw new Exception("年齡不可以爲負數"); //異常拋出
    2. try{
            //捕獲異常
            $s->age=30;
            $s->age=-40;
    3.  }catch(Exception $e){
            //異常處理
            echo $e->getmessage();
        }

php面向對象中的實用類:

  1. Db.class.php 表數據信息操作類
  2. page.class.php 分頁類
    方法:屬性:URL地址、條件、總頁數、總條數、頁大小、當前 頁
    構造方法(參數:總條數、頁大小、條件)
    私有方法:計算最大頁數、判斷當前頁數是否越界
    輸出分頁信息方法:(輸出給Model類中limit方法使用)
    私有屬性的getter方法(__GET());
    輸出分頁信息方法(輸出HTML代碼)(就是:【上一頁】【下一頁】。。。。)
  3. images.class.php 圖片處理類(等比縮放、圖片水印、裁剪);
  4. fileupload.class.php 文件上傳類
  5. 驗證碼輸出
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章