====== 02 - PHP IV: Depurar aplicaciones ====== Para poder encontrar errores en nuestros archivos PHP tenemos que tener algo de información sobre el error, si no sería casi imposible descubrirlo en miles de líneas de código. Por lo tanto, mientras estamos desarrollando una web tenemos que tener la posibilidad de mostrar los errores en tiempo de ejecución. Sin embargo, cuando nuestra web está en producción puede que no nos interese mostrar esos errores. Si el intérprete PHP encuentra algún fallo, lo mostrará por el navegador y lo podrá ver cualquier usuario que entre en nuestra web. {{ :clase:daw:dws:1eval:depuracion01.png?400 |}} Además, los mensajes de error pueden dar información sobre cómo están codificadas algunas partes de la web, incluso en temas de seguridad, lo cual es mucho más grave que un simple motivo estético. Afortunadamente, podemos habilitar o deshabilitar la función de mostrar errores en función de si el sitio está en desarrollo o en producción. De hecho, muchos hostings tienen deshabilitada la opción de mostrar errores por defecto por los motivos anteriores. Otro problema es cómo descubrir el error con la información que se nos muestra por pantalla. Si estás acostumbrado a programar en Java o C con algún IDE como Netbeans o Eclipse, puede que hayas utilizado algunas de sus útiles opciones de depuración, como //breakpoints//, //watches//… Programando PHP con //Visual Studio Code//, por ejemplo, no tenemos, en principio, ninguna herramienta de depuración para poder usar todas esas opciones. La forma tradicional de depurar en PHP es mostrar por el navegador el valor de las variables mediante las funciones que nos ofrece el lenguaje. La buena noticia es que podemos utilizar herramientas desarrolladas por terceros para instalar extensiones que nos faciliten la mayoría de esas opciones. Una de las más populares es **Xdebug**. ===== Mostrar los errores en el servidor ===== Para poder mostrar los errores de tu web podemos hacerlo de varias formas. Si queremos que sea permanente, podemos editar nuestro archivo //php.ini// y añadir la línea: display_errors = on; De la misma manera, si queremos que PHP no nos muestre los errores cambiaremos la línea anterior por: display_errors = off; Puede ser que tu proveedor de //hosting// no permita modificar el archivo //php.ini//. O puede que quieras mostrar los errores sólo en uno de tus archivos PHP. Para eso, podemos utilizar varias directivas al principio de los archivos PHP para mostrar el nivel que queramos de errores. Una de ellas es [[https://www.php.net/manual/es/function.error-reporting|error_reporting]], donde tenemos varios niveles de reporte de errores. Por ejemplo, si queremos mostrar todos los errores: Si queremos que no se muestre ningún tipo de error (ni //warning//): Otra forma de hacerlo es utilizar la directiva [[https://www.php.net/manual/es/function.ini-set|ini_set]] para establecer los valores de los parámetros de configuración. De esta manera, el navegador nos informará del error aunque la directiva //display_errors// de //php.ini// esté en off. ===== Mostrar el valor de las variables ===== La primera opción que se nos viene a la cabeza para mostrar una variable por pantalla es utilizar //echo// o //print//. Podemos usar cualquiera de las dos para que nos muestre el valor de una variable en un momento dado. $a = 5; echo "La variable a vale: $a
";
Si el error es fácil de localizar, nos pueden valer estas dos funciones. El problema es la forma de mostrar los datos. Vamos a cambiar el tipo de datos de //\$a// a un //array// númerico. $a = array(9,12,34,56,78); echo "La variable a vale: $a
"; {{ :clase:daw:dws:1eval:depuracion01.png?400 |}} Si observamos la salida del navegador, vemos que la única información que nos da sobre la variable es que es un //array//, pero no nos muestra sus valores por ningún lado. Para mostrar los valores de los tipos de datos complejos, tenemos otras dos funciones que nos pueden ser útiles: [[https://www.php.net/manual/es/function.print-r.php|print_r]] y [[https://www.php.net/manual/es/function.var-dump.php|var_dump]]. La función //print_r// imprime información legible para los humanos sobre una variable. $a = array(9,12,34,56,78); print_r ($a); {{ :clase:daw:dws:1eval:depuracion03.png?400 |}} Esta función ya nos muestra los valores del //array//, aunque sigue sin darnos mucha más información y el formato no es muy cómodo. Podemos anidarla con la etiqueta //
// de HTML para mejorar la legibilidad.


$a = array(9,12,34,56,78);
echo "
”;
print_r ($a);
echo "
”;
{{ :clase:daw:dws:1eval:depuracion04.png?400 |}} Si queremos mostrar más información, podemos usar //var_dump//. Además de mostrarnos el valor de la variable, nos muestra el número de elementos del //array// y el tipo de datos de los valores. $a = array(9,12,34,56,78); echo "
”;
var_dump ($a);
echo "
”;
{{ :clase:daw:dws:1eval:depuracion05.png?400 |}} En cualquier caso, tener que escribir tres líneas de código para mostrar el valor de una variable puede ser un tanto engorroso. Aunque hay ocasiones en que mostrar los errores por pantalla se queda cortos a la hora de depurar, sigue siendo uno de los métodos más utilizados para encontrar errores en los ficheros PHP. Existen librerías de terceros que nos facilitan la visualización de las variables en PHP. Una que es muy útil y cómoda de utilizar es [[https://packagist.org/packages/larapack/dd|larapack/dd]], que podemos instalar en nuestros proyectos (es bastante aconsejable) mediante **composer** como veremos en temas posteriores. ===== Xdebug y PHP Debug ===== Otra de las opciones que tenemos para aprovechar la potencia de los depuradores es instalar alguna herramienta implementada por terceros. Una de las más populares a la hora de depurar PHP es [[https://xdebug.org/|Xdebug]] en combinación con algún plugin de //VSC// como [[https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug|PHP Debug]]. Para instalar //Xdebug// basta con ir al apartado [[https://xdebug.org/docs/install|instalación]] de su web y seguir las instrucciones según el sistema operativo que estemos usando. Por su parte, //PHP Debug// se instala como cualquier otra extensión de //VSC//. Pulsamos //CTRL+p// para abrir la barra de búsqueda y añadimos el código para instalar la extensión (también podemos buscarla directamente en el apartado extensiones). Después tendréis que configurar algunos parámetros dependiendo de que servidor HTTP estéis utilizando, sistema operativo, ubicación de vuestras webs… Una vez instalada la extensión, ya podéis utilizar las herramientas propias de un depurador, como //breakpoints//, //watches//… Además, si tenemos instalado //Xdebug//, se modificará el formato en que nos muestra los errores y la forma de visualizar las variables mediante //var_dump//, con lo que no hará falta usar. {{ :clase:daw:dws:1eval:depuracion07.png?400 |}} {{ :clase:daw:dws:1eval:depuracion06.png?400 |}}