私は Web アプリ フレームワークで作業しており、その一部は多数のサービスで構成されており、すべてシングルトンとして実装されています。それらはすべて、シングルトンの動作が実装されている Service クラスを拡張し、次のようになります。
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;
}
}
さて、次のように実装された FileService というクラスがあるとします。
class FileService extends Service {
// Lots of neat stuff in here
}
... FileService::getInstance() を呼び出しても、必要なように FileService インスタンスは生成されませんが、Service インスタンスが生成されます。ここでの問題は、Service コンストラクターで使用される「self」キーワードにあると思います。
ここで私が望むものを達成する他の方法はありますか? シングルトン コードは数行しかありませんが、できる限りコードの冗長性を避けたいと考えています。