diff --git a/src/Symfony/Component/ErrorHandler/ErrorHandler.php b/src/Symfony/Component/ErrorHandler/ErrorHandler.php index 29f674443d20d..d357658ac1eb9 100644 --- a/src/Symfony/Component/ErrorHandler/ErrorHandler.php +++ b/src/Symfony/Component/ErrorHandler/ErrorHandler.php @@ -422,11 +422,7 @@ public function handleError(int $type, string $message, string $file, int $line) return false; } - if (false !== strpos($message, "@anonymous\0")) { - $logMessage = $this->parseAnonymousClass($message); - } else { - $logMessage = $this->levels[$type].': '.$message; - } + $logMessage = $this->levels[$type].': '.$message; if (null !== self::$toStringException) { $errorAsException = self::$toStringException; @@ -455,6 +451,23 @@ public function handleError(int $type, string $message, string $file, int $line) return true; } } else { + if (false !== strpos($message, '@anonymous')) { + $backtrace = debug_backtrace(false, 5); + + for ($i = 1; isset($backtrace[$i]); ++$i) { + if (isset($backtrace[$i]['function'], $backtrace[$i]['args'][0]) + && ('trigger_error' === $backtrace[$i]['function'] || 'user_error' === $backtrace[$i]['function']) + ) { + if ($backtrace[$i]['args'][0] !== $message) { + $message = $this->parseAnonymousClass($backtrace[$i]['args'][0]); + $logMessage = $this->levels[$type].': '.$message; + } + + break; + } + } + } + $errorAsException = new \ErrorException($logMessage, 0, $type, $file, $line); if ($throw || $this->tracedErrors & $type) { diff --git a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php index 8603bf825dec0..e921ea198e26b 100644 --- a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php +++ b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php @@ -368,11 +368,12 @@ public function testHandleUserError() public function testHandleErrorWithAnonymousClass() { + $anonymousObject = new class() extends \stdClass { + }; + $handler = ErrorHandler::register(); - $handler->throwAt(3, true); try { - $handler->handleError(3, 'foo '.\get_class(new class() extends \stdClass { - }).' bar', 'foo.php', 12); + trigger_error('foo '.\get_class($anonymousObject).' bar', \E_USER_WARNING); $this->fail('Exception expected.'); } catch (\ErrorException $e) { } finally { @@ -380,10 +381,7 @@ public function testHandleErrorWithAnonymousClass() restore_exception_handler(); } - $this->assertSame('foo stdClass@anonymous bar', $e->getMessage()); - $this->assertSame(3, $e->getSeverity()); - $this->assertSame('foo.php', $e->getFile()); - $this->assertSame(12, $e->getLine()); + $this->assertSame('User Warning: foo stdClass@anonymous bar', $e->getMessage()); } public function testHandleDeprecation()
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: