Categorías: Tutoriales

¿Por qué no debemos usar require_once en PHP? ¿Qué soluciones tengo?

Cuando desarrollamos es muy frecuente que necesitemos leer código de otros ficheros, los lenguajes y las tecnología difieren en la forma, pero es algo básico y común a todos ellos (salvo excepciones). En PHP una forma cómoda de hacerlo es con require_once o include_once.

¿Por qué cómoda? Porque incluimos ficheros sin preocuparnos de si ya han sido incluidos. PHP lo hace por nosotros.

¿Qué problema hay? PHP al buscar si han sido incluidos o no, consume una cantidad de recursos y de tiempo de ejecución que siempre que podamos, debemos ahorrárnoslo.

¿Qué soluciones hay frente a este problema? Voy a detallar algunas de ellas, pero seguro que tú conoces alguna más que te funciona.

Usar un framework o un CMS

Si usas un entorno de este tipo, probablemente él te dote de funciones similares en funcionalidad que esquivan este problema. Por ejemplo en WordPress uso mucho get_template_part.

Indicar mediante define si se ha incluido o no

La idea sería algo así:

if (!defined('MiFichero')) {
    require('MiFichero');
    define('MiFicherp', 1);
}

De esta forma, con esta bandera, ya tenemos siempre presentes si está incluido o no (podemos hacer una función con ese código para reutilizarlo).

Comprobar si existe la clase o la función

Si nuestra intención es insertar un fichero, será porque queremos o mostrar parte de él, o muy probablemente incluir funciones o clases en nuestro espacio de nombres actual. Para evitar problemas con definir dos veces las funciones, podemos hacer comprobaciones del tipo en todo nuestro código:

if (!function_exists('mifuncion')) {
    function mifuncion() { /* la función */}
if (!function_exists('miclase')) {
    function miclase() { /* la clase */}

¿Qué os parecen? ¿Usáis algo mejor o al menos diferente para atajar este problema?

F. Javier Carazo Gil

Cofundador de CODECTION, empresa especializada en WordPress, autor de un libro sobre WordPress (el primero en español) y multitud de artículos (en medios físicos y virtuales) sobre el tema. Participa en la comunidad WordPress de forma activa siendo parte del equipo organizador de la WordPress Meetup de Córdoba, dando charlas en diferentes WordCamp y siendo autor y coautor de multitud de plugins libres y premium para WordPress de gran éxito.

Ver comentarios

  • Es un tema interesante, se suele abusar de los require_once cuando muchas veces basta con organizarse un poco (mentalmente y en el código) para asegurarse de que solo cargas una vez aquello que solo debe ser cargado una vez. En cualquier caso este abuso no suele ser cuello de botella en el rendimiento, salvo que sea muy exagerado, claro. xD

    En el caso de la carga de archivos con clases PHP, el tema de los includes y requires empieza a formar parte del pasado gracias al estándar PSR-0 que aprobó el PHP-FIG (Framework Interop Group). Simplemente es un proceso de autoload basado en namespaces, de forma que al definir un "use SomeNamespaceClass;", carga automáticamente esa clase.

    En mi opinión es MUY interesante informarse sobre el tema porque ya está cambiando bastante todo este asunto. Dejo un par de enlaces sobre PHP-FIG y el PSR-0:
    http://www.php-fig.org/
    https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md

    Un saludo.

    • Gracias por los enlaces, si algo le falta a PHP para mi humilde opinión es un buen IDE propio y un buen sistema de espacio de nombres.

  • bueno tu comentario man yo lo uso,,, por ahora me quedare con el pues mi sistema es totalmente a pie y no uso csm

  • Disculpen, alguien sabe por que al usar requiere_once no se incluye el codigo que tengo en el archivo que quiero incluir, me salen como variables no definidas

  • Hola.. Sobre este tema tengi una duda por un problema con una web que tengo: http://fkr.uvedoble.es . Desde hace unos dias, cuando accedo, aparece lo siguiente:
    Warning: require_once(/homepages/6/d445168402/htdocs/clickandbuilds/fkr/wp-load.php): failed to open stream: Permission denied in /homepages/6/d445168402/htdocs/clickandbuilds/fkr/wp-blog-header.php on line 13

    Fatal error: require_once(): Failed opening required '/homepages/6/d445168402/htdocs/clickandbuilds/fkr/wp-load.php' (include_path='.:/usr/lib/php5.6') in /homepages/6/d445168402/htdocs/clickandbuilds/fkr/wp-blog-header.php on line 13

    Necesito ayuda irgente. Alguien sabría decrme por qué pasa y como solucionarlo? Muchas gracias de antemano y felicidades por la web...

Entradas recientes

432 CVEs

5 días hace

Anti-IA

2 semanas hace

Memoria

3 semanas hace

Mal uso

4 semanas hace

Precio de la RAM

1 mes hace

AUR

1 mes hace