Diferencias entre include, require, include_once y require_once

Buenos, cuando una aprende a programar con php una de las primeras cosas que le enseñan es a cargar archivos con las funciones include, require, include_once y require_once pero a muchos (como a mí) no nos aclaran cuál es la diferencia entre las cuatro.

Por empezar todas tienen el mismo fin, importar un archivo externo, ya sea un .php, .html, .xml, etc. Comencemos:

include

Esta función intentará importar un archivo, ahora bien, puede ser que ese archivo no exista porque lo han borrado o está mal escrito, en ese caso nos devolverá un error de tipo Warning. Esto significa que al no encontrar el archivo habrá una advertencia pero el script continuará. Por ejemplo:

<?php 
 include 'archivo_que_no_existe.php'; 
 echo 'La vida continua'; 
?>

Ahora bien, los tipos de errores independientemente de que sean Notice, Warning o Fatal error no deberían estar. En este caso el include no romperá el script pero más adelante puede pagarse caro. Por ejemplo:

<?php 
 include 'archivo_que_no_existe.php'; 
 funcionQueNuncaSeCargo();
 echo 'La vida continua';
?>

En este caso en la primer línea intenta cargar un archivo donde se supone que existe una función, el archivo no existe, y como se cargó con include no mostrará un Warning, el script sigue, pero en la siguiente línea se intenta llamar a una función que tampoco existe,  ya que se supone que esa función estaba en el archivo. Y ahí sí, CHAU, se rompió el script definitivamente mostrando por pantalla un Fatal error y la última línea nunca se ejecuta.

require

Esta función es más estricta, si el archivo no lo encuentra tira un Fatal error y ahí se rompe el script:

<?php 
 require 'archivo_que_no_existe.php'; 
 echo 'La vida continua';
?>

En este caso en la primer línea se rompe el script y la segunda nunca se ejecuta.

include_once

Hará lo mismo que include, si no encuentra el archivo devolverá un Warning, la única diferencia es que la importación del archivo la hará una vez, aunque el archivo se llame muchas veces. Por ejemplo si hacemos esto:

<?php 
 include 'archivo_externo.php';
 include 'archivo_externo.php';
?>

Esto cargará dos veces y si se llamará a esa función con ese archivo cincuenta veces se cargará cincuenta veces también.

Ahora si usamos include_once:

<?php 
 include_once 'archivo_externo.php';
 include_once 'archivo_externo.php';
?>

En este caso el archivo se cargará en la primer línea, pero la segunda no hará nada, ya que ese archivo con ese nombre ya ha sido cargado previamente en la primer línea.

require_once

En esta caso sucederá lo mismo que include_once, require_once importará un archivo, y se vuelve a llamar a esta función con el mismo archivo no hará nada. Pero al igual que require, de no encontrar el archivo se romperá el script con un Fatal error.

En los cuatros casos si el archivo no es encontrado nos devolverá un error, Warning en el caso de include y include_once y Fatal error en el caso de require y require_once.