2008-11-05 8 views
7

Tengo varios patrones de fábrica estáticos en mi biblioteca de PHP. Sin embargo, la huella de memoria se está yendo de las manos y queremos reducir la cantidad de archivos necesarios durante el tiempo de ejecución. Aquí está un ejemplo de donde estamos hoy:¿Cuál es la mejor manera de incluir bibliotecas PHP cuando se usa un patrón estático de fábrica?

require_once('Car.php'); 
require_once('Truck.php'); 

abstract class Auto 
{ 
    // ... some stuff ... 

    public static function Create($type) 
    { 
     switch ($type) { 
      case 'Truck': 
       return new Truck(); 
       break; 
      case 'Car': 
      default: 
       return new Car(); 
       break; 
     } 
    } 
} 

Esto no es deseable porque Car.php Y Truck.php tendrán que ser incluidos a pesar de que sólo uno o el otro puede ser necesaria. Por lo que sé, requerir/incluir y su ..._ una vez la variación incluye las bibliotecas en el mismo ámbito que su convocatoria. ¿Es esto cierto?

Si es así, creo que esto llevaría a una pérdida de memoria:

abstract class Auto 
    { 
     // ... some stuff ... 

     public static function Create($type) 
     { 
      switch ($type) { 
       case 'Truck': 
        require_once('Truck.php'); 
        return new Truck(); 
        break; 
       case 'Car': 
       default: 
        require_once('Car.php'); 
        return new Car(); 
        break; 
      } 
     } 
    } 

A mi me parece que en el segundo ejemplo, varias llamadas a Crear() daría lugar a múltiples requiere debido al alcance de la llamada aunque se usa el sabor require_once.

¿Es esto cierto? ¿Cuál es la mejor manera de incluir bibliotecas dinámicamente en php en un ejemplo como este?

Gracias!

Respuesta

7

La instalación de Autoload a menudo se considera mal, pero funciona muy bien en estas tareas.

Si puede obtener un buen sistema de archivos < -> asignación de nombres de clase para que pueda, cuando se le proporcione una clase proporcionar, encontrarlo, entonces le ahorrará gastos generales y solo cargará clases cuando sea necesario.

Funciona también para clases estáticas, por lo que una vez que la clase estática está en alcance, ni siquiera necesita llamar a la prueba "is file yet file" de requerir una vez, porque la clase ya está en la tabla de símbolos.

a continuación, puedes crear

require("autoloader.php"); 
$x = new Car(); 
$x = new Bike(); 

y que sólo traerá en cuando sea necesario.

Ver Php.net/__autoload para más detalles.

+0

¿La carga automática es un azúcar sintáctico que no requiere un alcance local? – thesmart

+0

Cuando el archivo "requerido" contiene definiciones de clase, no hay problema con el alcance local.PHP no admite "clases internas" como Java; todas las clases se definen en el "nivel superior" del espacio de nombres actual. –

2

Yo recomendaría usar el autoloader.

Es decir, no utilice require_once() requerían una subclase, pero permite que el cargador automático para llamar a una función que se puede cargar la clase que se hace referencia cuando se llama new Truck() o new Car().

En cuanto a la pregunta de fuga de memoria, no, require_once no está delimitado por el bloque de código.

0

El punto de la función require_once es que no importa el alcance, no incluirá un archivo dos veces y redefinirá una clase que causa un error de PHP. Así que no se preocupe por las pérdidas de memoria, si se tocó el require_once, la definición de clase va en la tabla de símbolos global solo una vez.

Pero aparte de eso, sí use el autocargador.

Cuestiones relacionadas