Skip to main content

后期静态绑定延迟

一、啥是后期静态绑定延迟

自 PHP 5.3.0 起,PHP 增加了一个叫做静态延迟绑定的功能,用于在继承范围内引用静态调用的类。

其实本质就是子类在继承父类的时候,使用父类的方法做转发,转发应用子类的功能。

二、关键字

self: 用于访问本类成员方法,静态成员以及类常量。

parent: 用于调用父类被子类重写的方法

static:用于访问本类定义的静态成员

三、代码实践

无静态延迟实践:

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();
?>

此时会输出A,因为使用的是Self关键字,没有做到转发

静态延迟绑定实现:

<?php
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,因为使用static关键字,转发成功。

转发和非转发实现:

<?php
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,为啥那?

原因有二:

  1. 例子中的self和parent可以转发类请求,因为定位到的Foo方法使用static关键字
  2. 后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止

四、总结

现在知道为啥叫后期静态绑定延迟了吧。

“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的,也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用,这句话源于文档,不过很形象的描绘出了这个功能。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 2 = 1