0

私はPHPのOOPで動作するプロジェクトで働いています。

問題は、抽象クラスから2つのサブクラスをインスタンス化しようとすると、最初のインスタンスのみがインスタンス化され、両方はインスタンス化されないことです。

DataBase.php:

abstract class DataBase {

    private $_connection;

    private static $_singleton = false;

    /**
     * Fetch an instance of the class.
     */
    public final static function connect () {
        if ( self::$_singleton === false ) {
            self::$_singleton = new static();
        }

        return self::$_singleton;
    }
}

UserDataBaseManager.php:

require_once 'DataBase.php';

class UserDataBase extends DataBase { (...) }

ImageDataBaseManager.php:

require_once 'DataBase.php';

class UserDataBase extends DataBase { (...) }

したがって、ImageDataBaseとUserDataBaseをインスタンス化しようとしている場合:

$imageDB = ImageDataBaseManager::connect();
$userDB = UserDataBase::connect();
var_dump($userDB);

そしてこれは印刷します:

object(ImageDataBaseManager)#2 (1) { ["_connection":"DataBase":private]=> object(PDO)#3 (0) { } } 

したがって、ファーストクラスのインスタンスのみを取得していますが、両方が必要です。

どうすれば修正できますか?

4

2 に答える 2

1

新しい ImageDataBaseManager を開始すると、抽象クラスの $_singleton にオブジェクトが格納され、次に UserDataBase::connect が新しいインスタンスを要求すると、それが返されます (静的プロパティはインスタンスに依存しません)。そのため、シングルトン パターンをサブクラス化することはお勧めできません。ただし、これを機能させるには、インスタンスを親クラスではなくサブクラスに格納する必要があります。親クラスとその静的プロパティは両方に共通です (実行時)。このコードを参照してください。サブクラスには、インスタンスを格納するための独自の $_singleton があります。

abstract class DataBase {

    private $_connection;

    protected static $_singleton = false;

    /**
     * Fetch an instance of the class.
     */
    public final static function connect () {
        if ( static::$_singleton === false ) {
            static::$_singleton = new static();
        }

        return static::$_singleton;
    }
}

class UserDataBase extends DataBase { protected static $_singleton = false; }

class ImageDataBaseManager extends DataBase { protected static $_singleton = false; }

$imageDB = ImageDataBaseManager::connect();
$userDB = UserDataBase::connect();
var_dump($userDB);
于 2013-03-19T04:35:38.650 に答える
0

これを試して:

protected static $_singleton = false;

public final static function connect () {
    if ( static::$_singleton === false ) {
        static::$_singleton = new static();
    }
于 2013-03-19T03:21:01.200 に答える