代碼:程序員
class object { public $name; public $gender; public function say(){ echo $this->name."is".$this->gender; } } $student = new object(); $student->name = 'Tom'; $student->gender = 'male'; $student->say(); //因爲PHP 的對象是用數組來模擬的,所以把對象轉換爲數組,就能查看這個對象的全部屬性了 var_dump($student); var_dump((array)$student);//(array)對象類型轉換成數組,打印屬性值 var_dump(array($student)); print_r((array)$student); echo '<br />'; //對象序列化 $str = serialize($student); echo $str.'<br />'; file_put_contents('store.txt',$str); //反序列化,取出這個對象 $str = file_get_contents('store.txt'); $student = unserialize($str); $student->say(); 結果: Tomismale object(object)[1] public 'name' => string 'Tom' (length=3) public 'gender' => string 'male' (length=4) array (size=2) 'name' => string 'Tom' (length=3) 'gender' => string 'male' (length=4) array (size=1) 0 => object(object)[1] public 'name' => string 'Tom' (length=3) public 'gender' => string 'male' (length=4) Array ( [name] => Tom [gender] => male ) O:6:"object":2:{s:4:"name";s:3:"Tom";s:6:"gender";s:4:"male";} Tomismale
面向對象的優點在於類的複用
。繼承與多態都是對類進行復用,它們一個是類級別的複用
,一個是方法級別的複用
。提到繼承必提組合,兩者有何異同?PHP到底有沒有多態?若沒有,則爲何沒有?有的話,和其餘語言中編程
在繼承中,用parent
指代父類,用self
指代自身。使用「::」
運算符(範圍解析操做符)調用父類的方法。
經過一些總結,得出了繼承是一種「是、像
」的關係,而組合是一種「須要
」的關係。利用這條規律,就能夠很簡單地判斷出父親與兒子應該是繼承關係,父親與家庭應該是組合關係。還能夠從另一個角度看,組合偏重總體與局部的關係,而繼承偏重父與子的關係。設計模式
耦合是一個軟件結構內不一樣模塊之間互連程度的度量,也就是不一樣模塊之間的依賴關係。
低耦合指模塊與模塊之間,儘量地使模塊間獨立存在;模塊與模塊之間的接口儘可能少而簡單。現代的面向對象的思想不強調爲真實世界建模,變得更加理性化一些,把目標放在解耦上。
解耦是要解除模塊與模塊之間的依賴。
按照這個思想,繼承與組合兩者語義上難於區分,在兩者都可使用的狀況下,更傾向於使用組合。爲何呢?繼承存在什麼問題呢?
1)繼承破壞封裝性。
好比,定義鳥類爲父類,具備羽毛屬性和飛翔方法,其子類天鵝、鴨子、鴕鳥等繼承鳥這個類。顯然,鴨子和鴕鳥不須要飛翔這個方法,但做爲子類,它們卻能夠無區別地使用飛翔這個方法,顯然破壞了類的封裝性。而組合,從語義上來講,要優於繼承。
2)繼承是緊耦合的。
繼承使得子類和父類捆綁在一塊兒。組合僅經過惟一接口和外部進行通訊,耦合度低於繼承。
3)繼承擴展複雜。
隨着繼承層數的增長和子類的增長,將涉及大量方法重寫。使用組合,能夠根據類型約束,實現動態組合,減小代碼。
4)不恰當地使用繼承可能違反現實世界中的邏輯。數組
多態確切的含義是:同一類的對象收到相同消息時,會獲得不一樣的結果。而這個消息是不可預測的。多態,顧名思義,就是多種狀態,也就是多種結果。
區別是不是多態的關鍵在於看對象是否屬於同一類型。若是把它們看作同一種類型,調用相同的函數,返回了不一樣的結果,那麼它就是多態;不然,不能稱其爲多態。因而可知,弱類型的PHP裏多態和傳統強類型語言裏的多態在實現和概念上是有一些區別的,並且弱類型語言實現起多態來會更簡單,更靈活。
本節解決了什麼是多態,什麼不是多態的問題。至於多態是怎麼實現的,各類語言的策略是不同的。可是,最終的實現無非就是查表和判斷。總結以下:
多態指同一類對象在運行時的具體化。
PHP語言是弱類型的,實現多態更簡單、更靈活。
類型轉換不是多態。
PHP中父類和子類看作「繼父」和「繼子」關係,它們存在繼承關係,但不存在血緣關係。 所以子類沒法向上轉型爲父類,從而失去多態最典型的特徵。
多態的本質就是if…else,只不過實現的層級不一樣。函數
狹義的接口,即interface關鍵字。廣義的接口能夠是任何一個對外提供服務的出口,好比提供數據傳輸的USB接口、淘寶網對其餘網站開放的支付寶接口。網站
接口做爲一種規範和契約存在。做爲規範,接口應該保證可用性;做爲契約,接口應該保證可控性。
接口只是一個聲明,一旦使用interface關鍵字,就應該實現它。能夠由程序員實現(外部接口),也能夠由系統實現(內部接口)。接口自己什麼都不作,可是它能夠告訴咱們它能作什麼。
PHP中的接口存在兩個不足,一是沒有契約限制,二是缺乏足夠多的內部接口。
接口其實很簡單,可是接口的各類應用很靈活,設計模式中也有很大一部分是圍繞接口展開的。this
面向對象編程中對象被賦予了自省的能力,而這個自省的過程就是反射。
反射,直觀理解就是根據到達地找到出發地和來源。比方說,我給你一個光禿禿的對象,我能夠僅僅經過這個對象就能知道它所屬的類、擁有哪些方法。
反射指在PHP運行狀態中,擴展分析PHP程序,導出或提取出關於類、方法、屬性、參數等的詳細信息,包括註釋。這種動態獲取信息以及動態調用對象方法的功能稱爲反射API。spa
本章主要介紹面向對象思想的程序的組成元素——類和對象。類是一個動做和屬性的模板,對象是數據的集合。結合PHP自身實際狀況,着重講述PHP裏面向對象的一些比較模糊的知識點,包括魔術方法、接口、多態、類的複用、反射、異常機制等。接口是一種類型,從接口的實現講述接口是怎麼實現「即插即用」的。設計