实现类:
클래스 컨테이너
{
보호된 $설정 = 배열();
공개 함수 집합($abstract, $concrete = null)
{
if ($concrete === null) {
$콘크리트 = $추상;
}
$this->settings[$abstract] = $concrete;
}
공개 함수 get($abstract, $parameters = array())
{
if (!isset($this->settings[$abstract])) {
null을 반환합니다.
}
return $this->build($this->settings[$abstract], $parameters);
}
공용 함수 빌드($concrete, $parameters)
{
if ($concrete instanceof 클로저) {
$concrete($this, $parameters)를 반환합니다.
}
$reflector = 새로운 ReflectionClass($concrete);
if (!$reflector->isInstantiable()) {
throw new Exception("{$concrete} 클래스는 인스턴스화할 수 없습니다.");
}
$constructor = $reflector->getConstructor();
if (is_null($constructor)) {
return $reflector->newInstance();
}
$parameters = $constructor->getParameters();
$종속성 = $this->getDependency($parameters);
$reflector->newInstanceArgs($dependent)를 반환합니다.
}
공개 함수 getDependency($parameters)
{
$종속성 = 배열();
foreach($parameters를 $parameter로) {
$의존성 = $parameter->getClass();
if ($dependent === null) {
if ($parameter->isDefaultValueAvailable()) {
$dependent[] = $parameter->getDefaultValue();
} 그 밖의 {
throw new Exception("클래스 종속성 {$parameter->name}을 해결할 수 없습니다.");
}
} 그 밖의 {
$dependent[] = $this->get($dependent->name);
}
}
$종속성을 반환합니다.
}
}
实现实例:
'container.php'가 필요합니다.
인터페이스 MyInterface{}
Foo 클래스가 MyInterface를 구현합니다{}
클래스 Bar는 MyInterface를 구현합니다.{}
클래스 바즈
{
공용 함수 __construct(MyInterface $foo)
{
$this->foo = $foo;
}
}
$컨테이너 = 새 컨테이너();
$container->set('바즈', '바즈');
$container->set('MyInterface', 'Foo');
$baz = $container->get('Baz');
print_r($baz);
$container->set('MyInterface', 'Bar');
$baz = $container->get('Baz');
print_r($baz);