后期静态绑定
类中的静态成员是不需要对象而使用类名直接访问的
eg:类名::静态成员属性名,类名::静态成员方法名()
中类的成员方法中使用self::静态成员属性名/方法名()
attention: 在静态方法中只能访问静态成员,因为非静态的成员必须通过对象的引用才能访问$this。
在传统的继承关系中,$this可以动态地与当前调用对象进行绑定 ,但是中静态上下文中就是另外一回事类。
static:: 在处理静态方法时与 $this 是不同的。 $this-> 会遵循继承规则,但是 static:: 不会,它可以与静态成员的调用类进行绑定。
<?phpabstract class createInstance
{
}
class User extends createInstance
{
//创建当前类的实例
public static function create() :self
{
return new self();
}
}
class Product extends createInstance
{
//创建当前类的实例
public static function create()
{
return new self();
}
}
//生成User的实例,使用类名调用类中的静态成员方法
$user = User::create();
var_dump($user);//结果:object(User)#1 (0) { }
为了减少代码的冗余
<?phpabstract class createInstance
{
//创建当前类的实例
public static function create() :self
{
//self总是与当前定义该方法的类绑定,并不能和调用类绑定
//定义类:createInstance
//调用类:User Product
// return new self();
//解决方案:将类的调用与类的调用完全分离,使用static进行后期静态绑定, 可以与当前方法的调用类进行绑定
return new static();
}
}
class User extends createInstance
{
}
class Product extends createInstance
{
}
//生成User的实例,使用类名调用类中的静态成员方法
$user = User::create();
var_dump($user);//结果:object(User)#1 (0) { }
//生成Product的实例,使用类名调用类中的静态成员方法
$Product = Product::create();
var_dump($Product);//结果:object(Product)#1 (0) { }
以上是 后期静态绑定 的全部内容, 来源链接: utcz.com/z/518969.html