![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Auto carga de clases en PHP 5
Hola,
Creo haber encontrado una forma más o menos curiosa y elegante (y no tengo abuela) de implementar la función mágica "__autoload()" de PHP 5. Quisiera compartirla con vosotros, y, por supuesto, recibir alguna idea, crítica o sugerencia. Explicaré un poco por encima lo que significa la función "__autoload()" en PHP 5. Lamentaré aburrir a quien ya sepa esto. Anteriormente a la existencia de esta función, cuando uno quería utilizar una clase en PHP, tenía antes que requerir su "script", es decir, el archivo donde se implementara la clase. Esto, que, con dos o tres clases, puede no ser problema alguno, cuando las clases empiezan a ser algunas más, obliga a conformar "ristras" de "requires", cuyos "elementos" además tienen que guardar cierto orden. Es decir, pongamos por caso: Código PHP:
La función "__autoload()" viene a solucionar esta problemática. Se considera una función "mágica", porque, es el propio PHP el encargado de ejecutarla, si es que está implementada, lógicamente. En este caso, PHP ejecutará la función "__autoload()" cada vez que se requiera una clase, es decir: Código PHP:
Ahora bien, aunque la función "__autoload()" es nuestra amiga y quiere ayudarnos, ya he dicho que su implementación depende uno, y que esta se puede llevar a cabo de distintas formas, atendiendo a las necesidades de cada aplicación, evidentemente. Yo quiero hablar ahora sobre la implementación de la función "__autoload()" en el gestor de bitácoras Gesbit, que algunos ya conocéis. En Gesbit sigo la siguiente regla: todas las clases propias se encuentran en un directorio para tal efecto, y, todas las clases de librerías (o bibliotecas) de terceros, se encuentran en subdirectorios del directorio de clases "principal" mencionado. Lo de menos es porqué hago esto, aunque, claro está, la idea subyacente (siempre quise decir esto) se ve como positiva. Lo que nos importa ahora, conociendo lo dicho, es cómo implementar la función "__autoload()" de PHP teniendo esto en cuenta. El asunto pasa por buscar la clase que PHP está requiriendo, pasada como parámetro a la función, intentar encontrar la clase que se necesita, y, de hacerlo, requerirla sin más, para que PHP pueda seguir procesando nuestro "script". Así pues, uno se plantea algo muy similar a lo siguiente: Código PHP:
Pero, fíjate lo que ocurre con las clases de terceros. Al estar cada una de ellas en directorios diferentes, en el código anterior se trataba de encontrar el "script" de la clase en cuestión en todos los directorios posibles. Si se encontraba en alguno de ellos, ya no se miraba más allá, se requería la clase, y aquí paz y después gloria. Pero tiene un inconveniente, al menos. Tal y como lo ves, no cambiaba el código por los "require" de PHP 4, es decir, creo que la idea subyacente (otra vez) no está mal, y que la implementación de la función "__autoload()" puede servir, en un primer momento. De hecho ha servido para Gesbit durante los últimos meses. Ahora bien, ¿qué pasa cuando se han de añadir más clases de terceros? Efectivamente, que la función "__autoload()" crecerá y crecerá, conforme se vayan añadiendo más clases de terceros, cada una de ellas en sus propios directorios. Pues bien. Hoy me volví a plantear el problema, y, aunque no di en principio con una solución, creo que al cabo sí que he conseguido algo que, además de que mantiene el rendimiento del "script" o incluso lo mejora, creo que "escala" mejor. El código en cuestión, es este: Código PHP:
En fin. Una vez que he terminado de escribir esto me parece un poco tonto publicarlo aquí. Puede que incluso lo haga en mi bitácora también. Digo que me parece un poco tonto, porque, visto en perspectiva, la cosa parece bastante clara. Es como si vieras este último código y dijeras, ¡pues claro! ¿Es que no lo hacías así? Pero, evidentemente, no lo hacía así. He mostrado (en el primer bloque de código) cómo lo hacía. Y no sólo eso, sino que podría enlazar a una entrada en la bitácora de Gesbit donde, precisamente, llegué a plantearme una solución mucho más drástica y de la que me hubiera arrepentido: meter todas las clases en un mismo directorio... con el consiguiente lío, puesto que algunas librerías (o bibliotecas) de terceros incorporan más de una clase, y otras pueden incorporar también otros archivos, etc. En definitiva, que, aunque tal vez ahora me parece evidente, quizás alguien pueda encontrar de utilidad este texto. Yo así lo espero. ![]() Última edición por dec fecha: 08-03-2008 a las 05:06:15. |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Los ayudantes de clases (o clases ayudantes), ¿ya se gestaban en Delphi 7? | Al González | OOP | 5 | 12-12-2007 09:03:52 |
EAN 128 Auto Switch ?? | ofillia | Varios | 2 | 02-02-2007 19:07:03 |
Auto completar un edit... | Perio | SQL | 5 | 19-05-2005 03:09:43 |
auto incremento | valentino | MySQL | 1 | 14-02-2005 12:59:33 |
Auto borrado | brandolin | Varios | 6 | 27-09-2003 21:18:37 |
![]() |
|