유연한 PHP 응용 프로그램을 구축하기위한 고급 조건부 패턴
정책 모드를 사용하여 조건부 논리를 교환 가능한 동작으로 대체합니다. 2. 빈 객체 모드를 사용하여 널 값 점검을 제거하십시오. 3. 상태 모드를 사용하여 내부 상태에 따라 객체가 동작을 변경하게합니다. 4. 사양 모드를 통한 복잡한 비즈니스 규칙 결합; 5. 명령 모드와 경비원을 결합하여 무조건 실행 제어를 달성하는 것; 6. 클래스 기반 분포를 사용하여 스위치 문을 대체합니다. 이러한 모드는 조건부 로직을 다형성 및 조합으로 변환하여 코드의 유지 관리 가능성, 테스트 가능성 및 확장 성을 향상시켜보다 유연한 PHP 응용 프로그램을 구축합니다.
유연하고 유지 관리 가능한 PHP 응용 프로그램을 구축 할 때 기본 if-else
문에 의존하면 엄격하고 관리하기 어려운 코드가 빠르게 이어질 수 있습니다. 고급 조건부 패턴을 통해 개발자는보다 역동적이고 확장 가능하며 읽기 쉬운 논리를 작성할 수 있습니다. 이러한 패턴은 간단한 분기를 넘어서 문제의 분리, 테스트 가능성 및 확장을 촉진하는 설계 원칙을 수용합니다.

다음은 PHP 응용 프로그램을보다 적응력있게 만들기 위해 사용할 수있는 몇 가지 고급 조건부 패턴입니다.
1. 전략 패턴 : 조건부 논리를 교환 가능한 동작으로 바꾸십시오
Long switch
또는 if-elseif
체인을 사용하여 동작을 결정하는 대신 전략 패턴을 사용하여 각 변형을 자체 클래스로 캡슐화하십시오.

예 : 지불 처리
인터페이스 지불 처리기 { 공개 기능 프로세스 (float $ 금액) : bool; } 클래스 신용 카드 프로세서는 지불 처리기를 구현합니다 { 공개 기능 프로세스 (float $ 금액) : bool { // 신용 카드 프로세스 진실을 반환하십시오. } } Class PayPalprocessor는 PaymentProcessor를 구현합니다 { 공개 기능 프로세스 (float $ 금액) : bool { // PayPal을 통해 처리합니다 진실을 반환하십시오. } } Class PaymentService { 개인 지불 처리기 $ 프로세서; 공개 함수 setProcessor (PaymentProcessor $ processor) : void { $ this-> 프로세서 = $ 프로세서; } 공개 함수 실행 (float $ 금액) : bool { $ this-> processor-> process ($ 금액)를 반환합니다. } }
더 나은 이유 :

- 논리를 선택할 때 필요한 조건이 없습니다
- 새로운 결제 방법을 쉽게 추가 할 수 있습니다
- 의존성 주입 및 테스트를 촉진합니다
다음과 같은 경우 사용하십시오.
- 동일한 작업에 대한 여러 알고리즘이 있습니다
- 컨텍스트 또는 구성에 따라 행동이 변경됩니다
2. 널 객체 패턴 : 널 검사를 제거합니다
if ($object !== null)
확인을 산란하는 대신 동일한 인터페이스를 구현하지만 아무것도하지 않는 NULL 객체를 사용하십시오.
인터페이스 로거 { 공개 함수 로그 (String $ 메시지); } 클래스 FilElogger는 Logger를 구현합니다 { 공개 기능 로그 (String $ 메시지) { file_put_contents ( 'app.log', $ message. php_eol, file_append); } } 클래스 NullLogger는 Logger를 구현합니다 { 공개 기능 로그 (String $ 메시지) { // 아무것도하지 않습니다 } } 클래스 사용자 서비스 { 개인 로거 $ 로거; 공개 함수 __construct (logger $ logger = null) { $ this-> logger = $ logger ?? NEW NULLLOGGER (); // 널 확인을 피하십시오 } 공개 기능 레지스터 (String $ 이메일) { // 로거가 null인지 확인할 필요가 없습니다 $ this-> logger-> log ( "사용자 등록 : $ 이메일"); } }
혜택 : 클리너 코드, 방어 조건이 적습니다.
3. 상태 패턴 : 객체가 내부 상태에 따라 동작을 변경하도록합니다.
객체의 행동이 상태에 따라 크게 변할 때 상태 논리를 외부화하여 if ($status === 'active')
와 같은 조건을 피하십시오.
인터페이스 주문 { 공개 기능 선 (OrderContext $ 주문); 공개 기능 취소 (OrderContext $ order); } 클래스 보급 상태는 Orderstate를 구현합니다 { 공개 기능 선 (OrderContext $ order) { / * 허용되지 않음 * /} public function cancel (OrderContext $ order) {$ order-> setState (new CancelledState ()); } } 클래스 선적 상태는 Orderstate를 구현합니다 { 공개 기능 선 (OrderContext $ order) { / * 이미 배송 * /} 공개 기능 취소 (OrderContext $ order) { / * 취소 할 수 없습니다 * /} } Class OrderContext { 개인 주문 $ State; 공개 기능 __construct () { $ this-> state = new PendingState (); } 공개 기능 setstate (Orderstate $ State) { $ this-> state = $ state; } 공개 기능 선박 () {$ this-> state-> ship ($ this); } public function cancel () {$ this-> state-> cancel ($ this); } }
이것은 다음과 같은 조건을 제거합니다.
if ($ this-> status === 'pending') { $ this-> status = 'shipped'; }
대신, 행동은 현재 상태 객체에 위임됩니다.
4. 사양 패턴 : 복잡한 비즈니스 규칙을 구성합니다
객체를 통해 부울 로직을 사용하여 비즈니스 규칙을 나타냅니다. 이것은 유효성 검사 또는 필터링에 특히 유용합니다.
인터페이스 사양 { 공개 기능 isatisfiedby ($ 후보) : bool; 공개 기능 및 (사양 $ 기타) : 사양; 공개 기능 또는 (사양 $ 기타) : 사양; 공개 기능이 아닙니다 () : 사양; } 클래스 aspecification은 사양을 구현합니다 { 개인 int $ minage; 공개 기능 __construct (int $ minage) { $ this-> minage = $ minage; } 공개 기능 issatisfiedby ($ 후보) : bool { $ $ 후보자-> Age> = $ this-> Minage; } 공개 기능 및 (사양 $ 기타) : 사양 { 신규 및 지사를 반환합니다 ($ this, $ 기타); } // ... 유사하게 또는 (), () }
이제 규칙을 구성 할 수 있습니다.
$ canvote = (New Agescecification (18))-> 및 (새로운 CitizenshipsPecification ( 'us')); if ($ canvote-> issatisfiedby ($ user)) {...}
이것은 복잡한 중첩 조건을 읽을 수 있고 재사용 가능한 규칙 객체로 대체합니다.
5. 가드가있는 명령 패턴 : IFS없이 조건부 실행
명령 패턴을 전제 조건 (가드)과 결합하여 실행 흐름을 제어하십시오.
인터페이스 명령 { 공개 함수 canexecute () : bool; 공개 함수 execute (); } 클래스 deleteaccountcommand는 명령을 구현합니다 { 개인 사용자 $ 사용자; 공개 기능 __construct (사용자 $ user) { $ this-> user = $ user; } public function canExecute () : bool { return $ this-> user-> isverified () &&! $ this-> user-> hasactivesubscriptions (); } 공개 함수 실행 execute () { if (! $ this-> canexecute ()) { 새로운 runtimeexception을 던지십시오 ( "명령을 실행할 수 없음"); } // 삭제를 수행합니다 } }
그런 다음 일반적으로 명령을 처리합니다.
foreach ($ cmd as $ cmd) { if ($ cmd-> canexecute ()) { $ cmd-> execute (); } }
이로 인해 조건부 논리를 중앙 집중화하고 명령 파이프 라인을 쉽게 관리 할 수 있습니다.
6. 스위치 문 대신 클래스 기반 디스패치를 사용하십시오
대신 :
스위치 ($ 유형) { 사례 'pdf': 새로운 pdfexporter ()를 반환합니다. CASE 'CSV': 새로운 CSVEXPORTER ()를 반환합니다. // ... }
클래스에 유형의지도를 사용하십시오.
클래스 ExporterFactory { 개인 배열 $ map = [ 'pdf'=> pdfexporter :: class, 'csv'=> csvexporter :: class, ]; 공개 함수 make (문자열 $ 유형) : Exporter { if (! isset ($ this-> map [$ type])) { 새로운 InvalidArgumentException ( "알 수없는 유형 : $ 유형"); } 새로운 $ this-> map [$ type] (); } }
더 나은 : DI 컨테이너를 사용하여 동적으로 해결하십시오.
최종 생각
고급 조건부 패턴이 도움이됩니다.
- 코드 복제를 줄입니다
- 테스트 가능성을 향상시킵니다
- 시스템을 쉽게 확장 할 수 있도록합니다
- 깊은 둥지와 사이클로 더 복잡성을 피하십시오
"다음에 무엇을해야합니까?" 조건에서 : 물어보십시오.
- 이것이 대상이 될 수 있습니까?
- 이것은 주입 할 수 있습니까?
- 이것이 구성 될 수 있습니까?
조건을 다형성 및 구성으로 대체함으로써 시간이 지남에 따라 추론하고 진화하기 쉬운 시스템을 구축합니다.
기본적으로, 어떤 일을 해야하는지 결정하려는 진술을 작성하는 if
, 아마도 패턴을 사용해야 할 때입니다.
위 내용은 유연한 PHP 응용 프로그램을 구축하기위한 고급 조건부 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT
더 현명한 결정을 위한 AI 기반 투자 연구

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP의 if-Else 문은 프로그램 동적 제어를 구현하기위한 핵심 도구입니다. 1. 기본 IF-ELSE 구조는 이진 의사 결정을 지원하고 참 또는 허위 조건에 따라 다른 코드 블록을 실행합니다. 2. elseif를 사용하여 여러 조건에서 순서대로 판단하고 특정 조건이 사실이되면 후속 검사를 중지하십시오. 3. 정확한 조건은 비교 연산자 (예 : === 유형과 값이 동일하도록)와 논리 연산자 (&&, ||,!)를 결합하여 구성해야합니다. 4. 조건에서 과제 작업의 오용을 피하고, == 또는 === 비교; 5. 진술이 강력하다면 중첩되지 않았지만 가독성을 줄이기 쉽지만 조기 복귀를 사용하여 둥지를 줄이는 것이 좋습니다. 6. Ternary Operator (? :)는 간단한 조건부 할당에 적합하며 체인을 사용할 때 가독성에주의를 기울여야합니다. 7. 배수

checkforemptyinputusingifnotuser_nametodisplayanerrorandpreventdownstreamissues.2.validatedatatypeswithifage_input.isdigit () b

usingIf ... elseInSideLoopSenablesDynamicControlFlowBowingReal-timedecisionsedeacherationBasedOnConditions.2.ItSupportSconditionalProcessing, subleasdistinguishingeevenandddnumbersinalist, byexecutingdifferentcodepathferentValues.

정책 모드를 사용하여 조건부 논리를 교환 가능한 동작으로 대체하십시오. 2. 빈 객체 모드를 사용하여 널 값 점검을 제거하십시오. 3. 상태 모드를 사용하여 내부 상태에 따라 객체가 동작을 변경하도록합니다. 4. 사양 모드를 통한 복잡한 비즈니스 규칙 결합; 5. 무조건 실행 제어를 달성하기 위해 명령 모드와 경비원 결합; 6. 클래스 기반 분포를 사용하여 스위치 문을 대체합니다. 이러한 모드는 조건부 로직을 다형성 및 조합으로 변환하여 코드의 유지 관리 가능성, 테스트 가능성 및 확장 성을 향상시켜보다 유연한 PHP 응용 프로그램을 구축합니다.

elseif 및 elseif 함수는 기본적으로 PHP에서 동일하지만 실제 사용에서는 elseif가 선호되어야합니다. elseif는 단일 언어 구조이며 Elseif는 두 개의 독립적 인 진술로 구문 분석됩니다. 대체 구문 (예 : 및 endif)에서 elseif를 사용하면 구문 분석 오류가 발생합니다. psr-12 인코딩 표준은 명시 적으로 elseif를 금지하지는 않지만, 그 예에서 elseif의 사용은 통합되어 글쓰기 방법을 표준으로 설정합니다. elseif는 성능, 가독성 및 일관성이 더 우수하며 주류 도구에 의해 자동으로 형식화됩니다. 따라서 elseif는 잠재적 인 문제를 피하고 통합 코드 스타일을 유지하기 위해 사용해야합니다. 마지막 결론은 다음과 같습니다. elseif는 항상 사용해야합니다.

== 사용하는 것은 == 대신 PHP에서 유형 변환 위험을 피하는 열쇠입니다. ==는 '0'== 0 또는 strpos가 0과 같은 오류가 발생하여 보안 취약성과 논리적 버그를 유발하기 때문입니다. === 값과 유형을 엄격하게 비교하여 이러한 문제를 방지합니다. 따라서 ===는 기본적으로 사용하고 필요할 때 유형을 명시 적으로 변환하고 동시에 유형 안전을 개선하기 위해 선언 (strict_types = 1)을 결합해야합니다.

매치 표현식은 간결한 구문, 엄격한 비교, 표현 반환 값으로 인해 다른 체인보다 낫고 기본값을 통해 무결성을 보장 할 수 있습니다. 2. 상태를 기반으로 프로세서 선택과 같은 작업에 문자열 또는 열거를 매핑하는 데 적용됩니다. 3. 열거와 php8.1을 결합하는 것은 유형-안전 권한 할당을 달성 할 수 있습니다. 4. 동일한 범주로 분류 된 다른 MIME 유형과 같은 단일 브랜치 멀티 밸런 매칭 지원; 5. 실행 논리를 지연시키기위한 반환 폐쇄; 6. 제한 사항에는 동일한 값 비교를 지원하는 것만 포함되며, 낙상 메커니즘이 없으며 복잡한 조건을 적용하지 않는 것이 포함됩니다. 7. 모범 사례에는 항상 기본 분기 추가, 조기 반환 결합, 구성 또는 라우팅 매핑 및 잘못된 입력이 비효율적 일 때 예외를 던지는 것이 포함됩니다.

짧은 원격 변환 aapowerfulfeatureinprogramminglanguages likepython, javascript, c, andjavathatenhancescodescodesafety, 효율성, 및 읽기 가능성 .1.itpreventserrorsbyallowingsafeAcccestonestedproperties, suleassingif (user && user.address) injavas
