- Output for 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.25, 8.4.1 - 8.4.12
- object(Test)#3 (1) { ["number"]=> int(5) }
<?php
class Test
{
public int $number = 5;
}
class DIContainerException extends Exception{}
interface ContainerInterface
{
public function get(string $id): mixed;
public function has(string $id): bool;
}
class DIContainer implements ContainerInterface
{
private array $registered = [];
private array $created = [];
public function register(string $id, callable $factory): void
{
if ($this->has($id)) {
throw new DIContainerException('Сервис с таким именем уже зарегистрирован.');
}
$this->registered[$id] = $factory;
}
public function get(string $id): mixed
{
if (array_key_exists($id, $this->created)) {
return $this->created[$id];
} elseif ($this->has($id)) {
$object = call_user_func($this->registered[$id], $this);
$this->created[$id] = $object;
return $object;
} else {
throw new DIContainerException('Сервис с таким именем не зарегистрирован.');
}
}
public function has(string $id): bool
{
return isset($this->registered[$id]);
}
}
$container = new DIContainer();
$container->register('Test', function(DIContainer $container) {
return new Test();
});
var_dump($container->get('Test'));