Bonjour,

J'ai des des class construites sous la forme de singleton.

Je souhaite faire une fonction pour pouvoir les instancier dynamiquement.

Je vous donne des exemples de codes qui seront plus parlant.

// Utilisation d'une fonction d'une de mes class
$test = $this->loadClass('Class1')->une_des_fonctions_de_ma_class_Class1();

// Dans la Class permettant de faire tourner mon application j'ai la fonction loadClass
public function loadClass($class)
{
    $root_class = '\\mon_application\\mes_class\\'.$class;

    return new $root_class::getInstance(); // <-- Code qui ne passe pas
}

Bon forcemment ca ne fonctionne pas, est ce que vous auriez une idée sur l'écriture du code pour que je puisse instancier mes singleton à la volée ?

4 réponses


PLJerem
Auteur
Réponse acceptée

Bonjour yanis-git,

Ces class sont internes à mon application, l'utilisateur n'a aucun moyen de les altérer. Du coup je n'ai pas mis de contrôle sur leur existance.

Je viens de trouver la solution qui est plutot de mon erreur : "new", pas très utile pour des fonctions static...

Du coup, le code suivant fonctionne à merveille :

public function loadClass($class)
{
    $root_class = '\\mon_application\\mes_class\\'.$class;

    return $root_class::getInstance(); // <-- J'ai enlevé le "new"
}

Ton namespace est valide ?

Je te recommande de plutôt faire :

<?php
class Loader{
    public function loadClass($class)
    {
        if(!class_exists($class))
            throw new \Exception('class: '.$class.' doesn\'t exist');

        if(!method_exists($class,'getInstance'))
            throw new \Exception('class : '.$class.' doesn\'t implement getInstance method');
        return new $root_class::getInstance();
    }
}

$test = $this->loadClass(\My\Namespace\Class1::class)->une_des_fonctions_de_ma_class_Class1();
//Ou
use My\Namespace\Class1;
$test = $this->loadClass(Class1::class)->une_des_fonctions_de_ma_class_Class1();

1/ Le contrôle te sert à toi en fait, pour vite te rendre compte si tu as fait une erreur ou non.
2/ Cela permet aussi de rendre dynamique les Namespaces, tu restes pas bloqué à \mon_application\mes_class\ mais à n'importe quel namespace;
3/ Tu gardes la merveilleuse fonctionnalité de "click and go" de ton IDE, un simple contrôle clique sur le paramètre de loadClass te permet d'aller à la classe et pouvoir la modifier si besoin :)

PLJerem
Auteur

Merci pour les conseils.

J'ai pris ton modéle, pour l'instant mon application est assez simple, c'est vrai qu'à force de rajouter des "modules" ca peut s'avérer utile.