Zend_View_Abstract es la clase base sobre la que se construye
Zend_View; Zend_View en sí simplemente
la extiende y declara una implementación concreta del método
_run() (que es invocado por
render()).
Muchos desarrolladores descubren que quieren extender
Zend_View_Abstract para añadir funcionalidad personalizada, e
inevitablemente se encuentran con problemas debido a su diseño, que incluye una serie de
miembros privados. Este documento pretende explicar la razón detrás del
diseño.
Zend_View es una especie de motor anti-plantillas en el sentido de que
usa PHP de forma nativa para su plantillado. Como resultado, todo
PHP está disponible, y los scripts de vista heredan el ámbito de su
objeto invocador.
Es este último punto el que resulta relevante para las decisiones de diseño.
Internamente, Zend_View::_run() hace lo siguiente:
protected function _run()
{
include func_get_arg(0);
}
Como tal, los scripts de vista tienen acceso al objeto actual
($this), y a cualquier método o miembro de ese
objeto. Dado que muchas operaciones dependen de miembros con
visibilidad limitada, esto plantea un problema: los scripts de vista podrían
potencialmente hacer llamadas a dichos métodos o modificar directamente propiedades
críticas. Imagine un script sobrescribiendo $_path o
$_file por accidente -- ¡cualquier llamada posterior a
render() o a los helpers de vista se rompería!
Afortunadamente, PHP 5 tiene una respuesta a esto con sus
declaraciones de visibilidad: los miembros privados no son accesibles por objetos que extienden una
clase dada. Esto llevó al diseño actual: dado que
Zend_View extiende
Zend_View_Abstract, los scripts de vista quedan así limitados solo a
los métodos y miembros protegidos o públicos de
Zend_View_Abstract -- limitando efectivamente las acciones que puede
realizar, y permitiéndonos proteger áreas críticas del abuso por parte de los scripts de
vista.