Bug #77985 [Opn]: Wrong resolution of "Late Static Binding" after self::method()

From: Date: Tue, 07 May 2019 19:33:51 +0000
Subject: Bug #77985 [Opn]: Wrong resolution of "Late Static Binding" after self::method()
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-220755@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=77985&edit=1 ID: 77985 User updated by: dev at mabe dot berlin Reported by: dev at mabe dot berlin -Summary: Wrong resolution of "Late Static Binding" after static::method() +Summary: Wrong resolution of "Late Static Binding" after self::method() Status: Open Type: Bug Package: Class/Object related Operating System: Linux PHP Version: Irrelevant Block user comment: N Private report: N New Comment: Sorry in my first sentence I mean "if it got called using self::method()" Previous Comments: ------------------------------------------------------------------------ [2019-05-07 19:31:40] dev at mabe dot berlin Description: ------------ Wrong resolution of the referenced class that was initially called (Late Static Binding) if it gets called using static::method(). Both, static::class as well as get_called_class() result into the wrong class name. Simplified explanation from test script: 1. calling "B:call()" 2. -> calling "self::getStaticClass()" defined in "A::call" This should get resolved to "A::getStaticClass()" 3. -> returning "static::class" This should get resolved to "A:class" as it was called by "A::getStaticClass()" Test script: --------------- <?php class A { static function getStaticClass(){ return static::class; } static function getCalledClass() { return get_called_class(); } static function call(){ $self = self::class; echo $self; echo $self::getStaticClass(); echo $self::getCalledClass(); echo self::getStaticClass(); echo self::getCalledClass(); echo PHP_EOL; $static = static::class; echo $static; echo $static::getStaticClass(); echo $static::getCalledClass(); echo static::getStaticClass(); echo static::getCalledClass(); echo PHP_EOL; $calledClass = get_called_class(); echo $calledClass; echo $calledClass::getStaticClass(); echo $calledClass::getCalledClass(); echo PHP_EOL; } } class B extends A {} echo 'A:call()', PHP_EOL; A::call(); echo 'B:call()', PHP_EOL; B::call(); Expected result: ---------------- A:call() AAAAA AAAAA AAA B:call() AAAAA BBBBB BBB Actual result: -------------- A:call() AAAAA AAAAA AAA B:call() AAABB <- The last two cases should resolve to A instead of B BBBBB BBB ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=77985&edit=1

« previous php.bugs (#220755) next »