面向對象
面向對象
1、什麼是面向對象面向對象是一種程式設計思想,面向對象也叫OOP,是一種基于面向過程的程式開發思想。它的好處是:1.可以多人合作友善 2.減少代碼備援,靈活性高 3.代碼的可用性發揮到極緻 4.可擴充性強.
面向過程:程式設計思路集中的是過程上
面向對象:程式設計思路集中在參與的對象
以去飯館吃飯為例:
面向過程:點菜——做菜——上菜——吃飯——結賬——收拾
面向對象:服務員,廚師,客人
對象是具體存在的事物,對象是由屬性(變量)和方法(函數)組成的
類是具有相同屬性和行為的一組對象的集合.
在開發的時候先寫類,通過類建立對象,通過對象調用方法和屬性
一個類可以建立多個對象
面向對象的主要三大特征是:封裝,繼承,多态。
封裝:把資料與資料操作捆綁到一起,對外界形成隐蔽,同時對外界提供可操作的接口
繼承:子類繼承父類,子類可以直接通路父類,php中屬于單項繼承,不能同時繼承多個父類,但是可以b繼承a,c在繼承b,子類對象可以通路父類被繼承的成員,而父類不能通路子類。父類的私有成員放在一個方法裡面通過(可以通過父類開放接口實作)this通路它,子類繼承父類方法沒有私有化,那麼子類可以通路到父類的私有成員,但是設計意義上是不可以存在的。因為對象的屬性是儲存在對象記憶體空間,是以父類的私有屬性也會繼承,但是設計意義上不可以存在的。
多态:多态的發生必須有繼承關系,多态是指父類對象擁有子類的形态,并且可以表現出子類的特性,php不支援多态
2、php中的類成員成員變量(屬性),成員方法(成員函數)和類常量
3、$this類的内部内置的一個對象$this代表對象的通路
4、self在類的内部使用,代替類名,必須和範圍解析操作符一起使用,在内部也可以執行個體化對象,可以降低耦合性.
5、範圍解析操作符 ::專門用于實作類成員操作,類常量,靜态成員都隻能使用範圍解析操作符通路。
6、構造方法__construct
系統内置的一個特殊的方法,在執行個體化對象後,自動調用自己,如果構造函數傳遞了參數,那麼在執行個體化對象的時候也必須傳遞參數。
7、析構方法__destruct
系統内置的一個特殊的方法,在對象銷毀時自動調用,用來釋放資源比較好。
8、php回收機制腳本在運作完成後,系統會自動回收記憶體
9、對象傳值對象傳值是引用傳遞,不管對象指派給多少個變量,記憶體中都隻有個對象。但是重新new執行個體化的就不一樣了,它們都是獨立的存在了。
10、類的自動加載__autoload php提供的類的加載機制,記憶體中不存在自動調用,但是7版本後不建議使用,而是采用一種注冊機制,spl_autoload_register(定義好的函數)
7版本前使用 __autoload <?php //自動加載機制:利用系統提供的__autoload()函數 function __autoload($classname){ //參數為類名:即目前需要通路的類的名字 //需要人為定義去哪加載,怎麼加載 include_once $classname . '.php'; //假定為目前目錄下,類檔案名字為:類名.php } //使用類:記憶體目前并沒有 $s = new Saler(); //系統發現記憶體沒有Saler,是以調用__autoload()去加載 ?> 7版本以後使用spl_autoload_register <?php //定義一個函數,用來加載類檔案 function my_autoload($classname){ //也需要一個參數來接收要加載的類名字 //功能與__autoload()一樣 $c_file = 'c/' . $classname . '.php'; //如c/Saler.php if(file_exists($c_file)){ include_once $c_file; }else{ //說明c檔案夾沒有對應的檔案 $m_file = 'm/' . $classname . '.php'; //如m/Saler.php if(file_exists($m_file)){ include_once $m_file; } } } //此時,上述函數永遠不會自動運作,除非将函數注冊到系統内部 spl_autoload_register('my_autoload'); ?>
11、克隆對象clone出來的對象與原來對象是二個不同的記憶體位址,此時他們二個都是獨立存在的,在内部也可以使用__clone方法,在對被克隆後,新克隆的對象會自動調用
12、重寫ovenrride重寫即是子類與父類有重名成員,子類可以重寫父類的成員,一般重寫父類方法用來拓展或者更改業務。子類重寫父類後,會覆寫父類,通路的都是子類(私有不能被重寫),如果還想通路父類成員那麼可以使用parent通路父類成員(不能通路父類屬性靜态屬性)。重寫父類,子類的控制權不能高于父類,子類重寫父類方法的時候參數必須保證一緻(資料類型都必須一緻)!!!!
13、trait代碼複用trait相當于是一個公共的函數,誰都可以用。它不是類,不可以被執行個體化,不可以被繼承!除了類常量其他成員它都可以擁有!
類要使用trait的時候必須引入,use 定義的trait名,而且trait可以一次性引入多個隻需要逗号分開即可。
引入多個trait如果有同名方法,可以使用insetadof代替處理
//解決方案:先替換後别名 class Animal{ use t1,t2{ t1::eat insteadof t2; //明确使用t1中的eat方法 t2::eat as eat2; //t2中的eat方法改名叫eat2 } } $a = new Animal(); $a->eat(); //t1,eat $a->eat2(); //t2,eat
類中引入trait同名屬性會報錯,同名方法會覆寫
trait可以使用抽象方法 ,使用目前trait的類要是成為抽象類要麼實作抽象方法
14、靜态延遲綁定靜态延遲綁定是指通過static關鍵字進行類靜态成員的通路,是指在被通路時才決定到底使用哪個類
靜态延遲綁定對比的是靜态綁定self
靜态延遲綁定的意義是用來保證通路的靜态成員是根據調用類的不同而選擇不同的表現
15.、最終類finalfinal最終類不能被繼承,final修飾的方法不能被重寫,最終類final可以很好的包含類的内部結構不被暴露
16、抽象類 Abstract抽象類修飾的類,隻能被繼承不能執行個體化,abstract修飾的方法不能有方法體,而且抽象方法的類必須是抽象類。抽象類裡面不能有私有方法,因為它隻能被繼承,私有了就不能被繼承了。子類繼承了抽象類,如果抽象類裡面有抽象方法,子類要麼成為抽象類要麼實作抽象類的方法。
17、接口interface它不是類,不可以被執行個體化。它隻能被類用 implement實作,接口定義隻能有抽象方法與接口常量
實作接口必須成為抽象類或者實作裡面的抽象方法,除非接口裡面沒有抽象方法
不允許重寫接口,不允許添加接口方法的控制權,權限隻能使用public
接口可以被接口繼承
18、php重載重載是類的多态的一種實作。函數重載指一個辨別符被用作多個函數名,且能夠通過函數的參數個數或參數類型将這些同名的函數區分開來,調用不發生混淆。即當調用的時候,雖然方法名字相同,但根據參數的不同可以自動調用相應的函數。
php不好實作。
可以使類裡面的某個方法産生多種效果,根據傳入參數不同,可以執行不同的邏輯。
19、魔術方法系統内置的方法,魔術方法__開始
__construct(),類的構造函數
__destruct(),類的析構函數
__call(),在對象中調用一個不可通路方法時調用
__callStatic(),用靜态方式中調用一個不可通路方法時調用
__get(),獲得一個類的成員變量時調用
__set(),設定一個類的成員變量時調用
__isset(),當對不可通路屬性調用isset()或empty()時調用
__unset(),當對不可通路屬性調用unset()時被調用。
__sleep(),執行serialize()時,先會調用這個函數
__wakeup(),執行unserialize()時,先會調用這個函數
__toString(),類被當成字元串時的回應方法
__invoke(),調用函數的方式調用一個對象時的回應方法
__set_state(),調用var_export()導出類時,此靜态方法會被調用。
__clone(),當對象複制完成時調用
__autoload(),嘗試加載未定義的類
20、周遊對象foreach可以對對象像數組一樣周遊
foreach周遊對象周遊的是對象内部的所有公有屬性
21、單例模式單例模式就是技術的類最多隻能有一個對象,三私一共,保持唯一性
私有化構造方法:禁止在類外無限執行個體化對象
私有化克隆方法:禁止對象無限克隆對象
私有化靜态屬性:儲存類内部執行個體化得到的對象
公有化靜态方法:允許外部通過調用類内部方法擷取對象
22、工廠模式工廠模式factory,是指像工廠一樣流水線生産對象,由一個地方生産對象,其他位置就不需要額外執行個體化對象,進而可以友善後期代碼統一的維護。而且工廠模式下可以友善隐藏真實的類結構,是以也更加安全。
23、命名空間命名空間本身是PHP就有的,用來防止命名沖突問題的。