[英]What's the most efficient way to interact with a Singleton?
為了我自己的利益,我已經在自己的小框架上工作了一段時間,在學習新知識的同時不斷地回顧代碼。 如您所料,我有一個Registry對象,幾乎所有其他對象都在使用該對象。
目前,最基本的對象(AFObject)設置如下
absract class AFObject {
var $_registry;
function __construct(){
$this->_registry = AFRegistry::getInstance();
}
}
因此,每個對象現在都將包含對注冊表的本地引用。 因此,如果我一次實例化了數百個對象,那么這就是對單例的數百個引用。 但是總是像這樣直接引用注冊表會或多或少有效...
class AFRouter extends AFObject {
function someMethod( $bar ){
AFRegistry::$foo = $bar;
}
}
我認為,“注冊”類型的類有點氣味 。
既然您提到您是為了學習和變得更好而這么做,那么您是否曾經考慮過徹底消除注冊表類並采取其他方法? 也許將所需的數據推送到類構造函數,而不是從類內部提取數據?
我將省略選項1(抽象基類),因為那樣您的所有類都將依賴於其他一些類...
如果您確實希望保留注冊表設置,那么在我看來,使用像Yngve Sneen這樣的靜態類將是最好的方法。
類似於:registry :: set('var1',$ var1); $ var1 =注冊表:: get('var1');
考慮一下:
class AFRouter extends AFObject {
function someMethod($bar) {
global $af_registry;
$af_registry->setFoo($bar);
}
}
甚至:
class AFRouter extends AFObject {
function someMethod($bar) {
af_registry_set('foo', $bar);
}
}
除去語法,此方法與當前解決方案之間基本上沒有區別。
是的,這意味着您的注冊表實質上是一個全局變量。 是的,全局變量存在問題。 更好的選擇是傳遞依賴項 。
在這種情況下,我認為您不應該考慮效率(因為100個引用確實不是問題,並且有點過早的優化)。 但是請考慮一下代碼中最優雅的內容。 另外,考慮是否需要單例(可以實現為靜態類嗎?)。 我可能會選擇使用第二種情況,因為這會使您的代碼更加明顯(至少我認為是這樣)。
在那種情況下
class AFRouter extends AFObject {
function someMethod( $bar ){
AFRegistry::getInstance()->$foo = $bar;
}
}
或者,如果您封裝了屬性:
class AFRouter extends AFObject {
function someMethod( $bar ){
AFRegistry::getInstance()->setFoo($bar);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.