이 글은 주로 PHP 디커플링의 세 가지 영역에 대한 관련 지식을 소개합니다. 매우 좋은 참조 값을 가지고 있습니다.
이 기사를 읽기 전에 다음 사항을 숙지해야 합니다: PHP 구문, 객체 지향
전체 소프트웨어 프로젝트 개발을 완료하는 과정에서 때로는 여러 사람의 협력이 필요할 수도 있고 때로는 완료될 수도 있습니다. 그것이 무엇이든, 그것이 무엇이든 코드의 양이 증가함에 따라 작성될 때 "통제 불능"이 되고 점차적으로 "추악한 인터페이스와 더러운 구현"이 되어 프로젝트 유지 관리의 비용과 어려움이 증가합니다. 지속 불가능할 정도로, 유일한 선택은 리팩토링하거나 재개발하는 것입니다.
첫 번째 레벨
가설 시나리오: 세션, 데이터베이스 및 파일 시스템을 동시에 작동할 수 있는 처리 클래스를 작성해야 합니다. 우리는 이것을 쓸 수도 있습니다.
Realm 기능: 실행할 수 있지만 심각하게 결합되어 있습니다.
작성 시 단점: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{ public function Write(){ $db=new DB(1,2); $filesystem=new FileSystem(3,4); $session=new Session(5,6); } } $writer=new Writer(); $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 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();서비스 등록(바인딩)
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 dependency
$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); });위 내용은 이 글의 전체 내용입니다. 나는 바란다 모두에게 도움이 될 것입니다. 학습에 도움이 됩니다.
관련 권장 사항:
PHP 디커플링의 세 가지
영역 심층 분석(서비스 컨테이너에 대한 간략한 설명)
[전송] 프레임워크에서 PHP의 다섯 가지
위 내용은 PHP 디커플링의 세 가지 영역에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!