Skip to content

Commit

Permalink
Merge pull request #33 from php-fn/pr-typehint-self
Browse files Browse the repository at this point in the history
Add support for 'self' type hint
  • Loading branch information
mnapoli authored Jan 15, 2021
2 parents 3238899 + 2bf6afc commit 770de9a
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 6 deletions.
3 changes: 3 additions & 0 deletions src/ParameterResolver/Container/TypeHintContainerResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ public function getParameters(
}

$parameterClass = $parameterType->getName();
if ($parameterClass === 'self') {
$parameterClass = $parameter->getDeclaringClass()->getName();
}

if ($this->container->has($parameterClass)) {
$resolvedParameters[$index] = $this->container->get($parameterClass);
Expand Down
3 changes: 3 additions & 0 deletions src/ParameterResolver/TypeHintResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ public function getParameters(
}

$parameterClass = $parameterType->getName();
if ($parameterClass === 'self') {
$parameterClass = $parameter->getDeclaringClass()->getName();
}

if (array_key_exists($parameterClass, $providedParameters)) {
$resolvedParameters[$index] = $providedParameters[$parameterClass];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,19 @@ public function setUp(): void
*/
public function should_resolve_parameter_with_typehint_and_container()
{
$callable = function (TypeHintContainerResolverFixture $foo) {
$callable = function (TypeHintContainerResolverFixture $foo, self $bar) {
};
$reflection = new \ReflectionFunction($callable);

$fixture = new TypeHintContainerResolverFixture;
$this->container->set(self::FIXTURE, $fixture);
$this->container->set(self::class, $this);

$parameters = $this->resolver->getParameters($reflection, [], []);

$this->assertCount(1, $parameters);
$this->assertCount(2, $parameters);
$this->assertSame($fixture, $parameters[0]);
$this->assertSame($this, $parameters[1]);
}

/**
Expand Down
13 changes: 9 additions & 4 deletions tests/ParameterResolver/TypeHintResolverTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,20 @@ public function setUp(): void
*/
public function should_resolve_parameter_with_typehint()
{
$callable = function (TypeHintResolverFixture $foo) {
$callable = function (TypeHintResolverFixture $foo, self $bar) {
};
$reflection = new \ReflectionFunction($callable);

$fixture = new TypeHintResolverFixture;

$parameters = $this->resolver->getParameters($reflection, [self::FIXTURE => $fixture], []);

$this->assertCount(1, $parameters);
$parameters = $this->resolver->getParameters(
$reflection,
[self::FIXTURE => $fixture, self::class => $this],
[]
);
$this->assertCount(2, $parameters);
$this->assertSame($fixture, $parameters[0]);
$this->assertSame($this, $parameters[1]);
}

/**
Expand Down Expand Up @@ -64,6 +68,7 @@ public function should_skip_parameter_if_already_resolved()

$this->assertSame($resolvedParameters, $parameters);
}

}

class TypeHintResolverFixture
Expand Down

0 comments on commit 770de9a

Please sign in to comment.