PHP の遅延静的バインディング

巴扎黑
リリース: 2016-11-11 13:13:50
オリジナル
886 人が閲覧しました

最近、あるプロジェクトでこのようなケースに遭遇しました。パフォーマンスを高めるには、すべての 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;  
    }  
}
ログイン後にコピー


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!