搜尋
首頁後端開發php教程PHP依賴倒置案例詳解

PHP依賴倒置案例詳解

May 17, 2018 am 10:43 AM
php案例詳解

這次帶給大家PHP依賴倒置案例詳解,PHP依賴倒置的注意事項有哪些,以下就是實戰案例,一起來看一下。

什麼是依賴倒置呢?簡單地講就是將依賴關係倒置為依賴介面,具體概念如下:

1.上層模組不應該依賴下層模組,它們共同依賴一個抽象(父類別不能依賴子類,它們都要依賴抽象類別)

2.抽像不能依賴於具體,具體應該要依賴抽象。

注意,這裡的介面不是狹義的介面

為什麼要依賴介面?因為介面體現對問題的抽象,同時由於抽像一般是相對穩定的或是相對變化不頻繁的,而具體是易變的。因此依賴抽像是實作程式碼擴充和運行期內綁定(多態)的基礎:只要實作了該抽象類別的子類,都可以被類別的使用都使用。這裡,強調一下擴展性這個概念。通常擴展性指對已知行為的擴展,在講述介面時,也提到過,介面應該是相對的。這就告訴我們,無論使用多麼先進的設計模式,也無法做到不需要修改程式碼即可達到不變應萬變的地上。在物件導向的這五大原則裡,我認為依賴倒置是最難理解,也是最難實現的。

這裡以僱員類別為例

<?php
interface employee
{
  public function working();
}
class teacher implements employee
{
  public function working()
  {
    echo &#39;teaching...&#39;;
  }
}
class coder implements employee
{
  public function working()
  {
    echo &#39;coding...&#39;;
  }
}
class workA
{
  public function work()
  {
    $teacher = new teacher();
    $teacher->working();
  }
}
class workB
{
  private $e;
  public function set(employee $e)
  {
    $this->e = $e;
  }
  public function work()
  {
    $this->e->working();
  }
}
$worka = new workA;
$worka->work();
$workb = new workB;
$workb->set(new teacher());
$workb->work();

在workA中,work方法依賴teacher實作;在workB中,work轉而依賴抽象,這樣可以把需要的物件經由參數傳入。上述程式碼透過接口,實現了一定程度的解耦,但仍然是有限的。不僅是使用接口,使用工廠等也能實現一定程度的解耦和依賴倒置。

在workB中,teacher實例透過set方法傳入,從而實現了工廠模式。由於這樣的實作仍然是硬編碼的,為了實現程式碼的進一步擴展,把這個依賴關係寫在設定檔裡,指明workB需要一個teacher對象,專門由一個程式配置是否正確(如所依賴的類別檔案是否存在)以及載入配置中所依賴的實現,這個檢測程序,就稱為IOC容器。

很多文章看到IOC(Inversion of Control)概念,實際上,IOC是依賴倒置原則(Dependence Inversion Principle,DIP)的同義詞。而在提IOC的時候,你可能還會看到有人提起DI等概念。 DI,即依賴注入,一般認為,依賴注入(DI)和依賴查找(DS)是IOC的兩種實作。不過隨著某些概論的演化,這幾個概念之間的關係也變得很模糊,也有人認為IOC就是DI。有人認為,依賴注入的描述比起IOC來更貼切,這裡不糾纏於這幾個概念之間的關係。

在經典的J2EE設計裡,通常把DAO層和Servicen層細分為介面層和實作層,然後在設定檔裡進行所依賴關係的配置,這是最常見的DIP的應用。 Spring框架就是一個很好的IOC容器,把控制權從程式碼剝離到IOC窗口,這裡是透過XML設定檔實現的,Spring在執行期間根據設定檔的設定,建立物件之間的依賴關係。

如下面的程式碼所示

<bean scopre="prototype" class="cn.notebook.action.NotebookListOtherAction" id="notebookListOtherAction">
  <property ref="userReplyService" name="userReplyService" />
  <property ref="userService" name="userService" />
  <property ref="permissionService" name="permissionService" />
  <property ref="friendService" name="friendService" />
</bean>

但是這樣的設定一樣存在問題,設定檔會變得越來越大,其間關係會越來越複雜。同樣逃脫不了隨著應用程式和業務的改變,不斷修改程式碼的惡魘(這裡認為設定檔是程式碼的一部分。並且在實際開發中,很少存在單純修改設定檔的情況。一般設定檔修改了,程式碼也會做相應的修改)

在PHP裡,也有類似模仿Spring的實現,也就是把依賴關係寫在了設定檔裡,透過設定檔來產生需要的物件。我覺得這樣的程式碼還是為了實現而實現。在Srping裡,設定檔裡配置的不僅是一個類別執行時期的依賴關係,還可以實現事務管理、AOP、延遲載入等。而PHP要實現上面的種種特性,其消耗是巨大的。從語言層面講,PHP這種動態腳本語言在實作一些多型特性上和編譯型的語言不同。其次PHP作為敏捷性的開發語言,更強調快速開發、邏輯清晰、程式碼更簡單易懂,如果再附加了各種設計模式的框架,從技術實作和運作效率來看,都是不可取的。依賴倒置的核心原則是解耦。如果脫離這個最原始的原則,那就是本末倒置。

事實上,很多的設計模式裡已經隱含了依賴倒置原則我們也在有意無意地做著一些依賴反轉的工作。只是作為PHP,目前還沒有一個比較完善的IOC容器,或許是PHP根本不需要。

如果滿足DIP:

1.每個較高層次類別都為它所需要的服務提出一個介面聲明,較低層次類別實作實作這個介面。

2.每個高層次類別都透過該抽象介面使用服務。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

Bootstrap PHP實作多圖上傳步驟詳解

CI框架實作購物車功能步驟詳解

以上是PHP依賴倒置案例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
超越炒作:評估當今PHP的角色超越炒作:評估當今PHP的角色Apr 12, 2025 am 12:17 AM

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

PHP中的弱參考是什麼?什麼時候有用?PHP中的弱參考是什麼?什麼時候有用?Apr 12, 2025 am 12:13 AM

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

解釋PHP中的__ Invoke Magic方法。解釋PHP中的__ Invoke Magic方法。Apr 12, 2025 am 12:07 AM

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。

解釋PHP 8.1中的纖維以進行並發。解釋PHP 8.1中的纖維以進行並發。Apr 12, 2025 am 12:05 AM

Fibers在PHP8.1中引入,提升了並發處理能力。 1)Fibers是一種輕量級的並發模型,類似於協程。 2)它們允許開發者手動控制任務的執行流,適合處理I/O密集型任務。 3)使用Fibers可以編寫更高效、響應性更強的代碼。

PHP社區:資源,支持和發展PHP社區:資源,支持和發展Apr 12, 2025 am 12:04 AM

PHP社區提供了豐富的資源和支持,幫助開發者成長。 1)資源包括官方文檔、教程、博客和開源項目如Laravel和Symfony。 2)支持可以通過StackOverflow、Reddit和Slack頻道獲得。 3)開發動態可以通過關注RFC了解。 4)融入社區可以通過積極參與、貢獻代碼和學習分享來實現。

PHP與Python:了解差異PHP與Python:了解差異Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

php:死亡還是簡單地適應?php:死亡還是簡單地適應?Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來:改編和創新PHP的未來:改編和創新Apr 11, 2025 am 12:01 AM

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器