Los ordenadores no poseen inteligencia ni sentido común, se limitan a ejecutar las instrucciones contenidas en el programa. Por ello, los programas no pueden contener errores ni ambigüedades y tienen que tener previstos todas las posibles situaciones.
Algunos errores de programación no pueden ser detectados por los compiladores o intérpretes (por ejemplo, si un programa tiene que calcular una suma y el programador ha escrito una multiplicación en vez de la suma el programa no dará el resultado correcto pero el compilador no puede saberlo), pero otros sí. En esta lección se comentan los errores que detectan los compiladores o intérpretes, avisando al programador o al usuario de su existencia.
Podemos distinguir dos tipos de errores:
Un programa debe estar escrito según las reglas del lenguaje de programación. Si un programa no cumple alguna regla, se dice que el programa tiene un error sintáctico. Estos errores detienen la ejecución de los programas.
Aunque un programa siga las reglas del lenguaje, el intérprete de PHP puede ser incapaz de ejecutar una instrucción determinada. En ese caso, se dice que el programa tiene errores no sintácticos. Dependiendo del error, la ejecución del programa puede detenerse o continuar (aunque seguramente obteniendo resultados distintos a los esperados).
Entre los errores no sintácticos, se pueden distinguir varios tipos de errores:
El intérprete de PHP no es capaz de ejecutar una instrucción determinada, ni continuar con la ejecución del programa.
El intérprete de PHP es incapaz de ejecutar una instrucción determinada, pero puede continuar con la ejecución del programa. En ese caso, se dice que el compilador da advertencias.
Los avisos se producen cuando el intérprete de PHP es capaz de ejecutar una instrucción determinada, pero sospecha que el programador puede haberse equivocado. Los avisos no siempre son señales de equivocaciones, pero deben evitarse.
El intérprete de PHP puede detectar que un programa utiliza características del lenguaje que actualmente funcionan correctamente, pero que no estarán (o pueden no estar) disponibles en futuras versiones, y genera un aviso de obsolescencia.
A continuación se comentan algunos mensajes de error.
Cuando PHP encuentra errores en un programa, PHP puede generar un mensaje de error que se incluye en la página en el punto en que se ha encontrado el error. El error incluye una descripción del error y el número de línea en el que PHP ha encontrado el error, lo que facilita al programador su corrección (el número de línea indica la línea en que PHP se da cuenta de que hay un error, pero el error puede estar en una línea anterior a la indicada por PHP).
La directiva error_reporting del fichero de configuración de PHP php.ini permite establecer qué tipos de error generarán un mensaje de error. Como se comenta en la lección de configuración de PHP:
Antes de ejecutar un programa, PHP analiza el programa en busca de errores sintácticos (llaves, paréntesis o comillas sin cerrar, etc). Un error sintáctico es un error fatal, que detiene el propio análisis y lo único que obtendremos será el mensaje de error. Si un programa contiene varias errores sintácticos, PHP sólo muestra el mensaje de error del primer error. Una vez corregido el primer error, al volver a ejecutar el programa se mostrará el mensaje del segundo error y así sucesivamente hasta corregir todos los errores sintácticos.
Si un programa no contiene errores sintácticos, PHP ejecuta el programa. Durante la ejecución del programa PHP puede encontrar un error que impida la ejecución del resto del programa o encontrarse con un error que no impida la ejecución del programa. En el primer caso, el navegador mostrará el contenido de la página generado hasta el error, el mensaje de error y nada más. En el segundo caso, el navegador mostrará el contenido de la página completo, con el mensaje de error insertado en el lugar en el que se produjo (dependiendo de la estructura de la página, el mensaje de error puede ser visible únicamente en el código fuente).
Por supuesto, que un programa no genere mensajes de error no significa que el programa funcione correctamente, pero si genera mensajes de error probablemente no funcionará correctamente.
Los errores fatales son errores que impiden y detienen la ejecución del programa.
<?php
$numero = 0;
$resultado = 1 / $numero;
print "<p>Resultado: $resultado</p>";
?>
Fatal error: Uncaught DivisionByZeroError: Division by zero in ejemplo.php:3
Stack trace:
#0 {main}
thrown in ejemplo.php on line 3
En este caso, el motivo del aviso es que se intenta realizar un cálculo matemático imposible (dividir entre cero).
<?php
$edad = 18;
print "<p>Edad: " . edad . "</p>\n";
?>
En este caso, el motivo del aviso es que PHP encuentra una palabra (edad) que no es un término del lenguaje, ni una variable (porque no empieza por $) ni una cadena (porque no está entre comillas. PHP genera un aviso y supone que se trata de una cadena, y por eso escribe "edad".
Un programa está formado por las palabras reservadas del lenguaje, cadenas, variables, constantes o funciones, paréntesis, llaves, corchetes, signos de puntuación, operadores, etc, que además deben sucederse en un orden determinado. Los errores sintácticos se producen cuando el compilador no encuentra los símbolos (tokens) esperados o encuentra otros en su lugar.
En el manual de PHP se encuentra la lista de palabras reservadas (keywords), la lista de constantes predefinidas, la lista de clases predefinidas y la lista de tipos de símbolos (tokens).
Cuando encuentra un símbolo no esperado, PHP indica el tipo de símbolo que ha encontrado sin esperarlo.
<?php
print <p>Hola</p>\n
?>
Parse error: syntax error, unexpected '<' in ejemplo.php on line 2
En este caso, el motivo del error es que un trozo de texto debe estar contenido en una cadena (rodeado por comillas simples o dobles) y cuando encuentra el carácter < (que representa el operador matemático de desigualdad), no puede entenderlo como tal.
<?php
primt "<p>Hola</p>\n";
?>
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in ejemplo.php on line 2
En este caso, el motivo del error es que primt no es una palabra reservada del lenguaje ni una función (debería decir print) y cuando a continuación encuentra una cadena no sabe cómo seguir.
<?php
print "<p>Hola</p>\n"
print "<p>Adios</p>\n"
?>
Parse error: syntax error, unexpected T_PRINT in ejemplo.php on line 3
En este caso, el motivo de error es que la primera sentencia no finaliza en punto y coma (;) y no se esperaba el segundo print. Por cierto, la última sentencia de un bloque php puede no finalizar en punto y coma, aunque se recomienda hacerlo.
Los paréntesis, llaves y corchetes deben estar emparejados (por cada signo abierto debe hacer uno cerrado).
<?php
$edad = 15;
if ($edad < 19) {
print "<p>Menor de edad</p>\n";
?>
Parse error: syntax error, unexpected $end in ejemplo.php on line 5
En este caso, el motivo de error es que no se ha cerrado la llave y PHP llega al final del fichero sin haber cerrado el bloque.
<?php
$resultado = 2 * 3 + 4);
print "<p>Resultado: $resultado</p>\n";
?>
Parse error: syntax error, unexpected ')' in ejemplo.php on line 2
En este caso, el motivo de error es que no se ha abierto el paréntesis y PHP no se espera el paréntesis cerrado.
Estos avisos indican que se ha producido un error de algún tipo que no impide la ejecución del resto del programa, aunque seguramente el programa no producirá el resultado esperado.
<?php
print "<p>Edad: $edad</p>\n";
?>
Edad:
En este caso, el motivo del aviso es que se utiliza una variable a la que no se había asignado valor previamente. El programa funciona puesto que PHP le asigna el valor de cadena vacía, pero se desaconseja utilizar variables no establecidas previamente.
<?php
print "<p>Hola</p>\n";
header("Location:index.php");
exit;
?>
Hola
Warning: Cannot modify header information - headers already sent by (output started at ejemplo.php:2) in ejemplo.php on line 3En este caso, el motivo del aviso es que se intenta enviar una cabecera después de haber enviado texto (dependiendo de la configuración de PHP, concretamente de la directiva output_buffering, puede no dar aviso de error).
Los avisos no impiden la ejecución de un programa, aunque seguramente el programa no producirá el resultado esperado.
<?php
function prueba($a = [], $b)
{
}
?>
En este caso, el motivo del aviso es que se ha definido un argumento opcional antes de los obligatorios. Este aviso en concreto se produce desde la versión PHP 8.0.