Salut !

J'ai un petit problème.

Je souhait créer un autoloader à partir d'une méthode statique.
J'aimerais évite d'instancier l'objet, voici ce que je faisais avant :

J'instancie l'objet avec les paramètres
J'appelle la méthode register()

Voici le code :

namespace Framework;

class Autoloader
{

    private $_namespace;
    private $_path;

    public function __construct($namespace, $path)
    {
        $this->_namespace = $namespace;
        $this->_path = $path;
    }

    public function register()
    {
        spl_autoload_register(array(__CLASS__ , 'loadClass'));
    }

    public function loadClass($class)
    {
        if(preg_match('/^' . $this->_namespace . '/', $class))
        {    
            $namespaceLength = strlen($this->_namespace);
            $class = substr($class, $namespaceLength);
            require $this->_path . '\\' . $class . '.php';
        }
    }
}

Appel de la méthode et instanciation de l'objet :

$autoloader = new Autoloader('MonNamespace', 'lechemin/');
$autoloader->register();

Voici ce que je souhaite faire :

Appel statique de register avec en paramètres le namespace et le chemin

Le code pour le moment :

namespace Framework;

class Autoloader
{

    private $_namespace;
    private $_path;

    public static function register($namespace, $path)
    {    
        // Comment faire en sorte que ces deux variables passent à loadClass ?
        $this->_namespace = $namespace;
        $this->_path = $path;
        spl_autoload_register(array(__CLASS__ , 'loadClass'));
    }

    public function loadClass($class)
    {    
        //Utilisation des variables
        if(preg_match('/^' . $this->_namespace . '/', $class))
        {    
            $namespaceLength = strlen($this->_namespace);
            $class = substr($class, $namespaceLength);
            require $this->_path . '\\' . $class . '.php';
        }
    }
}

Je sais qu'on ne peut pas passer des variables vu que ce n'est pas une instance d'Autoloader, mais j'aimerais savoir comment je pourrais passer les variables malgré tout !

Pouvez-vous m'aider et me guider ?
Merci d'avance à tous !

PS : Je sais que j'ai mis $this dans le code, je sais que ce n'est pas logique vu que ce n'est pas une instance, mais c'est en exemple ! Sourire

5 réponses


Grafikart
Réponse acceptée

Mmh pas très clair mais tu peux faire un callable :


spl_autoload_register(function ($class) use ($namespace, $path) { 
    // Ici tu as accès à $namespace et $path
});

Salut,

Pour quelle raison veux-tu faire cela ? Ca me paraît bizarre, non ?

Salut !

Je vais tester le code de mon côté, ça devrait marcher !
Pour la question : pourquoi ne pas vouloir instancier Autoloader, c'est que j'essaye de faire ça le moins long possible.
Sinon, j'utilisais le premier code que je vous ai donné pour le faire. ;)

Merci à tous pour vos réponses ! :)

Si tu veux un code moins long tu as composer et son autoloader :)

Merci, je vais aller voir ! ;)