¿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?