第一章:小明與他的手機
從前有個人叫小明
小明有三大嗜好,抽煙,喝酒…… 咳,不好意思,走錯片場了。應該是逛知乎、玩王者農藥和搶微信紅包
#小明的三大愛好
我們用一段簡單的偽代碼,來製造一個這樣的小明
class Ming extends Person { private $_name; private $_age; function read() { //逛知乎 } function play() { //玩农药 } function grab() { //抢红包 } }
但是,小明作為一個人類,沒有辦法僅靠自己就能實現以上的功能,他必須依賴一部手機,所以他買了一台iphone6,接下來我們來製造一個iphone6
class iPhone6 extends Iphone { function read($user="某人") { echo $user."打开了知乎然后编了一个故事 \n"; } function play($user="某人") { echo $user."打开了王者农药并送起了人头 \n"; } function grab($user="某人") { echo $user."开始抢红包却只抢不发 \n"; } }
小明非常珍惜自己的新手機,每天把它牢牢控制在手心裡,所以小明變成了這個樣子
class Ming extends Person { private $_name; private $_age; public function __construct() { $this->_name = '小明'; $this->_age = 26; } function read() { //…… 省略若干代码 (new iPhone6())->read($this->_name); //逛知乎 } function play() { //…… 省略若干代码 (new iPhone6())->play($this->_name);//玩农药 } function grab() { //…… 省略若干代码 (new iPhone6())->grab($this->_name);//抢红包 } }
今天是星期六,小明不用上班,於是他起床,並依序逛起了知乎,玩王者農藥,並搶了個紅包。
$ming = new Ming(); //小明起床 $ming->read(); $ming->play(); $ming->grab();
這個時候,我們可以在命令列裡看到輸出如下
小明打開了知乎然後編了一個故事
小明打開了王者農藥並送起了人頭
小明開始搶紅包卻只搶不發
這一天,小明過得很充實,他覺得自己是世界上最幸福的人。
第二章:小明的快樂與憂傷
小明與他的手機曾一起度過了一段美好的時光,一到空閒時刻,他就抱著手機,逛知乎,刷微博,玩遊戲,他覺得自己根本不需要女朋友,只要有手機在身邊,就滿足了。
可誰能想到,一次次地系統更新徹底打碎了他的夢想,他的手機變得越來越卡頓,電池的使用壽命也越來越短,一直到某一天的寒風中,他的手機終於耐不住寒冷,頭也不回地關機了。
小明很憂傷,他意識到,自己要換手機了。
為了能獲得更好的使用體驗,小明一咬牙,剁手了一台iphoneX,這部手機鈴聲很大,電量很足,還能雙卡雙待,小明很喜歡,但是他遇到一個問題,就是他之前過度依賴了原來那一部iPhone6,他們之間已經深深耦合在一起了,如果要換手機,他就要拿起刀來改造自己,把自己體內所有方法中的iphone6 都換成iphoneX。
漫長的改造過程
經歷了漫長的改造過程,小明終於把程式碼中的 iphone6 全部換成了 iphoneX。雖然很辛苦,但小明覺得他是快樂的。
於是小明開開心心地帶著手機去上班了,並在回來的路上被小偷偷走了。為了應急,小明只好重新使用那部剛被遺棄的iphone6,但是一想到那漫長的改造過程,小明的心裡就說不出的委屈,他覺得自己過於依賴手機了,為什麼每次手機出什麼問題他都要去改造他自己,這不只是過度耦合,簡直是本末倒置,他向天空大喊,我不要再控制我的手機了。
天空中的造物主,也就是身為程式設計師的我,聽到了他的吶喊,我告訴他,你不用再控制你的手機了,交給我來管理,把控制權交給我。這就叫做控制反轉。
第三章:造物主的智慧
小明聽到了我的話,他既高興,又有一點害怕,他跪下來磕了幾個頭,虔誠地說到:「原來您是傳說中的造物主,巴格梅克上神。我聽到您剛剛說了控制反轉四個字,就是把手機的控制權從我的手裡交給你,但這只是您的想法,是一種思想罷了,要用什麼辦法才能實現控制反轉,又可以讓我繼續使用手機呢?」
「呵“,身為造物主的我在表現完不屑以後,丟下了四個大字,「依賴注入!」
接下來,偉大的我開始對小明進行慘無人道的改造,如下
class Ming extends Person { private $_name; private $_age; private $_phone; //将手机作为自己的成员变量 public function __construct($phone) { $this->_name = '小明'; $this->_age = 26; $this->_phone = $phone; echo "小明起床了 \n"; } function read() { //…… 省略若干代码 $this->_phone->read($this->_name); //逛知乎 } function play() { //…… 省略若干代码 $this->_phone->play($this->_name);//玩农药 } function grab() { //…… 省略若干代码 $this->_phone->grab($this->_name);//抢红包 } }
接下來,我們來模擬運行小明的一天
$phone = new IphoneX(); //创建一个iphoneX的实例 if($phone->isBroken()){//如果iphone不可用,则使用旧版手机 $phone = new Iphone6(); } $ming = new Ming($phone);//小明不用关心是什么手机,他只要玩就行了。 $ming->read(); $ming->play(); $ming->grab();
我們先看一下iphoneX 是否可以使用,如果不可以使用,則直接換成iphone6,然後喚醒小明,並把手機塞到他的手裡,換句話說,把他所依賴的手機直接注入他的身上,他不需要關心自己拿的是什麼手機,他只要直接使用就可以了。
這就是依賴注入。
第四章:小明的感悟
小明的生活開始變得簡單了起來,而他把省出來的時間都用來寫筆記了,他在筆記本上這樣寫到
我曾經有很強的控制欲,過度依賴於我的手機,導致我和手機之間耦合程度太高,只要手機出現一點點問題,我都要改造我自己,這實在是既浪費時間又容易出問題。自從我把控制權交給了造物主,他每天在喚醒我以前,就已經替我選好了手機,我只要按照平時一樣玩手機就可以了,根本不用關心是什麼手機。即便手機出了問題,也可以由造物主直接搞定,不需要再改造我自己了,我現在買了七部手機,都交給了造物主,每天換一部,美滋滋!
我也從其中得到了這樣的感悟: 如果一個類A 的功能實作需要藉助於類B,那麼就稱類B是類A的依賴,如果在類A的內部去實例化類B,那麼兩者之間會出現較高的耦合,一旦類B出現了問題,類A也需要進行改造,如果這樣的情況較多,每個類之間都有很多依賴,那麼就會出現牽一發而動全身的情況,程序會極難維護,容易出現問題。要解決這個問題,就要把A類對B類的控制權抽離出來,交給一個第三方去做,把控制權反轉給第三方,就稱作控制反轉(IOC Inversion Of Control)。控制反轉是一種思想,是能夠解決問題的一種可能的結果,而依賴注入(Dependency Injection)就是其最典型的實作方法。由第三方(我們稱作IOC容器)來控制依賴,把他透過建構函式、屬性或工廠模式等方法,注入到類別A內,這樣就極大程度的對類A和類B進行了解耦。
推薦教學:《PHP教學》
以上是深入理解依賴注入是如何實現解耦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP可以輕鬆創建互動網頁內容。 1)通過嵌入HTML動態生成內容,根據用戶輸入或數據庫數據實時展示。 2)處理表單提交並生成動態輸出,確保使用htmlspecialchars防XSS。 3)結合MySQL創建用戶註冊系統,使用password_hash和預處理語句增強安全性。掌握這些技巧將提升Web開發效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

記事本++7.3.1
好用且免費的程式碼編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

WebStorm Mac版
好用的JavaScript開發工具