1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.view.abstract">
<title>Zend_View_Abstract</title>
<para>
<classname>Zend_View_Abstract</classname> est la classe de base à partir de laquelle
<classname>Zend_View</classname> est construite ; <classname>Zend_View</classname> elle-même
l'étend simplement et déclare une implémentation concrète de la méthode <methodname>_run()</methodname>
(qui est invoquée par <methodname>render()</methodname>).
</para>
<para>
De nombreux développeurs constatent qu'ils veulent étendre
<classname>Zend_View_Abstract</classname> afin d'ajouter des fonctionnalités
supplémentaires, et inévitablement se trouvent confrontés face à des problèmes avec ce
design, qui inclut un certain nombre de membres privés. Ce document a pour but d'expliquer
les décisions qui ont poussé à ce design.
</para>
<para>
<classname>Zend_View</classname> est une sorte de moteur anti-template dans lequel on
utilise nativement <acronym>PHP</acronym> pour la réalisation du template. Avec comme résultat, tout le <acronym>PHP</acronym> est
disponible, et les scripts de vue héritent de la portée des objets appelants.
</para>
<para>
C'est ce dernier point qui est important dans le choix de la décision de ce design. En
interne, <methodname>Zend_View::_run()</methodname> réalise simplement ceci :
</para>
<programlisting language="php"><![CDATA[
protected function _run()
{
include func_get_arg(0);
}
]]></programlisting>
<para>
Ainsi, les scripts de vue ont accès à l'objet courant(<varname>$this</varname>),
<emphasis>et toute méthode ou membres et cet objet</emphasis>. Puisque beaucoup d'opérations
dépendent de membres ayant une portée limitée, ceci pose un problème : les scrips de vue
peuvent potentiellement faire des appels à ces méthodes ou modifier des propriétés critiques
directement. Imaginer un script surchargeant par inadvertance <varname>$_path</varname> ou
<varname>$_file</varname> - tout appel suivant à <methodname>render()</methodname> ou aux aides de vue sera
cassé !
</para>
<para>
Heureusement, <acronym>PHP</acronym> 5 a une réponse à ceci avec ses déclarations de visibilité : les
membres privés se sont pas accessibles par un objet étendant une classe donnée. Ceci a
permis la conception actuelle : <classname>Zend_View</classname> <emphasis>étend</emphasis>
<classname>Zend_View_Abstract</classname>, les scripts de vues sont ainsi limités aux seuls
méthodes et membres <code>public</code> ou <code>protected</code> de
<classname>Zend_View_Abstract</classname> - limitant effectivement les actions qu'il peut
exécuter, et nous permettant de sécuriser des secteurs critiques d'un risque de modification
par les scripts de vue.
</para>
</sect1>
|