Maison  >  Questions et réponses  >  le corps du texte

Puis-je créer un alias pour un espace de noms entier en PHP ?

Puis-je créer des alias d'espace de noms à l'aide des fonctions PHP 8.1 (telles que les noms de catégories) ?

Nous avons nommé le module d'espace de noms par défaut dans la société « Sous-société » et souhaitons qu'il soit désormais « Société » puisque son utilisation s'est étendue.

Une réponse parfaite est d'avoir le moins de surcharge possible et de permettre un chargement automatique transparent. Un problème est que des outils comme Intelephense comprendront cet alias.

Ce projet utilise également Composer, donc la réponse à la réécriture de l'espace de noms en l'utilisant fonctionnera également.

P粉252423906P粉252423906251 Il y a quelques jours336

répondre à tous(1)je répondrai

  • P粉613735289

    P粉6137352892024-01-17 11:10:42

    Oui, et réfléchissez : class_alias a été introduit avec PHP 5.3 avec ses nouvelles fonctionnalités de langage d'espace de noms. Il a été créé pour faciliter la migration d'un espace de noms global vers un espace de noms - en fait entre espaces de noms.

    Cependant, vous devez d'abord enregistrer un nom de classe pour chaque ancienne classe/interface/trait/énumération auprès de la nouvelle contrepartie.

    My\Old\Lib\Name\Module\Submodule\Interface
    My\Tiger\Lib\Name\Module\Submodule\Interface

    L'ancienne bibliothèque a disparu et il y a maintenant une toute nouvelle bibliothèque Tiger. Toutes leurs classes, etc. peuvent être mappées en échangeant les préfixes d'espace de noms ('MyOldLibName' -> 'MyTigerLibName').

    Cela peut être fait au moment de l'exécution car PHP fait la plupart du travail à votre place.

    Enregistrez un chargeur automatique qui se charge en tant que nouveau préfixe d'espace de noms en fonction de l'ancien préfixe d'espace de noms et ajoute le nom de la catégorie à l'ancien nom.

    Exemple :

    spl_autoload_register(
        static function (string $class_name) {
            static $old = 'My\Old\Lib\Name\';
            static $new = 'My\Tiger\Lib\Name\';
    
            // only operate on the old namespace
            if (0 !== strpos($class_name, $old)) {
                return;
            }
            $new_name = substr_replace($class_name, $new, 0, strlen($old));
            class_alias($new_name, $class_name);
            $exists = class_exists($new_name);
        },
        $throw = true,   /* throw when registering fails */
        $prepend = false /* only alias at fall-through */
    );
    

    Ce code est très simple, juste deux explications sur les paramètres d'inscription :

    1. $throw = true : Lorsque le chargeur automatique d'alias ne parvient pas à s'enregistrer, vous souhaitez arrêter l'application immédiatement, sinon vous obtiendrez d'étranges erreurs "classe non trouvée" beaucoup plus tard.
    2. $prepend = false : Le rappel ne doit être appelé que s'il existe encore du code utilisant l'ancien nom de classe. Par conséquent, le code standard vient désormais en premier en utilisant le nouvel espace de noms et le chargement automatique standard.

    Il convient peut-être de noter la partie class_exists() :

            $exists = class_exists($new_name);
    

    Si la nouvelle classe n'est pas encore chargée, elle déclenche le chargement automatique.

    Après avoir enregistré l'autoloader, l'ancien code chargera automatiquement la nouvelle classe sous l'ancien alias.

    use My\Old\Lib\Name\Module\Boring;
    
    $boring = new Boring();
    assert($boring instanceof My\Old\Lib\Name\Module\Boring);
    var_dump(get_class($boring)); # string(31) "My\Tiger\Lib\Name\Module\Boring"
    

    répondre
    0
  • Annulerrépondre