>  기사  >  백엔드 개발  >  PHP 디커플링의 세 가지 영역에 대해 자세히 알아보기(서비스 컨테이너에 대한 간략한 논의)

PHP 디커플링의 세 가지 영역에 대해 자세히 알아보기(서비스 컨테이너에 대한 간략한 논의)

迷茫
迷茫원래의
2017-03-26 10:28:341837검색

이 기사를 읽기 전에 다음 사항을 숙지해야 합니다. PHP 구문, 객체 지향

전체 소프트웨어 프로젝트 개발을 완료하는 과정에서, 때로는 여러 사람이 협력해야 할 때도 있고, 때로는 독립적으로 완료할 수도 있습니다. 어떤 유형이든 코드의 양이 늘어나면 작성할 때 "통제 불능"이 되고 점차 "추악한 인터페이스 , 더러운 구현"으로 인해 프로젝트 유지 비용과 어려움이 증가합니다. , 지속 불가능할 정도로 재구성하거나 재개발하는 것이 유일한 선택입니다.

1단계

가설 시나리오: 세션, 데이터베이스, 파일 시스템을 동시에 운영할 수 있는 처리 클래스를 작성해야 합니다. 우리는 이것을 쓸 수도 있습니다.

영역 기능: 실행할 수 있지만 심각하게 결합되어 있습니다.

class DB{
	public function DB($arg1,$arg2){
		echo 'constructed!'.PHP_EOL;
	}
}

class FileSystem{
	public function FileSystem($arg1,$arg2){
		echo 'constructed!'.PHP_EOL;
	}
}

class Session{
	public function Session($arg1,$arg2){
		echo 'constructed!'.PHP_EOL;
	}
}

class Writer{
	public function Write(){
		$db=new DB(1,2);
		$filesystem=new FileSystem(3,4);
		$session=new Session(5,6);
	}
}

$writer=new Writer();
$writer->write();

작성의 단점:

1. 데이터베이스 매개변수가 변경되면 개체를 구성합니다. , 수정 작업량이 많을 것입니다

2. Writer 클래스를 설계하는 사람은 DB 및 기타 클래스의 다양한 API에 익숙해야 합니다

. 연결?

두 번째 수준(매개변수 종속성)

가설 시나리오: 데이터베이스 주소가 고객마다 자주 변경되어야 하고, DB를 호출하는 클래스가 많습니다. (여러 개가 있는 경우) 데이터베이스 주소가 변경되더라도 이러한 클래스의 코드를 수정할 필요가 없기를 바랍니다.


class DB{
	public function DB($arg1,$arg2){
		echo 'constructed!'.PHP_EOL;
	}
}

class FileSystem{
	public function FileSystem($arg1,$arg2){
		echo 'constructed!'.PHP_EOL;
	}
}

class Session{
	public function Session($arg1,$arg2){
		echo 'constructed!'.PHP_EOL;
	}
}

class Writer{
	protected $_db;
	protected $_filesystem;
	protected $_session;
	public function Set($db,$filesystem,$session){
		$this->_db=$db;
		$this->_filesystem=$filesystem;
		$this->_session=$session;
	}
	public function Write(){
		
	}
}

$db=new DB(1,2);
$filesystem=new FileSystem(3,4);
$session=new Session(5,6);

$writer=new Writer();
$writer->Set($db,$filesystem,$session);
$writer->write();

DB 클래스의 구성을 클라이언트로 옮겼음에도 불구하고 수정이 가해지면 작업량이 크게 줄어들지만 새로운 문제가 발생합니다. Writer 클래스를 생성하려면 먼저 DB 클래스, FileSystem 클래스 등을 생성해야 합니다. 이는 Writer 클래스를 담당하는 사람에게 매우 까다로운 일입니다. 그는 다른 많은 클래스 문서를 읽고 하나씩 생성해야 합니다(필요할 수도 있음). 초기화되어야 함) 필수 작성자 변수를 생성하기 전에.

그래서 우리는 Writer 클래스를 작성하는 사람들이 매개변수를 입력하지 않고도 더 빠른 인터페이스를 사용하여 원하는 클래스를 만들고 호출할 수 있도록 더 나은 작성 방법이 있기를 바랍니다.

세 번째 레벨(IOC 컨테이너)

처음 두 레벨 이후에 다음과 같은 이점을 추가할 수 있기를 바랍니다.

1. $db=new DB(arg1,arg2);와 같은 문을 작성하는 등 매번 지루한 초기화 없이 class, Session 클래스 및 FileSystem 클래스를 "사용할 수 있습니다".

2. DB 및 기타 유형의 객체는 "전역"이며 전체 프로그램 실행 중 언제든지 호출할 수 있기를 바랍니다.

3. DB 및 기타 유형을 호출하는 프로그래머는 이 클래스에 대해 너무 많은 세부 사항을 알 필요가 없으며 문자열 별명을 사용하여 이러한 객체를 생성할 수도 있습니다.

위의 목표를 달성할 수 있는 것은 IOC 컨테이너입니다. 간단히 IOC 컨테이너를 전역 변수로 간주하고 연관 배열을 사용하여 문자열을 생성자에 바인딩할 수 있습니다.

먼저 컨테이너 클래스를 구현합니다


class Container{
	public $bindings;
	public function bind($abstract,$concrete){
		$this->bindings[$abstract]=$concrete;
	}
	public function make($abstract,$parameters=[]){
		return call_user_func_array($this->bindings[$abstract],$parameters);
	}
}

서비스 등록(바인딩)

$container=new Container();
$container->bind('db',function($arg1,$arg2){
	return new DB($arg1,$arg2);
});

$container->bind('session',function($arg1,$arg2){
	return new Session($arg1,$arg2);
});

$container->bind('fs',function($arg1,$arg2){
	return new FileSystem($arg1,$arg2);
});

컨테이너 종속성

class Writer{
	protected $_db;
	protected $_filesystem;
	protected $_session;
	protected $container;
	public function Writer(Container $container){
		$this->_db=$container->make('db',[1,2]);
		$this->_filesystem=$container->make('session',[3,4]);
		$this->_session=$container->make('fs',[5,6]);
	}
}

$writer=new Writer($container);

위 내용은 PHP 디커플링의 세 가지 영역에 대해 자세히 알아보기(서비스 컨테이너에 대한 간략한 논의)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.