Trong PHP, một constructor không trả lại.
Vì vậy, phương thức get
trả về đối tượng one
, lần đầu tiên được gọi, sau đó là đối tượng mysqli
. Có lẽ không phải những gì bạn muốn.
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
}
Nếu bạn muốn trả lại đối tượng mysqli
, bạn không cần một singleton, như không có nhu cầu để tạo ra một thể hiện của một đối tượng mà chỉ đây để trở về một thể hiện của đối tượng khác.
Mẫu đăng ký sẽ tốt hơn trong trường hợp này.
Nếu bạn cần cung cấp các phương thức (trình bao bọc cho đối tượng DB của bạn), sau đó tạo một singleton thực.
EDIT
Tôi đã kiểm tra mã được cập nhật. Bây giờ bạn luôn quay trở lại phiên bản mysqli
. Nhưng bạn không cần phải khởi tạo đối tượng của riêng bạn. Điều đó hoàn toàn vô dụng ...
Nếu bạn thực sự muốn đi với loại hình của bạn, như vàng nói, trong trường hợp tĩnh của bạn, kiểm tra xem self::db
là NULL
. Nếu có, hãy tạo cá thể mysqli
và gán nó cho self::db
. Sau đó trả lại nó.
public static getDatabaseInstance()
{
if(self::$_db == NULL)
{
self::$_db = new mysqli(...);
}
return self::$_db;
}
Cũng đặt hàm tạo riêng tư, vì vậy người dùng sẽ không thể tạo các phiên bản vô dụng của lớp học của bạn. Hoặc tốt hơn làm cho nó công cộng và ném một ngoại lệ:
public function __construct()
{
throw new Exception('This class is not supposed to be instantiated');
}
+1 cho sự khéo léo! – Clive
Vẫn còn là singleton. Không có gì bất thường ở đó, tôi nói. – Smar
Errr ... Không ai thấy rằng phương thức get trả về một đối tượng khác? – Macmade