%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/vendor/pestphp/pest/src/Support/ |
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/vendor/pestphp/pest/src/Support/Container.php |
<?php declare(strict_types=1); namespace Pest\Support; use Pest\Exceptions\ShouldNotHappen; use ReflectionClass; use ReflectionParameter; /** * @internal */ final class Container { private static ?Container $instance = null; /** * @var array<string, object|string> */ private array $instances = []; /** * Gets a new or already existing container. */ public static function getInstance(): self { if (! self::$instance instanceof \Pest\Support\Container) { self::$instance = new self(); } return self::$instance; } /** * Gets a dependency from the container. */ public function get(string $id): object|string { if (! array_key_exists($id, $this->instances)) { /** @var class-string $id */ $this->instances[$id] = $this->build($id); } return $this->instances[$id]; } /** * Adds the given instance to the container. * * @return $this */ public function add(string $id, object|string $instance): self { $this->instances[$id] = $instance; return $this; } /** * Tries to build the given instance. * * @template TObject of object * * @param class-string<TObject> $id * @return TObject */ private function build(string $id): object { $reflectionClass = new ReflectionClass($id); if ($reflectionClass->isInstantiable()) { $constructor = $reflectionClass->getConstructor(); if ($constructor instanceof \ReflectionMethod) { $params = array_map( function (ReflectionParameter $param) use ($id): object|string { $candidate = Reflection::getParameterClassName($param); if ($candidate === null) { $type = $param->getType(); /* @phpstan-ignore-next-line */ if ($type instanceof \ReflectionType && $type->isBuiltin()) { $candidate = $param->getName(); } else { throw ShouldNotHappen::fromMessage(sprintf('The type of `$%s` in `%s` cannot be determined.', $id, $param->getName())); } } return $this->get($candidate); }, $constructor->getParameters() ); return $reflectionClass->newInstanceArgs($params); } return $reflectionClass->newInstance(); } throw ShouldNotHappen::fromMessage(sprintf('A dependency with the name `%s` cannot be resolved.', $id)); } }