典型地,具有裝飾圖案的工作時,我通常實例化的類直接,一個在另一個內:動態實例化使用裝飾圖案類在PHP
abstract class Handler
{
public function __construct(Handler $handler = null)
{
$this->handler = $handler;
}
abstract public function handle();
}
class FirstHandler extends Handler
{
public function handle()
{
// Just calls the next guy in the chain. Obviously, this isn't doing anything, it's just for example sake.
$this->handler->handle();
}
}
// ... and so on with the SecondHandler, ThirdHandler, FourthHandler
$chain = new FirstHandler(
new SecondHandler(
new ThirdHandler(
new FourthHandler()
)
)
);
$chain->handle();
然而,與鏈條的可能性越來越多的人說,可能有20個處理程序,你可以看到代碼開始縮進太多並且難以閱讀,特別是如果鏈中的不同處理程序的名稱不像「FirstHandler」,「SecondHandler 「,但總體而言,它看起來不太好。
我想知道如果有一種方法,以通過將它們放置在陣列中,並且迭代向下陣列並傳遞n + 1個元件陣列中的作爲構造參數傳遞給第n動態實例化的類數組中的元素。
我腦子裏想的東西有點像這樣:
$chain = null;
$links = [
FirstHandler::class,
SecondHandler::class,
ThirdHandler::class,
FourthHandler::class
];
foreach ($links as $index => $link) {
$chain = new $link(new $links[$index + 1]());
}
您也許能夠告訴大家,第一個問題是$chain
大幹快上的每個呼叫覆蓋。第二個問題是,即使在循環中,我仍然必須手動將每個處理程序傳遞到鏈中,而實際上所做的只是創建鏈四次,這實際上更糟糕。第三個問題是最終我會遇到一個越界異常。
有沒有一種方法來動態地實例化這個鏈(如我的意圖所示)(或許是一種遞歸調用)還是我註定要按照之前的方式做到這一點?
你要創造**依賴注入** –
哈哈。你能用一個例子來證明這一點嗎?我想了解我是如何做到的。 –
谷歌它。這包括準備使用像DI容器等組件。所有的例子都在 –