johnbillion/query-monitor

Uncaught TypeError: ReflectionMethod::__construct(): Argument #2 ($method) must be of type ?string, array given

Opened this issue · 2 comments

I'm encountering this error:

Uncaught TypeError: ReflectionMethod::__construct(): Argument #2 ($method) must be of type ?string, array given

Pointing to this line.

I've stumbled upon this error when trying to simulate an error in a context similar to this one:

function foo_init() {
	if ( ! class_exists( 'Foo' ) ) {
		class Foo extends Bar {
			protected function __construct() {
				parent::__construct();

				add_action( 'init', function () {
					if ( rand( 0, 10 ) === 10 ) {
						throw new \RuntimeException( 'Simulated error . ' );
					}
				} );
			}
		}
	}
}

It seems $callback['function'][1] is an array, whereas it should be a string.

This is probably being called in the context of PHP Debug Logger Collector, output_fatal method, while building the stack trace.

Unfortunately I don't have time right now to further debug this. Maybe some kinda of easy defensive programming here could be useful, like a try-catch and skipping the trace if it fails to build it...?

I forgot to mention that this ran on PHP 8.4 RC.3

a 'quickfix' to combat fatal type errors would be replacing

} catch ( ReflectionException $e ) {
$callback['error'] = new WP_Error( 'reflection_exception', $e->getMessage() );
}

with

		} catch ( ReflectionException $e ) {

			$callback['error'] = new WP_Error( 'reflection_exception', $e->getMessage() );

		} catch ( TypeError $e ) {

			$callback['error'] = new WP_Error( 'type_error', $e->getMessage() );

		}