2011-01-18 11 views
1

私は、次のコードを持っている:PHPシングルトン演技おかしい

$e1 = call_user_func(array("MySQL_Extension", "getInstance")); 
$e2 = call_user_func(array("Error_Extension", "getInstance")); 
self::$extensions->MySQL = $e1; 
self::$extensions->Error = $e2; 

// Debug 
echo "<pre>"; 
print_r(self::$extensions); 

それぞれのgetInstance()メソッドは次のようになります。

public static function getInstance() 
{ 
    if (self::$_instance == null) 
    { 
     self::$_instance = new self; 
    } 

    return self::$_instance; 
} 

両方のクラスが同じ "Extension_Abstract" クラスを拡張しますが、何らかの理由「print_r」デバッグ・ステートメントは次のように出力されます。

stdClass Object (
    [MySQL] => MySQL_Extension Object 
    [Error] => MySQL_Extension Object 
) 

すべてのアイデアはありますか? 2つの "MySQL_Extension"オブジェクトを返し、Error_Extensionクラスを完全に無視するでしょうか?私は困惑している!

+0

'getInstance'メソッドは、' MySQL_Extension'クラスまたはその両方にありますか? – lonesomeday

答えて

1

MySQL_Extensionに解決されselfので、私は各クラスではなくExtension_Abstractで定義されているよりも、この方法を(持っていると仮定しています。しかし、どこself::$_instanceで定義された?私の本能は、それがExtension_Abstractに定義されているということです。単にそれを再定義しますあなたが使用している場合、それはあなたが継承したクラスを決定するために、後期静的バインディングを使用することができますので、各クラス(protected static $_instance = null;)で。

また

、代わりのself、5.3+あなたはstaticを使用する必要があります。

をそれが助けにならない場合は、コードを投稿してください(クラス定義が助けになります)...

0

$_instanceはベースクラスですか?

もしそうなら、それぞれの特定のサブクラスではなく、階層全体のシングルトンが得られます。

0

self::ではなく、MySQL_Extension::Error_Extension::を明示的に使用しないでください。

また、抽象親クラスExtension_Abstractには、getInstanceメソッドの実装が含まれていてはなりません。

2

http://socket7.net/article/php-5-static-and-inheritanceを参照してください。

問題は、親クラスのスコープ内で定義された静的変数が1つだけあることです。 2つの静的変数を作成する最も簡単な方法は、両方のサブクラスで$ _instance variableおよびget_instanceメソッドを定義することです。

別の可能な回避策は、上記の記事のコメントに記載されてい

:「どのクラスそれが必要メソッド言って呼び出し、静的メソッドに余分なクラス名パラメータを渡す 『行為としての。』」

+0

うわー!私がそれを投稿するとすぐにこれを見つけました:P助けてくれてありがとう。私はこれを5.2.xのフレンドリーなものにするようにしています。そのため、よりレイアウトされたシングルトンパターンの多くが無駄になります。 – Andrew

0

遅延バインディング問題。

public static function getInstance() 
{ 
    if (static::$_instance == null) 
    { 
     static::$_instance = new static(); 
    } 

    return static::$_instance; 
} 
関連する問題