On 8 March 2020 09:47:37 GMT+00:00, Marc <marc@mabe.berlin> wrote: >https://3v4l.org/NSdB8 > >class A { > static function call() { > self::method(); > > $self = self::class; > $self::method(); > } > static function method() { echo static::class; } >} > >class B extends A {} > >B::call(); // displays "BA" instead of "AA"
Someone else may be able to confirm if this is a bug or working as designed, but what seems to be happening is that the value of "static" is not reset when calling a method using self:: This doesn't just apply to getting the class name, but to actual static calls; for instance: # https://3v4l.org/p2g8E class A { static function call() { self::method1(); } static function method1() { static::method2(); } static function method2() { echo 'Base definition'; } } class B extends A { static function method2() { echo 'Override'; } } B::call(); If the call to self::method1() reset the called class, this would run A::method2() and echo 'Base definition'; instead, the called class is remembered, and it calls B::method2() and echoes 'Override'. If you explicitly call A::method1(), as you are effectively doing in your self::class example, the "called class" information is reset, and the call goes through to A::method2(). Regards, Hi Marc, -- Rowan Tommins [IMSoP] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php