2012-01-15 9 views
14

Descargo un marco y código y tengo una pregunta con respecto a require y include contra class_exists.Comprensión de clase requerida y existe

En el código de descargo, veo:

require_once('class.php'); 

Así como:

if(class_exists('class') == false) { require('class.php'); } 

consigo require_once significa que sólo 1 hora y existe la clase compruebe si existe la clase.

Mi pregunta es: ¿es la segunda mejor que la primera? ¿y por qué?

+0

En realidad, una perspectiva muy interesante, me sorprende que nunca antes haya visto el segundo uso. – esqew

+1

Vale la pena mencionar que hay mejores formas hoy en día http://php.net/spl-autoload-register – KingCrunch

+2

Supongo que aquí cada archivo representa una y solo una clase? Usted no tiene múltiples clases por archivo? –

Respuesta

9

esta condición:

if(class_exists('class') == false) { require('class.php'); } 

evitar que el require_once a ser llamado.

require_once puede ser lento si tiene muchos archivos que incluye en su proyecto (especialmente marcos) porque tienen que escanear el código para asegurarse de que el archivo no se incluye dos o más veces. así que si tiene más de 25 archivos que incluye y están anidados, require_once tendrá que verificarlos todos.

1

El segundo proporcionaría más protección de la importación de la clase dos veces. El primero importa el archivo de clase una vez, pero si la clase se ha importado de otro archivo por alguna razón, el segundo se dará cuenta de que la clase ya se ha declarado antes y no requiere el archivo de clase.

+0

nota: dos clases con el mismo nombre casi siempre son una mala idea, así que a menos que estés haciendo algo loco, 'require_once' debería estar bien. –

1
  • require_once() única include s un archivo vez.

  • class_exists() comprueba si su clase existe.

Puede definir una clase en varios archivos y require_once() no importa. Tu segundo pedazo lo hará.

5

Como se discutió en otras respuestas, hay diferencias semánticas entre las dos variantes. También en un escenario de alojamiento compartido donde el proveedor de hospedaje no ofrece caché PHP Opcode (APC o equivalente), todos los archivos de código deben leerse y compilarse una vez por solicitud. Aquí el asesino principal no es el tiempo de compilación en sí mismo (~ 0.5M sentencias PHP/seg en un núcleo moderno) sino la sobrecarga de E/S de recopilar los archivos PHP si no están previamente almacenados en la memoria caché del sistema de archivos (10s de I/Os/sec).

En este escenario, si una aplicación requiere un núcleo de, digamos, una docena de módulos para el 90% de las consultas, entonces tiene sentido almacenar en caché un conjunto de estos en un solo archivo de carga masiva. Si se adopta este tipo de solución, colocar un protector class_exists('class') alrededor del archivo de la clase lo hace a prueba de bombas.

también una advertencia: si utiliza una función __autoload() hacer la carga de clases JiT, ser conscientes de que class_exists('fred') se activará la carga automática de fred. Si quieres una sonda débil, entonces necesitas usar el predicado !in_array('fred', get_declared_classes()).

Cuestiones relacionadas