← Retour à l'accueil
php refactoring webdev laravel

Structurer vos données en PHP : pourquoi les POPOs surpassent les arrays

Publié le 01/07/2022

Les arrays en PHP sont pratiques, mais souvent imprévisibles. Découvrez comment les POPOs (Plain Old PHP Objects) peuvent rendre votre code plus lisible, typé et maintenable.

Les arrays, c’est bien pratique. On peut y ranger toutes les données qu’on veut, avec ou sans clés, et ça reste une structure incontournable. Mais parfois, cette flexibilité peut devenir un vrai casse-tête : difficile de savoir à quoi s’attendre, et bonjour les erreurs de frappe sur les clés. Heureusement, il existe une solution simple pour y voir plus clair : les POPOs !

Les arrays, c’était avant

Prenons un exemple concret.

Avant, je passais mes données à une méthode sous forme d’array :

class MonObjet
{
    public function bidouille(array $user)
    {
        // toutes ces données dans seulement 4 caractères $user... l'audace, la fougue.
        if ($user["element_super_important_big"] === 93) {
            win();
        }
    }
}

Mais ça, c’était avant. Aujourd’hui, je préfère nommer correctement mes variables et, surtout, utiliser les POPOs pour trimbaler mes données.

Les POPOs : Plain Old PHP Objects

Un POPO, c’est quoi ? Eh non ce n’est pas 💩 en espagnol, c’est l’acronyme de Plain Old PHP Object, qui pourrait se traduire par “Bon Vieil Objet PHP” mais avouez que BVOP c’est pas foufou comme acronyme.

Un POPO est donc un objet PHP qui définit une structure de données claire et prévisible. Inspiré du concept de POJO (Plain Old Java Object) en Java, le POPO permet d’organiser vos données comme un array… mais en mieux !

Avec un POPO, vous bénéficiez de l’autocomplétion de votre IDE préféré, d’une structure de données bien définie et d’une lisibilité accrue. Et tout cela, sans sacrifier la simplicité.

Créer un POPO

Pour construire un POPO, rien de plus simple. On définit une classe qui représente notre structure de données, avec des attributs publics ou des getters. Voici un exemple en PHP 8.1+ :

namespace Rachids\Popo;

class User
{
    public function __construct(
        public readonly string $name,
        public readonly string $email,
        public readonly int $chiffrePrefereEntre_1_et_12430,
    ) {}
}

Avec un tel objet, vous savez exactement ce que contiennent vos données et vous profitez d’une immuabilité garantie grâce au mot-clé readonly. Finis les changements de données imprévus au milieu de votre code !

Exemple pratique

Reprenons notre méthode bidouille :

namespace Rachids\System;

use Rachids\Popo\User;

class MonObjet
{
    public function bidouille(User $userPOPO)
    {
        if ($userPOPO->chiffrePrefereEntre_1_et_100 === 93) {
            win();
        }
    }
}

Là, c’est tout de suite plus clair, non ? (bon ok j’abuse sur le nom des propriétés..)

Ajouter un peu de logique

Les POPOs peuvent aussi contenir de la logique métier simple. Par exemple, on peut ajouter une méthode statique pour créer un objet depuis une requête Laravel :

namespace Rachids\LesPOPOS;

use Illuminate\Support\Facades\Request;

class User
{
    public function __construct(
        public readonly string $name,
        public readonly string $email,
        public readonly int $chiffrePrefereEntre_1_et_100,
    ) {
        // Optionnel : Ajouter une validation ici (ex: lever une exception si l'email est invalide)
    }

    /**
     * Créer un POPO depuis une requête Laravel.
     */
    public static function makeFromRequest(Request $request): self
    {
        return new self(
            name: $request->get('name'),
            email: $request->get('email'),
            chiffrePrefereEntre_1_et_100: $request->get('chiffre', 42)
        );
    }

    /**
     * Est-ce que l'utilisateur aime le 93 ?
     */
    public function isNeufTrois(): bool
    {
        return $this->chiffrePrefereEntre_1_et_100 === 93;
    }
}

Avec cette classe, notre if devient encore plus lisible et facile à tester:

if ($userPOPO->isNeufTrois()) {
    win();
}

Pourquoi adopter les POPOs ?

  • Typage clair : Les paramètres des méthodes acceptent des objets bien définis plutôt que des tableaux mystères.
  • Lisibilité : Votre code “raconte une histoire” plus compréhensible.
  • Centralisation : Ajoutez de la logique (et de la validation) directement dans vos POPOs pour un code plus épuré.

Les POPOs sont un outil puissant pour améliorer la qualité de vos applications PHP. Essayez-les, et vous ne reviendrez plus jamais aux arrays pour structurer vos données complexes !