Haciendo un pequeño proyecto en PHP siguiendo el paradigma de la orientación a objetos, hoy me he encontrado con un pequeño problema del que PHP no te avisa.
Bueno, te avisa mostrando la pantalla del navegador totalmente en blanco (no genera ningún HTML) y si lo ejecutas mediante CLI te dice Fallo de segmentación (core dumped). Este es de los errores más bonitos que te pueden ocurrir programando, sobre todo cuando no eres tú el que hizo el software que falló.
Usando un poco el gdb como indican en la documentación de PHP cuando se produce un segfault, he visto que existen varias funciones que siempre se ejecutan en bucle infinito: zend_get_constant_ex(), zval_update_constant_ex() y zval_update_constant().
Como mi aplicación utiliza muchas constantes (no me gusta poner cadenas por el código; cada vez que una cadena se repite la refactorizo a una constante) me dio que pensar y al final (después de bastante rato) descubrí el error. Más o menos, para que lo podáis comprobar, bastaría con ejecutar en Linux el comando php5 -f segfault.php siendo segfault.php el siguiente código:
#!/usr/bin/php5
<?php
class BaseClass {
const THE_CONSTANT = "beosman";
}
class DerivedClass extends BaseClass {
const THE_CONSTANT = self::THE_CONSTANT;
function __construct() {
echo "THE_CONSTANT = ".self::THE_CONSTANT."\n";
}
}
$class = new DerivedClass();
?>
Para más información, estoy usando PHP versión 5.2.1 (Zend Engine v2.2.0) en Ubuntu 7.04 (kernel 2.6.20-17-generic).
Y por si alguien quire fuchicar un rato más porque no se queda agusto, para ejecutar gdb hay que usar el comando gdb php5 y luego, dentro de su propia consola hay que ejecutar el comando run /ruta/al/archivo/php/que/falla.php -e. Una vez que falle, hay que indicarle a gdb que imprima un backtrace mediante el comando bt.






pues en debian. al menos en CLI te avisa:
Fatal error: Cannot declare self-referencing constant ‘self::THE_CONSTANT’ in /home/alberto/segfault.php on line 15
PHP version 5.2.6, asi que supongo que sea que ya está arreglado
A ver si viene mi ordenador nuevo, le pongo Ubuntu 8.10 y ese ya traerá el ultimísimo PHP que supongo ya no fallará, como bien apuntas.
Pero vamos, curioso lo que me ha pasado… sí.