개발 꿀팁/PHP

PHP제어반전(IOC)

Jammie 2022. 6. 25. 11:11
반응형

제어 반전: IOC(inversion of control) 제어 반전 모드; 제어 반전은 3종류(컴포넌트 간)에 대한 의존관계를 프로그램 내부에서 외부로 언급하여 관리한다.

개념 이해
먼저 반전을 제어하고 주입에 의존한다는 개념을 소개하겠습니다. 이 두 가지 개념은 그들이 표현하는 것과 같은 의미라고 생각할 수 있습니다. 통속적인 예를 들면, 우리 사용자 로그인은 로그를 기록하는 기능을 제공해야 하기 때문에 선택해서 사용할 수 있습니다.파일이나 데이터베이스.다음은 코드로 보여드리겠습니다.

// 로그 쓰기 인터페이스 규격 정의
interface log
{
    public function write();   
}

// 파일 로그
class FileLog implements Log
{
    public function write(){
        echo 'file log write...';
    }   
}

// 데이터베이스 로그
class DatabaseLog implements Log
{
    public function write(){
        echo 'database log write...';
    }   
}

// 프로그램 운영 클래스
class User 
{
    protected $fileLog;

    public function __construct()
    {
        $this->fileLog = new FileLog();   
    }

    public function login()
    {
        // 로그인 성공, 로그 기록
        echo 'login success...';
        $this->fileLog->write();
    }

}

$user = new User();
$user->login();

위의 글쓰기는 로그 기록 기능을 할 수 있지만, 지금 데이터베이스로 로그를 기록하려면 User 클래스를 수정해야 합니다. 이 코드는 디커플링에 이르지 못하고 프로그래밍 오픈 클로즈드 원칙에도 맞지 않습니다. 어떻게 수정해야 할까요?우리는 로그 처리 클래스를 구조 함수 방식으로 전달할 수 있다.다음은 유저 클래스의 코드를 수정해 보겠습니다.

class User 
{
    protected $log;

    public function __construct(Log $log)
    {
        $this->log = $log;   
    }

    public function login()
    {
        // 로그인 성공, 로그 기록
        echo 'login success...';
        $this->log->write();
    }

}

$user = new User(new DatabaseLog());
$user->login();

이렇게 생각하면 어떤 방식으로든 조작 로그를 기록할 필요가 없어져, User 클래스를 수정할 필요가 없고, 컨스트럭터 파라미터 전달만으로 실현될 수 있다고 생각합니다만, 이것이 바로 '컨트롤 반전'입니다.자체적인 내용 수정 없이 외부 외부로 전달되도록 변경한다.수요의존을 외부에서 책임지는 행태를 우리는 통제반전(IoC)이라고 부를 수 있다.

반응형