Table des matières
Why Replace Nested Ifs?
What Is the Strategy Pattern?
Refactoring with the Strategy Pattern
1. Define the Strategy Interface
2. Create Concrete Strategies
3. Use a Context or Resolver
4. Use It Cleanly
Benefits in Modern PHP
When to Use It
Final Thoughts
Maison développement back-end tutoriel php Remplacement des IF imbriqués par le modèle de stratégie dans PHP moderne

Remplacement des IF imbriqués par le modèle de stratégie dans PHP moderne

Aug 07, 2025 pm 10:44 PM
PHP Nested if Statement

要替换PHP中嵌套的if语句,应使用策略模式,1. 定义策略接口;2. 创建具体策略类;3. 使用上下文类管理策略;4. 通过类型选择并执行对应策略,从而提升代码的可维护性、可测试性和扩展性,最终实现清晰、解耦的设计。

Replacing Nested Ifs with the Strategy Pattern in Modern PHP

When your PHP code starts piling up with deeply nested if or elseif statements—especially when they’re making decisions based on types, statuses, or user roles—it’s a clear sign that your code is becoming harder to read, test, and maintain. One powerful way to clean this up is by replacing those nested conditionals with the Strategy Pattern.

Replacing Nested Ifs with the Strategy Pattern in Modern PHP

Let’s walk through how and why you’d do this in modern PHP.


Why Replace Nested Ifs?

Nested if statements often look like this:

Replacing Nested Ifs with the Strategy Pattern in Modern PHP
function calculateShipping($order) {
    if ($order->type === 'standard') {
        if ($order->weight <= 5) {
            return 5.00;
        } elseif ($order->weight <= 10) {
            return 10.00;
        } else {
            return 15.00;
        }
    } elseif ($order->type === 'express') {
        if ($order->weight <= 5) {
            return 15.00;
        } elseif ($order->weight <= 10) {
            return 25.00;
        } else {
            return 40.00;
        }
    }
    // ... more conditions
}

This gets messy fast. It violates the Open/Closed Principle (OCP), is hard to test, and makes adding new shipping types a chore.

The Strategy Pattern helps by encapsulating each algorithm (or behavior) into its own class, making it easy to swap them in and out.

Replacing Nested Ifs with the Strategy Pattern in Modern PHP

What Is the Strategy Pattern?

The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. The context (e.g., shipping calculator) uses a strategy without knowing the internal details.

In PHP, this typically involves:

  • A strategy interface
  • Multiple concrete strategy classes
  • A context that uses the selected strategy

Refactoring with the Strategy Pattern

1. Define the Strategy Interface

interface ShippingStrategy {
    public function calculate(float $weight): float;
}

2. Create Concrete Strategies

class StandardShipping implements ShippingStrategy {
    public function calculate(float $weight): float {
        return $weight <= 5 ? 5.00 : ($weight <= 10 ? 10.00 : 15.00);
    }
}

class ExpressShipping implements ShippingStrategy {
    public function calculate(float $weight): float {
        return $weight <= 5 ? 15.00 : ($weight <= 10 ? 25.00 : 40.00);
    }
}

You could go further and break down the weight logic into separate strategies or use configuration, but this keeps it simple.

3. Use a Context or Resolver

class ShippingCalculator {
    private array $strategies;

    public function __construct() {
        $this->strategies = [
            'standard' => new StandardShipping(),
            'express'  => new ExpressShipping(),
        ];
    }

    public function calculate(string $type, float $weight): float {
        if (!isset($this->strategies[$type])) {
            throw new InvalidArgumentException("Unknown shipping type: $type");
        }

        return $this->strategies[$type]->calculate($weight);
    }
}

4. Use It Cleanly

$calculator = new ShippingCalculator();
$cost = $calculator->calculate('express', 7); // returns 25.00

No more nested ifs. Just a clean, readable call.


Benefits in Modern PHP

Using the Strategy Pattern in PHP 8+ brings several advantages:

  • Type Safety: With interfaces and strict typing, you catch errors early.
  • Testability: Each strategy can be tested in isolation.
  • Extensibility: Add a new shipping method? Just create a new class and register it.
  • Readability: No more tracing through 10 levels of if/else.
  • Integration with DI: You can inject strategies via dependency injection containers (e.g., in Laravel or Symfony).

For example, in Laravel, you might bind strategies in a service provider:

$this->app->bind(ShippingStrategy::class . '_express', fn() => new ExpressShipping());

Or use a strategy factory with config-driven registration.


When to Use It

Consider the Strategy Pattern when you see:

  • Multiple conditionals based on a type or mode
  • Repeated switch or if-elseif blocks
  • Code that’s hard to test due to branching
  • Business rules that may change or expand

It’s overkill for two simple branches, but shines when you have 3+ variations or expect growth.


Final Thoughts

Replacing nested if statements with the Strategy Pattern leads to code that’s:

  • More maintainable
  • Easier to test
  • Simpler to extend

In modern PHP, with namespaces, autoloading, and strong OOP support, this pattern fits naturally into your architecture.

You don’t need a framework to use it—just a little forethought and a commitment to clean design.

Basically, if your if chain is making you scroll sideways, it’s time to strategize.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1527
276
Architecting Control Flow: Quand utiliser (et éviter) IFS imbriqué en php Architecting Control Flow: Quand utiliser (et éviter) IFS imbriqué en php Jul 31, 2025 pm 12:42 PM

Nestalifstatementsaveacceptable inhppwhentheyreflectlogicalHierarchies, telsguardcauses withclearlyexits, hiérarchicalbusinesslogic, orShalnesting (1–2levels), becausetheyenhanceClarit

Du code flèche au code nettoyant: stratégies pour simplifier les IFS nichés Du code flèche au code nettoyant: stratégies pour simplifier les IFS nichés Jul 30, 2025 am 05:40 AM

Pour éliminer la complexité des instructions imbriquées, vous devez utiliser la clause de garde pour revenir à l'avance, fusionner les expressions conditionnelles, remplacer les branches par des modèles polymorphes ou politiques et utiliser des valeurs de mappage de table de recherche; 1. Utilisez la clause de garde pour traiter les conditions aux limites à l'avance et quitter; 2. Utilisez des opérations logiques pour remplir et des conditions connexes; 3. Utilisez des modèles polymorphes ou politiques pour remplacer les branches de type complexe; 4. Utiliser des dictionnaires et autres structures de données pour remplacer la cartographie conditionnelle simple; En fin de compte, rendre le code plat et linéaire, améliorant la lisibilité et la maintenabilité.

Clauses de garde PHP: l'alternative supérieure aux déclarations imbriquées Clauses de garde PHP: l'alternative supérieure aux déclarations imbriquées Jul 31, 2025 pm 12:45 PM

GuardClauseSaSaEasuperioralterativeToTeShedIfstatementsInphpBecausethereDeduceComplexityByHandling représentent la manière.1) They ImprovereadabilityByyleliminatingDepnesting et greepthemainlogicatthebaseindentationLevel.2)

Apprivoiser la pyramide de Doom: refactoring a imbriqué des déclarations en php Apprivoiser la pyramide de Doom: refactoring a imbriqué des déclarations en php Aug 01, 2025 am 12:33 AM

Pour résoudre le problème de la «pyramide de la mort» causé par des déclarations imbriquées en PHP, les cinq méthodes de reconstruction suivantes doivent être adoptées: 1. Utilisez un retour précoce (GuardClauses) pour aplatir le contrôle des conditions pour éviter une nidification profonde; 2. Extraire les conditions complexes dans une méthode privée avec des noms clairs pour améliorer la lisibilité et la réutilisabilité; 3. Utilisez des objets de vérification ou du mode middleware pour des processus complexes pour obtenir une logique de vérification composable et extensible; 4. Utilisez des opérateurs de fusion ternaires ou vides uniquement dans des scénarios simples pour éviter les expressions ternaires imbriquées; 5. Utilisez des exceptions pour remplacer le retour de la chaîne d'erreur, gérer les erreurs de manière centralisée et garder la logique principale pure. L'objectif ultime est de rendre le code plus sûr, plus facile à tester et plus facile à maintenir par une défaillance rapide, une séparation logique et des modèles de conception appropriés.

IFS imbriqué comme une odeur de code: identifier et rectifier une logique trop complexe IFS imbriqué comme une odeur de code: identifier et rectifier une logique trop complexe Aug 01, 2025 am 07:46 AM

DeeplySpestedIfstatementsreducereadability andinCreaSecognitiveLoad, makecodehardetoDBugandtest.2.EtheyoftenviolatethesingleRespibilityprinpilebycombiningMultipleConcernsinonefunction.3.GuardCauseseswitheredRepleconcenSinLogicAndImproveclanity

Le coût caché: implications de performance des conditions de PHP profondément imbriquées Le coût caché: implications de performance des conditions de PHP profondément imbriquées Jul 30, 2025 am 05:37 AM

DeeplyNestedConditionalsInCreACognitiveLoAdandDebuggingtime, faisant de la codehardetroundère et de la refactation de refactorise de réalisation et de garantie

Gestion et validation des erreurs efficaces avec des structures IF-Else imbriquées Gestion et validation des erreurs efficaces avec des structures IF-Else imbriquées Jul 31, 2025 am 11:59 AM

DeeplyShestedIF-elseblocksreducecoderareadabilité et de même maître

IFS niché contre l'expression de Match: une confrontation PHP moderne IFS niché contre l'expression de Match: une confrontation PHP moderne Aug 05, 2025 pm 02:47 PM

Pour la cartographie de valeur à la valeur, la correspondance doit être utilisée en premier car sa syntaxe est plus concise, le type-sate et les performances sont plus élevées; 2. Lorsque une logique complexe, des conditions multivariées ou des effets secondaires sont impliqués, les instructions imbriquées doivent toujours être utilisées; 3. La correspondance évite la coercition du type par une comparaison stricte et améliore la prévisibilité du code; 4. Dans les scénarios hautes performances, la correspondance est utilisée pour optimiser les tables de sauts en interne, et l'efficacité d'exécution est meilleure que l'IF-Else à longue chaîne; 5. Suggestions finales: utilisez la correspondance pour une correspondance simple, utilisez si pour un flux de contrôle complexe et sélectionnez les outils appropriés en fonction du scénario pour réaliser la lisibilité et la maintenance du code.

See all articles