Position actuelle: Accueil> Derniers articles> sprintf et réflexion réalisent le formatage automatique

sprintf et réflexion réalisent le formatage automatique

gitbox 2025-04-28

Dans le développement quotidien, nous utilisons souvent la fonction sprintf pour formater les chaînes, telles que la sortie des nombres avec des décimaux fixes, l'alignement du contenu de sortie, etc. Cependant, si nous pouvons "automatiser" cette logique de formatage, c'est-à-dire le formatage automatiquement à travers la méta-information de l'objet (comme les propriétés et la description du format de la classe), il améliorera considérablement la flexibilité et la maintenabilité des propriétés de la classe.

L'API de réflexion de PHP fournit un mécanisme pour analyser les classes, les propriétés et les méthodes au moment de l'exécution. Combiné avec les capacités de formatage puissantes de SprintF , nous pouvons implémenter un "outil de formatage automatique", qui peut formater et sortir des objets en fonction des annotations ou des conventions de dénomination dans les propriétés de la classe.

Atteindre l'objectif

Nous voulons réaliser les effets suivants:

 $user = new User('Alice', 5, 1234.5678);
echo AutoFormatter::format($user);

Le résultat de sortie est similaire à:

 Name: Alice     | Level: 005 | Balance: $1234.57

Où le format est déterminé par la définition de la classe, plutôt que du codé dur dans la fonction de formatage.

Étape 1: Définissez la classe avec description du format

Nous utilisons les attributs PHP 8 pour ajouter des instructions de formatage aux attributs de la classe.

 #[Attribute]
class Format {
    public function __construct(public string $format) {}
}

class User {
    #[Format('%-10s')] // Gauche aligné,occuper10Peu
    public string $name;

    #[Format('%03d')] // Entier,Reconstituer zéro à3Peu
    public int $level;

    #[Format('$%.2f')] // 保留两Peu小数,Et ajouter le signe du dollar
    public float $balance;

    public function __construct($name, $level, $balance) {
        $this->name = $name;
        $this->level = $level;
        $this->balance = $balance;
    }
}

Étape 2: construire un formateur automatique

Nous utilisons la réflexion pour lire les propriétés, leurs formats correspondants et générer des chaînes formatées.

 class AutoFormatter {
    public static function format(object $obj): string {
        $refClass = new ReflectionClass($obj);
        $values = [];
        $formats = [];

        foreach ($refClass->getProperties() as $prop) {
            $prop->setAccessible(true);
            $value = $prop->getValue($obj);

            $attrs = $prop->getAttributes(Format::class);
            if (!empty($attrs)) {
                $formatAttr = $attrs[0]->newInstance();
                $formats[] = $formatAttr->format;
                $values[] = $value;
            }
        }

        $formatString = implode(' | ', $formats);
        return sprintf($formatString, ...$values);
    }
}

Étape 3: Utiliser la démonstration des effets

 $user = new User('Alice', 5, 1234.5678);
echo AutoFormatter::format($user);
// Sortir:Name: Alice     | Level: 005 | Balance: $1234.57

Si vous souhaitez postuler sur l'interface Web, il vous suffit de retourner le résultat formaté:

 header('Content-Type: text/plain');
echo AutoFormatter::format(new User('Bob', 42, 98765.4321));

Vous pouvez également utiliser ces formats pour la journalisation, le rendu de modèle ou la réponse API. Par exemple:

 file_put_contents('https://gitbox.net/logs/user.log', AutoFormatter::format($user), FILE_APPEND);

résumé

En combinant le sprintf et la réflexion de PHP, nous pouvons extraire la logique de formatage du code d'application pour atteindre des fonctions de formatage automatique hautement découplées et configurables. Cela rend non seulement le code plus élégant, mais offre également une grande commodité pour les changements de format futurs.

Cette méthode convient particulièrement aux scénarios tels que la journalisation, l'exportation et les rapports qui nécessitent une sortie de format unifié.