johnbillion / query-monitor

The developer tools panel for WordPress
https://querymonitor.com
GNU General Public License v2.0
1.6k stars 212 forks source link

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

Open Luc45 opened 2 months ago

Luc45 commented 2 months ago

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...?

Luc45 commented 2 months ago

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

ardittristan commented 1 week ago

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

https://github.com/johnbillion/query-monitor/blob/6b66f6513580023415fe21e6f0218bd256b3c59a/classes/Util.php#L440-L444

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() );

        }