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