3v4l.org

run code in 500+ PHP versions simultaneously
<?php function accept_callable(callable $arg) {} class Foo { public function __construct() { set_error_handler([__CLASS__, 'log_error']); set_exception_handler([$this, 'log_exception']); } public function log_error( $type, $message, $file, $line ) { echo "log error" . PHP_EOL; return true; } public function log_exception( $e ) { echo "log exception" . PHP_EOL; var_dump($e); } } $foo = new Foo(); $previousHandler = set_error_handler(static fn () => false); restore_error_handler(); accept_callable($previousHandler);
Output for 8.1.0 - 8.1.34, 8.2.0 - 8.2.30, 8.3.0 - 8.3.30, 8.4.1 - 8.4.18, 8.5.0 - 8.5.3
log exception object(TypeError)#2 (7) { ["message":protected]=> string(107) "accept_callable(): Argument #1 ($arg) must be of type callable, array given, called in /in/rjRSm on line 27" ["string":"Error":private]=> string(0) "" ["code":protected]=> int(0) ["file":protected]=> string(9) "/in/rjRSm" ["line":protected]=> int(3) ["trace":"Error":private]=> array(1) { [0]=> array(4) { ["file"]=> string(9) "/in/rjRSm" ["line"]=> int(27) ["function"]=> string(15) "accept_callable" ["args"]=> array(1) { [0]=> array(2) { [0]=> string(3) "Foo" [1]=> string(9) "log_error" } } } } ["previous":"Error":private]=> NULL }

preferences:
79.79 ms | 1089 KiB | 4 Q