diff --git a/src/Symfony/Component/Debug/ErrorHandler.php b/src/Symfony/Component/Debug/ErrorHandler.php index cc698ee533..3ec11276a9 100644 --- a/src/Symfony/Component/Debug/ErrorHandler.php +++ b/src/Symfony/Component/Debug/ErrorHandler.php @@ -95,6 +95,7 @@ class ErrorHandler private $loggedTraces = array(); private $isRecursive = 0; + private $isRoot = false; private $exceptionHandler; private static $reservedMemory; @@ -134,7 +135,12 @@ class ErrorHandler $handler = new static(); } - $prev = set_error_handler(array($handler, 'handleError'), $handler->thrownErrors | $handler->loggedErrors); + if (null === $prev = set_error_handler(array($handler, 'handleError'))) { + restore_error_handler(); + // Specifying the error types earlier would expose us to https://bugs.php.net/63206 + set_error_handler(array($handler, 'handleError'), $handler->thrownErrors | $handler->loggedErrors); + $handler->isRoot = true; + } if ($handlerIsNew && is_array($prev) && $prev[0] instanceof self) { $handler = $prev[0]; @@ -326,12 +332,16 @@ class ErrorHandler private function reRegister($prev) { if ($prev !== $this->thrownErrors | $this->loggedErrors) { - $handler = set_error_handler('var_dump', 0); + $handler = set_error_handler('var_dump'); $handler = is_array($handler) ? $handler[0] : null; restore_error_handler(); if ($handler === $this) { restore_error_handler(); - set_error_handler(array($this, 'handleError'), $this->thrownErrors | $this->loggedErrors); + if ($this->isRoot) { + set_error_handler(array($this, 'handleError'), $this->thrownErrors | $this->loggedErrors); + } else { + set_error_handler(array($this, 'handleError')); + } } } } @@ -527,7 +537,7 @@ class ErrorHandler self::$reservedMemory = null; - $handler = set_error_handler('var_dump', 0); + $handler = set_error_handler('var_dump'); $handler = is_array($handler) ? $handler[0] : null; restore_error_handler(); @@ -672,7 +682,7 @@ class ErrorHandler { @trigger_error('The '.__METHOD__.' static method is deprecated since version 2.6 and will be removed in 3.0. Use the setLoggers() or setDefaultLogger() methods instead.', E_USER_DEPRECATED); - $handler = set_error_handler('var_dump', 0); + $handler = set_error_handler('var_dump'); $handler = is_array($handler) ? $handler[0] : null; restore_error_handler(); if (!$handler instanceof self) { diff --git a/src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php b/src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php index 1516dbedf9..2f948d7572 100644 --- a/src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php +++ b/src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php @@ -175,7 +175,7 @@ class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase */ public function testDeprecatedSuper($class, $super, $type) { - set_error_handler('var_dump', 0); + set_error_handler(function() { return false; }); $e = error_reporting(0); trigger_error('', E_USER_DEPRECATED); @@ -205,7 +205,7 @@ class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase public function testDeprecatedSuperInSameNamespace() { - set_error_handler('var_dump', 0); + set_error_handler(function() { return false; }); $e = error_reporting(0); trigger_error('', E_USER_NOTICE); @@ -231,7 +231,7 @@ class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase $this->markTestSkipped('PHP7 already prevents using reserved names.'); } - set_error_handler('var_dump', 0); + set_error_handler(function() { return false; }); $e = error_reporting(0); trigger_error('', E_USER_NOTICE); diff --git a/src/Symfony/Component/Filesystem/LockHandler.php b/src/Symfony/Component/Filesystem/LockHandler.php index fa2575f911..b53d9f4d52 100644 --- a/src/Symfony/Component/Filesystem/LockHandler.php +++ b/src/Symfony/Component/Filesystem/LockHandler.php @@ -68,9 +68,8 @@ class LockHandler return true; } - // Silence both userland and native PHP error handlers - $errorLevel = error_reporting(0); - set_error_handler('var_dump', 0); + // Silence error reporting + set_error_handler(function() {}); if (!$this->handle = fopen($this->file, 'r')) { if ($this->handle = fopen($this->file, 'x')) { @@ -81,7 +80,6 @@ class LockHandler } } restore_error_handler(); - error_reporting($errorLevel); if (!$this->handle) { $error = error_get_last(); diff --git a/src/Symfony/Component/HttpKernel/EventListener/DebugHandlersListener.php b/src/Symfony/Component/HttpKernel/EventListener/DebugHandlersListener.php index f50e4d6c3b..19a4c6d945 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/DebugHandlersListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/DebugHandlersListener.php @@ -67,7 +67,7 @@ class DebugHandlersListener implements EventSubscriberInterface } $this->firstCall = false; if ($this->logger || null !== $this->throwAt) { - $handler = set_error_handler('var_dump', 0); + $handler = set_error_handler('var_dump'); $handler = is_array($handler) ? $handler[0] : null; restore_error_handler(); if ($handler instanceof ErrorHandler) {