訪問修飾限定符的簡單總結、final/abstruct/interface對類的限制、自動加載機制、序列化與反序列化【數據持久化和對象的序列化問題】、對象的拷貝(按引用是由於對象標識)和克隆(__cl

1.針對訪問修飾限定符的理解只須要兩點:
(1)針對的是類的概念和訪問代碼的位置來肯定是否可以訪問
(2)對訪問修飾限定符的使用時只須要對該成員的使用場景注意便可【也就是內部,繼承類,外部進行訪問的權限】php

不須要對內部進行太多理解
【須要對php底層理解時進行理解】數據庫

【重點】
【用途】
經過訪問修飾限定符將內部成員的權限合理的限制,而後再使用公共接口來調用這個基本服務,保證外部不能訪問其內部的構件
【這樣既可以經過類內的設置,將內部的功能實現更好的限制,只有最外層的接口能夠正常被訪問到,而不瞭解內部的業務】編程


【設置權限時的原則:設計框架時的考慮原則】
【禁用全部,開放特殊】
【在某方法被調用超過兩次就能夠考慮該方法被單獨提取出來進行調用處理】json


2.final類【不能被繼承,只能被實例化對象】
類的做用:
(1)對象在定義之初的控制
(2)調用其靜態成員
(3)做爲其餘類的基礎類,被繼承數組

兩大功能
(1)實例化對象
(2)被繼承數據結構


存在兩種特殊的類,功能單一
(1)一種只能實例化對象【不能被繼承final類】
(2)只能被繼承【不能實例化對象抽象類abstract】框架

final類:
在繼承鏈條上,最末的一個類【保證不被繼承】
在語法上限制某個類不能被繼承。【來實現final類須要的效果】函數

final類的使用就是爲了將該類限制不被繼承而只能被實例化來實現的途徑來實現特殊的類。this

 

3.抽象類abstract類
抽象類指的是不完整的類。【因爲包含了不完整的方法因此被稱爲不完整類】(這也就是爲什麼抽象方法一旦存在,那麼這個類就是抽象類)
不完整方法【抽象方法】【也就是說只有方法聲明而沒有方法的實現那麼就是抽象方法】設計


使用abstract關鍵字來聲明不完整的方法。【abstract public function 方法名();】
一旦有抽象方法的話,那麼這個類就是抽象類,也須要abstract關鍵字進行聲明
【抽象類中能夠沒有抽象方法,可是一旦一個類中有抽象方法,那麼該類就必定是抽象類】


抽象類只能被繼承【這點是重點】
繼承後的類須要對本來的抽象類中的抽象方法進行重寫【將不完整方法進行完善】


抽象類的用處就是:
經過抽象類的定義進行規定其子類使用的一致方法的定義【該方法每個子類都須要進行重寫,也就是該方法時子類都必須存在,可是能夠各自不一樣】
【抽象類是考慮到子類都必須出現的方法和接口進行區別,interface類實際上是規範化】


【抽象類和final類都是基於業務邏輯層面來定義的特殊類:final類只被實例化對象,abstract類用來限定子類的結構】
【final方法在繼承中不能被更改】

【類和方法在final和abstract關鍵字修飾和正常的狀況】
在類的層面上,final和abstract類指代了兩種特殊的類
在方法的層面上,final保證了方法在繼承中的不可更改,abstract保證了方法在繼承子類中的結構確認

經過這兩個關鍵字和普通類和方法的定義實現了父類對繼承子類的結構和內容的基本控制

 

4.interface【接口和實現implement】
抽象的方法自己也是一種implement。

接口,指的是對象的公共方法。【接口的方法的屬性都是公共方法。抽象方法內屬性能夠作公共方法也可使protected】
定義一個結構,用於限制一個類或對象應該具有的公共方法。

【接口決定了實現該接口的類(對象)的必定要具有的方法】


接口中的特殊點:
【接口內定義的接口方法,只能是public方法,另外不會在接口內包含完整的方法】
【接口內只能包含公共的接口方法(接口方法自己就是不完整的方法)】
【接口至關於將抽象類中抽象方法中的public的方法進行單獨取出來,放入接口中】【這樣保證類實現接口內所定義的全部接口方法】

【並且由於接口的方法都是public方法,因此實現接口的方法只能是public(implements實現該接口方法以後,權限只能比接口方法的權限更寬,只能是public)】
【接口主要是對外使用的,不只僅是框架中定義的方法,框架中確保繼承使用的子類結構使用的仍是abstract,可是接口更偏向外】


【接口與抽象類之間的區別】
(1)抽象類與普通類之間是繼承關係【能夠獲得抽象類中的完整成員,而後才須要實現抽象方法】
(2)接口與普通類之間是實現關係【接口中並無完整成員,只有接口方法,因此實現只能實現接口】
(3)接口只用來定義公共方法,抽象類能夠進行定義更多【只要是公共的成員均可以】
使用接口來規定公共操做,使用抽象類來定義公共的內容(包括屬性和完整的成員)【將抽象方法使用接口進行實現,將公共內容使用抽象類進行整合】
以上即是兩者之間的區別和現實使用中的結合點。

繼承只能是單繼承【子類只能繼承一個父類】
可是實現可使多實現【一個類能夠實現多個接口implements關鍵字】


接口能夠定義常量【這一點要注意:接口常量const關鍵字】
至關於實現時,每個實現的子類都包含該常量

【注意點】
(1)接口不是類【因此接口不是抽象類的特例】class_exist()判斷【只是接口自己實現了抽象類的外層定義】
(2)php是單繼承,如何實現多繼承【利用接口的多實現機制來模擬,可是絕對不是繼承】

能夠理解爲類是對象的設計圖紙,接口是類的設計圖紙【因此接口自己就不是類】
【final、abstract、interface這三個關鍵字來限制類的設置】

 

5.__autoload

項目中如何管理類?
爲每一個類獨立的建立一個文件,用於保存該類的代碼。在使用時,對該文件進行載入便可。
【因此類名和文件對應,經過類名進行文件加載便可。這也就是自動加載機制的使用】

【以前的解決方法是將全部的類所有載入,加載文件太多,這樣對編譯和處理的過程太過冗餘】
【如今解決這個載入問題的方法:就是根據須要,若是該文件沒有被載入,那麼加載相應文件】

解決方案須要解決的問題:
(1)判斷當前類是否已經被加載。
(2)該類在哪一個文件中【類名和文件名一致】
(3)如何判斷須要這個類【實例化,繼承等等都是須要這個類。如何實現判斷須要類的時機是自動加載的關鍵】
【解決方法】
使用php的類文件,自動加載機制來完成。
【當須要一個類,可是並無找到該類的定義。此時php內部會自動嘗試調用__autoload的函數。會將當前須要的類名做爲參數傳遞到auto_load函數中】
正由於有這種機制,咱們只須要對類和文件進行對應,而且設置自動檢索區域,便能實現對類的檢索,檢索以後而且進行鍼對加載。【在__autoload函數進行定義載入文件便能實現自動加載】


實質上咱們須要進行解決的就是,對類名和文件名進行一致化(也就是類單獨進行建立一個文件),而且對該文件進行加載。
【因此咱們須要(命名規則:類名和文件名一致)和(包含文件的方法寫入__autoload函數中)這兩點便能實現自動加載的功能】


【自動加載這個功能須要注意的就是php的內部機制。由於php可以很好的識別php使用類的時候,只是多對該類進行一次查找和調用__autoload函數】


【公司項目的文件加載機制】
經過include_path設置自動檢索區域,對路徑進行簡單使用,而後對自動加載的方法實現類名加載文件

 

6.序列化和反序列化【串行化與反串行化】serialize unserialize
數據永久化的概念【例如將數據保存在文件內,數據庫等】
在保存數據的過程當中,數據的格式是一個問題。文件內只能存字符串【而php自己的數據類型有八種,因此須要將php裏除了字符串以外的數據類型的數據須要轉化爲字符串】
這也就是序列化【與json很好區別。json的數據格式是js默認可以接受的數據格式,而不是所謂的字符串】


數據類型:相應的數據結構和定義在該結構上的操做
在傳輸和存儲過程當中都是流的形式【字符串】所謂的流?

一旦數據類型不是字符串,就會致使數據不能原始保存或者傳輸。【這也就是序列化的使用場景】
php全部的數據類型均可以被序列化和反序列化【資源例外。由於資源自己就是對外部的操做,並且外部的操做不能持久化。只有把資源換成其餘類型的數據以後,才能被序列化】

【重點】
對象被序列化和反序列化:
(1)將對象序列化保存到一個文件中時,該信息會很好的保存,可是並不會保存對象指定的類,致使了反序列化後,顯示的該對象就是__php_incomplete_class類的對象。因此須要在反序列化以前將該類載入,才能正常進行讀取反序列化結果
【緣由:對象中並不會存方法,因此須要指定該類】
(2)反序列化也會出發自動加載機制【由於須要找到類】【只要使用自動加載函數定義正常,便能正常載入類】
【由於自動加載會自動傳入類名,該類名在序列化的結果裏有聲明】

(3)反序列化以後的對象還須要多注意【尤爲是須要使用該對象作處理時】
【例子是數據庫鏈接後的對象,由於資源不能被序列化和反序列化,該數據庫鏈接對象並不能在反序列化以後正常鏈接數據庫】
【因此須要咱們在反序列化以後得到的數據以後,再進行一次鏈接】
【在序列化時能夠自定義保存序列化的對象中的屬性是否被序列化,在反序列化時能夠自動執行某些代碼,從而完成】
【__sleep()和__wakeup()方法保證了對象的序列化和反序列之中的處理】


7.__sleep和__wake up
【應用場景就在對象在序列化和反序列化的過程當中控制對象屬性是否被序列化的方法】
【保證對象在序列化和反序列化過程當中也能正常處理資源這樣的屬性的功能,保證代碼的自動化】

__sleep()方法會在對象被序列化時,自動調用,返回一個數組。數組中的每個元素表示一個屬性名。數組內存在的屬性名纔會被序列化
【這樣就可以經過這樣的方法進行對象序列化時限制對象中屬性是否被序列化】
function __sleep(){
return array('但願被序列化的屬性');//這個函數會被自動調用,因此只須要有這個返回值便能實現對要序列化的屬性控制
}

__wakeup()方法在對象對反序列化時,自動調用,實現反序列化以後缺失的一些能力的處理
【例如反序列化以後對象的資源屬性的從新初始化】

【總結:魔術方法】
__construct
__destruct
__sleep
__wakeup
這四個方法
php自動調用,用戶腳本進行定義,並且在特定情境下才會被調用


8.對象的拷貝與克隆
對象的賦值是按引用傳遞【兩個對象之間進行賦值以後,若是改變一個,那麼另外一個也起做用】
保存對象的變量內,保存的是對象的標識,而不是變量自己。因此使用兩個對象的變量進行賦值的過程當中,只是將該變量指向對象的標識複製了一份,而對象的標識和對象之間的引用關係並未變化
【這就是說對象的變量的只能是指向該標識】
【因此對象的變量的改變,都是使用該對象標識進行對象值的改變,因此看來對象時按引用的效果】


可是有時候咱們須要對象的總體複製【克隆clone關鍵字】
【克隆須要注意的就是__clone()這樣的魔術方法】
可是克隆並不會徹底同樣,由於這兩份數據也須要進行區別。
在克隆是調用__clone()方法來對克隆操做以後添加一些識別的屬性。【這個方法也是自動調用,在__clone()方法內的$this指代的是克隆後的新方法】
【咱們在編程中也要對克隆後的新對象增長額外的識別屬性】

 

 

【數組的拷貝相關知識回顧,另外foreach】

【問題】數據的流的顯示

相關文章
相關標籤/搜索