Envoyé par
gtraxx
Etant donnée que je dois toujours appelé framework_....., je me demande si je ne peux pas faire en sorte que dans l'autoload je passe directement cette partie de l'instance afin de réduire la chaine.
Donc je pourrai l'appeler dans mon site de cette manière sub_ns_Controller_subcontroller_truc(); sachant que framework_ est pré instanciée automatiquement.
Je ne sais pas si tu me suis
Je pense comprendre ton problème et je t'ai répondu plus haut: ça ne va pas fonctionner.
Si ta "vraie" classe porte le nom de framework_sub_ns_Controller_subcontroller_truc, alors on ne peut pas y faire référence avec un nom plus court du point de vue de php:
$a = new sub_ns_Controller_subcontroller_truc; // pas bon
En interne php maintient une symbols table et si "sub_ns_Controller_subcontroller_truc" n'est pas déjà une classe connue à un instant t, le mécanisme d'autoloading entre en jeu et ce dernier est prié de lui fournir une classe qui porte ce nom exact ou sinon il y a une erreur.
Donc là je me place dans le cadre d'un autoloading avec une convention à la PEAR/Zend: Des classes du genre Zend_Machin_Bidule_Abstract. On doit se trimbaler le prefixe "Zend_". Les symboles doivent être en corrélation.
Cependant, il y aurait une alternative: quelque chose proche d'un Factory. Là on ne va plus utiliser des expressions du style "$a = new Symbole" mais plutôt "$a = getSymbole()". getSymbole() serait une fonction (ou une méthode, peu importe) et c'est à elle qu'incombe la tache d'utiliser l'opérateur new avec le bon nom de classe. Cette indirection serait une solution pour les noms à rallonge, mais personnellement, je trouve que ce serait complètement inapproprié. Pour comprendre, un exemple:
1 2 3 4 5 6 7 8
| // partie librairie
function getTruc() {
// trigger l'autoloading si besoin. pas de prob, tout baigne
return new famework_sub_ns_Controller_subcontroller_truc;
}
// partie userland
$t = getTruc(); |
getTruc() (ou createTruc(), newTruc() etc) s'extirpe complètement de la convention des prefixes sensée apporter un peu de cohérence et d'ordre dans les libraires et les usages. Alors ok, à la place de getTruc(), on pourrait mettre:
1 2 3
| function sub_ns_Controller_subcontroller_truc() {
return new famework_sub_ns_Controller_subcontroller_truc;
} |
Mais ça me parait encore pire...
Partager