经过简单的工厂模式来认识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
实例化一个调用本身的当前类的对象