搜尋
首頁後端開發php教程怎麼能簡單易通的了解php中的反射和依賴注入這兩個概念

求大神指點,謝謝

回覆內容:

求大神指點,謝謝

沒必要了解,真的,不逗你。
除非你去開發類似ZendFramework, ThinkPHP, CakePHP之類的框架,幾乎沒有機會用到這個。
這是很底層的東西,尤其是依賴注入這種東西的應用場景就是輔助開發,選型的框架支援依賴注入就行了,沒必要自己實現。而反射這個東西也差不多,在業務邏輯上我從來沒遇到過必須靠反射解決的問題,同樣也是框架才用到。

哦,看錯了,你只要知道概念,通俗的說法就是
反射是通過對象實例反向分析,從而獲取其信息,例如基於反射自動根據對象實例生成其對應的類的PHPDocument文件
依賴注入是指自動分析建構物件、呼叫方法時所需的參數,並自動注入此參數。通常此類物件的實例需要透過特定方法取得,而很難透過簡單的new進行建構。

所謂反射是動態獲取類信息,還能做出修改。例如一些魔術方法 __FUNCTION__,__METHOD__。進階一點可以使用 reflectionClass,就是反射類別取得。
依賴注入,也叫控制反轉。有時間再上程式碼示範

說不清楚,主要是類別的一些魔法方法
你可以百度下 php序列化漏洞

1 先解釋下我熟悉的"依賴注入"吧,依賴注入是指將依賴的物件透過參數的形式一次傳入,而不是在使用時顯示new。舉個粟子:

<code>//这就是依赖注入。。。
class Bar
{
}

class Foo
{
    protected $bar;

    public function __construct(Bar $bar)
    {
        $this->bar = $bar;
    }

    public function getBar()
    {
        return $this->bar;
    }
}

$bar = new Bar();
$foo = new Foo($bar); //将类Bar的对象$bar通过参数的形式注入进去
</code>

2 擴充:
//依賴類Human
abstract class Human
{
}

//繼承依賴類別Human的Woman
class Woman extends Human
{
}

class Man extends Human
{

<code>protected $wife;

public function setWife(Human $human)
{
   $this->wife = $human;
}</code>

}

$man = new Man();
$man->setWife(new Woman());

總結:在依賴注入之前聲明的類別時,這個類別可以是繼承依賴類別的任何類別(介面同理)

反射就是反向映射,用於獲取類別(不僅僅只是類別)的訊息,例如你想知道一個類別包含哪些方法、這些方法需要傳入什麼參數,每個參數是什麼類型。

依賴注入就需要利用反射實現,例如:

<code>class A
{
    protected $b;

    public function __constrcut(B $b)
    {
        $this->b = $b;
    }
}

// 通过控制反转容器生成 A 的实例时,会通过反射发现 A 的构造函数需要一个 B 类的实例
// 于是自动向 A 类的构造函数注入 B 类的实例
$a = IoC::make(A::class);</code>

反射還有很多用處,例如單元測試中做出一系列的斷言,對於一些私有屬性的獲取判斷,還有 PHPDocument 文件生成(因為反射可以獲取方法和類別的註釋)

控制反轉和依賴注入很顯然必須要用到此功能。

關於依賴注入可以參考我的部落格這篇文章,雖然是針對 Laravel 框架寫的,但是也具有普遍性(Laravel 用的設計模式非常豐富而且都沒濫用,恰到好處,十分適合學習):

https://www.insp.top/article/learn-laravel-container

依賴注入就是動態載入類別物件並實例化。一般用於讀取設定檔按需載入。

反射除了能做到這個,還能做到動態存取物件的成員。 php這種腳本語言的反射更為強大,也能透過修改物件內部的關聯表來為物件新增新的成員。

ie8用e.cancelBubble=true
別的用e.stopPropagation()

依賴注入,我的理解是物件載入到類別的建構方法中,為了解耦,一般會選擇透過介面的方式,在設定好按需載入到主類別中進行拼裝,實作多種功能
反射就是取出類別中的屬性和方法

给你推荐个地址吧,http://www.digpage.com/di.html,内容将的是yii2的依赖注入,里面的例子你看一遍差不多能明白是怎么回事了。

https://3v4l.org/1OVmo

<code>class Request 
{
    public function hello()
    {
        return 'hello ';
    }
}

class App
{
    public function name()
    {
        return 'the app';
    }
    public function response(Request $req, App $app)
    {
        return $req->hello().$app->name();
    }
}


//依赖查找 or 自动依赖注入
$c['App']     = new App;
$c['Request'] = new Request;

$r      = new ReflectionMethod('App', 'response');
$params = $r->getParameters();
$params = array_map(function($p) use ($c) {
    $className = $p->getClass()->name;
    return $c[$className]??null;
}, $params);

$res = $r->invokeArgs($c['App'], $params);


//手动依赖注入
$app = new App;
$req = new Request;
$res = $app->response($req, $app);</code>

只是名字比较唬人,其实很简单
反射其实就是获取类的信息(把类也看成是对象,然后通过反射类获取这个对象的一些属性), 你比如说有个发送邮件的类。

<code><?php class MailerService
{
    public $mail;
    
    public function __construct(Mailer $mail)
    {
       $this->setHandle($mail);
    }
    
    public function setHandle(Mailer $mail)
    {
         $this->mail = $mail;
    }
}</code>

比如说:
我想知道这个类有哪些方法, 那我可以这样:

<code><?php $class = new ReflectionClass('MailerService');
$methods = $class->getMethods();</code>

我想知道这个类的构造函数要传什么参数

<code><?php $method = new ReflectionMethod('MailerService', '__construct');
$paramters = $method->getParameters();</code>

一言以蔽之, 反射就是获取类的信息的.

控制反转也很好理解,不过要先搞清楚, 控制反转和依赖注入不是一回事.
控制反转是一种目的,而实现方法之一就是依赖注入.
所谓的依赖注入就是不自己new class了, 而是由一个专门的类去做, 由这个类去解决类的依赖的问题,比如上面的MailerService类就依赖Mailer类, 这个专门的类会通过反射去获取MailerService类的构造函数需要什么参数,这个需要的参数也叫作依赖, 然后解决依赖. 这个就叫依赖注入. 一般通过依赖注入的方式来实现控制反转. 上述的那个专门的类一般也叫服务容器.

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何使PHP應用程序更快如何使PHP應用程序更快May 12, 2025 am 12:12 AM

tomakephpapplicationsfaster,關注台詞:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

PHP性能優化清單:立即提高速度PHP性能優化清單:立即提高速度May 12, 2025 am 12:07 AM

到ImprovephPapplicationspeed,關注台詞:1)啟用opcodeCachingwithapCutoredUcescriptexecutiontime.2)實現databasequerycachingingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandreduceconnection.4 limitesclection.4.4

PHP依賴注入:提高代碼可檢驗性PHP依賴注入:提高代碼可檢驗性May 12, 2025 am 12:03 AM

依赖注入(DI)通过显式传递依赖关系,显著提升了PHP代码的可测试性。1)DI解耦类与具体实现,使测试和维护更灵活。2)三种类型中,构造函数注入明确表达依赖,保持状态一致。3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

PHP性能優化:數據庫查詢優化PHP性能優化:數據庫查詢優化May 12, 2025 am 12:02 AM

DatabasequeryoptimizationinPHPinvolvesseveralstrategiestoenhanceperformance.1)Selectonlynecessarycolumnstoreducedatatransfer.2)Useindexingtospeedupdataretrieval.3)Implementquerycachingtostoreresultsoffrequentqueries.4)Utilizepreparedstatementsforeffi

簡單指南:帶有PHP腳本的電子郵件發送簡單指南:帶有PHP腳本的電子郵件發送May 12, 2025 am 12:02 AM

phpisusedforsenderemailsduetoitsbuilt-inmail()函數andsupportivelibrariesLikePhpMailerAndSwiftMailer.1)usethemail()functionForbasiceMails,butithasimails.2)butithasimail.2)

PHP性能:識別和修復瓶頸PHP性能:識別和修復瓶頸May 11, 2025 am 12:13 AM

PHP性能瓶颈可以通过以下步骤解决:1)使用Xdebug或Blackfire进行性能分析,找出问题所在;2)优化数据库查询并使用缓存,如APCu;3)使用array_filter等高效函数优化数组操作;4)配置OPcache进行字节码缓存;5)优化前端,如减少HTTP请求和优化图片;6)持续监控和优化性能。通过这些方法,可以显著提升PHP应用的性能。

PHP的依賴注入:快速摘要PHP的依賴注入:快速摘要May 11, 2025 am 12:09 AM

依賴性注射(DI)InphpisadesignPatternthatManages和ReducesClassDeptions,增強量強制性,可驗證性和MATIALWINABIOS.ItallowSpasspassingDepentenciesLikEdenciesLikedAbaseConnectionStoclasseconnectionStoclasseSasasasasareTers,interitationAseTestingEaseTestingEaseTestingEaseTestingEasingAndScalability。

提高PHP性能:緩存策略和技術提高PHP性能:緩存策略和技術May 11, 2025 am 12:08 AM

cachingimprovesphpermenceByStorcyResultSofComputationsorqucrouctationsorquctationsorquickretrieval,reducingServerLoadAndenHancingResponsetimes.feftectivestrategiesinclude:1)opcodecaching,whereStoresCompiledSinmememorytssinmemorytoskipcompliation; 2)datacaching datacachingsingMemccachingmcachingmcachings

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脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!