php对象之静态绑定

在了解静态绑定时,我们需要提前了解两个概念:转发调用和非转发调用

转发调用

进行静态调用时,使用self::、parent::、static::、forward_static_call()进行调用

非转发调用

进行静态调用时使用类名::和非静态调用(例 $obj->test())方式调用

现在我们来看看官方文档所说的静态绑定的概念

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

借助例子分析,如下:

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

1、C::test() 使用的是 非转发调用,因为它属于类名::进行调用的,故根据官方概念,这时存储了 C 类名

2、然后执行到B类下的test()方法, 调用了A::foo() ,这又是属于非转发,所以这时存储了A类名
再执行到了A 类中的foo方法,使用了 static::who,这属于转发调用,所以这时存储的还是A类名,然后就输出了A

3、当第2步执行完了,开始执行parent::foo(),这属于转发调用,所以这时还是存储C类名,后面执行的也都是转发调用,所以最后输出了C

4、当第3不执行完了,开始执行self::foo(),这和第三步类似,结果也输出了 C

如下所示,输出了 A C C
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,063评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,134评论 18 399
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,298评论 0 62
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 2,158评论 0 9
  • 妹的,一到晚上满脑子就全是你了。五年恋爱,再怎么都分不开了。已经异地一年了,都特么坚持下来了,真是不容易,这一年也...
    小聪go阅读 143评论 0 1

友情链接更多精彩内容