摘要:而哈士奇區別于普通狗,又有新的特征逗比,愛搗亂為了保證類之間的松綁定,通常會繼承抽象類,而且是淺繼承只有一層子類。如果知道所有類都會共享一個公共的行為實現,就使用抽象類,并在其中實現該行為。
為什么使用OOP
OOP是一個模塊化的過程,目的是為了把復雜問題簡單化,一個模塊解決一個復雜問題的某一個方面,即一個類應當只有一個職責
OOP區別于順序式編程與過程式編程,在于:
1.順序編程:用于處理最簡單的問題 2.過程編程:將代碼分為模塊以便在程序中重用,程序猿輸為一個函數 輸入不同實參就能利用不同具體值使用函數 3.OOP:形同過程編程,長處在于能處理自己的數據結構,更方便地處理 獨立但相互關聯的類
從外部源啟動PHP類,往往由其它模塊調動,不會自啟動,舉個反例:
OOP基本概念 抽象(abstract)用于指示一個對象的基本特征,是處理復雜性的具體方法。
我們會對現實中的相似性分組,對具體的相似性抽象。
舉個例子:我們一般不會叫自己的愛寵哈士奇為"我的蠢萌蠢萌的、搖著尾巴的、愛搗亂的名叫Jeff的哈士奇",而往往會直接說:"我的狗!"
抽象類不能實例化,只能由具體類(可以實例化的類,非抽象類)繼承抽象類的接口以及所有具體屬性
所有類都是對數據的一組操作的抽象
基本語法:
接口(interface)不能像抽象類那樣在接口中包含具體方法或變量,除非是具有抽象性的接口,可以包含具體常量
接口的核心部分由類中操作(函數)定義的所有簽名組成。簽名包括一個操作的操作名和參數,一個接口表示的就是所有簽名的集合。例如以下代碼,簽名由trick()和形參$whatever組成
public function trick($whatever){ echo "signature"; }
如果要實現接口(implements),就要保證實現接口中的所有方法,在此基礎上可以再繼續添加額外的方法
"; } public function sendInfo(){ return $Info; } public function calculate($first,$second){ $calculate = $first * $second; return $calculate; } /******** 除此之外可以增加其他類 ********/ public function useMethods(){ $this->getInfo("習近平會見馬英九"); echo $this->sendInfo("恒大戰平阿赫利") . "
"; echo "Salary : $" . $this->calculate(20,15) ; } $worker = new ImplementAlpha; $worker->useMethods(); //前面提到不要自啟動,這里為了方便就直接自啟動實例化類 //不過可以看到,在實現類中,方法都是經過useMethods的方法調用的 //在后面章你會看到很多例子都是這樣實現的,而往往不會直接調用 } ?>
OOP和設計模式有很多重要的結構要素,其中之一就是指定數據類型為接口而不是一個具體實現,對數據的引用要通過父類完成。如下所示:
//useProduct.php //兩個實現include進來,此處省略代碼 class useProduct{ public function __construct(){ $apple = new FruitStore(); $book = new BookStore(); $this->doInterface($apple); $this->doInterface($book); //實例化類在一個方法中,調用類的方法又在另一個方法中,降低了耦合度 } function doInterface(IProduct $product){ echo $product->apples(); echo $product->books(); } } $worker = new useProduct(); ?>
這就是強制數據類型,其中使用的對象(類)必然有給定的接口,如果把一個接口 (一個對象類或者接口) 作為代碼提示,綁定會更寬松)它會綁定到接口而不是綁定到一個特定的實現,如上面的doInterface(IProduct $product)
封裝(Encapsulation)封裝是畫份一個抽象的諸多元素的過程,這些元素構成該抽象的結構和行為,封裝的作用就是將抽象的契約接口與其實現分離
通過3種類型的可見性保護封裝(private/protected/public)。但是一個類還是要有可見方法訪問封裝,比如__consruct構造函數,默認為公共的
為了保持封裝而又提供可訪問性,OOP建議使用getter()和setter()方法,但是不能濫用,否則會破壞封裝
setter(200); $got = $this->getter(); echo $got; } private function getter(){ return $this->data; } private function setter($setValue){ $this->data = $setValue; } } $worker = new GetSet(); ?>繼承(extends)
假設我有一只哈士奇(我們稱之為子類),那么它繼承了狗(父類)的屬性,比如四只腳,看到的世界都是通過#404040層過濾的。而哈士奇區別于普通狗,又有新的特征:逗比,愛搗亂
為了保證類之間的松綁定,通常會繼承抽象類,而且是淺繼承(只有一層子類)。深繼承的話,一旦對父類進行簡單修改,子類會帶來嚴重的破壞
$pet = $petChar; } } ?>
fourlegs() . "多態(polymorphism)
"; echo $this->character("They are crazy!") . "
"; echo $this->naughty() . "
"; } private function naughty(){ return "Haski dogs are naughty"; } } ?>
多態的真正價值在于可以調用有相同接口的對象來完成不同的工作。一個大型項目中,增加和修改會對程序帶來巨大影響,除非有一個公共的接口(父類或接口),例如:
從上面的例子看出,Jet和Car類對接口的實現有很大不同。但是基于這樣一個公共接口,在一個給定的程序結構中做出修改或者增補時,可以放心地請求或使用接口方法,而不必擔心程序會崩潰
抽象還是接口(引用于CSDN-PHP的抽象類、接口的區別)
如果要創建一個模型,這個模型將由一些緊密相關的對象采用,就可以使用抽象類。如果要創建將由一些不相關對象采用的功能,就使用接口。
如果必須從多個來源繼承行為,就使用接口。
如果知道所有類都會共享一個公共的行為實現,就使用抽象類,并在其中實現該行為。
PS:該篇引用于《Learning PHP設計模式》第1、2章節
Chap2 預告 :設計模式與UML算法處理操作速度,設計模式解決開發速度
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21209.html
摘要:工廠模式優點集中實例化,可以傳參等缺點分不清屬于哪個對象我們先來談談優點,看例子集中實例化返回實例化對象返回返回不難看出,工廠模式比上面的例子減少了很多代碼。 ECMAscript開發的兩種模式:1.過程化 2.OOP(面向對象) 面向對象的語言有一個標志,那就是類的概念,而通過類可以創建任意多個具有相同屬性的方法的對象。但是ECMAscript中沒有類的概念! 又談作用域 首先...
摘要:構造函數上一章我們講了工廠模式,它的缺點就是無法識別到底哪個屬于哪個的問題。我們可以用構造函數來解決這個識別問題。來比較構造函數內的值就可以看出到底是什么類型。 構造函數 上一章我們講了工廠模式,它的缺點就是無法識別到底哪個屬于哪個的問題。我們可以用構造函數來解決這個識別問題。 //構造函數 function Create(a,b) { this.a =a; this...
摘要:上一章我們談了構造函數,他的唯一特點就是比較了地址不相同,因為大家知道引用類型是比較的引用。也就是說不用在構造函數中定義對象實例,而是直接將這些添加到原型當中。如果構造函數實例里面沒有,就去原型里面查找,如果有就立即返回。 上一章我們談了構造函數,他的唯一特點就是比較了地址不相同,因為大家知道引用類型是比較的引用。我們來談談原型。 原型 我們每創建一個函數都有一個原型(prototyp...
摘要:原型設計模式中,原型設計模式的關鍵是要了解如何使用內置函數抽象原型角色聲明一個克隆自身的接口具體原型角色實現一個克隆自身的操作原型設計模式的目的通過克隆以減少實例化對象的開銷,與其實例化新對象,完全可以使用一個已有實例的克隆注意類是原型設計 原型設計模式 Notice: PHP中,原型設計模式的關鍵是要了解如何使用內置函數__clone() 抽象原型角色(Prototype):聲明一...
摘要:設計模式設計模式基本原則設計原則按接口而不是按實現來編程按接口而不是按實現編程是指,要將變量設置為一個抽象類或接口數據類型的實例,而不是一個具體實現的實例。例如父類的一個改變會逐級向下傳遞給子類實現,這可能會影響子類使用的某個算法。 設計模式 設計模式基本原則 設計原則 ① : 按接口而不是按實現來編程 按接口而不是按實現編程是指,要將變量設置為一個抽象類或接口數據類型的實例,而不是一...
閱讀 2444·2021-09-22 15:41
閱讀 1460·2021-08-19 10:54
閱讀 1769·2019-08-23 15:11
閱讀 3408·2019-08-23 10:23
閱讀 1436·2019-08-22 16:28
閱讀 806·2019-08-22 15:11
閱讀 749·2019-08-22 14:53
閱讀 723·2019-08-22 13:49