Heim > Artikel > Backend-Entwicklung > PHP verzögerte die statische Bindung
Ich bin kürzlich in einem Projekt auf einen solchen Fall gestoßen. Ich bin der Meinung, dass alle Modellklassen Singletons sein müssen, um eine höhere Leistung zu erzielen. Da alle Modelle die einheitliche übergeordnete Klasse BaseModel erben, fügen Sie den Code zur Steuerung des Singletons in BaseModel hinzu. Wie folgt:
Java-Code
/*基类*/ class BaseModel { private static $instance = null; public static function instance() { if (empty(self::$instance)) { self::$instance = new self(); } return self::$instance; } }
Dann jedes logische Unterklassenmodell
Java-Code
/*商品类*/ 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);
Diese Art von $gut ist
Java-Code
object(BaseModel)#1 (0) { }
Unnötiges GoodModel
Das ist die Notwendigkeit, sich selbst vorzustellen
self::Die aufgerufene Variable ist nur die der Klasse. Auch wenn die Klasse geerbt und die Variable überschrieben wird, gibt die Funktion self::called in der übergeordneten Klasse weiterhin den Variablenwert der übergeordneten Klasse aus Der Wert von
erfordert das Schlüsselwort static, um die statische Bindung zu verzögern.
Der Code lautet wie folgt:
Java-Code
/ *Basisklasse*/
class BaseModel { private static $instance = null; public static function instance() { if (empty(self::$instance)) { self::$instance = new static(); } return self::$instance; } }
Das $gute zu diesem Zeitpunkt ist
Java-Code
object(GoodModel)#1 (0) { }
Tatsächlich die get_claimed_class Die Funktion kann auch zur Lösung des oben genannten Problems verwendet werden. Der Code lautet wie folgt:
Java-Code
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; } }