php 我可以对非静态成员使用后期静态绑定吗?

vyswwuz2  于 2023-06-28  发布在  PHP
关注(0)|答案(1)|浏览(104)

文档中指出:
这个特性被命名为“后期静态绑定”,从内部Angular 考虑。“后期绑定”来自static::将不会使用定义方法的类来解析,而是使用运行时信息来计算。它也被称为“静态绑定”,因为它可以用于(但不限于)静态方法调用。
not limited to static methods only”是什么意思?
我只是试着去理解,我不想做具体的事情,举个例子就好了。

6ioyuze2

6ioyuze21#

我最常使用它的地方是当你想在继承类中重写一个常量,但它被用在一个方法中,而这个方法在继承类中没有被重写:

class A
{
    const FOO = 'A';
    public function foo()
    {
        printf("I am: %s\n", get_class($this));
        printf("self::FOO = %s\n", self::FOO);
        printf("static::FOO = %s\n", static::FOO);
        echo "\n";
    }
}

class B extends A
{
    const FOO = 'B';
}

在这里,如果我们运行使用self::的继承方法,我们将获得在父类中定义的值,而不是示例化的类。也就是说,在B类中,如果self::FOO被继承自A的方法引用,则self::FOO的值为A。所以self::将为我们提供定义方法的类,而static::将为我们提供运行时碰巧所在的类。

(new A())->foo();
(new B())->foo();

输出:

I am: A
self::FOO = A
static::FOO = A

I am: B
self::FOO = A
static::FOO = B

因此,这不是一个静态方法调用,但我们仍然使用static::关键字来确保获得覆盖值(如果有的话)。

相关问题