>  기사  >  백엔드 개발  >  PHP의 코드 아키텍처 분리에 대한 간략한 토론

PHP의 코드 아키텍처 분리에 대한 간략한 토론

*文
*文원래의
2018-01-02 17:17:322478검색

PHP는 코드 아키텍처의 분리에 대해 간략하게 설명합니다. 이 글에서는 주로 PHP 디커플링의 세 가지 영역과 서비스 컨테이너 관련 지식을 소개합니다. 매우 좋은 참조 값을 가지고 있습니다. 그것이 모두에게 도움이 되기를 바랍니다.

전체 소프트웨어 프로젝트 개발을 완료하는 과정에서 때로는 여러 사람의 협력이 필요할 수도 있고, 때로는 어느 쪽이든 독립적으로 완료될 수도 있습니다. 코드의 양이 늘어날수록 "아웃"이 발생합니다. 제어"가 점차 "추악한" 인터페이스, 지저분한 구현"으로 변해 프로젝트 유지 관리의 비용과 어려움이 지속 불가능할 정도로 증가했으며 유일한 선택은 리팩터링이나 재개발뿐이었습니다.

첫 번째 레벨

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

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

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. 데이터베이스 매개변수 변경이 포함되면 수정이 많이 필요합니다. of work Quantity

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);

관련 권장 사항:

Yii2 두 모듈(모듈) 간의 데이터는 서로 호출해야 합니다. 디자인 결합을 최대한 줄이는 방법은 무엇입니까?

인터페이스 추상 클래스 PHP에서 인터페이스, 추상 클래스, 일반 기본 클래스를 사용하는 "인터페이스 지향 프로그래밍"과 "결합 방법"에 대한 간략한 설명

PHP 결합 디자인 패턴의 이해_PHP 튜토리얼

위 내용은 PHP의 코드 아키텍처 분리에 대한 간략한 토론의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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