5.3 より前でも実装できますが、コードは次のように複雑になります。
クラス MOrder は SModel を拡張します{
protected static $handle; //単一ケースのハンドル
プライベート関数 __construct(){
//何か
}
/**
* このタイプのシングルトン、public のメソッドを取得します
*
* @return MOrder
*/
パブリック静的関数instance() {
if(self::$handle){
自分自身を返す::$ハンドル;
}
$class = __CLASS__;
self::$handle = 新しい $class();
自分自身を返す::$ハンドル;
}
//その他
}
5.3 遅延静的バインディングを追加する (この言葉は本当に厄介です)
コードは次のように実装されます
クラス SModel {
/**
* シングルトンハンドルを取得し、特定のモデルクラスのインスタンスオブジェクトを返します
*/
保護された静的関数instance() {
if(静的::$ハンドル){
静的::$ハンドルを返します;
}
$class = get_called_class();
static::$handle = 新しい $class();
静的::$ハンドルを返します;
}
//親クラスの何か
}
クラス MGoods は SModel を拡張します{
/**
* このタイプのシングルトン、public のメソッドを取得します
* @return MGoods
*/
パブリック静的関数instance(){
親を返す::インスタンス();
}
protected static $handle; //単一ケースのハンドル
保護された関数 __construct(){
//何か
}
//その他
}
修正により、サブクラスの実装コードの一部を削減し、親クラスで実装しました
正直、まだ非常に面倒です。PHP が単独でシングルトンを実装した方が良いでしょう。