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

Reply via email to