前 言 OOP 學習了好久的PHP,今天來總結一下PHP中的抽象類與抽象方法/靜態屬性和靜態方法/PHP中的單利模式(單態模式)/串列化與反串列化(序列化與反序列化)。 1、什麼是抽象方法? 沒有方法體 {} 的方法,必須使用abstract 關鍵字修飾。這樣的方,我們叫做抽象方法。 abstrac ...
前 言
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():需要在類外部聲明函數。當實例化一個為生命的類時,自動調用。傳遞實例化的類名,可以使用類名自動載入對應的類文件。
學習時候的筆記,可能會有一些錯誤的地方,歡迎各位的批評指點。
反思,復盤,每天收穫一點---------------------期待更好的自己