我終於開始在PHP中探索特性。我認爲我會嘗試的第一個地方是將配置位注入類中。如果我使用DIC,我可能有這樣的代碼在需要配置對象的任何類:如何避免用於依賴注入的衝突PHP特性
protected function SetConfig($config) {
$this->config = $config;
}
protected $config;
這似乎是一個天然的適合特質,以避免所有的地方是樣板代碼,所以我可能會造成這樣的:
trait Config {
protected function SetConfig($config) {
$this->config = $config;
}
protected $config;
}
,然後用它像這樣:
class Foo {
use Config;
public function __construct() {
//can now use $this->config
}
}
這是偉大的。現在,讓我們說,我想創建第二個特點,比如說,對日誌記錄:
trait Logger {
protected function SetLogger($logger) {
$this->logger = $logger;
}
protected $logger;
}
,我可以使用這樣的:
class Foo {
use Logger;
public function __construct() {
//can now use $this->logger
}
}
也很大。現在,如果這兩個特徵想要互相使用,問題就來了。它似乎很合理的一個記錄器類需要有注入的配置對象,這意味着這樣做:
trait Logger {
use Config;
protected function SetLogger($logger) {
$this->logger = $logger;
}
protected $logger;
}
但接下來的事情會打破當其他類使用這兩種特質:
class Foo {
use Config, Logger;
public function __construct() {
//want to use $this->config and $this->logger
}
}
這當然不起作用,因爲配置位在Foo中被有效地複製。
我可以略去Logger trait中的use Config;
作品,知道它最終會在那裏。但是這對我來說很奇怪,因爲它會產生一種外部依賴性。如果我想將記錄器用於某個尚未具有配置特性的地方,該怎麼辦?這個解決方案也意味着我需要忍受我的IDE(PhpStorm 8)警告我關於未知方法,而不是提供自動完成。我意識到我可以通過使用@method反過來解決這些問題,但這只是把口紅放在豬身上,可以這麼說。
我也可以在記錄器中別名配置位,但這也有問題。
所有這一切都有點氣味給它的,但我還沒有想出這是否是因爲這對我來說是一個新的模式,或者如果它確實是一個臭模式。無論哪種方式,我都不確定實現這種方法的最佳方式是否可行。
上解決這一特質問題的最好方法有什麼建議?還是避免DIC捷徑的特點是更好的?
從未使用過'traits'爲DI自己,但一我可以提出的建議是,如果你有需要其他特性的特質,你可以將它們轉換成類來獲益。 – Crackertastic 2014-10-10 20:41:20
記錄器特徵可能需要配置才能知道要使用的日誌級別或寫入日誌文件的位置。但是,真的,問題不僅僅是這種情況 - 這只是一個例子。更廣泛地說,在覈心功能之間有依賴關係並不罕見。在每個班級中使用樣板代碼(屬性和設置器)時,這不是問題,但這是特性的問題。在這種情況下,將'使用配置'添加到記錄器將不起作用,因爲同時使用記錄器和配置(上面的,Foo)的類將生成致命錯誤,因爲來自配置的部分是重複的。 – 2014-10-10 21:18:30
這就是我問這個問題的原因。正如我所說,它有一種有趣的氣味,但同時,性狀似乎是解決DI中固有的樣板問題的一種很好的方法。那麼將兩者結合在一起的最佳方法是什麼? – 2014-10-10 21:46:18