2010-11-27 15 views
1

奇妙なトラブル。私はシングルトンを複数回使用しましたが、この特定のケースは機能したくありません。 Dumpはインスタンスがnullであることを示します。PHP OOPシングルトンはオブジェクトを返さない

define('ROOT', "/"); 
define('INC', 'includes/'); 
define('CLS', 'classes/'); 

require_once(CLS.'Core/Core.class.php'); 

$core = Core::getInstance(); 

var_dump($core->instance); 

$core->settings(INC.'config.php'); 
$core->go(); 

コアクラス

class Core 
{ 
    static $instance; 

    public $db; 
    public $created = false; 

    private function __construct() 
    { 
     $this->created = true; 
    } 

    static function getInstance() 
    {  
     if(!self::$instance) { 
      self::$instance = new Core(); 
     } else { 
      return self::$instance; 
     } 
    } 

    public function settings($path = null) 
    { 
     ... 
    } 
    public function go() 
    { 
     ... 
    } 

} 

エラーコード

Fatal error: Call to a member function settings() on a non-object in path 

それはおそらくいくつかの愚かなタイプミスだが、私は私のエディタですべてのエラーを持っていません。いつものように速い応答に感謝します。

答えて

9

あなたはelse文を持っているので、getInstanceの最初の呼び出しが何も返さないように、ここにあなたが、ではない、常にシングルトンメソッドからシングルトンオブジェクトを返す必要があります。

static function getInstance() 
{  
    if(!self::$instance) { 
     self::$instance = new Core(); 
    } else { 
     return self::$instance; 
    } 
} 

あなたのシングルトンメソッド必要があります次のようになります。

static function getInstance() 
{  
    if(!self::$instance) { 
     self::$instance = new Core(); 
    } 
    return self::$instance; 
} 

また、オブジェクトが作成されたかどうかを示すインスタンス変数を持つことがほとんど役に立たない、あなただけのif(self::$instance !== NULL)を比較することができ、あなたが行ってもいいですので。

+1

+1また、技術的に '(self :: $ instance!== null)'と '' $ this->」という部分がありますので、OPの '$ this-> created'ビットは役に立たないと思います。 created == true'は同等です。 – netcoder

+0

@netcoderありがとうございました。 –

+0

私は今知っている - しかし、私はこのエラーがあったことを認識していない。ありがとう – Misiur

2

のgetInstanceは常に値を返す必要があります - このように変更する必要があります:あなたにのgetInstance()メソッドを変更する必要に加えて

static function getInstance() 
{  
    if(!self::$instance) { 
     self::$instance = new Core(); 
    } 
    return self::$instance; 
} 
0

static function getInstance() {  
    if(!self::$instance) { 
     self::$instance = new Core(); 
    } 
    return self::$instance; 
} 

...次の呼び出しで、インスタンス自体から$ instanceを参照解除しようとしています。

var_dump($core->instance); 

あなたはチェックする必要があり、次のいずれかの$中核=コア::のgetInstance()呼び出しの後に、同じオブジェクトである必要があり、

var_dump($core); 

または

var_dump(Core::$instance); 

を...。

関連する問題