亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

php兩種封裝類的優缺點?

php兩種封裝類的優缺點?

江戶川亂折騰 2019-04-07 11:18:23
php很多內置的類或擴展類比較粗糙,需要人為的封裝一遍,于是有了兩種封裝方式,1直接繼承2內部實例化如redis類,可以namespacelibclassredisextends\Redis{}也可以namespacelibclassredis{private$_redis=null;publicfunction__construct(){$this->_redis=new\Redis()}}第一種方法的優點是方便,無須把所有的方法重寫一遍,但是不太好統一捕捉異常,第二種就是麻煩些,需要重寫一遍所有的方法,(雖然可以用魔術方法),捕捉異常方便些。大家用的哪種?為什么呢?
查看完整描述

2 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

繼承
繼承的特點有
?實現成本低
?調用者可以沿用原有的接口使用,學習成本低
?原有的功能無需任何代碼如常工作
?無法隱藏或改變原有的功能
其實你可以這么做,就好像你確實可以用鐵絲去捅插座眼一樣
改變輸入、改變輸出、改變行為都屬于改變功能,比如原來拋的異?,F在不拋了,原來returnfalse現在變異常了,原來輸入的是青椒現在變牛肉了等等
?正交性弱,沒有做到屏蔽父類的依賴,需要更換父類的時候顯得脆弱
常見的合適的應用有
增加日志記錄等不影響原有邏輯的“旁路邏輯”
增加一些方法,比如原有的某一些方法a()b()c()總是連續一起調用,增加一個doABC()方法
僅限簡單的少量的方法,如果要加復雜的功能或者大量的方法,還是建議用組合
增加一些靜態/工廠方法,比如newRedis(ip,port)=>OurRedis::getInstance()
一句話說就是原有行為不變,is-a的場景用繼承。
組合
組合的特點有
?實現成本略高,創建對象的過程可能會變復雜
?調用者需要理解新的接口
?需要轉發才能讓原有的功能工作
?很容易隱藏/屏蔽原有的部分功能
?正交性強,可以通過更換內部的對象適配不同的情況而保持外部接口不變
常見的合適的應用有
一切涉及改變行為的需求
未來依賴會變的場景,比如redis會變成memcache,或者mysql會變mariadb之類
需要屏蔽細節的場景,比如SessionCache等需求確實用到redis,但對外肯定要屏蔽“這是個redis實現的session”。否則恐龍會出現在你背后把你腦袋咬掉
一句話就是某個功能依賴另一個功能,use-a或has-a的場景用組合
偏題,predis用起來還不錯,可以一試
                            
查看完整回答
反對 回復 2019-04-07
?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

如果你看過任何一本設計模式的書,肯定都是推薦你使用第二種。
它們奉行的原則是:組合優于繼承。
不過,還得看自己需求。如果系統的接口和你的類提供的一致,可以試試第一種。如果不一致,選擇第二種。
如果你正在為系統設計DB中間層,需要適配不同的數據庫,選擇第二種。
                            
查看完整回答
反對 回復 2019-04-07
  • 2 回答
  • 0 關注
  • 388 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號