php 后期静态绑定

php手册上关于后期静态绑定如下解释:
后期静态绑定工作原理是存储了在上一个"非转发调用"的类名。

这里我们先明确什么是"转发调用":
"转发调用"指的是通过以下几种方式进行的静态调用:self::, parent::, static::以及forward_static_call()。可以理解为没有指定类名的静态调用就是"转发调用"。
那么"非转发调用"就是指明确指定类名的静态调用和非静态调用。

该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。

下面我们看看官网给的例子讲解:

  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();

分析这段代码:
C::test(),进入类B调用了A::foo(), parent::foo(), self::foo()
根据概念C::test()就是"非转发调用",类名C
通过A::foo()进入类A的foo方法,即'上一次非转发调用'的类变成A了,所以static::代表类A,A来调用who
parent::foo()进入类A的foo方法,但"上一次非转发调用"的类仍然为C,所以static::代表C,C来调用who
self::foo()进入类B的foo方法,"上一次非转发调用"的类还是C,所以static::代表C,C来调用who
所以得出:
A C C

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 在观看laravel源码的时候,突然看到了 虽然之前翻看手册的时候看到过,但很少使用,于是仔细看了一下,原来是后期...
    winlans阅读 355评论 0 0
  • 一个需求 做的某项目有一个“转账”的功能,但是转账的类型有很多种,对应每种转账需要的参数也不同,举个例子一种转账是...
    兮嘉阅读 2,375评论 6 6
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 我爱跑步,它和有挑战的工作一样快乐而刺激。山很高,人很渺小,若是坚持,高山便在你脚下;事很多有时人还很麻烦,只要勇...
    周筠桐阅读 373评论 4 4