TypePHP 编译器
https://swoole.com/aot/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.3 KiB
49 lines
1.3 KiB
--TEST--
|
|
Symfony pattern: container fallback caches static first-class callable
|
|
--FILE--
|
|
<?php
|
|
|
|
final class MiniContainer
|
|
{
|
|
public array $services = [];
|
|
public array $aliases = [];
|
|
public array $factories = [];
|
|
public static mixed $make = null;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->factories['custom'] = static fn (self $container): object => (object) ['id' => 'custom'];
|
|
}
|
|
|
|
public function get(string $id): object
|
|
{
|
|
return $this->services[$id]
|
|
?? $this->services[$id = $this->aliases[$id] ?? $id]
|
|
?? ('service_container' === $id ? $this : ($this->factories[$id] ?? self::$make ??= self::make(...))($this, $id));
|
|
}
|
|
|
|
public static function make(self $container, string $id): object
|
|
{
|
|
$service = (object) ['id' => $id];
|
|
$container->services[$id] = $service;
|
|
|
|
return $service;
|
|
}
|
|
}
|
|
|
|
function main(): void
|
|
{
|
|
$container = new MiniContainer();
|
|
$container->aliases['logger'] = 'monolog';
|
|
|
|
var_dump($container->get('logger')->id);
|
|
var_dump($container->get('monolog')->id);
|
|
var_dump($container->get('custom')->id);
|
|
var_dump(MiniContainer::$make instanceof Closure);
|
|
}
|
|
?>
|
|
--EXPECT--
|
|
string(7) "monolog"
|
|
string(7) "monolog"
|
|
string(6) "custom"
|
|
bool(true)
|
|
|