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

PHP 디커플링의 세 가지 영역 분석(서비스 컨테이너에 대한 간략한 논의)

高洛峰
高洛峰원래의
2017-03-12 10:09:101123검색

PHP 디커플링의 세 가지 영역 분석(서비스컨테이너에 대한 간략한 논의)

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

전체 소프트웨어 프로젝트의 개발을 완료하는 과정에서 때로는 여러 사람의 협력이 필요할 수도 있고 때로는 독립적으로 완료될 수도 있습니다. 즉, 코드의 양이 늘어나면 통제할 수 없게 됩니다.”는 점차 “추악한인터페이스, 프로젝트 유지 관리의 어려움이 지속 불가능할 정도로 증가했습니다. 유일한 선택은 재건축이나 재개발이었습니다.

첫 번째 수준

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

영역 기능: 실행 가능하지만 결합이 심함

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 클래스, Session 클래스, FileSystem 클래스를 $db=new DB(arg1,arg2);와 같은 문을 작성하는 등 매번 지루한 초기화 없이 "즉시" 사용할 수 있기를 바랍니다.

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으로 문의하세요.