Browse Source

Use error handler to supress `ReflectionType::__toString()` deprecation warnings on PHP 7.4 (#14355)

* Add error handler to supress `ReflectionType::__toString()` deprecation warning.
* Fix wrong backport.
Edgaras Janušauskas 6 years ago
parent
commit
a58a3089bb

+ 19 - 3
src/TestSuite/MockBuilder.php

@@ -30,12 +30,28 @@ class MockBuilder extends BaseMockBuilder
      */
     public function getMock()
     {
-        $errorLevel = error_reporting();
-        error_reporting(E_ALL ^ E_DEPRECATED);
+        static::setSupressedErrorHandler();
+
         try {
             return parent::getMock();
         } finally {
-            error_reporting($errorLevel);
+            restore_error_handler();
         }
     }
+
+    /**
+     * Set error handler to supress `ReflectionType::__toString()` deprecation warning
+     *
+     * @return void
+     */
+    public static function setSupressedErrorHandler()
+    {
+        $previousHandler = set_error_handler(function ($code, $description, $file = null, $line = null, $context = null) use (&$previousHandler) {
+            if (($code & E_DEPRECATED) && ($description === 'Function ReflectionType::__toString() is deprecated')) {
+                return true;
+            }
+
+            return $previousHandler($code, $description, $file, $line, $context);
+        });
+    }
 }

+ 6 - 6
src/TestSuite/TestCase.php

@@ -750,8 +750,8 @@ abstract class TestCase extends BaseTestCase
         $callAutoload = true,
         $cloneArguments = false
     ) {
-        $errorLevel = error_reporting();
-        error_reporting(E_ALL ^ E_DEPRECATED);
+        MockBuilder::setSupressedErrorHandler();
+
         try {
             return parent::getMockClass(
                 $originalClassName,
@@ -764,7 +764,7 @@ abstract class TestCase extends BaseTestCase
                 $cloneArguments
             );
         } finally {
-            error_reporting($errorLevel);
+            restore_error_handler();
         }
     }
 
@@ -781,8 +781,8 @@ abstract class TestCase extends BaseTestCase
         $mockedMethods = [],
         $cloneArguments = false
     ) {
-        $errorLevel = error_reporting();
-        error_reporting(E_ALL ^ E_DEPRECATED);
+        MockBuilder::setSupressedErrorHandler();
+
         try {
             return parent::getMockForAbstractClass(
                 $originalClassName,
@@ -795,7 +795,7 @@ abstract class TestCase extends BaseTestCase
                 $cloneArguments
             );
         } finally {
-            error_reporting($errorLevel);
+            restore_error_handler();
         }
     }
 

+ 0 - 2
tests/test_app/TestApp/Auth/CallCounterPasswordHasher.php

@@ -1,6 +1,4 @@
 <?php
-declare(strict_types=1);
-
 namespace TestApp\Auth;
 
 use Cake\Auth\AbstractPasswordHasher;