PHP orientado a objetos 6: autoload

En esta entrada veremos cómo guardar cada clase en un archivo y no morir en el intento.

hiroshige

archivado en: PHP/AJAX / 17 marzo, 2013 / taller:

Sigo con la serie de PHP orientado a objetos. Como ya he mencionado, salvo algún caso excepcional, lo más limpio es guardar cada clase en un archivo, el cual debe tener el mismo nombre de la clase. Y cuando digo el mismo es el mismo, incluidas las mayúsculas: la clase Mi_Clase_Superchula se guarda en Mi_Clase_Superchula.php.

Y a partir de aquí empieza el jaleo : ).

En teoría, para que las clases puedan interactuar bastaría con incluirlas todas al principio del documento, en el index.php o la página en la que se necesiten, con la función require(), que inserta un archivo dentro de otro. Pero no es tan sencillo, ya que esta solución presenta algunos problemas.

Imaginemos que tenemos el siguiente escenario:

clases

Las flechas muestran una relación de dependencia. En la página solo necesitamos la clase1, aunque esta a su vez necesite otras que necesitan de otras. Si cargamos todas de golpe en index.php, estaríamos incluyendo la clase 6, que no necesitamos, por lo que para optimizar habría que ir viendo página por página qué clases dependen de cuáles. O lo que sería peor aún, ¿qué ocurre si necesitamos una sola clase en otro archivo que no sea index.php? ¿Hay que cargarlas todas de nuevo? En fin, un lío.

Por esta razón y otras que no vienen al caso, es mucho mejor que cada clase sea independiente, totalmente autónoma; lo cual se puede conseguir empleando los require() pertinentes a cada clase en el archivo correspondiente.

Ahora bien, si lo hacemos así tenemos otro problema y es que si tratamos de insertar con require el mismo archivo dos veces nos da error. Así, por ejemplo, en el escenario de antes, se produciría un error si por lo que sea se incluye la clase 5, que llama a la 4, pues esta ya ha sido llamada por la 3.

Solución 1: usar require_once(), que carga el documento solo si no ha sido insertado antes. Así, en el escenario anterior, el archivo clase1.php empezaría así:

<?php

require_once('clase3.php');

class Clase1...

y clase3

<?php

require_once('clase2.php');

require_once('clase4.php');

class Clase3...

Solución 2 (la chula): usar __autoload()

Vale, entonces con require_once() podríamos hacer un apaño, pero qué ocurriría en el siguiente caso: Tenemos 63 clases, de las que solo hemos programado directamente 25, y para un apartadico de la aplicación vamos a añadir otra que hereda de otra que ¿¿¿quién sabe que diantres de relación tiene con las demás???

Y desde estas páginas me comprometo a invitar a un frigopie a quien sea capaz de recordar qué hace y cómo se relaciona cada clase de un sitio web cuando pasan de la decena. Al menos yo, a partir de la segunda  ni lo intento :P.

Entonces, ¿qué hacemos? ¿Cargamos todas las clases en cada clase? No, no es necesario porque tenemos a nuestra disposición una de las funciones más molonguis de PHP: spl_autoload_register().

En esencia, lo que hace es, cada vez que se necesita —por ejemplo al sacar la instancia de una clase (new tal) o al extender una clase—, detectar si la clase ha sido cargada y, en caso contrario, cargarla.

Así, por ejemplo, si hemos guardado las clases en una carpeta llamada class, para despreocuparnos de este jaleo basta con incluir al principio de cada archivo algo como esto:

<?php

spl_autoload_register(function ($clase) {

require_once('../class/'.$clase.'.php');

});

?>

Y, en las clases que están en la misma carpeta, esto otro:

<?php

spl_autoload_register(function ($clase) {

require_once($clase.'.php');

});

?>

|| Tags: ,

valoración de los lectores sobre PHP orientado a objetos 6: autoload

  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • 4.6 sobre 5 (15 votos)

¿Te ha parecido útil o interesante esta entrada?
dormido, valoración 1 nadapensativo, valoración 2 un poco sonrisa, valoración 3 a medias guiño, valoración 4 bastante aplauso, valoración 5 mucho

Tú opinión es muy importante, gracias por compartirla!

4 respuestas a “PHP orientado a objetos 6: autoload