Pregunta

En mi include_path en el lado del servidor tengo una referencia a un directorio de pera, en '/ usr / share / pera /'. Dentro de mis aplicaciones que incluyen archivos de una biblioteca común, que viven en '/ usr / share / pera / biblioteca /' con require_once 'library/file.php'.

Recientemente he empezado a utilizar el cargador automático spl, me di cuenta en la función de cargador usted tiene que determinar la lógica con la que incluir el archivo. Mi primera forma de hacer esto era tratar de incluir un archivo y suprimir con @ para ver si sería un fracaso, por ejemplo, @include 'library/file.php' sin embargo creo que sobre todo porque he leído mucho sobre @ ser una mala práctica que decidí hacer manualmente el trabajo yo mismo por la explosión de get_include_path por el PATH_SEPARATOR y ver si el directorio es lo que yo quiero que sea, a continuación, haciendo un file_exists e incluyéndola .

Al igual que:

function classLoader( $class ) {
    $paths = explode( PATH_SEPARATOR, get_include_path() );
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
    if ( file_exists( $file) == false ) 
    {
        $exists = false;
        foreach ( $paths as $path ) 
        {
            $tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php';
            if ( file_exists ( $tmp ) ) 
            {
            $exists = true;
            $file = $tmp;
            }
        }
        if ( !$exists ) { return false; }
    }
    include $file;
}

spl_autoload_register('classLoader');

Qué hice el camino equivocado? Debo haber hecho el negocio @include o estoy haciendo algo en la dirección correcta?

¿Fue útil?

Solución

Una cosa que la Habari proyecto cargador automático ¿eso es interesante es caché toda la lista de archivos de clase en la memoria de modo que no está haciendo búsquedas de disco para los archivos cada vez que se solicita una clase.

En esencia, se declara una estática dentro de su __autoload() que contiene una matriz de todos los archivos de clase, indexado por la clase que hará que se carguen. Por ejemplo, el código usaría Dir o glob() para generar esta matriz estática:

$class_files = array(
  'user' => '/var/www/htdocs/system/classes/user.class.php',
);

A continuación, basta con incluir $class_files[$class] para obtener el archivo correcto. Esto es bueno y rápido porque se pone el catálogo desde el disco a la vez, en lugar de generar la lista o la búsqueda de un nombre de archivo específico cada vez se hace referencia a una nueva clase. (Usted se sorprenderá de la cantidad de una diferencia de velocidad que hace.)

Si el nombre de la clase no es una llave en la matriz, puede lanzar una excepción personalizada o generar un / clase simulacro talón de volver. Además, si se echa un vistazo el cargador automático sistema de Habari, verá que implementa Habari __static() en clases que se cargan automáticamente, que es como un constructor de clases estáticas.

include_once() ha de evitarse, y el operador @ no es necesario si usted ha comprobado que el archivo se incluye.

Otros consejos

Yo personalmente sigo el camino utilizando

function autoload($class) {
    /* transform class name into filename ... */
    include $class;
}

incluso sin la @ para facilitar la depuración (errores se cierran / conectado producción)

Usted también puede estar interesado en la discusión relacionada en la lista de desarrolladores de PHP: http: / /marc.info/?t=125787162200003&r=1&w=2

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top