>백엔드 개발 >PHP 튜토리얼 >PHP 종속성 반전(종속성 주입) 코드 example_php 예제

PHP 종속성 반전(종속성 주입) 코드 example_php 예제

WBOY
WBOY원래의
2016-05-16 20:35:111060검색

实现类:

复主代码 代码如下:

 
클래스 컨테이너
{
    보호된 $설정 = 배열();
 
    공개 함수 집합($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);
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.