可以通過一下地址學(xué)習(xí)composer:學(xué)習(xí)地址
在開發(fā)過程中,依賴注入(dependency injection, di)是非常常見的一種設(shè)計模式。它可以幫助我們管理對象之間的依賴關(guān)系,提高代碼的可維護性和可測試性。然而,在使用傳統(tǒng)的di容器時,我常常遇到一個問題:ide無法識別從容器中獲取的對象類型,這導(dǎo)致無法提供智能提示和靜態(tài)分析,嚴重影響了我的開發(fā)效率。
為了解決這個問題,我嘗試了mrclay/props-dic這個庫。mrclay/props-dic提供了一種全新的方式來訪問容器中的值:通過自定義的屬性和方法名。這不僅讓IDE能夠識別返回值的類型,還能提供更好的智能提示和靜態(tài)分析功能。
使用composer安裝mrclay/props-dic非常簡單,只需運行以下命令:
composer require mrclay/props-dic
讓我們來看一個簡單的例子,展示如何使用mrclay/props-dic:
/** * @property-read Foo $foo * @method Foo new_foo() */ class MyContainer extends PropsContainer { public function __construct() { $this->foo = function (MyContainer $c) { return new Foo(); }; } } $c = new MyContainer(); $foo1 = $c->foo; // 你的IDE會知道這是一個Foo實例 $foo2 = $c->new_foo(); // 一個新的Foo實例 $foo3 = $c->foo; // 與$foo1相同
在這個例子中,我們通過自定義的屬性$foo和方法new_foo()來訪問容器中的值。IDE能夠識別這些屬性和方法的類型,并提供相應(yīng)的智能提示和靜態(tài)分析。
另一個更復(fù)雜的例子展示了如何管理多個依賴:
/** * @property-read string $style * @property-read Dough $dough * @property-read Cheese $cheese * @property-read Pizza $pizza * @method Slice new_slice() */ class PizzaServices extends PropsContainer { public function __construct() { $this->style = 'deluxe'; $this->dough = function (PizzaServices $c) { return new Dough(); }; $this->setFactory('cheese', 'CheeseFactory::getCheese'); $this->pizza = function (PizzaServices $c) { $pizza = new Pizza($c->style, $c->cheese); $pizza->setDough($c->dough); return $pizza; }; $this->slice = function (PizzaServices $c) { return $c->pizza->getSlice(); }; } } $c = new PizzaServices; $c->pizza; // 第一次解析并緩存cheese和dough。 $c->pizza; // 與上面的pizza實例相同(沒有調(diào)用工廠)。 $c->new_slice(); // 一個新的Slice實例 $c->new_slice(); // 另一個新的Slice實例
在這個例子中,我們通過自定義的屬性和方法來管理多個依賴關(guān)系,IDE能夠提供更好的類型提示和靜態(tài)分析功能。
使用mrclay/props-dic庫,我不僅解決了IDE無法識別返回值類型的問題,還提升了開發(fā)效率和代碼質(zhì)量。它通過自定義屬性和方法名訪問值的方式,使得依賴注入變得更加直觀和易于管理。如果你在使用依賴注入時也遇到類似的問題,不妨嘗試一下mrclay/props-dic。