Diferencia entre "incluir" y "requerir" en php


174

¿Hay alguna diferencia entre ellos? ¿Usarlos es una cuestión de preferencia? ¿Usar uno sobre el otro produce alguna ventaja? ¿Cuál es mejor para la seguridad?



3
Siempre use "requerir". "incluir" es tan conveniente como una puerta eléctrica en una sauna.
Marco Mariani

2
@MarcoMariani ¿Cómo sería eso inconveniente? Probablemente esté claro, simplemente no lo estoy viendo. Tal vez el vapor?
Austin Burk

En pocas palabras, si falta un archivo 'foo.php' por error, quiero saber lo antes posible, no cuándo se llama a una función que debería haber estado en foo.php. Reemplazar include con require a menudo puede revelar errores. Supongamos que falta config.php y la aplicación se ejecuta con una configuración predeterminada. ¿Cuál es mejor para la seguridad? En cuanto a la sauna, cuando estoy dentro y la puerta no se abre por alguna razón, no me gusta.
Marco Mariani

Respuestas:


148

Las diferencias se explican en el manual detallado de PHP en la página derequire :

requirees idéntico a, includeexcepto en caso de falla, también producirá un E_COMPILE_ERRORerror de nivel fatal . En otras palabras, detendrá el script mientras que include solo emite una advertencia ( E_WARNING) que permite que el script continúe.

Ver la respuesta de @ efritz para un ejemplo


66
tiposaurus.co.uk/2011/04/04/… "La diferencia clave entre require () e include () es que si necesita () un archivo que no se puede cargar (por ejemplo, si no está allí), entonces genera un error fatal que detendrá la ejecución de la página por completo y no se generará más salida. Por otro lado, si incluye () un archivo que no se puede cargar, esto simplemente generará una advertencia y continuar construyendo la página ".
stormwild

3
"Lo que debe usar depende de la situación; require () es el más adecuado para cargar archivos que son esenciales para el resto de la página; por ejemplo, si tiene un sitio web basado en una base de datos, entonces use require () para incluir un archivo que contenga el inicio de sesión y la contraseña de la base de datos son claramente preferibles al uso de include (). Si usó include () en esta situación, puede terminar generando más advertencias y errores de los que pretendía ".
stormwild

3
<?php if (isset($flibbertygibbet)) require 'file.php';Parece que esta respuesta parece totalmente incorrecta. De lo contrario, debería recibir un error fatal aunque la condición no sea verdadera. straceno muestra PHP incluso tratando de tocar file.php.
cHao

A diferencia de include (), require () siempre se leerá en el archivo de destino, incluso si la línea en la que se encuentra nunca se ejecuta. Si desea incluir un archivo condicionalmente, use include (). Y, sin embargo, si no se ejecuta la línea en la que se requiere require (), tampoco se ejecutará ninguno de los códigos del archivo de destino. Parece estar diciendo lo contrario, ¿o estoy malentendido?
lorless

1
Todos estos comentarios se refieren a la versión original de esta respuesta antes de que se editara. Originalmente hubo un reclamo no válido, alegando que if (false) require 'file.php';causaría que se cargara 'file.php' (pero no se ejecutara). TLDR ignora todos estos comentarios.
Kevin Wheeler


5

Úselo includesi no le importa que su script continúe sin cargar el archivo (en caso de que no exista, etc.) y pueda (aunque no debería) vivir con un mensaje de error de Advertencia que se muestra.

Usar requiresignifica que su script se detendrá si no puede cargar el archivo especificado y arrojará un error Fatal.


2

Como otros señalaron, la única diferencia es que requieren arrojar un error fatal e incluyen una advertencia atrapable. En cuanto a cuál usar, mi consejo es seguir incluyéndolo. ¿Por qué? porque puede captar una advertencia y generar comentarios significativos para los usuarios finales. Considerar

  // Example 1.
  // users see a standard php error message or a blank screen
  // depending on your display_errors setting
  require 'not_there'; 


  // Example 2.
  // users see a meaningful error message
  try {
      include 'not_there';
  } catch(Exception $e) {
     echo "something strange happened!";
  }

NB: por ejemplo 2 para trabajar, necesita instalar un controlador de errores a excepciones, como se describe aquí http://www.php.net/manual/en/class.errorexception.php

  function exception_error_handler($errno, $errstr, $errfile, $errline ) {
     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
  }
  set_error_handler("exception_error_handler");   

En el nivel de inclusión, no es un gran lugar para aprender que el archivo que espera no está allí. Ninguno de los problemas en su ejemplo es uno para empujar a los visitantes de su sitio web.
Kzqai

0
<?PHP
echo "Firstline";
include('classes/connection.php');
echo "I will run if include but not on Require";
?>

Un ejemplo práctico muy simple con código. Se mostrará el primer eco. No importa si utiliza include o require porque se ejecuta antes de include o required.

Para verificar el resultado, en la segunda línea de un código, proporcione intencionalmente la ruta incorrecta al archivo o cometa un error en el nombre del archivo. Por lo tanto, el segundo eco que se mostrará o no dependerá totalmente de si usa require o include .

Si usa require, el segundo eco no se ejecutará, pero si usa include, no importa qué error aparezca, también verá el resultado del segundo eco.


-2

En caso de que el programa Incluir no termine y muestre una advertencia en el navegador, por otro lado, el programa Requerir terminará y mostrará un error grave en caso de que no se encuentre el archivo.


¿Realmente tuvo que responder una pregunta de 2 años y medio para repetir lo que 2/3 de las respuestas ya han dicho ...?
cHao

44
¡Aww, es un novato! Probablemente todavía no comprende el concepto de SO.
Dan Hanly

usuario pobre2069222, ahora dejó SO: '(
Gagantous
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.