Passer des variables à un objet avec une méthode statique

Par TheFlameflo, il y a 9 ans


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, il y a 9 ans

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 });
betaWeb, il y a 9 ans

Salut,

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

TheFlameflo, il y a 9 ans

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 ! :)

quenti77, il y a 9 ans

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

TheFlameflo, il y a 9 ans

Merci, je vais aller voir ! ;)