摘要:例如汽車這個名詞可以理解為汽車的總類,但這輛寶馬汽車則是一個具體的汽車對象。當在類成員方法內部調用的時候,可以使用偽變量調用當前對象的屬性。在面向對象中則被稱之為方法。
簡述
“現在大伙都在講面向對象編程,但是我們也得先找著一個對象是不?不然怎么面向對象?怎么編程?” --- 笑話一則,但是理不虧,要搞P面向對象編程,我們起碼要先搞懂對象(還有類)是什么?只有了解它,理解它,你才能駕馭它。做編程的不能瞎搞,邏輯嚴謹清晰最重要,要明白我們在做什么?我需要做什么?我該怎么做?接下來,我來談談PHP類和對象的認知,然后說一下我們應該怎么用它們。
走進 PHP 類和對象 簡述PHP類和對象初學者的角度,可以認為類就是屬性+函數。
類是面向對象程序設計的基本概念,通俗的理解“類”就是對現實中某一個種類的東西的抽象。
比如:汽車可以抽象為一個類,汽車擁有名字、輪胎、速度、重量等屬性,可以有換擋、前進、后退等操作方法。
通常定義一個汽車類的方法為:
name; } } ?>
類是一類東西的結構描述,而對象則是一類東西的一個具體實例。
例如:汽車這個名詞可以理解為汽車的總類,但這輛寶馬汽車則是一個具體的汽車對象。
對象可以通過new關鍵字進行實例化:
getName();// 調用Car這個類里面的getName()方法并輸出結果(因為類被實例化了,所以這個類里面的函數、方法、變量、常量等都可以調用使用) ?>
類與對象看起來比較相似,但實際上有本質的區別:類是抽象的概念,對象是具體的實例。
類可以使程序具有可重用性。
如何創建一個類類通過關鍵字class開頭,然后是類名與花括號,在花括號中定義類的屬性與方法。
類名必須是字母或下劃線開頭,后面緊跟若干個字母、數字或下劃線,類名最好能夠表意,可以采用名詞或者英文單詞。
定義一個類,你可以這么干:
name; } } ?>
要創建一個類的實例,可以使用new關鍵字創建一個對象,下面介紹2種創建類的方法:
注意:類的定義和創建是有本質上的區別的,定義類只是相當于創造了一臺汽車,而創建類則是你要去開這臺汽車,但是你并不知道這臺汽車是否存在(類是否已被定義),所以在使用類之前那你必須要確保你要用的類存在(已被定義)。
類的屬性1.在類中定義的變量稱之為屬性,通常屬性跟數據庫中的字段有一定的關聯,因此也可以稱作“字段”。 2.屬性聲明是由關鍵字`public`,`protected`或者`private`開頭,后面跟一個普通的變量聲明來組成。 3.屬性的變量可以設置初始化的默認值,默認值必須是常量。 4.訪問控制的關鍵字代表的意義為: public:公開的 protected:受保護的 private:私有的
下面有一個案例,可以參考一下:
類的屬性默認都為public,外部可以訪問。
類的屬性一般通過 -> 對象操作符來訪問對象的屬性或者方法,對于靜態屬性則使用 : : 雙冒號進行訪問。
當在類成員方法內部調用的時候,可以使用$this偽變量調用當前對象的屬性。
下面是類屬性調用的案例,也有一些錯誤的屬性調用:
name; // 調用對象的屬性 echo $car->color; // 錯誤 受保護的屬性不允許外部調用 echo $car->price; // 錯誤 私有屬性不允許外部調用 ?>
受保護的屬性與私有屬性不允許外部調用,在類的成員方法內部是可以調用的。如下:
price; // 內部訪問私有屬性 ? } } ?>定義類的方法
方法就是在類中的function,很多時候我們分不清方法與函數有什么差別 :
1.在面向過程的程序設計中function叫做函數 。
2.在面向對象中function則被稱之為方法 。
注:同屬性一樣,類的方法也具有public,protected以及private的訪問控制。
*訪問控制的關鍵字代表的意義為:
public:公開的 protected:受保護的 private:私有的
我們可以這樣定義方法:
getName(); ?>
使用關鍵字static修飾的,稱之為靜態方法,靜態方法不需要實例化對象,可以通過類名直接調用,操作符為雙冒號 : : 。
構造函數和析構函數top:這個其實我自己把握也不是很大,可能自己使用的比較少,析構方法和構造方法這些用的妙常常出現在高級工程師之手,都是一些項目底層代碼里面經常用到的,而我之所以很少接觸,顯然易見我還是菜鳥,所以我應該繼續好好學習。
定義:PHP5可以在類中使用__construct()定義一個構造函數,具有構造函數的類,會在每次對象創建的時候調用該函數,因此常用來在對象創建的時候進行一些初始化工作。(這個的意思大概就是說構造函數往往在對象創建之前就調用該函數創建一些系統必須的共用對象或者類方法,還有完成一些初始化工作,所以這些構造函數往往都是一些最最最底層的東西)。
下面有一個很很很簡單構造函數案例:
如果在子類中定義了__construct(),則不會調用父類的__construct()。
如果需要同時調用父類的構造函數,需要使用 parent : : __construct() 顯式的調用。
案例(可能有點繞):
同樣,PHP5支持析構函數,使用__destruct()進行定義,析構函數指的是當某個對象的所有引用被刪除,或者對象被顯式的銷毀時會執行的函數。
案例:
當PHP代碼執行完畢以后,會自動回收與銷毀對象,因此一般情況下不需要顯式的去銷毀對象。
Static靜態關鍵字靜態屬性與方法可以在不實例化類的情況下調用,直接使用 類名::方法名 的方式進行調用。
靜態屬性不允許對象使用->操作符調用:
靜態方法也可以通過變量來進行動態調用:
靜態方法中,$this偽變量不允許使用。可以使用self,parent,static在內部調用靜態方法與屬性:訪問控制
訪問控制通過關鍵字public,protected和private來實現。
被定義為公有的類成員(public)可以在任何地方被訪問。
被定義為受保護的類成員(protected)則可以被其自身以及其子類和父類訪問。
被定義為私有的類成員(private)則只能被其定義所在的類訪問。
類屬性必須定義為公有、受保護、私有之一。
為兼容PHP5以前的版本,如果采用 var 定義,則被視為公有。
案例:
類中的方法可以被定義為公有、私有或受保護。
如果沒有設置這些關鍵字,則該方法默認為公有:
如果構造函數定義成了私有方法,則不允許直接實例化對象了,這時候一般通過靜態方法進行實例化,在設計模式中會經常使用這樣的方法來控制對象的創建,比如單例模式只允許有一個全局唯一的對象:
對象繼承繼承是面向對象程序設計中常用的一個特性,汽車是一個比較大的類,我們也可以稱之為基類,除此之外,汽車還分為卡車、轎車、東風、寶馬等,因為這些子類具有很多相同的屬性和方法,可以采用繼承汽車類來共享這些屬性與方法,實現代碼的復用。
在代碼中,實際上就是類的繼承,ClassA extends ClassB,就是這么簡單,但是這為我們開發提供了一個對象的重用性的特質,使得我們在開發上得到更好便利。
對象(我的理解就是類)的繼承,就是函數方法調用的通道和數據接口的使用,實際使用就是這么的一個體驗。(這僅僅是我的觀點,歡迎大家指正我的觀點,同時歡迎大家發表你的觀點。)
重載PHP中的重載指的是動態的創建屬性與方法,是通過魔術方法來實現的。
屬性的重載通過__set,__get,__isset,__unset來分別實現對不存在屬性的賦值、讀取、判斷屬性是否設置、銷毀屬性。
關于重載,有以下這個案例可以看一下:
ary[$key] = $val; } // 魔法方法__get public function __get($key) { if (isset($this->ary[$key])) { return $this->ary[$key]; } return null; } // 魔法方法__isset public function __isset($key) { if (isset($this->ary[$key])) { return true; } return false; } // 魔法方法__unset public function __unset($key) { unset($this->ary[$key]); } } $car = new Car(); $car->name = "汽車"; //name屬性動態創建并賦值 echo $car->name; ?>
方法的重載通過__call來實現,當調用不存在的方法的時候,將會轉為參數調用__call方法,當調用不存在的靜態方法時會使用__callStatic重載。
speed += 10; } } } $car = new Car(); $car->speedUp(); // 調用不存在的方法會使用重載 echo $car->speed; ?>對象的高級特性
對象比較,當同一個類的兩個實例的所有屬性都相等時,可以使用比較運算符==進行判斷,當需要判斷兩個變量是否為同一個對象的引用時,可以使用全等運算符===進行判斷:
對象復制,在一些特殊情況下,可以通過關鍵字clone來復制一個對象,這時__clone()方法會被調用,通過這個魔術方法來設置屬性的值。
name = $this->name; } } $a = new Car(); $a->name = "new car"; // 通過關鍵字clone來復制一個對象 $b = clone $a; var_dump($b); ?>
對象序列化,可以通過serialize()方法將對象序列化為字符串,用于存儲或者傳遞數據,然后在需要的時候通過unserialize()將字符串反序列化成對象進行使用。
"; $b = unserialize($str); //反序列化為對象 var_dump($b); ?>小結
人人都在喊面向對象編程,但是卻不是人人都懂面向對象編程,這是一個很模糊很模糊的概念,模糊到很多人都不知道怎么定義它們。
到現在為止還沒有人能夠正式定義它們,這一切都需要靠自己,怎么去形容它?我一般用形容來對待什么是面向對象,類就像一個汽車類,而他的對象就是那些跑車小轎車什么的。
類和對象要切記對象是類的具體表現形式(基本存在),比如寶馬車之于汽車類的意義。
總結面向對象編程(OOP)是一種設計范式,同時也是一種程序開發方法。它視對象為程序的基本單元,將程序和數據封裝在其中,以提高程序的重用性、靈活性和可擴展性。
類是對象的抽象組織,對象是類的基本存在。
對象和類的概念及兩者的關系:
1.類是定義一系列屬性和操作的模版,而對象則是把屬性進行具體化,然后交給類處理。
2.對象就是數據,對象本身不包含方法。但是對象有一個“指針”指向一個類而這個類里可以有方法。
3.方法描述不同屬性會導致不同的表現。
4.類和對象是不可分割的,有對象就必定有一個類與其對應,否則這個對象也就沒有意義了。(但是有一種特殊情況:由標量進行強制類型轉換的object,沒有一個類與他相對應,此時PHP中一個稱為“孤兒”sidClass類就會收留這個對象)。
關于類的繼承和組合的總結:首先繼承是一種“像”或“是”的關系。而組合則是一種“需要”的關系。比如:
1.如果兩個或者多個類有相同的代碼和方法時,大可把它們都抽象(離)出來形成一個父類,然后它們這些有相同代碼或方法的類作為子類 去繼承它(哪些共有的代碼)。
2.組合相比繼承簡單,組合的類可以是有關系(體現為復用代碼很少),甚至沒關系(復用的方法或代碼)。
在編程中,耦合是一種軟件結構內不同模塊代碼之間互連程度的度量,也就是不同模塊之間的依賴關系。(這個代碼開發時要考慮代碼可擴展性和易維護性,不然很容易牽一發而動全身的問題)。
低耦合是指模塊與模塊之間盡可能地使模塊間獨立存在,模塊與模塊之間的接口盡量少而簡單。(這個就是說我們寫的代碼要盡可能的實現靠自己就能實 現功能,不需要靠別人,因為別人不一定靠得住,誰知道哪一天它就被干掉了呢?)。
解耦是指要接觸模塊與模塊之間的依賴。
底層代碼多用組合,頂層/業務層代碼多用繼承:
1.底層用組合可以提高效率,避免臃腫。
2.頂層代碼用繼承可以提高靈活性,讓業務使用更加方便。
面對對象的多態?
1.多態是指同一類對象在運行時的具體化。
2.PHP語言是弱類型,實現多態更簡單更靈活。
3.類型轉換不是多態。
4.PHP中父類和子類看作“繼父”和“繼子”關系,他們存在繼承關系,但是不存在血緣關系,因此子類無法向上轉為父類,從而失去多態最典型的特征。
5.多態的本質就是一個if...else,只不過實現的層級不同。
面向對象的接口
1.接口是作為一種規范和契約的存在:作為規范,接口應該保證可用性;作為契約,接口應該保證可控性。
2.接口只是一個聲明,一旦使用interface關鍵字,就應該實現它。可以由程序員實現(外部接口),也可以由系統實現(內部接口)。
3.接口本身什么都不做,但是它可以告訴我們它能做什么。
4.PHP接口存在兩點不足:沒有契約的限制;缺少足夠多的內部接口。
面向對象設計五大原則:
1.單一職責原則(SRP):避免同一職責分散到不同類中,避免一個類承擔太多職責(我的建議就是每個類盡可能簡單,單純實現一個功能,而且代碼量盡可能精短,數據加工的方法可以抽離出來)。
2.接口隔離原則(ISP):使用多個接口比使用單個接口好(一個類對另外一個類的依賴性(影響)是建立在最小的接口上,避免接口污染,避免為接口添加不必要的職責)。
3.開放-封閉原則(OCP):模塊在擴展性方面應該是開放的,而模塊的更改性應該是封閉的(模塊的行為必須是開放的,支持擴展而不是僵化的;對模塊的功能進行擴展時,不應該影響或大規模地影響已有程序模塊)。
4.替換原則(LSP):子類必須能夠替換它們的父類,并代表其出現在任何地方(父類的方法都要在子類中實現或者重寫,并且派生類只實現其抽象類中聲明的方法,不應該給出多余的方法定義或實現;在客戶端程序中只應該使用父類對象而不應當直接使用子類對象,這樣可以實現運行期綁定(動態多態))。
5.依賴倒置原則(這個真不熟):將依賴關系倒置為依賴接口(上層模塊不應該依賴下層模塊,它們共同依賴同一個抽象;抽象不能依賴于具體,具體應該要依賴抽象)。
面向對象優點:
1.新成員的加入和融入不在困難,高難度抽象有利于高度總結。
2.代碼即文檔,團隊中任何人都可以輕松地獲得產品的各個模塊的基本信息,而不需要讀大量代碼。
注:建議大家看看《PHP核心技術與最佳實踐》這本書,由列旭松和陳文著作,機械工業出版社2013出版的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21255.html
摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 2847·2021-09-28 09:36
閱讀 3937·2021-09-22 15:52
閱讀 3630·2021-09-06 15:00
閱讀 1947·2021-09-02 15:40
閱讀 2798·2021-09-02 15:15
閱讀 3454·2021-08-17 10:15
閱讀 2781·2019-08-30 15:53
閱讀 2073·2019-08-29 18:39