Skip to content

PHP 8 union types, [presumably same for 8.1 intersection types]. #52

@sjokkateer

Description

@sjokkateer

Bug Report

Q A
Version(s) 3.7.x

Summary

When trying to create an object that depends on a union type in its constructor, a call to Injector::create() results in an error.

Current behavior

The Injector::class forwards the resolveParameters() call to the DependencyResolver::resolveParameters() method, which, at L#280 makes a call to Parameter::getType(). Within this method, a call is made to the underlying object's ReflectionParameter::getType() method is made. The returned object by getType() is a ReflectionUnionType::class, which has no method getName() defined, and hence, it crashes the program due to L#63.

The error message:
Error: Call to undefined method ReflectionUnionType::getName()

How to reproduce

Settings:
PHP 8.0.19 (cli)

Class definition:

class Foo
{
    public function __construct(private string|Stringable $s)
    {
    }

    public function getS(): string|Stringable
    {
        return $this->s;
    }
}

Test case:

public function testCreateClassWithUnionTypeParameterAsConstructorArgument(): void
{
    $injector = new Injector();
    
    $s       = 'Hello, World';
    $foo     = $injector->create(Foo::class, ['s' => $s]);
    $actualS = $foo->getS();

    $this->assertEquals($s, $actualS);
}

Expected behavior

An instance of Foo::class constructed with the property $s set to the string value 'Hello, World'.

PS

I am sorry if this is not considered a bug, but I did not know where to otherwise post this matter. Please let me know what you think of the above stated.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions