PHP 學習筆記(三)

參考資料:PHP5 權威編程


筆記開始

PHP 中的類和對象

? ? ? ? ? ? 對象:萬物皆對象;

? ? ? ? ? ? 類: 任何對象,都可以人為規(guī)定為某種類型(類別)。

PHP中的對象

? ? ? ?? ? ?類是描述一類事物的一個總稱,是具有相同特征的該類事物的一個通用名稱。

? ? ? ? ? ? 對象是一個明確的具體的物體,是某個類中的一個實物(類就是一個抽象的概念)。對象一定隸屬于某個類--------有類才有對象,先有類再有對象。

? ??????????屬性和方法

? ? ? ? ? ? 在面相對象過程中

? ? ? ? ? ? 屬性就是原來的變量,寫在一個類中,原來的變量就稱為屬性(類的變量成員叫屬性);

? ? ? ? ? ? 方法就是原來的函數(shù),寫在一個類中,原來的函數(shù)就稱為方法。

屬性和方法

? ? ? ? ? ? 對象的創(chuàng)建

4種創(chuàng)建方法

? ? ? ? ? ? 對象的傳值方式

? ????????????對象的存儲模式(結構):

????????????????????????$變量 ----> ?對象標識符/編號(#1) -----> ?#1對象數(shù)據(jù)本身

????????????????????????并且:該變量中存儲的實際是該對象的標識符/編號。這個標識符或編號有能力去“指向?qū)ο蟆保?/p>

值傳遞
引用傳遞

????????????????????對象中的 值傳遞引用傳遞 結果一樣, 但是過程卻不相同

? ? ? ? ? ? ? ? ? ? 值傳遞過程

值傳遞

????????????????????引用傳遞

引用傳遞


引用傳遞


? ??????類中成員

? ? ? ? ? ? ? ? 類中成員分為3大類

? ? ? ? ? ? ? ? ? ? 屬性:1 普通屬性? 2 靜態(tài)屬性

? ? ? ? ? ? ? ? ? ? 方法: 1 普通方法 2 靜態(tài)方法 3 構造方法 4 析構方法

? ? ? ? ? ? ? ? ? ? 常量

? ? ? ? ? ? ? ? 類常量

? ? ? ? ? ? ? ? ? ? 定義形式?

? ? ? ? ? ? ? ? ? ? ? ? class 類名{

? ? ? ? ? ? ? ? ? ? ? ? ? ? const 常量名 ;? ? ?//?不能使用define

????????????????????????}

? ? ? ? ? ? ? ? ? ? 使用形式

? ??????????????????????常量的使用,是通過類名,并使用范圍解析符(::)來取用的;

????????????????????????類名::常量名;

常量使用形式

? ? ? ? ? ? ? ? 普通屬性(實例屬性)

? ? ? ? ? ? ? ? ? ? 定義形式

? ? ? ? ? ? ? ? ? ? ? ? class 類名{

? ? ? ? ? ? ? ? ? ? ? ? ? ? var $屬性名 = 初始值;

? ? ? ? ? ? ? ? ? ? ? ? ? ? var $屬性名;

? ? ? ? ? ? ? ? ? ? ? ? ? ? // 另一種形式

? ? ? ? ? ? ? ? ? ? ? ? ? ? public $屬性名 = 初始值;

? ??????????????????????????public $屬性名;

????????????????????????}

? ? ? ? ? ? ? ? ? ? 使用形式

? ??????????????????????$對象->屬性名;(沒有$符號?。。?/b>


? ? ? ? ? ? ? ? 靜態(tài)屬性

? ??????????????????靜態(tài)屬性,本質(zhì)上也是“變量”,但其有一個特點就是:該變量只隸屬于“類”,即:

????????????????????一個類中的一個靜態(tài)屬性,就只有“一份數(shù)據(jù)”;

? ? ? ? ? ? ? ? ? ? 一個類中的一個實例屬性,就可以有“多份數(shù)據(jù)”——每創(chuàng)建一個對象出來,就會有一份數(shù)據(jù);

? ? ? ? ? ? ? ? ? ? 定義形式

? ? ? ? ? ? ? ? ? ? ? ? class? 類名{

? ? ? ? ? ? ? ? ? ? ? ? ? ? static $屬性名 =? 初始值;

? ??????????????????????????static $屬性名;

????????????????????????}

? ? ? ? ? ? ? ? ? ? 使用形式

? ??????????????????????使用類名和范圍解析符(::)來對靜態(tài)屬性進行操作:

????????????????????????類名::$靜態(tài)屬性名;? ? //注意:屬性名帶$符號?。。。。?!

靜態(tài)屬性只有一份數(shù)據(jù)

? ??????????????1,實例屬性,是每個對象都可以不一樣的數(shù)據(jù),也是每個對象都“獨自擁有”的數(shù)據(jù);

????????????????2,靜態(tài)屬性,他不屬于任何一個對象,而只屬于該類本身,也可以理解為為所有對象所共有的數(shù)據(jù);


? ? ? ? ? ? ? ? 普通方法(實例方法)

? ???????????????????定義形式

? ??????????????????????class? 類名{

? ? ? ? ? ? ? ? ? ? ? ? ? ? function 方法名($形參1,$x形參2....){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // code.......

????????????????????????????}

????????????????????????}

? ? ? ? ? ? ? ? ? ? 調(diào)用形式

? ??????????????????$對象名->方法名(實參1,實參2,....);

? ? ? ? ? ? ? ? 靜態(tài)方法

? ? ? ? ? ? ? ? ? ? ? ?一個類中定義的方法,只隸屬于這個類本身,而不是隸屬于這個類的對象。

? ? ? ? ? ? ? ? ? ? ???定義形式

? ??????????????????????????class? 類名{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?static function 方法名($形參1,$x形參2....){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????// code.......

????????????????????????????????????}

????????????????????????????}

? ? ? ? ? ? ? ? ? ? ? ? 調(diào)用形式

? ??????????????????????類名::方法名(實參1,實參2,....);

靜態(tài)方法

? ??????????????self關鍵字:用在方法中,表示該方法所在的類。

????????????????static關鍵字代替self關鍵字的位置,除了具有self作用外,還具有更靈活的作用,那就是所謂“后期靜態(tài)綁定”。


? ? ? ? ? ? ? ? 構造方法(__construct)

? ??????????????構造方法是一個類在進行實例化(new一個對象出來)的時候,會?首先自動調(diào)用 的方法。主要的目的是為了在new一個對象的時候,給該對象設置一些“初始值”(初始化工作);構造方法的參數(shù)沒有規(guī)定,通常是根據(jù)實際的需要來定義,目的是為了對象屬性數(shù)據(jù)的初始化。

? 構造方法(__construct)??


? ? ? ? ? ? ? ? 析構方法(__destruct)

? ? ? ? ? ? ? ? 析構方法是一個對象被銷毀的時候被 自動調(diào)用?的方法,自己無法調(diào)用。

? ? ? ? ? ? ? ? 析構方法??不能帶參數(shù)(形參),只能是public的。但方法中也可以使用$this這個詞,代表“當前對象”。

? ??????????????如果一個類中定義了析構方法,則銷毀對象時就會調(diào)用該方法。

????????????????如果一個類中沒有定義析構方法,則銷毀對象時就會調(diào)用其父類的析構方法(如果有)

?析構方法(__destruct)

? ? ? ? ? ? ? ? ? ?

? ?????對象在哪些情況下會被銷毀?

? ??????????????1,如果程序結束,所有變量都會被銷毀,自然,變量所代表的對象也會被銷毀;

程序結束 對象銷毀

? ??????????????對象銷毀的順序,默認情況下,跟其創(chuàng)建的順序相反;

????????????????2,當一個對象沒有任何變量“指向”它的時候,即使程序還沒有結束,也會被銷毀;

一個對象沒有任何變量“指向”它

? ? ? ? ? ? ? ? ? ? 此時,$obj1 斷開了指向 ,但是程序還沒也結束,此時,也會銷毀對象。此時執(zhí)行析構方法。

? ? ? ? ? ? ? ? 3,當變量賦值為標量,不能再指向?qū)ο螅瑢ο缶蜁讳N毀。

變量賦值為標量

? ? ? ? ??類的繼承

? ??????????????????將一個類A中的特性信息,傳遞到另一個類B中,此時就稱為:

????????????????????B繼承A

????????????????????A派生出B;

? ? ? ? ? ? ? ? ? ? 基本語法:extends

extends

? ? ????????????????說明

????????????????????????父類/子類:已有類為父類,新建類為子類。父類又可以稱為“基類”,上級類,子類又稱為派生類,下級類,

? ? ? ? ? ? ? ? ? ? ? ? 單繼承:一個類只能從一個上級類繼承其特性信息。PHP和大多數(shù)面向?qū)ο蟮恼Z言都是單繼承模式。C++是多繼承。

????????????????????????擴展:在子類中再來定義自己的一些新的特有的特性信息(屬性,方法和常量)。沒有擴展,繼承也就沒有意義了。


? ? ? ? ? 訪問控制修飾符? ??

? ? ? ? ? ? ? ? ? ? ? ? public:公告的,在所有位置都可以訪問;

? ? ? ? ? ? ? ? ? ? ????protected:受保護的,只能在該類內(nèi)部和該類的子類或者父類中訪問和使用;

? ? ? ? ? ? ? ? ? ? ????private:私有的,只能在該類內(nèi)部訪問。

? ??????????????????????形式????

? ? ? ? ? ? ? ? ? ? ? ? ? ? class 類名{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 訪問控制修飾符? 屬性或者方法

????????????????????????????}

? ? ? ? ? ? ? ? ? ? ????作用:用來 限制 其說修飾的成員的 可訪問性,即用

? ? ? ? ? ? ? ? ? ? ? ? 對象->實例屬性和方法? 或者 類::靜態(tài)屬性和靜態(tài)方法? ?的合理性。

? ??????????????????訪問控制修飾符,需要結合使用該語法形式的所在位置,才能確定是否可訪問。

? ? ? ? ? ? ? ? ? ?3個訪問位置:類的內(nèi)部,? 繼承類的內(nèi)部,類的外部??

訪問的權限

? ? ? ? ? ? ? ? ? ??總結:

????????????????????1,public修飾的成員,哪里都能訪問;

? ? ? ? ? ? ? ? ? ? 2,類的內(nèi)部,可以訪問任何級別的成員;

? ? ? ? ? ? ? ? ? ? 3,public具有最寬泛的可訪問性;private具有最狹小的可訪問性;protecte則居中;

訪問控制修飾符? ? 外部
訪問控制修飾符? ? 內(nèi)部
訪問控制修飾符? ? 繼承類內(nèi)部??

? ? ? ? ? parent關鍵詞

? ??????????????????paren在面向?qū)ο笳Z法中,代表“父類”。本質(zhì)上就是代表父類這個“類”,而不是父類的“對象”;

? ??????????????????使用方式為:

? ? ? ? ? ? ? ? ? ? ? parent::屬性或方法; //通常是靜態(tài)屬性或靜態(tài)方法,但有時候可能是實例屬性或?qū)嵗椒ǎ?/p>

? parent關鍵詞

? ? ????????????????三個關鍵字對比

三個關鍵字對比

? ? ? ? ? ? ? ? ?? 構造方法? 析構方法?在父類和子類中的運用

? ??????????????????1,如果一個類 有構造方法,則實例化這個類的時候,就不會調(diào)用父類的構造方法(如果有);

????????????????????2,如果一個類沒有構造方法,則實例化這個類的時候,就會自動調(diào)用父類的構造方法(如果有);????????????????

? ??????????????????3,如果一個類 有析構方法,則銷毀這個類的時候,就不會調(diào)用父類的析構方法(如果有);

????????????????????4,如果一個類沒有析構方法,則銷毀這個類的時候,就會自動調(diào)用父類的析構方法(如果有);

? ??????????????????5,如果一個類中有構造方法或析構方法,則就可以去“手動”調(diào)用父類的同類方法(如果有);

????????????????手動調(diào)用的語法形式總是這樣:

????????????????parent::構造方法或析構方法()

??parent::構造方法或析構方法()


? ?????覆蓋(override)

? ??????????????覆蓋,又叫“重寫”,將一個類從父類中繼承過來的屬性和方法“重新定義”——此時相當于子類不用父類的該屬性或方法,而是重新定義。

覆蓋

? ??????????訪問控制權限:

????????????????????子類覆蓋的屬性或方法的訪問控制權限,不能“低于”父類的被覆蓋的屬性或方法的訪問控制權限:

????????????????具體來說:

????????????????父類:public 子類:只能是public

????????????????父類:protected 子類:可以是protected和public

????????????????父類:private 子類:不能覆蓋!——既父類的私有成員,不存在被子類覆蓋的可能。

????????????????方法的參數(shù)形式:

????????????????子類覆蓋父類的同名方法的時候,參數(shù)要求跟父類保持一致;

????????????????特例:

????????????????構造方法重寫的時候參數(shù)可以不一致

????????????????小注意:

????????????????雖然父類的私有屬性不能被覆蓋,但子類卻可以定義自己的跟父類同名的屬性;

????????????????雖然父類的私有方法不能被覆蓋,但子類也不能定義自己的同名方法;


? ? ? ? 最終類

? ??????????最終類,其實就是一種特殊要求的類:要求該類不允許往下繼承下去。

????????????形式:

????????????????final ?class類名{

????????????????//類的成員定義。。。跟一般類的定義一樣!

????????????????}

? ? ? ? 最終方法

? ??????????最終方法,就是一個不允許下級類去覆蓋的方法??!

????????????形式:

????????????????class類名{

????????????????????final ?function方法名(形參列表...){ 。。。。。 }

????????????????}

? ? ? ?設計模式

? ??????????設計模式就是解決某個問題的一般性代碼的經(jīng)驗性總結。

? ? ? ? ? ? ? ? ? ? ? ? 工廠模式

? ??????????????????????????所謂工廠模式,就是這樣一個類(就是所謂的工廠類):它可以根據(jù)“傳遞”給他的類名,而去生產(chǎn)出對應的類的對象。

? ?????????????????????????工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。

工廠模式

? ? ? ? ? ? ? ? ? ? ? ??

? ??????????????????????單例模式

? ??????????????????????通過單例模式可以保證系統(tǒng)中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例。

單例模式


??????抽象類和抽象方法

? ? ? ? ? ? ? ? 抽象類:一個不能實例化的類

? ? ? ? ? ? ? ? ? ? 形式:abstract? ?class? 類名{? ? }? ? ? ??

? ? ? ? ? ? ? ? 抽象方法:是一個只有方法頭,沒有方法體的方法定義形式;

? ? ? ? ? ? ? ? ? ? 形式:abstract function 方法名();? ??//注意,這里必須有分號;

? ? ? ? ? ? ? ? 抽象類? 和? 抽象方法? 注意事項

? ? ? ? ? ? ? ? 1 一個抽象方法必須在抽象類中,抽象類中不一定有抽象方法(不常見);

? ? ? ? ? ? ? ? 2?被定義為抽象的方法只是聲明了其調(diào)用方式(參數(shù)),不能定義其具體的功能實現(xiàn)。 抽象方法是為了規(guī)定下級類中必須去完成對抽象方法的詳細描述;

? ? ? ? ? ? ? ? 3子類實現(xiàn)父類的抽象方法的時候,其形參也應該跟父類保持一致,其訪問權限也不能更?。弧湓蚱鋵嵾@是“重寫現(xiàn)象”,自然應該遵循重寫的要求;

抽象類和抽象方法

? ? ? ? 重載技術?

? ? ? ? ? ? ? ? 重載的基本概念

? ??????????????????????PHP所提供的重載(overloading)是指動態(tài)地創(chuàng)建類屬性和方法。簡單來說,當對一個對象或類使用其未定義的屬性或方法的時候,其中的一些“處理機制”。

????????????????????????我們是通過魔術方法(magic methods)來實現(xiàn)的。?

重載

????????????????屬性重載

? ??????????????????就是對一個對象的不存在的屬性進行使用的時候,這個類中預先設定好的應對辦法(處理機制);

????????????????????屬性,本質(zhì),就是變量,其只有4個操作:

????????????????????取值:當對一個對象的不存在的屬性進行“取值”的時候,就會自動調(diào)用內(nèi)部方法:__GET()

? ??????????????????__GET($屬性名)

? ??????????????????該方法可以帶一個形參,表示這個要對之取值的不存在的屬性名(字符串);

?__GET


? ???????????????????賦值:當對一個對象的不存在的屬性進行“賦值”的時候,就會自動調(diào)用內(nèi)部方法:__SET()

? ??????????????????__SET($屬性名,值)

? ? ? ? ? ? ? ? ? ? ?它有2個形參,分別代表要對不存在的屬性進行賦值的時候的“屬性名”和“屬性值”;

__SET($屬性名,值)

????????????????????判斷(isset):當對一個對象的不存在的屬性進行isset()判斷的時候,就會自動調(diào)用內(nèi)部方法:__isset()

? ??????????????????__isset(屬性名)

?????????????__isset(屬性名)?

????????????????????銷毀(unset):當對一個對象的不存在的屬性進行unset()銷毀的時候,就會自動調(diào)用內(nèi)部方法:__unset()

? ??????????????__unset(屬性名)

??__unset(屬性名)


????????????????方法重載

? ??????????????當對一個對象的不存在的實例方法進行“調(diào)用”的時候,會自動調(diào)用類中的__call()這個魔術方法;

? ? ? ? ? ? ? ? 當對一個類的不存在的靜態(tài)方法進行“調(diào)用”的時候,會自動調(diào)用類中的__callstatic()這個靜態(tài)魔術方法;

? ??????????????__call($method_name , $argument?)

? ? ? ? ? ? ? ? $method_name 表示要調(diào)用的不存在的方法名

? ? ? ? ? ? ? ? $argument? 表示要調(diào)用的不存在的方法所使用的實參數(shù)據(jù),是一個數(shù)組

???__call($method_name , $argument?)??

? ? ? ? 接口

? ??????????????使用接口(interface),可以指定某個類必須實現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容。

????????????????接口是通過interface關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。

? ? ? ? ? ? ? ? 接口中定義的所有方法都必須是公有,這是接口的特性。

? ??????????????接口里面只能放 “抽象方法” 和 “常量”。

? ? ? ? ? ? ? ? 形式:

? ? ? ? ? ? ? ? ? ? interface 接口名{

? ? ? ? ? ? ? ? ? ? ? ? 常量1;

? ? ? ? ? ? ? ? ? ? ? ? 常量2;????

? ? ? ? ? ? ? ? ? ? ? ? .........

? ? ? ? ? ? ? ? ? ? ? ? 抽象方法1;

? ??????????????????????抽象方法2;

????????????????????}

? ??????????????????????接口常量的使用形式為:接口名稱::常量名稱;

? ? ? ? ? ? ? ? ? ? ? ? 接口中的抽象方法,不要使用abstract修飾,也不需要使用訪問控制修飾符,因為其天然就是public。

接口

? ? ? ? ? ? ? ? ? ? ? ? 接口的作用

? ? ? ? ? ? ? ? ? ? ? ? PHP是單繼承,但是運用中往往要運用到 多繼承,接口就是對沒有多繼承的類之間關系的一個補充。

? ? ? ? ? ? ? ? ? ? ? ? 接口可以實現(xiàn)“多繼承”——但此時不稱為繼承而已,而是稱為“實現(xiàn)”;

????????????????????????????即: 接口1 ?-->>類1;? ?稱為:類1實現(xiàn)了接口1;

????????????????????????????其本質(zhì),其實就是類1中,有了接口1中“特征信息”

????????????????????????使用形式:

????????????????????????class 類名?implements接口1,接口2.....{

????????????????????????}

接口作用

? ? ? ?

? ? ? ?類的自動加載

????????????????????當某行代碼需要一個類的時候,php的內(nèi)部機制可以做到“自動加載該類文件”,以滿足該行需要一個類的這種需求。 ?

? ? ? ? ? ? ? ? ? ? 什么時候需要一個類

? ? ? ? ? ? ? ? ? ? 1 new一個對象的時候;

? ? ? ? ? ? ? ? ? ? 2 使用一個類的靜態(tài)方法的時候;

? ? ? ? ? ? ? ? ? ? 3 定義一個類(B)并以另外一個類(A)作為父類的時候。

自動加載函數(shù)????

? ? ? ? ? ? 使用條件

????????????????1, 當需要一個類的時候,就會自動調(diào)用某個函數(shù)(默認是__autoload),并傳入所需要的類的名字;

? ? ? ? ? ? ? ? 2,一個類應該保存到一個獨立的“類文件中”:即其中只有該類的定義,沒有別的代碼;

? ? ? ? ? ? ? ? 3,習慣上,類文件的命名要有一定的“規(guī)則”,通常是:類名.class.php;

? ? ? ? ? ? ? ? 4,在自動加載函數(shù)中,形參為需要加載的類名,所以要拼湊好正確的路徑。

? ? ? ? 自定義自動加載函數(shù)

? ? ? ? ? ? __autoload 函數(shù)是系統(tǒng)定義的自動加載函數(shù),在需要時,我們可以自定義 自動加載函數(shù)。

? ? ? ? ? ?形式

? ? ? ? ? ?spl_autoload_register(“函數(shù)1”); //聲明“函數(shù)1”作為自動加載函數(shù);

? ? ? ? ? ?spl_autoload_register(“函數(shù)2”); //聲明“函數(shù)2”也作為自動加載函數(shù);

????????????.........

????????????定義(與__autoload一樣)

????????????function 函數(shù)1( $class_name ){

? ? ? ? ? ? ? //.......

? ? ? ? ? ? }

????????????function函數(shù)2( $class_name ){

????????????????//.......

? ? ? ? ? ? }

自定義自動加載函數(shù)


? ? ? ? 對象的復制(克?。?/h4>

????????????對象的克隆,就是用于將一個對象“制作”雙份,類似之前普通數(shù)據(jù)的“值傳遞”;? ?

? ? ? ? ????? 定義

????????????????$obj2 ?= ?clone ?$obj1; //這樣,就有一個跟$obj1完全一樣的新的對象。

?? 對象的復制(克隆)

? ? ? ? ? ? __clone 魔術方法

? ? ? ? ? ? 使用 clone? 會克隆出一個跟當前對象一樣的新的對象,并且會調(diào)用該類中的魔術方法:__clone ,只要 該類中有該方法。????

? ? ? ? ? ? 在單例模式中,應該禁止對該單例的克隆,所有要在該類中禁止__clone 魔術方法,做法就是私有化__clone

? ? ? ? ? ? 第4步私有化這個克隆的魔術方法

? ? ? ? ? ? private function __clone {//不用寫代碼}


? ? ? ? 對象的遍歷? ? ?

?? ?????對象的遍歷,跟數(shù)組的遍歷,一樣!只能遍歷出對象的“實例屬性數(shù)據(jù)”。

? ? ? ? foreach($對象名? as? $key=>$value){

? ? ? ? ? ? ? ? //處理$key? $value

? ? ? ? ?}

? ? ? ? 說明:1 $key 是對象的屬性名,$value 是其對應的值;

? ? ? ? ? ? ? ? ? ?2 能變量出來的屬性,根據(jù)訪問控制權限,只能是在該范圍中的“可訪問屬性”;

對象的遍歷


? ? ? ? PHP內(nèi)置標準類??

? ? ? ? ? ? ? ?PHP中有很多 定義好的類,其中有一個叫? 內(nèi)置標準類。該類的內(nèi)部什么都沒有定義,可以理解為:

? ? ? ? class stdclass{? ? }

stdclass

? ? ? ? 作用:1 可以臨時存儲數(shù)據(jù):$obj2 -> p1 = 100;

? ? ? ? ? ? ? ? ? ?2 當其他數(shù)據(jù)類型轉(zhuǎn)換為對象類型的時候,得到就就是一個內(nèi)置標準類(stdclass)的一個對象實例;

? ? ? ? ? ? ? ? ? ? 形式: $obj = (object)其他數(shù)據(jù)類型;

? ? ? ? ? ? ? ? ? ? ①數(shù)組轉(zhuǎn)為對象:數(shù)組的鍵名作為屬性名,鍵值作為對應的值;數(shù)字下標的數(shù)組,不推薦轉(zhuǎn)換,因為無法通過對象語法獲取。

數(shù)組轉(zhuǎn)對象 得到的是內(nèi)置標準類的一個實例

????????????????????????②null 轉(zhuǎn)為對象 為空對象

內(nèi)置標準類

? ? ? ? ? ? ? ? ? ? ? ? ③其他?標量數(shù)據(jù) (布爾(boolean),整型(interger),浮點型(float/double),? ?字符串(string)轉(zhuǎn)為對象,鍵名為 固定的“scalar”,值為 該變量的值;

其他?標量數(shù)據(jù) 轉(zhuǎn)為對象

? ? ? ? 類型約束

? ??????????就是要求某個變量只能使用(接收,存儲)某種指定的數(shù)據(jù)類型;

? ? ? ? ? ? PHP只支持在函數(shù)(或方法)的形參上,設定類型的約束目標,形式:

? ? ? ? ? ? function 函數(shù)名 (【要求使用的類型】形參1,【要求使用的類型】形參2.......){? ?}

? ? ? ? ? ? 說明:1 定義一個函數(shù)的時候,可以設定約束類型也可以不設定;

? ? ? ? ? ? ? ? ? ? ? ?2 如果設定了約束類型,該實參就必須是該類型,否則就會報錯;

? ? ? ? ? ? ? ? ? ? ? ?3 能夠使用約束類型的就只有一下幾種:數(shù)組(array),對象(使用類的名稱,表示該實參必須是該類的一個實例),接口(使用接口的名稱,表示該實參必須是該接口的類的一個實例)

? ? 類型約束


? ? ? ? 類相關的魔術方法

? ? ? ? ? ? ? ? 序列化與反序列化技術

????????????????序列化:就是將一個變量所代表的“內(nèi)存”數(shù)據(jù),轉(zhuǎn)換為“字符串”形式并持久保存在硬盤上的一種做法。

? ? ? ? ? ? ? ? $v1? = 100;

? ? ? ? ? ? ? ? $s1 = serialize($v1); //將任何類型的變量數(shù)據(jù),轉(zhuǎn)化為字符串

? ? ? ? ? ? ? ? file_put_contents('要保存的目標文件名',$s1);//保存到文件中去

????????????????反序列化:就是將序列化之后保存在硬盤上的“字符串數(shù)據(jù)”,恢復為其原來的內(nèi)存形式的變量數(shù)據(jù)的一種做法。

????????????????$s1 = file_get_contents( ‘保存序列化數(shù)據(jù)的目標文本文件’); //從一個文件里讀出其中的所有字符

????????????????$v1 = ?unserialize( $s1 ); //將該字符串數(shù)據(jù),反序列化轉(zhuǎn)換為變量(數(shù)據(jù))

序列化與反序列化


? ? ? ? ? ? ? ? 對象的序列化和反序列化

? ? ? ? ? ? ? ? 對象序列化只能保存其屬性,而方法被忽略;而且會自動調(diào)用該對象所屬類的魔術方法:__sleep()(前提是有該方法),且該方法必須返回一個數(shù)組,數(shù)組中是“計劃”要進行序列化的屬性名;

對象的序列化

? ? ? ? ? ? ? ? 對象反序列化其實是恢復其原來保存起來的屬性數(shù)據(jù),而且,此時必然需要依賴該對象原本的所屬類;對象在反序列化的時候,會自動調(diào)用該對象所屬類的這個魔術方法:__wakeup()(前提是有該方法)。


? ???????????__tostring()魔術方法(常用)

? ? ? ? ? ? ??將一個對象“當做”一個字符串來使用的時候,會自動調(diào)用該方法,并且在該方法中,可以返回一定的字符串,以表明該對象轉(zhuǎn)換為字符串之后的結果。

????????????????注意:如果沒有定義該方法,則對象無法當做字符串來使用。

__tostring?

? ? ? ? ?與類相關的方法屬性

? ? ? ? ? ? ? ? 魔術常量:以前的筆記中有的 __FILE__? ?__DIR__? __LINE__

? ??????????????__CLASS__: 代表當前其所在的類的類名;

????????????????__METHOD__:代表其當前所在的方法名;

魔術常量

? ??????與類有關的系統(tǒng)函數(shù):

????????class_exists(“類名”), 判斷一個類是否存在(是否定義過)

????????interface_exists(“接口名”), 判斷一個接口是否存在(是否定義過)

????????get_class(?$obj ), 獲得某個對象$obj的所屬類

????????get_parent_class($obj ), 獲得某個對象$obj的所屬類的父類

????????get_class_methods(), 獲得一個類的所有方法名,結果是一個數(shù)組,里面存儲的是這些方法的名稱

????????get_class_vars(), 獲得一個類的所有屬性名。結果是一個數(shù)組,里面存儲的是這些屬性的名稱get_declared_classes() 獲得“整個系統(tǒng)”所定義的所有類名;

? ??????與對象有關的系統(tǒng)函數(shù):

????????is_object( $obj ): 判斷某個變量是否是一個對象;

????????get_object_vars( $obj ):獲得一個對象的所有屬性;結果是一個數(shù)組,里面存儲的是這些屬性的名稱

? ??????與類有關的運算符:

????????instanceof: ?判斷一個“變量”(對象,數(shù)據(jù)),是否是某個類的“實例”;

???instanceof

? ??????static關鍵字的新用法和總結(重要)

? ??????????static這個關鍵字,也可以像“self”一樣,代表“當前類”,用于訪問一個類的“靜態(tài)屬性或靜態(tài)方法”;但,static,在應用中,更靈活,因此更常見。因為static,它代表的是“調(diào)用”當前方法的類,而不是“其代碼所在的類”;self它就比較死板,只代表這個單詞本身所在位置的所在類。

?static和self

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容