2009-12-14 6 views
6

Realmente no conseguir la documentación para spl_autoloadPHP spl_autoload

bool spl_autoload_register ([ callback $autoload_function ]) 

de mi comprensión, será tratar de ejecutar funciones registradas cuando PHP se encuentra con una clase que no está cargado ya. por ejemplo,

public function autoload() { 
    require ('nonLoadedClass.php'); 
} 
spl_autoload_register(autoload); 
$x = new nonLoadedClass(); 

¿Habrá que ejecutar el requerimiento? entonces también puedo registrar muchas funciones de autocarga?

public function autoloadXXX() {...} 
public function autoloadYYY() {...} 
public function autoloadZZZ() {...} 
spl_autoload_register('autoloadXXX'); 
spl_autoload_register('autoloadYYY'); 
spl_autoload_register('autoloadZZZ'); 

en el caso de la doctrina,

require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php'); 
spl_autoload_register(array('Doctrine', 'autoload')); 

se pasa una matriz, así que supongo que va a tratar de ejecutar la función de carga automática dentro de la clase Doctrina (que fue necesario)?

Respuesta

16

spl_autoloader_register registra una función/método de devolución de llamada, que se ejecutará cuando el código intente utilizar una clase desconocida.

Una función callback puede ser descrito de varias maneras:

  • un simple nombre de la función: 'my_function'
  • un método estático de una clase: array('MyClass', 'myMethod')
  • un método de una instancia de una clase: array($myObject, 'myMethod')

En el caso de Doctrine, parece ser la segunda solución: si se utiliza una clase que PHP no conoce, la aut oloader llamará al Doctrine::autoload, pasándole el nombre de la clase como parámetro.


así que también pueden registrarse por muchos de autocarga funciones?

Sí, se puede, con spl_autoload_register:

Si debe haber múltiples funciones de carga automática , spl_autoload_register() lo permita. Efectivamente, crea una cola de funciones de autocarga, y se ejecuta en cada una de ellas en el orden que están definidas.

Pero generalmente no se define una función/método de carga automática para cada clase que tenemos; eso sería bastante ineficiente, supongo.

En su lugar, usamos el nombre de clase, que es recibido por la función de carga automática, para decidir qué archivo debe incluirse.

Por ejemplo, una función de carga automática podría tener este aspecto:

function my_autoloader($className) 
{ 
    require LIBRARY_PATH . '/' . $className . '.php'; 
} 

El truco es que si los archivos tienen nombres de las clases que contienen, que inmediatamente se convierte en mucho más fácil ;-)

Este es por qué las clases a menudo se nombran utilizando la convención PEAR: My_Class_Name mapas en el archivo My/Class/Name.php

0

Lo que dicen es correcto. Se llama cuando se crea una instancia de una clase desconocida. Luego tiene la oportunidad de incluir/requerir el archivo necesario.

Cuando la función reside en una clase, debe pasar una matriz. En este caso, es una función estática porque pasan en la clase Doctrine en lugar de una instancia de la clase Doctrine.

1

Su declaración completa es correcta.

spl_autoload_register le permite registrar varias funciones de autocarga. En el caso de que intente crear o utilizar un objeto de una clase que no se haya cargado en el entorno PHP, PHP ejecutará todas sus funciones de autocarga buscando esa clase.

El ejemplo de Doctrine que usted proporciona está utilizando lo que se llama callback para registrar un método dentro de una clase. Una devolución de llamada es simplemente una matriz que contiene el nombre de clase (para métodos estáticos) o una instancia de esa clase (para métodos no estáticos) y el nombre del método.