Skip to content

Eval'd code with static return type wrongly overriden do not show correct message #9407

Description

@shavounet

Description

This might be only an issue in the error message since I didn't find any issue with a valid eval'd code.
It's quite minor, but I did loose some time trying to understand it :)

The following code:

<?php
class Request {
    public function duplicate(): static
    {
        return new Request;
    }
}

class TestGenerator {
    public static function generate(): void
    {
        $code = <<<PHP
class MockRequest extends Request {
    public function duplicate(): Request
    {
        return new MockRequest;
    }
}
PHP;
        eval($code);
    }
}

TestGenerator::generate();
$b = new MockRequest;
$b->duplicate();

Resulted in this output:

PHP Fatal error:  Declaration of MockRequest::duplicate(): Request must be compatible with Request::duplicate(): TestGenerator in var/test.php(20) : eval()'d code on line 2

But I expected this output instead:

PHP Fatal error:  Declaration of MockRequest::duplicate(): Request must be compatible with Request::duplicate(): static in var/test.php(20) : eval()'d code on line 2

With a correct eval'd code (static return type), I do not have issues.
With a bad not-eval'd code, I do have a correct error message.
I can reproduce it with self and parent return types.

PHP Version

PHP 8.1.9

Operating System

No response

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions