*/ private array $factories = []; /** @var array */ private array $instances = []; /** * Register a factory for a given class. * * @template T of object * @param class-string $class * @param callable(Container):T $factory */ public function bind( string $class, callable $factory ): void { $this->factories[ $class ] = $factory; unset( $this->instances[ $class ] ); } /** * Resolve a class instance (singleton). * * @template T of object * @param class-string $class * @return T */ public function get( string $class ): object { if ( isset( $this->instances[ $class ] ) ) { /** @var T */ return $this->instances[ $class ]; } if ( isset( $this->factories[ $class ] ) ) { $instance = ( $this->factories[ $class ] )( $this ); } else { $instance = new $class(); } $this->instances[ $class ] = $instance; /** @var T */ return $instance; } }