文档中指出:这个特性被命名为“后期静态绑定”,从内部Angular 考虑。“后期绑定”来自static::将不会使用定义方法的类来解析,而是使用运行时信息来计算。它也被称为“静态绑定”,因为它可以用于(但不限于)静态方法调用。“not limited to static methods only”是什么意思?我只是试着去理解,我不想做具体的事情,举个例子就好了。
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::将为我们提供运行时碰巧所在的类。
self::
B
self::FOO
A
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::关键字来确保获得覆盖值(如果有的话)。
1条答案
按热度按时间6ioyuze21#
我最常使用它的地方是当你想在继承类中重写一个常量,但它被用在一个方法中,而这个方法在继承类中没有被重写:
在这里,如果我们运行使用
self::
的继承方法,我们将获得在父类中定义的值,而不是示例化的类。也就是说,在B
类中,如果self::FOO
被继承自A
的方法引用,则self::FOO
的值为A
。所以self::
将为我们提供定义方法的类,而static::
将为我们提供运行时碰巧所在的类。输出:
因此,这不是一个静态方法调用,但我们仍然使用
static::
关键字来确保获得覆盖值(如果有的话)。