2010-02-12 26 views
35

¿Cómo se comprueba si existe un include/require_once antes de llamarlo, traté de ponerlo en un bloque de error, pero a PHP no le gustaba eso.Compruebe si existe una inclusión (o requiere)

Creo que file_exists() funcionaría con cierto esfuerzo, sin embargo, eso requeriría toda la ruta del archivo, y una inclusión relativa no se podría pasar fácilmente.

¿Hay alguna otra manera?

+1

¿nos puede mostrar algún código? ¿Básicamente puedes explicar lo que estás tratando de hacer? – JPro

+1

@GZipp: ** Para todos los que están sugiriendo el uso de 'file_exists()': ** * verifica si existe un archivo ** o directorio **. 'is_file()' sería una mejor opción en este caso. –

+1

@Alix Axel: A todos los que me están dirigiendo: no estaba sugiriendo nada más que la suposición de Smickie (que una ruta relativa no puede transformarse fácilmente en una ruta completa) era incorrecta. Otros han señalado que la ruta completa no es necesaria; de ahí mi comentario en lugar de responder. – GZipp

Respuesta

47

Creo file_exists funciona con rutas relativas, aunque también se podría tratar algo en este sentido ...

if([email protected]("script.php")) throw new Exception("Failed to include 'script.php'");

... no hace falta decir, es posible sustituir la excepción para cualquier tratamiento de errores método de su elección. La idea aquí es que la declaración if-verifica si el archivo podría incluirse, y cualquier mensaje de error normalmente emitido por include se suprime con el prefijo @.

+4

file exists works with relatives paths –

+2

No necesita los paréntesis alrededor del valor de argumento de 'include'. 'include' no es una función sino un constructo de lenguaje como' echo'. – Gumbo

+5

@Gumbo Considero que es una buena práctica usar parantheses para construcciones de lenguaje, al igual que hago con 'echo()' y 'print()' también. –

6

file_exists trabajaría para verificar si el archivo requerido existe cuando es relativo al directorio de trabajo actual, ya que funciona bien con rutas relativas. Sin embargo, si el archivo de inclusión estuviera en otro lugar en PATH, tendría que verificar varias rutas.

function include_exists ($fileName){ 
    if (realpath($fileName) == $fileName) { 
     return is_file($fileName); 
    } 
    if (is_file($fileName)){ 
     return true; 
    } 

    $paths = explode(PS, get_include_path()); 
    foreach ($paths as $path) { 
     $rp = substr($path, -1) == DS ? $path.$fileName : $path.DS.$fileName; 
     if (is_file($rp)) { 
      return true; 
     } 
    } 
    return false; 
} 
+1

file_exists no puede buscar en las rutas include. Tendría que analizarlos manualmente. –

+0

@Petr gracias por señalar eso, arreglado. – Yacoby

+1

PS == PATH_SEPARATOR && DS == DIRECTORY_SEPARATOR para quienes se preguntan, +1, con la esperanza de que lo solucionen, esto funciona bien y sin gastos generales de excepción y manejo de errores – mschr

4

file_exists() trabaja con rutas relativas, también comprobará si existen directorios. is_file() utilizar en su lugar:

if (is_file('./path/to/your/file.php')) 
{ 
    require_once('./path/to/your/file.php'); 
} 
+0

Aunque funciona con rutas relativas, no funciona con include paths - - algo a tener en cuenta;) –

7

También puede comprobar que no existen variables, funciones o clases definidas en el archivo de inclusión y ver si la incluyen trabajaban.

if (isset($variable)) { /*code*/ } 

O

if (function_exists('function_name')) { /*code*/ } 

O

if (class_exists('class_name')) { /*code*/ } 
+0

el problema aquí es que si el include no funciona en primer lugar, lanzará y error/advertencia ... –

0

Creo que la forma correcta es hacer:

if(file_exists(stream_resolve_include_path($filepath))){ 
    include $filepath;  
} 

Esto se debe a the documentation dice que stream_resolve_include_path resuelve el "nombre de fichero en contra de la ruta de inclusión de acuerdo con las mismas reglas que fopen()/incluir."

Algunas personas sugirieron utilizar is_file o is_readable pero eso no es el caso para el uso general porque en el uso general, si el archivo está bloqueado o no está disponible por algún motivo después de file_exists devuelve TRUE, eso es algo que necesita notar con un mensaje de error muy feo directamente en la cara del usuario final o de lo contrario está abierto a un comportamiento inesperado e inexplicable más adelante con la posible pérdida de datos y cosas por el estilo.