經過簡單的工廠模式來認識PHP的靜態延遲綁定php
當咱們須要爲不少類添加實例化本身的成員函數時,能夠用工廠設計模式 + 靜態延遲綁定的特性,在定級類中建立實例化上下文類的方法,繼而讓子類能夠直接調用此方法實例化本身,self()實例化的爲定義本身的類,不會根據上下文去切換,而static()會根據上下文去解析,指向當前調用本身的類。設計模式
<?php abstract class Demo { public static $name = 'sallency'; //error public static function selfInstance() { //self是用來解析上下文 //此處的語境爲調用定義它的類 //抽象類不可實例化因此會報錯 return new self(); } public static function staticInstance() { //static是用來調用上下文 //此處的語境爲解析調用它的上下文(某個類) //如果非抽象類調用的話天然能夠實例化 return new static (); } } class StaticDemo extends Demo { public function __construct() { echo "i am construct of " . __CLASS__ . '<br/>'; echo self::$name; } } var_dump(StaticDemo::staticInstance()); var_dump(Demo::$name);//抽象類只是不能實例化對象 ?>
注意抽象類裏的selfInstance方法是錯誤的,內部使用的return new self()是解析上下文,即調用此方法最初定義的地方,最初是在抽象類中,天然實例化報錯函數
在類中 new self() new static()均可以實例化類對象,但self是解析上下文,即實例化定義本身的類,static則是根據當前上下文是哪一類在調用本身而將本身指向此類spa
靜態延遲綁定設計
new self();code
實例化一個本身被定義的類的對象對象
new parent();io
實例化一個本身的父類對象function
new static();class
實例化一個調用本身的當前類的對象