W PHP, konstruktor nie zwraca.
Tak więc twoja metoda get
zwraca obiekt one
, po raz pierwszy jest wywoływany, a następnie obiekt mysqli
. Prawdopodobnie nie tego chcesz.
if(self::$_db == NULL)
{
return new self(); // Here you return an object of class one
}
else
{
return self::$_db; // Here you return an object of type mysqli
}
Jeśli chcesz zwrócić przedmiot mysqli
, nie trzeba pojedyncza, gdyż nie ma potrzeby tworzenia instancji obiektu, który znajduje się tylko tutaj, aby powrócić wystąpienie innego obiektu.
Schemat rejestru byłby lepszy w takim przypadku.
Jeśli potrzebujesz metod (otoki dla twojego obiektu DB), stwórz prawdziwy singleton.
EDIT
Sprawdziłem zaktualizowaną kod. Teraz zwracasz zawsze instancję mysqli
. Ale nie musisz tworzyć własnego obiektu. To całkowicie bezużyteczne ...
Jeśli naprawdę chcesz przejść do swojego wzorca, jak powiedział złoty, w statycznej instancji, sprawdza, czy self::db
jest NULL
. Jeśli tak, tworzy instancję mysqli
i przypisuje ją do self::db
. Następnie zwraca go.
public static getDatabaseInstance()
{
if(self::$_db == NULL)
{
self::$_db = new mysqli(...);
}
return self::$_db;
}
Ustaw również konstruktor jako prywatny, aby użytkownicy nie mogli tworzyć niepotrzebnych wystąpień Twojej klasy. Albo lepiej ich upublicznienie i wyjątek:
public function __construct()
{
throw new Exception('This class is not supposed to be instantiated');
}
+1 za pomysłowość! – Clive
Jest nadal singleton. Nic nietypowego, powiedziałbym. – Smar
Errr ... Nikt nie widzi, że metoda get zwraca inny obiekt? – Macmade