PHP_Incomplete_Class

14 Jul 2008

Hoy toca un tema de PHP duro, black metal que dirían algunos. Dándole caña al PHP con los alumnos, hemos encontrado un error de esos que parecen inexplicables, pero que al final tienen explicación. Realmente creo que nunca he encontrado un bug de PHP, al menos un bug bug, ya que esto podría considerarse como, al menos, falta de información útil. No he encontrado nada de esa información útil en castellano, así que vaya, seamos los primeros, allá vamos.

Pues bien, si utilizas la variable $_SESSION para almacenar objetos, y te encuentras al recuperarlo con algo como: Error”__PHP_Incomplete_Class”. Es que ha sucedido un problema en la deserialización, osea, en el proceso de convertir un objeto de una dato binario a algo en memoria, con sus variables, arrays, etc… El tema es que, si cuando la deserialización tiene que ser realizada, el intérprete no sabe de qué tipo de datos es el objeto, no tiene ni idea de cómo hacerlo. Por tanto, esto se soluciona de dos formas:

  1. Mandando todo al garete
  2. Incluyendo la definición de la clase (normalmente a través de un include) ANTES del session_start(). Ten en cuenta que antes de un session_start (o un header) no puede haberse sacado NADA por stdout. Si en el archivo en el que se define la clase se muestra algún carácter (esos echo $query, o espacios antes o después de las etiquetas de php) PHP nos voceará con el tan manido “headers already sent”.

Conclusiones, o conclusions que dirían los ingleses, hoy en día con estos lenguajes interpretados tan maravillosos parece que ellos lo hacen todo por nosotros, pero hay casos en los que o bien no son tan listos como deberían, o les creemos más listos de lo que son. Y sí, quizás PHP ante un proceso de deserialización debería analizar el script a ver si se va a incluir la clase… De cuando en cuando es cuando uno se plantea “¿es PHP un lenguaje poco serio?”. Pues seguramente sí, pero ahí bastante de su gracia.