php中延迟绑定,理解 PHP 延迟静态绑定 (late static bindings)

简单理解PHP延迟静态绑定

static::中的static其实是运行时所在类的别名,并不是定义类时所在的那个类名。这个东西可以实现在父类中能够调用子类的方法和属性。

使用(static)关键字来表示这个别名,和静态方法,静态类没有半毛钱的关系,static::不仅支持静态类,还支持对象(动态类)。

预备概念

转发调用

所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。

非转发调用

那么非转发调用其实就是明确指定类名的静态调用(foo::bar())和非静态调用($foo->bar())

后期静态绑定原理

后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。

例子1,简单使用static::

class A {

public static function who() {

echo __CLASS__;

}

public static function test() {

static::who(); // 后期静态绑定从这里开始

}

}

class B extends A {

public static function who() {

echo __CLASS__;

}

}

B::test();

以上例程会输出:

B

例子2,区分转发调用和非转发调用

class A {

public static function foo() {

static::who();

}

public static function who() {

echo __CLASS__."\n";

}

}

class B extends A {

public static function test() {

A::foo();

parent::foo();

self::foo();

}

public static function who() {

echo __CLASS__."\n";

}

}

class C extends B {

public static function who() {

echo __CLASS__."\n";

}

}

C::test();

以上例程会输出:

A

C

C

例子3,使用场景举例

class Model

{

public static function find()

{

echo static::$name;

}

}

class Product extends Model

{

protected static $name = 'Product';

}

Product::find();

参考资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值