Tengo un stack de objetos que pretendo escapar como string, haciendo simplemente un implode(), de tal modo que el casting llame automáticamente a la salida en forma de texto de cada objeto y los junte en una sola cadena.
Todos los objetos del stack son hijos de "Widget", y mi clase Widget tiene un método __toString() que llama a otro método getContent().
Código php:
Ver original
abstract class Rox_Wigdet { public function getContent() { return 'Contenido'; } final public function __toString() { try { return (string) $this->getContent(); } catch ( Rox_Widget_Exception $e ) { } return ''; } }
La idea es que cada widget pueda definir su contenido y que siempre se dibujen de igual manera.
Para prevenir que el contenido del objeto dispare cualquier excepcion, pensé en rodear todo el __toString con un bloque try...catch.
Pensé que estaba todo bien, pero hoy al modificar un widget, tuve un problema que disparó una excepcion, y descubrí que por algún motivo, la excepcion simplemente se saltó el bloque .
Acá hice un ejemplo reproducible:
Código php:
Ver original
<?php class A { public function output() { return ' algo A '; } public function __toString() { try { $out = $this->output(); } catch ( Exception $e ) { $out = $e->getMessage (); } return $out; } } class B extends A { public function output() { return ' algo B '; } } class C extends B { public function output() { throw new Exception('boooooooo!'); return ' algo C '; } } /** Prueba: */ new A(), new B(), new C() );