PHP中的抽象類與抽象方法/靜態屬性和靜態方法/PHP中的單利模式(單態模式)/串行化與反串行化(序列化與反序列化)/約束類型/魔術方法小結


 

  前  言

 OOP 

  學習了好久的PHP,今天來總結一下PHP中的抽象類與抽象方法/靜態屬性和靜態方法/PHP中的單利模式(單態模式)/串行化與反串行化(序列化與反序列化)。

 

1  PHP中的抽象類與抽象方法
   
     1、什么是抽象方法?
              沒有方法體 {} 的方法,必須使用abstract 關鍵字修飾。這樣的方,我們叫做抽象方法。
                    abstract function say(); //    抽象方法

          2、什么是抽象類?
           包含抽象方法的類就叫抽象類。抽象類必須使用abstract關鍵字修飾。
                  abstract class Person{}

          3、抽象類的注意事項
                ①    抽象類可以包含非抽象方法;
                ② 包含抽象方法的類,一定是抽象類;
                    抽象類,並不一定必須包含抽象方法;
                ③ 抽象類,不能實例化。
                  (抽象類中可能包含抽象方法,抽象方法沒有方法體,實例化調用沒有意義。)
               
                   我們使用抽象類的目的!就是限制實例化!!!        

          4、 子類繼承抽象類,那么子類必須重寫父類的所有抽象方法。除非子類也是抽象類。
         
          5、使用抽象類的作用?
              ① 限制實例化。(抽象類是一個不完整的類,里面的抽象方法沒有方法體,所以不能實例化)
              ② 抽象類為子類的繼承提供一種規范。子類繼承一個抽象類,則必須包含並且實現抽象類中已定的抽象方法。
         
         

 

2  靜態屬性和靜態方法
  
     1、static
              ① 可以修飾屬性和方法,分別稱為靜態屬性、靜態方法,也叫類屬性、類方法;
              ② 靜態屬性、靜態方法,只能使用類名直接調用。
                  使用"類名::$靜態屬性" 、 "類名::靜態方法()"
                  Person::$sex;  Person::say();
              ③ 靜態屬性、方法,在類裝載時就會聲明。先於對象產生;
              ④ 靜態方法中,不能調用非靜態屬性或方法;
                非靜態方法,可以調用靜態屬性或方法;    
              (因為靜態屬性和方法在類裝載時就已經產生,而非靜態的屬性方法、此時還沒有實例化誕生)
              ⑤ 在類中,可以使用self關鍵字,代指類名。
                  class Person{
                  static $sex = "nan";
                  function say(){
                      echo self::$sex;
                      }
                  }
              ⑥ 靜態屬性是共享的。也就是new很多對象也是共用一個屬性。

   2、final
          ① final 修飾類,此類為最終類,不能被繼承;
          ② final    修飾方法,此方法為最終方法,不能被重寫!
          ③ final 不能修飾屬性。
     
      3、const關鍵字;
            在類中聲明常量,不能使用define()函數!必須使用const關鍵字。
           與define()聲明類似,const關鍵字聲明常量不能帶$,必須全部大寫!
           常量一旦聲明,不能改變。調用時與static一樣,使用類名帝愛用 Person::常量。
     
      【小總結】  幾種特殊操作符
      1、 .      只能連接字符串; "".""
      2、 => 聲明數組是,關聯鍵與值["key"=>"value"]
      3、 -> 對象($this new出的對象)低啊用成員屬性、成員方法。
      4、  : :  ① 使用parent關鍵字,調用父類中的同名方法;parent::say();
                ② 使用類名(和self)調用類中的靜態屬性、靜態方法、以及常量。
     
     
         

 

3  PHP中的單利模式(單態模式)
   
   單利模式也叫單態模式
     
     
       可以保證,一個類只能有一個對象實例。
     
       實現要點:
            ① 構造函數私有化,不允許使用new關鍵字創建對象。
            ② 對外提供獲取對象的方法。在方法中判斷對象是否為空,如果為空則創建對象並返回,如果不為空直接放回,
          ③ 實例對象的屬性以及過去對象的方法必須都是靜態的。
            ④ 之后,創建對象只能使用我們提供的靜態方法。      $s1 = Singleton::getSingle();
            
         

 

 1 class Singleton{
 2         private static $single=null;
 3         private function __construct(){}
 4         static function getSingle(){
 5             if(!self::$single){
 6                 self::$single = new self();
 7             }
 8             return self::$single;
 9         }
10         function __destruct(){
11             echo "啊,我被銷毀了。";
12         }
13     }
14     
15     $s1 = Singleton::getSingle();
16     $s2 = Singleton::getSingle();
17     $s3 = Singleton::getSingle();
18     $s4 = Singleton::getSingle();
單利模式簡單的代碼

 

 

4  串行化與反串行化(序列化與反序列化)
   
            1、串行化:將對象通過一系列操作,轉化為一個字符串你的過程,稱為串行化;
              2、反串行化:將串行化后的字符串,再轉為對象的過程,稱為反串行化;
              3、什么時候使用串行化?
                  ① 對象需要在網絡中傳輸的時候;
                  ② 對象需要在文件或者數據庫中持久保存的時候;
              4、怎么實現對象串行化與反串行化?
              串行化: $str = serialize($duixiang);
              反串行化: $duixiang = unserialize($str);
              5、__sleep()魔術方法:
                  ① 當執行對象串行化的時候,會自動執行__sleep()函數;
                  ② __sleep()函數要求返回一個數組,數組中的值,就是可以串行化的屬性;不在數組中的屬性,不能被串行化;
                  function __sleep(){
                  return array("name","age");//只有name/age兩個屬性可以串行化
                  }
              6、__wakeup()魔術方法:
                  ① 當反串行化對象時,自動調用__wakeup()方法;
                  ② 自動調用時,用於給反串行化產生的新對象屬性,進行重新復制;
                  function __wakeup(){
                      $this->name = "李四";
        

 

5  約束類型 
   
    1、類型約束:是指在變量前,加上數據類型,用於約束此變量只能存放對應的數據類型.(這種操作常見於強類型語言,在PHP中,只能實現數組和對象的類型約束)
      2、如果類型約束為某一個類,則本類以及本類的子類對象,都可以通過;
     
      3、在PHP中,類型約束,只能發生在函數的形參中。
          class Person{}
          class Student extend
      
       function func(Person $p){
              //約束函數的參數,只接受Person類及Person子類
             echo "111";
             echo $p->name;
             }
          func(new Person()); √
          func(new Student()); √
       func("111");    ×
     
          形如 new Person();的形式,我們稱其為“匿名函數”;
    
         

 

6  魔術方法小總結
   
  1、__construct(): 構造函數,new一個對象時,自動調用
      2、__destruct(): 析構函數,當一個對象被銷毀前,自動調用
      3、__get():訪問類中私有屬性時,自動調用。傳遞讀取的屬性名,返回$this->屬性名
      4、__set():給類的私有屬性賦值時,自動調用。傳遞需要設置的屬性名和屬性值
      5、__isset():使用isset()檢測對象私有屬性時,自動調用。傳遞檢測的屬性名,返回isset($this->屬性名);
      6、__unset():使用unset()刪除對象私有屬性時,自動調用。傳遞刪除的屬性名,方法中執行unset($this->屬性名);
      7、__toString():使用echo打印對象時,自動調用。返回想要打印對象時,現實內容;返回必須是字符串;
      8、__call():調用一個類中未定義或未公開的方法時,自動調用。傳遞被調用的函數名,和參數列表數組;
      9、__clone():當使用clone關鍵字,克隆一個對象時,自動調用。作用是為新克隆的對象進行初始化復制;
      10、__sleep():對象序列化時,自動調用。返回一個數組,數組中的值就是可以序列化的屬性。
      11、__wakeup():對象反系列化時,自動調用。為反序列化新產生的對象,進行初始化復制;
      12、__autoload():需要在類外部聲明函數。當實例化一個為生命的類時,自動調用。傳遞實例化的類名,可以使用類名自動加載對應的類文件。
    
     

 

 

 

學習時候的筆記,可能會有一些錯誤的地方,歡迎各位的批評指點。

反思,復盤,每天收獲一點---------------------期待更好的自己


免責聲明!

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



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