ホームページ >バックエンド開発 >PHPチュートリアル >PHP の遅延静的バインディング
最近、あるプロジェクトでこのようなケースに遭遇しました。パフォーマンスを高めるには、すべての Model クラスがシングルトンである必要があると感じました。すべてのモデルが統合された親クラス BaseModel を継承するため、BaseModel にシングルトンを制御するコードを追加します。
Javaコード
/*基类*/ class BaseModel { private static $instance = null; public static function instance() { if (empty(self::$instance)) { self::$instance = new self(); } return self::$instance; } }
そして各論理サブクラスモデル
Javaコード
/*商品类*/ class GoodModel extends BaseModel{ public function getInfoById($goodId){ return array( 'id'=>$goodId, 'name'=>'小苹果', 'logo'=>'http://t3.qlogo.cn/mbloghead/65518bb9e5287fcd5864/180' ); } } ################################################################ $good = GoodModel::instance(); var_dump($good);
そのような$goodは
Javaコード
object(BaseModel)#1 (0) { }
不要なGoodModel
これは自己紹介が必要です
self::呼び出された変数はこのクラスのみであり、クラスが継承されて変数がオーバーライドされた場合でも、親クラスのself::呼び出された変数は親クラスの変数値を出力し、出力されません。上書きされた値
したがって、静的バインディングを遅らせるには static キーワードを使用する必要があります。 static はサブクラスを表します
コードは次のとおりです
Java コード
/*base class*/
class BaseModel { private static $instance = null; public static function instance() { if (empty(self::$instance)) { self::$instance = new static(); } return self::$instance; } }
今回は
Java コード
object(GoodModel)#1 (0) { }
実は、get_called_class 関数を使用して上記の問題を解決することもできます。 コードは次のとおりです
Java コード
class BaseModel { private static $instance = null; public static function instance() { if (empty(self::$instance)) { $className = get_called_class(); self::$instance = new $className(); } return self::$instance; } }