通过简单的工厂模式来认识PHP的静态延迟绑定
<?phpabstract 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则是根据当前上下文是哪一类在调用自己而将自己指向此类
静态延迟绑定
new self();
实例化一个自己被定义的类的对象
new parent();
实例化一个自己的父类对象
new static();
实例化一个调用自己的当前类的对象