En programación se acostumbra a separar el código en secciones, por ejemplo un archivo de funciones, otro de clases, etc, eso para mantener un orden además de llamar solo a los archivos de funciones o clases que realmente vamos a utilizar en ese momento. ya que cargar todas las opciones, funciones y controles de golpe cuando solo queremos ver una página simple que no usa nada eso es innecesaria y solo utiliza recursos del servidor.
Para anexar código de un archivo a nuestro script disponemos de 4 funciones require_once, require, include, include_once, y su traducción literal seria: requiere_una-vez, require, incluir, incluir_una-vez, así que más o menos imaginarás para que sirven cada una:
require() vs include()
La diferencia es que uno requiere obligatoriamente el archivo y en el otro caso es opcional, el require() te generará un warnings y un error fatal por tanto te detendrá la ejecución del código. mientras que con el include() solo te generará los warnings y tu script continuará, es decir, ese archivo era opcional y no afecta el funcionamiento de tu script.
require_once() vs require() o include_once() vs include()
La diferencia principal es que las versiones _once llaman al archivo 1 sola vez, si más adelante vuelves a invocar la función con el mismo nombre de archivo simplemente ya no lo hará porque el archivo ya lo ha incluido en una línea previa.
el require() y el include() trabajan igual solo que si vuelves a llamarlo en una segunda ocasión lo volverá a incluir el codigo, eso es útil si por ejemplo el archivo que quieres incluir contiene un bloque en HTML que quieres repetir, pero a su vez te puede generar un error si por ejemplo llamar a un archivo con funciones, al llamarlo por segunda vez estarías re-declarando funciones ya existentes o clases.
las versiones _once() son más pesadas y consumen más recursos, hay que utilizarlas sólo cuando sea necesario.