2010-08-19 55 views
4

我想定義一個Singleton基本類型可供用戶會從中得到他的課,所以這是我的想法:是否可以在PHP中定義一個接口Singleton?


interface SingletonInterface { 
    public static function getInstance(); 
} 

abstract class SingletonAbstract implements SingletonInterface { 
    abstract protected function __construct(); 
    final private function __clone() {} 
} 

但是,使用這種形式給出,用戶可以實現這個單...


class BadImpl implements SingletonInterface { 
    public static function getInstance() { 
     return new self; 
    } 
} 

你會怎麼做?

+0

*(相關)* [單身人士有什麼好壞](http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons) – Gordon 2010-08-19 06:51:23

回答

2

我使用此代碼創建一個Singleton:

abstract class Singleton { 

    private static $_aInstance = array(); 


    private function __construct() {} 

    public static function getInstance() { 

     $sClassName = get_called_class(); 

     if(!isset(self::$_aInstance[ $sClassName ])) { 

      self::$_aInstance[ $sClassName ] = new $sClassName(); 
     } 
     $oInstance = self::$_aInstance[ $sClassName ]; 

     return $oInstance; 
    } 

    final private function __clone() {} 
} 

這是使用這種模式的:

class Example extends Singleton { 
    ... 
} 

$oExample1 = Example::getInstance(); 
$oExample2 = Example::getInstance(); 

if(is_a($oExample1, 'Example') && $oExample1 === $oExample2){ 

    echo 'Same'; 

} else { 

    echo 'Different'; 
} 
+0

我認爲這種方法,但它有一些缺點.. 1 PHP 5.3需要 2.您類作爲一個SingletonContainer 3.派生類被認爲是不同 4.要調用構造函數 但它的優點是,你只需要擴展該類以擁有一個Singleton – eridal 2010-08-19 13:59:11

3

記住PHP不允許多重繼承,所以你必須仔細選擇你建立你的課程。 Singleton很容易實現,所以讓每個類定義它可能會更好。 還要小心,私人領域沒有移植到後代類,因此你可以有兩個不同的字段具有相同的名稱。

0

首先:如果你有這麼多單身以上的項目,那麼你可能弄亂的東西上投射水平

所有第二:辛格爾頓應該有使用,只有在那裏,更多的是一個實例一類可以完全沒有任何意義或者可能導致一些錯誤

最後:繼承的目的不是要減少代碼

0

現在,您可以使用特徵量,但你需要這麼多的單身?

相關問題