이 글은 주로 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();
세 번째 레벨(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=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 중국어 웹사이트의 기타 관련 기사를 참조하세요!