Autocarga de objetos

Cuando trabajamos con clases, solemos definir una clase en un solo fichero e incluirlo en el script PHP con las funciones **include_once()** o **require_once()** , similar a la programación en Java. El principal inconveniente de usar una clase por fichero es que tendremos que incluir una larga lista de includes-requires necesarios al principio de cada script, uno para cada clase.

Para solventar este problema, a partir de PHP 5 se incluye un método mágico llamado **__autoload()**. Su principal uso consiste en incluir cualquier archivo necesario para crear una instancia de la clase requerida, es decir, en lugar de incluir en la cabecera de un fichero PHP todas las librerías que queremos utilizar, definiremos la función \__autoload() y cada vez que vayamos a crear una instancia de la clase, podremos incluir el fichero correspondiente en el cuerpo de este método.

Cabe destacar que es una función independiente, es decir, se declara fuera de cualquier declaración de clase.

Si la implementamos, se invocará automáticamente al intentar crear una instancia de una clase que no se ha declarado previamente.

Las excepciones lanzadas por la función \__autoload() no se pueden capturar por un bloque try-catch y provocan un error fatal. En sesiones posteriores veremos que son las excepciones y cómo se pueden usar para escribir un código mucho más tolerante a fallos.

Veamos un ejemplo:

<?php
   function __autoload($name) {
      include_once 'includes\class.' . $name . '.php';
   }
   //como vemos se declara como funcion independiente
   $a = new a(); //__autoload(‘a’);
   $a->operacion();
?>

Resultado:

[A->operacion()]
Valor de $atributo es Valor por defecto

Según este ejemplo, al crear una instancia de la clase A, se invocará al método __autoload() y realizará un include_once() de la ruta 'includes\class.a.php' Este método es interesante porque podríamos incluir un directorio de clases con una sencilla instrucción.

A partir de la versión 5.3.0 de PHP se incluyen los "namespaces" que es algo similar a los paquetes/librerías de Java o .Net lo que solucionará todo el problema de tener que incluir ficheros mediante rutas. En una estructura compleja con directorios y subdirectorios puede ser un quebradero de cabecera encontrar la ruta de una clase.

results matching ""

    No results matching ""