Diferencias entre include, require, include_once y require_once

Seguro que esto ya lo sabes, pero todavía me encuentro bastante gente que no entiende bien la diferencia entre estas cuatro funciones.

include y require

En primer lugar vamos a ver la diferencia entre require e include. Es muy sencillo:

  • Si el fichero a incluir no existe include nos lanza un aviso (warning) pero el resto del programa se sigue ejecutando.
  • Si el fichero a incluir no existe require para la ejecución y muestra un error.

Esto se puede ver claramente aquí:

include('no existe');

echo "\nEste texto se va a mostrar";

require('no existe');

echo "\nEste texto no se va a mostrar";

Al ejecutar esto tendríamos los siguientes mensajes:

PHP Warning:  include(no existe): failed to open stream: No such file or directory in /home/gorka/webs/larala/public/prueba.php on line 2
PHP Warning:  include(): Failed opening 'no existe' for inclusion (include_path='.:/usr/share/php') in /home/gorka/webs/larala/public/prueba.php on line 2

Este texto se va a mostrar

PHP Warning:  require(no existe): failed to open stream: No such file or directory in /home/gorka/webs/larala/public/prueba.php on line 6
PHP Fatal error:  require(): Failed opening required 'no existe' (include_path='.:/usr/share/php') in /home/gorka/webs/larala/public/prueba.php on line 6

Podemos ver que el segundo mensaje no se muestra porque se ha producido un error.

¿Y qué hay del _once?

Si usamos las funciones _once (require_once e include_once) haremos que el fichero se añada sólo una vez.

¿Y eso es importante?

Pues sí, es importante. Imagina un archivo llamado funciones.php con el siguiente contenido:

function absurda() {
    echo "Esta es una función realmente absurda";
}

Si hacemos ésto en un fichero:

include("funciones.php");
include("funciones.php");

Vamos a conseguir un error similar a éste:

PHP Fatal error:  Cannot redeclare absurda() (previously declared in /home/gorka/webs/larala/public/funciones.php:4) in /home/gorka/webs/larala/public/funciones.php on line 5

¿Por qué? Porque estamos añadiendo el fichero dos veces y, por tanto, estaremos definiendo la función absurda() dos veces.

¡Qué tontería! ¡Nadie sería tan tonto como para incluir un fichero dos veces seguidas!

Puede que no (o sí) pero es muy probable que te encuentres con usa situación en la que tengas que añadir un fichero en dos sitios diferentes. Podría suceder que un determinado fichero sólo se cargue si se ejecuta cierto código pero en determinadas partes sea imprescindible. Si, en este caso, incluyeras el fichero pero ya estaba incluido tendrás un error.

¿Qué hacer? Para estos casos en donde nos ayuda el include_once. Si modificamos el ejemplo anterior:

include("funciones.php");
include_once("funciones.php");

Veremos que ya no hay error.

Lo mismo sucede con require:

require("funciones.php");
require("funciones.php");

Esto genera un error:

PHP Fatal error:  Cannot redeclare absurda() (previously declared in /home/gorka/webs/larala/public/funciones.php:4) in /home/gorka/webs/larala/public/funciones.php on line 5

Pero si usamos require_once ya no hay error:

require("funciones.php");
require_once("funciones.php");

Valores devueltos

Las funciones _once devuelven TRUE cuando el fichero ya se había incluido:

var_dump(include("funciones.php"));
var_dump(include_once("funciones.php"));

Resultará en:

int(1)
bool(true)

Si el fichero no existiese, además del aviso, la función devolvería FALSE:

var_dump(include_once("no existe.php"));

En este caso tendríamos:

bool(false)

Resumen

  • require() con un fichero que no existe: ¡meeec! ¡Error!
  • include() con un fichero que no existe… aviso.
  • once() nos incluirá el fichero sólo si no se había incluido antes.
Autor:
Nivel: Principiante
Palabras clave:
Fecha publicado:
Fecha actualizado: 10-01-2017

Otros capítulos de la misma serie

Este capítulo es parte de la serie: Trucos PHP.

Y muchos más en preparación.

Disponible en los planes: Laravel hero PHP a tope