De l'usage de plxPlugins->getInstance()

Bonjour,

Toujours dans ma traque aux instanciations surnuméraires de certains de mes plugins, j'ai découvert que certains plugins font appel à la méthode plxPlugins->getInstance().

En l'occurrence, voici un petit résultat d'une commande de recherche dans mon répertoire de plugins :
grep "plxPlugins->getInstance" */*.php 
adhesion/form.adherer.html.php:$plxPlugin=$plxMotor->plxPlugins->getInstance('adhesion');
adhesion/form.adhesion.html.php:$plxPlugin = $plxShow->plxMotor->plxPlugins->getInstance('adhesion');
adhesion/form.myaccount.html.php:$plxPlugin = $plxShow->plxMotor->plxPlugins->getInstance('adhesion');
adhesion/form.static_password.php:$plxPlugin=$plxMotor->plxPlugins->getInstance('adhesion');
plxMyContact/form.contact.php:$plxPlugin = $plxShow->plxMotor->plxPlugins->getInstance('plxMyContact');

Après recherche, cela me semble étrange. En effet, la méthode en question créé une nouvelle instance du plugin, alors même que cette instance existe déjà et est accessible dans plxMotor->plxPlugins (sans avoir besoin de la recréer).

A la place d'utiliser
$plxPlugin=$plxMotor->plxPlugins->getInstance($monPlugin);
Ne vaudrait-il mieux pas utiliser :
$plxPlugin=$plxMotor->plxPlugins->aPlugins[$monPlugin];

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager
    Salut

    getInstance() ne créer pas une nouvelle instance mais fait appel à l'instance déjà créée car les objets sont sous forme de singleton.

    avec la ligne suivante, ça fait référence à l'objet qui va permettre d'accéder à toutes ses variables et méthodes publiques
    $plxPlugin=$plxMotor->plxPlugins->getInstance($monPlugin);
    

    tandis que la ligne suivante ne fait référence qu'à un tableau
    $plxPlugin=$plxMotor->plxPlugins->aPlugins[$monPlugin];
    

    D'un point de vue occupation mémoire dans le 1er cas $plxPlugin pointe vers un objet, dans le second on a une copie d'un tableau, ce qui va dédoubler la mémoire le temps de la durée de vie de $plxPlugins

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • mathieumathieu Member
    Stéphane a écrit:
    getInstance() ne créer pas une nouvelle instance mais fait appel à l'instance déjà créée car les objets sont sous forme de singleton.

    dans PluXML 5.3.1 il y a bien la création d'une nouvelle instance avec "new" dans la méthode "getInstance"
    [== PHP ==]
        public function getInstance($plugName) {
            $filename = PLX_PLUGINS.$plugName.'/'.$plugName.'.php';
            if(is_file($filename)) {
                include_once($filename);
                if (class_exists($plugName)) {
                    return new $plugName($this->default_lang);
                }
            }
            return false;
        }
    
  • GariGari Member
    Merci Mathieu, c'est exactement le message que j'allais mettre. pluXml ne gère pas les plugins comme des singletons (dommage d'ailleurs :p).
    Par ailleurs la commande suivante :
    $plxPlugin=$plxMotor->plxPlugins->aPlugins[$monPlugin];
    
    ne fait pas référence à un tableau mais à un enregistrement d'un tableau, en l'occurrence, l'instance du plugin qui a été créer au moment de la création du moteur (la méthode __construct du plxMotor fait appel à plxPlugins->loadPlugins() qui effectue toutes les créations d'instance via la méthode plxPlugins->getInstance() et stocke l'ensemble des instances dans le tableau plxPlugins->aPlugins).
Connectez-vous ou Inscrivez-vous pour répondre.