先看一個範例:
<?php class A { public $b; public $c; public function A() { //TODO } public function Method() { $this->b=new B(); $this->c=new C(); $this->b->Method(); $this->c->Method(); //TODO } } class B { public function B() { //TODO } public function Method() { //TODO echo 'b'; } } class C { public function C() { //TODO } public function Method() { //TODO echo 'c'; } } $a=new A(); $a->Method(); ?>
上面程式碼,我們很容易理解一句話:
##A類別依賴B類別與C類別
也就是說,如果今後開發過程中,要對B類別或C類別修改,一旦涉及函數改名,函數參數數量變動,甚至整個類別結構的調整,我們也要對A類做出相對應的調整,A類的獨立性喪失了,這在開發過程中是很不方便的,也就是我們說的“牽一發動全身”,如果兩個類是兩個人分別寫的,矛盾往往就在這個時候產生了。 。 。
萬一真的要改動B類和C類,有沒有辦法,可以不去改動或盡量少改動A類的程式碼呢?這裡要用到控制反轉。高層模組不應該依賴底層模組,兩個都應該依賴抽象。控制反轉(IOC)是一種思想,
依賴注入(DI)是實施這種思想的方法。
第一種方法叫做:建構器注入(這種方法也不建議用,但比不用好)class A { public $b; public $c; public function A($b,$c) { $this->b=$b; $this->c=$c; } public function Method() { $this->b->Method(); $this->c->Method(); } }客戶端類別這樣寫:
$a=new A(new B(),new C()); $a->Method();A類別的建構器依賴B類和C類,透過建構器的參數傳入,至少實現了一點,就是B類
物件b和C類別物件c的建立都移至了A類別外,所以一旦B類別和C類別發生改動,A類別無需做修改,只要在client類別裡改就可以了
假如有一天,我們需要擴充B類,做兩個B類的子類class B { public function B() { //TODO } public function Method() { //TODO echo 'b'; } } class B1 extends B { public function B1() { //TODO } public function Method() { echo 'b1'; } } class B2 extends B { public function B2() { //TODO } public function Method() { echo 'b2'; } }也很簡單,客戶端類別這麼寫:
$a=new A(new B2(),new C()); $a->Method();所以A類別是不用關心B類別到底有哪些個子類別的,只要在客戶端類別關心就好了。 第二種方法叫做:
工廠模式注入(建議使用)
#
class Factory { public function Factory() { //TODO } public function create($s) { switch($s) { case 'B': { return new B(); break; } case 'C': { return new C(); break; } default: { return null; break; } } } }我們A類別程式碼改為:
class A { public $b; public $c; public function A() { //TODO } public function Method() { $f=new Factory(); $this->b=$f->create('B'); $this->c=$f->create('C'); $this->b->Method(); $this->c->Method(); //TODO } }其實已經解耦了一小部分,至少如果B類和C類的
建構子要是變化,例如修改函數參數等,我們只需要改Factory類別就可以了。
抽像不應該依賴細節,細節應該依賴抽象。把B類別和C類別中的方法再抽像出來,做一個
#
interface IMethod { public function Method(); }這樣,A類別中的$b
變數和$c變數就不再是一個具體的變數了,而是一個抽象類別型的變量,不到執行那一刻,不知道他們的Method方式是怎麼實現的。
class B implements IMethod { public function B() { //TODO } public function Method() { //TODO echo 'b'; } } class C implements IMethod { public function C() { //TODO } public function Method() { //TODO echo 'c'; } }總結幾點:1.我們把A類別中的B類別物件和C類別物件的建立移至A類別外2.原本A類依賴B類和C類,現在變成了A依賴Factory,Factory依賴B和C。
以上是PHP控制反轉(IOC)和依賴注入(DI)的實例程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

負載均衡會影響會話管理,但可以通過會話複製、會話粘性和集中式會話存儲解決。 1.會話複製在服務器間複製會話數據。 2.會話粘性將用戶請求定向到同一服務器。 3.集中式會話存儲使用獨立服務器如Redis存儲會話數據,確保數據共享。

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

PHP會話的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。 1.Cookies通過在客戶端存儲數據來管理會話,簡單但安全性低。 2.Token-basedAuthentication使用令牌驗證用戶,安全性高但需額外邏輯。 3.Database-basedSessions將數據存儲在數據庫中,擴展性好但可能影響性能。 4.Redis/Memcached使用分佈式緩存提高性能和擴展性,但需額外配

Sessionhijacking是指攻擊者通過獲取用戶的sessionID來冒充用戶。防範方法包括:1)使用HTTPS加密通信;2)驗證sessionID的來源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

本文比較了PHP和ASP.NET,重點是它們對大規模Web應用程序,性能差異和安全功能的適用性。兩者對於大型項目都是可行的,但是PHP是開源和無關的,而ASP.NET,


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版
中文版,非常好用

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

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具