美文网首页
对于PHP 后期静态绑定的理解

对于PHP 后期静态绑定的理解

作者: Mr_dreamer | 来源:发表于2017-12-29 17:23 被阅读4次

在学静态方法调用的时候只学了 parent:: self:: 调用静态方法,昨天突然看到一个兄弟的代码,写了一个 static:: ,没见过啊~于是查了一下官方文档,发现了“后期静态绑定”这个功能,

下边这段
代码1:

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,估计有朋友跟我一样一开始也是不明所以。仔细研究了一下文档说的内容,结合自己的测试。基本上搞明白了这个功能的意思。

根据官方文档:

后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 ::运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static::以及forward_static_call()。可用get_called_class()函数来得到被调用的方法所在的类名,static::则指出了其范围。

这一段话的意思说白了就是:
类名::静态方法 这种方式是非转发调用 如: A::test()
self/parent/static :: 静态方法 这种方式就是 转发调用 如 static::test()

虽然 都是转发调用,其实只有static是后期静态绑定
代码2:

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

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

B::test();

结果为 AB
原因是当调用静态绑定的方法时,由于转发调用,static::who()绑定的是上一个“非转发调用”的类名,也就是B::test()中的B,此时有人就问了,那代码1中的为什么是ACC不是AAC呢,在这里我也困惑了一阵子,其实文档中说的 上一个非转发调用类名说的不是很清楚(对我们这种菜鸟来说)。代码1中C::test()调用到

A::foo();
parent::foo();
self::foo();

此时这三个方法都绑定到C类上了,而调用A::foo()的时候 又是一个非转发调用,此时绑定者变为A,而之后的parent::foo()``self::foo()是转发调用,仍然绑定在C上。

相关文章

  • 对于PHP 后期静态绑定的理解

    在学静态方法调用的时候只学了 parent:: self:: 调用静态方法,昨天突然看到一个兄弟的代码,写了一个...

  • php后期静态绑定

    在观看laravel源码的时候,突然看到了 虽然之前翻看手册的时候看到过,但很少使用,于是仔细看了一下,原来是后期...

  • php 后期静态绑定

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

  • PHP 后期静态绑定

    自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。 准确说,...

  • PHP静态延迟绑定

    1、什么是静态延时绑定 1)自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内...

  • static 关键字

    静态变量 最基本的知识 连续声明会报错 后期静态绑定 理解继承 复杂的例子 总结,无论在静态绑定前调用的是 sel...

  • PHP面向对象-后期静态绑定

    说明 准确说,后期静态绑定工作原理是存储了在==上一个==“==非转发调用==”(non-forwarding c...

  • 「php化整为零系列」六、后期静态绑定

    该系列我只写我的理解,非官方解释,如不够专业请见谅 后期静态绑定说白了就是对于静态方法,在继承过程中引入stati...

  • 后期静态绑定

    PHP 有后期静态绑定的功能,用于在继承范围内引用静态调用的类,即在类的继承过程中,使用的类不再是当前类,而是调用...

  • 程序语言基础知识

    把一个方法与其所在的类/对象关联起来叫做方法的绑定,绑定分为静态绑定(前期绑定)和动态绑定(后期绑定)。 静态绑定...

网友评论

      本文标题:对于PHP 后期静态绑定的理解

      本文链接:https://www.haomeiwen.com/subject/lbmvgxtx.html