usar una que propias predefinidas metodos librerias función funciones funcionalidades como php include polymorphism require require-once

una - ¿Cuál es la mejor manera de incluir bibliotecas PHP cuando se usa un patrón de fábrica estático?



php funciones y metodos (4)

Eche un vistazo a la función __autoload () .

Tengo varios patrones de fábrica estáticos en mi biblioteca 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í hay un ejemplo de dónde estamos hoy:

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 es indeseable porque Car.php AND Truck.php deberá incluirse aunque solo sea necesario uno u otro. 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 provocarí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; } } }

Me parece que en el segundo ejemplo, las llamadas múltiples a Create () conducirían a múltiples necesidades debido al alcance de la llamada, aunque se use 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!


El objetivo de la función require_once es que no importa el alcance, no incluirá un archivo dos veces y redefinirá una clase que cause 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 autocargador.


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 nombre de clase para que pueda, cuando se le proporcione una clase proporcionarlo, lo encuentre, entonces le ahorrará gastos generales y solo cargará las clases cuando sea necesario.

También funciona para clases estáticas, por lo que una vez que la clase estática está en el alcance, no necesita llamar siquiera la prueba "is file yet yet" de require one, porque la clase ya está en la tabla de símbolos.

Entonces puedes simplemente crear

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

y solo los traerá cuando sea necesario.

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


Yo recomendaría usar el autocargador .

Es decir, no use require_once() para requerir cualquiera de las subclases, pero permite que el autocargador llame a una función que puede cargar la clase referenciada cuando llame a un new Truck() o un new Car() .

En cuanto a la pregunta de pérdida de memoria, no, require_once no tiene el alcance del bloque de código.