Tôi đang làm việc trong một khung ứng dụng web và một phần của nó bao gồm một số dịch vụ, tất cả được triển khai dưới dạng đơn. Tất cả họ đều thừa kế một lớp dịch vụ, nơi mà các hành vi singleton được thực hiện, tìm kiếm một cái gì đó như thế này:Mở rộng các tệp đơn trong PHP
class Service {
protected static $instance;
public function Service() {
if (isset(self::$instance)) {
throw new Exception('Please use Service::getInstance.');
}
}
public static function &getInstance() {
if (empty(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
Bây giờ, nếu tôi có một lớp được gọi là FileService thực hiện như thế này:
class FileService extends Service {
// Lots of neat stuff in here
}
... gọi FileService :: getInstance() sẽ không mang lại một cá thể FileService, như tôi muốn nó, nhưng một cá thể Service. Tôi cho rằng vấn đề ở đây là từ khóa "tự" được sử dụng trong constructor dịch vụ.
Có cách nào khác để đạt được những gì tôi muốn ở đây không? Mã singleton chỉ là một vài dòng, nhưng tôi vẫn muốn tránh bất kỳ sự thừa mã nào bất cứ khi nào tôi có thể.
FYI: Mã này sử dụng ['get_called_class'] (http://us2.php.net/manual/en/function.get-called-class.php), được thêm vào trong PHP 5.3. Làm điều này trong các phiên bản trước đó là một chút khó khăn hơn. – Charles
Cảm ơn Charles, đã cập nhật câu trả lời để khắc phục điều đó. –
Holy yikes, thật đáng sợ. Hãy tưởng tượng gọi 'getInstance' một chục lần, đó là một tá mở và một chục lần đọc của tập tin lớp. – Charles