목차
2. 널 객체 패턴 : 널 검사를 제거합니다
3. 상태 패턴 : 객체가 내부 상태에 따라 동작을 변경하도록합니다.
4. 사양 패턴 : 복잡한 비즈니스 규칙을 구성합니다
5. 가드가있는 명령 패턴 : IFS없이 조건부 실행
6. 스위치 문 대신 클래스 기반 디스패치를 사용하십시오
최종 생각
백엔드 개발 PHP 튜토리얼 유연한 PHP 응용 프로그램을 구축하기위한 고급 조건부 패턴

유연한 PHP 응용 프로그램을 구축하기위한 고급 조건부 패턴

Jul 31, 2025 am 05:24 AM
PHP if...else Statements

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

유연한 PHP 응용 프로그램을 구축하기위한 고급 조건부 패턴

유연하고 유지 관리 가능한 PHP 응용 프로그램을 구축 할 때 기본 if-else 문에 의존하면 엄격하고 관리하기 어려운 코드가 빠르게 이어질 수 있습니다. 고급 조건부 패턴을 통해 개발자는보다 역동적이고 확장 가능하며 읽기 쉬운 논리를 작성할 수 있습니다. 이러한 패턴은 간단한 분기를 넘어서 문제의 분리, 테스트 가능성 및 확장을 촉진하는 설계 원칙을 수용합니다.

유연한 PHP 응용 프로그램을 구축하기위한 고급 조건부 패턴

다음은 PHP 응용 프로그램을보다 적응력있게 만들기 위해 사용할 수있는 몇 가지 고급 조건부 패턴입니다.


1. 전략 패턴 : 조건부 논리를 교환 가능한 동작으로 바꾸십시오

Long switch 또는 if-elseif 체인을 사용하여 동작을 결정하는 대신 전략 패턴을 사용하여 각 변형을 자체 클래스로 캡슐화하십시오.

유연한 PHP 응용 프로그램을 구축하기위한 고급 조건부 패턴

예 : 지불 처리

 인터페이스 지불 처리기
{
    공개 기능 프로세스 (float $ 금액) : bool;
}

클래스 신용 카드 프로세서는 지불 처리기를 구현합니다
{
    공개 기능 프로세스 (float $ 금액) : bool
    {
        // 신용 카드 프로세스
        진실을 반환하십시오.
    }
}

Class PayPalprocessor는 PaymentProcessor를 구현합니다
{
    공개 기능 프로세스 (float $ 금액) : bool
    {
        // PayPal을 통해 처리합니다
        진실을 반환하십시오.
    }
}

Class PaymentService
{
    개인 지불 처리기 $ 프로세서;

    공개 함수 setProcessor (PaymentProcessor $ processor) : void
    {
        $ this-> 프로세서 = $ 프로세서;
    }

    공개 함수 실행 (float $ 금액) : bool
    {
        $ this-> processor-> process ($ 금액)를 반환합니다.
    }
}

더 나은 이유 :

유연한 PHP 응용 프로그램을 구축하기위한 고급 조건부 패턴
  • 논리를 선택할 때 필요한 조건이 없습니다
  • 새로운 결제 방법을 쉽게 추가 할 수 있습니다
  • 의존성 주입 및 테스트를 촉진합니다

다음과 같은 경우 사용하십시오.

  • 동일한 작업에 대한 여러 알고리즘이 있습니다
  • 컨텍스트 또는 구성에 따라 행동이 변경됩니다

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Stock Market GPT

Stock Market GPT

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

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

뜨거운 주제

PHP의 IF-ELSE 구성으로 조건부 제어 흐름 마스터 링 PHP의 IF-ELSE 구성으로 조건부 제어 흐름 마스터 링 Jul 31, 2025 pm 12:46 PM

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

강력한 입력 유효성 검증 및 오류 처리에`else ... '를 사용합니다 강력한 입력 유효성 검증 및 오류 처리에`else ... '를 사용합니다 Aug 01, 2025 am 07:47 AM

checkforemptyinputusingifnotuser_nametodisplayanerrorandpreventdownstreamissues.2.validatedatatypeswithifage_input.isdigit () b

동적 제어 흐름을 위해 루프 내에서 '만약'로직을 통합합니다 동적 제어 흐름을 위해 루프 내에서 '만약'로직을 통합합니다 Jul 30, 2025 am 02:57 AM

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

유연한 PHP 응용 프로그램을 구축하기위한 고급 조건부 패턴 유연한 PHP 응용 프로그램을 구축하기위한 고급 조건부 패턴 Jul 31, 2025 am 05:24 AM

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

`Elseif` vs. 'else if'토론 : 구문 및 PSR 표준에 대한 깊은 다이빙 `Elseif` vs. 'else if'토론 : 구문 및 PSR 표준에 대한 깊은 다이빙 Jul 31, 2025 pm 12:47 PM

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

유형 저글링의 함정 :`==`vs.`===`조건부 점검에서 유형 저글링의 함정 :`==`vs.`===`조건부 점검에서 Jul 31, 2025 pm 12:41 PM

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

'elseif'너머 : 현대 PHP에서 '매치'표현을 활용합니다 'elseif'너머 : 현대 PHP에서 '매치'표현을 활용합니다 Jul 31, 2025 pm 12:44 PM

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

조건 최적화 :`if` 문의 단락 평가 이해 조건 최적화 :`if` 문의 단락 평가 이해 Aug 01, 2025 am 04:33 AM

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

See all articles