1: | <?php |
2: | |
3: | declare(strict_types=1); |
4: | |
5: | /** |
6: | * This file is part of the Nexus framework. |
7: | * |
8: | * (c) John Paul E. Balandan, CPA <paulbalandan@gmail.com> |
9: | * |
10: | * For the full copyright and license information, please view |
11: | * the LICENSE file that was distributed with this source code. |
12: | */ |
13: | |
14: | namespace Nexus\Suppression; |
15: | |
16: | final class Silencer |
17: | { |
18: | /** |
19: | * @template T |
20: | * |
21: | * @param (\Closure(): T) $func |
22: | * |
23: | * @return array{T, null|string} |
24: | */ |
25: | public static function box(\Closure $func): array |
26: | { |
27: | $message = null; |
28: | |
29: | set_error_handler(static function (int $errno, string $errstr) use (&$message): bool { |
30: | $message = $errstr; |
31: | |
32: | if (str_contains($message, '): ')) { |
33: | $message = substr($message, (int) strpos($message, '): ') + 3); |
34: | } |
35: | |
36: | return true; |
37: | }); |
38: | |
39: | try { |
40: | return [$func(), $message]; |
41: | } finally { |
42: | restore_error_handler(); |
43: | } |
44: | } |
45: | |
46: | /** |
47: | * @template T |
48: | * |
49: | * @param (\Closure(): T) $func |
50: | * |
51: | * @return T |
52: | */ |
53: | public static function suppress(\Closure $func): mixed |
54: | { |
55: | $prevErrorLevel = error_reporting(0); |
56: | |
57: | try { |
58: | return $func(); |
59: | } finally { |
60: | error_reporting($prevErrorLevel); |
61: | } |
62: | } |
63: | } |
64: |