<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - rawsrc</title>
		<link>https://www.developpez.net/forums/blogs/32058-rawsrc/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Tue, 14 Apr 2026 18:27:49 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - rawsrc</title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/</link>
		</image>
		<item>
			<title>PhpEcho Version 2.0.0</title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b9154/phpecho-version-2-0-0/</link>
			<pubDate>Sat, 04 Apr 2020 09:57:21 GMT</pubDate>
			<description>Salut la compagnie, 
 
Dans...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Salut la compagnie,<br />
<br />
Dans le cadre de l'évolution et de l'amélioration du moteur de rendu en une classe, à savoir PhpEcho, j'ai procédé à une importante amélioration en y ajoutant la possibilité de créer et d'utiliser ses propres bouts de code afin de faciliter le rendu et à quelques autres changements dans le fonctionnement.<br />
<br />
<b>Le version 2.0.0 casse la compatibilité avec la version 1.0.0</b><br />
<br />
Tout le principe de fonctionnement reste le même, ce qui change : <br />
- la notation tableau de la version 1 <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$block</span><span class="br0">&#91;</span><span style="color: #FF0000;">'foo'</span><span class="br0">&#93;</span></span> renvoyait la valeur rattachée à la clé <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #FF0000;">'foo'</span></span> sans aucun échappement ; maintenant avec la version 2, la même notation renvoie toujours une valeur échappée pour les tableaux, les scalaires et les classes implémentant <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">__toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span>, pour les autres objets, il sont renvoyés tels quels.<br />
- la notation fonction de la version 1 <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$block</span><span class="br0">&#40;</span><span style="color: #FF0000;">'foo'</span><span class="br0">&#41;</span></span> renvoyait la valeur rattachée à la clé <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #FF0000;">'foo'</span></span> échappée ; maintenant avec la version 2, le notation fonction est uniquement réservée pour l'appel aux différents helpers définis par le développeur.<br />
<br />
Comme les principes de fonctionnement restent les mêmes, je n'ai pas modifié <a href="https://www.developpez.net/forums/blogs/32058-rawsrc/b8215/phpecho-moteur-rendu-php-classe-gouverner/" target="_blank">le billet de blog initial</a> car toutes les explications qu'il contient sont toujours d'actualité.<br />
<br />
Je ne vais m'attarder que sur les nouveautés.<br />
<br />
Voici le projet sur <a href="https://github.com/rawsrc/PhpEcho" target="_blank">GitHub</a>.<br />
<br />
<b><u><font size="3">1 - COURT EXEMPLE</font></u></b><br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$block</span>        = <span style="color: #0000ff;">new</span> PhpEcho<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$block</span><span class="br0">&#91;</span><span style="color: #FF0000;">'foo'</span><span class="br0">&#93;</span> = <span style="color: #FF0000;">'abc &quot; &lt; &gt;'</span>;   <span style="color: #808080;">// stock une cl&eacute;-valeur dans l'instance du bloc</span>
&nbsp;
<span style="color: #808080;">// r&eacute;cup&eacute;ration de la valeur ECHAPP&Eacute;E, par d&eacute;faut, ce qui rentre dans l'instance </span>
<span style="color: #808080;">// ressort &eacute;chapp&eacute; avec htmlspecialchars()</span>
<span style="color: #339933;">$x</span> = <span style="color: #339933;">$block</span><span class="br0">&#91;</span><span style="color: #FF0000;">'foo'</span><span class="br0">&#93;</span>;   <span style="color: #808080;">// $x = 'abc &amp;_quot; &amp;lt; &amp;gt;'</span>
&nbsp;
<span style="color: #808080;">// pour faire un &eacute;chappement &agrave; la demande : notation fonction et appel &agrave; un helper &quot;$hsc&quot;</span>
<span style="color: #339933;">$y</span> = <span style="color: #339933;">$block</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$hsc'</span>, <span style="color: #FF0000;">'une valeur &agrave; &eacute;chapper'</span><span class="br0">&#41;</span>;
&nbsp;
<span style="color: #808080;">// r&eacute;cup&eacute;ration de la valeur non &eacute;chapp&eacute;e : notation fonction et appel &agrave; un helper &quot;$raw&quot;</span>
<span style="color: #339933;">$z</span> = <span style="color: #339933;">$block</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$raw'</span>, <span style="color: #FF0000;">'foo'</span><span class="br0">&#41;</span>; <span style="color: #808080;">// $z = 'abc &quot; &lt; &gt;'</span></pre></td></tr></table></pre>
</div><br />
<b><u><font size="3">2 - BOUTS DE CODES PERSONNALISÉS (HELPERS)</font></u></b><br />
<br />
Vous avez dorénavant avec cette version, la possibilité de demander au moteur d'exécuter vos bouts de code afin de vous aider dans la génération du code de rendu. <br />
Ces bouts de code ne sont ni plus ni moins que des <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Closure</span>.<br />
<b><font color="#0000FF">PhpEcho</font></b> est fourni avec un petit jeu de helpers tous définis dans le fichier : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">stdHelpers.php</span>.<br />
<br />
Il vous est possible d'étendre les helpers définis et/ou d'ajouter les vôtres via un simple fichier comme indiqué dans le constructeur de la classe <b><font color="#0000FF">PhpEcho</font></b> : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">self</span>::addPathToHelperFile<span class="br0">&#40;</span><span style="color: #339933;">__DIR__</span>.DIRECTORY_SEPARATOR.<span style="color: #FF0000;">'stdHelpers.php'</span><span class="br0">&#41;</span>;</span><br />
<ul><li style="">Chaque helper est une <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Closure</span> qui peut renvoyer tout ce que vous voulez</li><li style="">Chaque helper peut être lié à une instance de PhpEcho, ainsi il sera possible d'utiliser <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$this</span>-&gt;</span> dans son code et avoir accès à l'instance d'exécution du bloc courant</li><li style="">Chaque helper peut aussi être une fonction autonome paramétrée</li></ul><br />
À la définition d'un helper il est possible de le paramétrer avec deux constantes : <br />
<ul><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">HELPER_BOUND_TO_CLASS_INSTANCE</span> : pour les helpers qui sont liés à une instance d'un bloc <b><font color="#0000FF">PhpEcho</font></b></li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">HELPER_RETURN_ESCAPED_DATA</span> : pour les helpers qui renvoient du code <u>déjà échappé</u> pour éviter le double échappement</li></ul><br />
<br />
Dans les helpers par défaut, il y en a un qui ne se charge que de comparer 2 valeurs et si elles sont égales, il renvoie <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"> checked</span>.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$checked</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span>, <span style="color: #339933;">$ref</span><span class="br0">&#41;</span> <span style="color: #0000ff;">use</span> <span class="br0">&#40;</span><span style="color: #339933;">$is_scalar</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> &amp;&amp; <span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$ref</span><span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$p</span> === <span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$ref</span><span class="br0">&#41;</span> ? <span style="color: #FF0000;">' checked '</span> : <span style="color: #FF0000;">''</span>;
<span class="br0">&#125;</span>;
<span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">'$checked'</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span><span style="color: #339933;">$checked</span>, HELPER_RETURN_ESCAPED_DATA<span class="br0">&#93;</span>;</pre></td></tr></table></pre>
</div>Cet helper est une fonction autonome (comparaison de 2 valeurs passées en paramètre) et comme la valeur renvoyée est juste <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"> checked</span>, on indique avec le drapeau <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">HELPER_RETURN_ESCAPED_DATA</span> qu'il n'est pas nécessaire de passer la valeur renvoyée à la moulinette d'échappement.<br />
Pour utiliser cet helper dans votre code, rien de plus simple : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$checked'</span>, <span style="color: #FF0000;">'valeur'</span>, <span style="color: #FF0000;">'valeur de r&eacute;f&eacute;rence'</span><span class="br0">&#41;</span></span>.<br />
<br />
Maintenant, regardons le helper en charge de renvoyer les valeurs non échappées au sein d'une instance de <b><font color="#0000FF">PhpEcho</font></b> :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$raw</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$key</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$key</span><span class="br0">&#93;</span> ?? <span style="color: #0080ff;">null</span>;
<span class="br0">&#125;</span>;
<span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">'$raw'</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span><span style="color: #339933;">$raw</span>, HELPER_RETURN_ESCAPED_DATA, HELPER_BINDED_TO_CLASS_INSTANCE<span class="br0">&#93;</span>;</pre></td></tr></table></pre>
</div>Cet helper a besoin de pouvoir accéder à l'instance courante de <b><font color="#0000FF">PhpEcho</font></b> afin d'atteindre la valeur du tableau contenue dans <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$vars</span><span class="br0">&#91;</span><span style="color: #339933;">$key</span><span class="br0">&#93;</span></span>, d'où la présence du drapeau : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">HELPER_BOUND_TO_CLASS_INSTANCE</span>. Par ailleurs, comme tout est automatiquement échappé par <b><font color="#0000FF">PhpEcho</font></b>, on indique au moteur que cette fois ci, l'échappement n'est pas de mise dans la mesure où l'on souhaite récupérer la valeur brut.<br />
<br />
Il existe trois moyens pour définir des helpers : <br />
<br />
<ul><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">&quot;<span style="color: #800000;">$helper</span>'s id&quot;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$helper_closure</span></span></li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">&quot;<span style="color: #800000;">$helper</span>'s id&quot;</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span><span style="color: #339933;">$helper_closure</span>, HELPER_RETURN_ESCAPED_DATA<span class="br0">&#93;</span></span></li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">&quot;<span style="color: #800000;">$helper</span>'s id&quot;</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span><span style="color: #339933;">$helper_closure</span>, HELPER_RETURN_ESCAPED_DATA, HELPER_BINDED_TO_CLASS_INSTANCE<span class="br0">&#93;</span></span></li></ul><br />
<br />
<b><u><font size="3">3 - CODE LA CLASSE</font></u></b><br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br />322<br />323<br />324<br />325<br />326<br />327<br />328<br />329<br />330<br />331<br />332<br />333<br />334<br />335<br />336<br />337<br />338<br />339<br />340<br />341<br />342<br />343<br />344<br />345<br />346<br />347<br />348<br />349<br />350<br />351<br />352<br />353<br />354<br />355<br />356<br />357<br />358<br />359<br />360<br />361<br />362<br />363<br />364<br />365<br />366<br />367<br />368<br />369<br />370<br />371<br />372<br />373<br />374<br />375<br />376<br />377<br />378<br />379<br />380<br />381<br />382<br />383<br />384<br />385<br />386<br />387<br />388<br />389<br />390<br />391<br />392<br />393<br />394<br />395<br />396<br />397<br />398<br />399<br />400<br />401<br />402<br />403<br />404<br />405<br />406<br />407<br />408<br />409<br />410<br />411<br />412<br />413<br />414<br />415<br />416<br />417<br />418<br />419<br />420<br />421<br />422<br />423<br />424<br />425<br />426<br />427<br />428<br />429<br />430<br />431<br />432<br />433<br />434<br />435<br />436<br />437<br />438<br />439<br />440<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">namespace</span> rawsrc\PhpEcho;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">use</span> ArrayAccess;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> ! defined<span class="br0">&#40;</span><span style="color: #FF0000;">'HELPER_BOUND_TO_CLASS_INSTANCE'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    define<span class="br0">&#40;</span><span style="color: #FF0000;">'HELPER_BOUND_TO_CLASS_INSTANCE'</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> ! defined<span class="br0">&#40;</span><span style="color: #FF0000;">'HELPER_RETURN_ESCAPED_DATA'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    define<span class="br0">&#40;</span><span style="color: #FF0000;">'HELPER_RETURN_ESCAPED_DATA'</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* PhpEcho : PHP Template engine : One class to rule them all ;-)</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link        https://www.developpez.net/forums/blogs/32058-rawsrc/b9154/phpecho-version-2-0-0/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @author      rawsrc - https://www.developpez.net/forums/u32058/rawsrc/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @copyright   MIT License</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              Copyright (c) 2020 rawsrc</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              Permission is hereby granted, free of charge, to any person obtaining a copy</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              of this software and associated documentation files (the &quot;Software&quot;), to deal</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              in the Software without restriction, including without limitation the rights</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              copies of the Software, and to permit persons to whom the Software is</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              furnished to do so, subject to the following conditions:</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              The above copyright notice and this permission notice shall be included in all</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              copies or substantial portions of the Software.</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              SOFTWARE.</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @method mixed  raw($p)       Return the raw value from a PhpEcho block</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @method mixed  hsc($p)       Escape the value in parameter (scalar, array, stringifyable)</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @method bool   isScalar($p)</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @method string selected($p, $ref)    Return &quot; selected &quot; if $p == $ref</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @method string checked($p, $ref)     Return &quot; checked &quot;  if $p == $ref</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> PhpEcho</span>
<span style="color: black;"><span style="color: #0000ff;">implements</span> ArrayAccess</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$id</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$vars</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Full resolved filepath to the external view file</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$file</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$code</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array [helper's id =&gt; bound closure]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$bound_helpers</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed  $file   see setFile() below</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array  $vars</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $id     if empty then auto-generated</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span><span style="color: #339933;">$file</span> = <span style="color: #FF0000;">''</span>, <span style="color: #0000ff;">array</span> <span style="color: #339933;">$vars</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$id</span> = <span style="color: #FF0000;">''</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$file</span> !== <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;setFile<span class="br0">&#40;</span><span style="color: #339933;">$file</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$id</span> === <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;generateId<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;id = <span style="color: #339933;">$id</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;vars = <span style="color: #339933;">$vars</span>;</span>
<span style="color: black;">        <span style="color: #0080ff;">self</span>::addPathToHelperFile<span class="br0">&#40;</span><span style="color: #339933;">__DIR__</span>.DIRECTORY_SEPARATOR.<span style="color: #FF0000;">'stdHelpers.php'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $id</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setId<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$id</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;id = <span style="color: #339933;">$id</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> id<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;id;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Generate an unique execution id based on random_bytes()</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Always start with a letter</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> generateId<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;id = chr<span class="br0">&#40;</span>mt_rand<span class="br0">&#40;</span><span style="color: #cc66cc;">97</span>, <span style="color: #cc66cc;">122</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.bin2hex<span class="br0">&#40;</span>random_bytes<span class="br0">&#40;</span><span style="color: #cc66cc;">4</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetExists<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> array_key_exists<span class="br0">&#40;</span><span style="color: #339933;">$offset</span>, <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Return escaped value for</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *     - scalars</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *     - array (escape keys and values)</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *     - stringifyable instance (class implementing __toString() method)</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * If object: return the object</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed|null</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetGet<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$v</span> = <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_array<span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span> || <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$is_scalar'</span>, <span style="color: #339933;">$v</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$hsc'</span>, <span style="color: #339933;">$v</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span>is_object<span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$v</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $value</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetSet<span class="br0">&#40;</span><span style="color: #339933;">$offset</span>, <span style="color: #339933;">$value</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span> = <span style="color: #339933;">$value</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetUnset<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">unset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Define the filepath to the external view file to include</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Rule R001 : Any space inside a name will be automatically converted to DIRECTORY_SEPARATOR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * For strings : $parts = 'www user view login.php';</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www/user/view/login.php&quot;  if DIRECTORY_SEPARATOR = '/'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www\user\view\login.php&quot;  if DIRECTORY_SEPARATOR = '\'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * For arrays, same rule (R001) for all values inside : $parts = ['www/user', 'view login.php'];</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www/user/view/login.php&quot;  if DIRECTORY_SEPARATOR = '/'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www/user\view\login.php&quot;  if DIRECTORY_SEPARATOR = '\'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * File inclusion remove the inline code</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $parts string|array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setFile<span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$file</span>  = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$parts</span> = is_string<span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#41;</span> ? explode<span class="br0">&#40;</span><span style="color: #FF0000;">' '</span>, <span style="color: #339933;">$parts</span><span class="br0">&#41;</span> : <span style="color: #339933;">$parts</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$parts</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$file</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = str_replace<span class="br0">&#40;</span><span style="color: #FF0000;">' '</span>, DIRECTORY_SEPARATOR, <span style="color: #339933;">$p</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;file = str_replace<span class="br0">&#40;</span>DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR, implode<span class="br0">&#40;</span>DIRECTORY_SEPARATOR, <span style="color: #339933;">$file</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;code = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Instead on including an external file, use inline code for the view</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * CAREFUL : when you use inline code with dynamic values from the array $vars, you must</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * be absolutely sure that the values are already defined before, otherwise you will only have empty strings</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Inline code remove the included file</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $code</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setCode<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$code</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;code = <span style="color: #339933;">$code</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;file = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * This function call a helper defined elsewhere or dynamically</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Auto-escape if necessary</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $helper</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array  $args</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$helper</span>, ...<span style="color: #339933;">$args</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$helper</span> !== <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::isHelper<span class="br0">&#40;</span><span style="color: #339933;">$helper</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;bound_helpers<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$this</span>-&gt;bound_helpers = <span style="color: #0080ff;">self</span>::bindHelpersTo<span class="br0">&#40;</span><span style="color: #339933;">$this</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">                <span style="color: #339933;">$escaped</span> = <span style="color: #0080ff;">self</span>::isHelperOfType<span class="br0">&#40;</span><span style="color: #339933;">$helper</span>, HELPER_RETURN_ESCAPED_DATA<span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$helpers</span> = <span style="color: #339933;">$this</span>-&gt;bound_helpers + <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$helper</span>  = <span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #339933;">$helper</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$result</span>  = <span style="color: #339933;">$helper</span><span class="br0">&#40;</span>...<span style="color: #339933;">$args</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #808080;">// being in a HTML context: in any case, the returned data should be escaped</span></span>
<span style="color: black;">                <span style="color: #808080;">// if you don't want so, use the specific helper '$raw'</span></span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$escaped</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$result</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$hsc'</span>, <span style="color: #339933;">$result</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param $name</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param $arguments</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__call</span><span class="br0">&#40;</span><span style="color: #339933;">$name</span>, <span style="color: #339933;">$arguments</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::isHelper<span class="br0">&#40;</span><span style="color: #339933;">$name</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;<span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span style="color: #339933;">$name</span>, ...<span style="color: #339933;">$arguments</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::isHelper<span class="br0">&#40;</span><span style="color: #FF0000;">'$'</span>.<span style="color: #339933;">$name</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;<span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$'</span>.<span style="color: #339933;">$name</span>, ...<span style="color: #339933;">$arguments</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Magic method that returns a string instead of current instance of the class in a string context</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;file !== <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> &amp;&amp; is_file<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;file<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            ob_start<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">include</span> <span style="color: #339933;">$this</span>-&gt;file;</span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> ob_get_clean<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;code;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">//region HELPER ZONE</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array  [name =&gt; closure]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #339933;">$helpers</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array  [path to the helpers file to include]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #339933;">$helpers_file_path</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array [helper's name =&gt; [type]]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #339933;">$helpers_types</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array   [helpers filepath to inject]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #339933;">$helpers_file_to_inject</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string   $name</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param \Closure $closure</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param int      ...$types  HELPER_RETURN_ESCAPED_DATA HELPER_BOUND_TO_CLASS_INSTANCE</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> addHelper<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$name</span>, \Closure <span style="color: #339933;">$closure</span>, <span style="color: #0080ff;">int</span> ...<span style="color: #339933;">$types</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #339933;">$name</span><span class="br0">&#93;</span> = <span style="color: #339933;">$closure</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$types</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$t</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers_types</span><span class="br0">&#91;</span><span style="color: #339933;">$name</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$t</span>; <span style="color: #808080;">// HELPER_BOUND_TO_CLASS_INSTANCE HELPER_RETURN_ESCAPED_DATA</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array $helpers [name =&gt; Closure | name =&gt; [Closure, ...type]]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> addHelpers<span class="br0">&#40;</span><span style="color: #0000ff;">array</span> <span style="color: #339933;">$helpers</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$helpers</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$name</span> =&gt; <span style="color: #339933;">$h</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$h</span> <span style="color: #0000ff;">instanceof</span> \Closure<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #339933;">$name</span><span class="br0">&#93;</span> = <span style="color: #339933;">$h</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span>is_array<span class="br0">&#40;</span><span style="color: #339933;">$h</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0080ff;">self</span>::addHelper<span class="br0">&#40;</span><span style="color: #339933;">$name</span>, array_shift<span class="br0">&#40;</span><span style="color: #339933;">$h</span><span class="br0">&#41;</span>, ...<span style="color: #339933;">$h</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array [name =&gt; closure]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> helpers<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Path to the file that contains helpers closure definition</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * The helpers are common to all instances and will be included only once</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string ...$path</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> addPathToHelperFile<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> ...<span style="color: #339933;">$path</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$path</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> ! <span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers_file_path</span><span class="br0">&#91;</span><span style="color: #339933;">$p</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers_file_path</span><span class="br0">&#91;</span><span style="color: #339933;">$p</span><span class="br0">&#93;</span>    = <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">                <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers_file_to_inject</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$p</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Read the paths and inject only once all the helpers</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> injectHelpers<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers_file_to_inject</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$path</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_file<span class="br0">&#40;</span><span style="color: #339933;">$path</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0080ff;">self</span>::addHelpers<span class="br0">&#40;</span><span style="color: #0000ff;">include</span> <span style="color: #339933;">$path</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers_file_to_inject</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  string   $helper_name</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array    [int]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> getHelperTypes<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$helper_name</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers_types</span><span class="br0">&#91;</span><span style="color: #339933;">$helper_name</span><span class="br0">&#93;</span> ?? <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  string $helper_name</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> isHelper<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$helper_name</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #339933;">$helper_name</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0080ff;">self</span>::injectHelpers<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #339933;">$helper_name</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Check if the helper has the defined type</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  string $helper_name</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  int    $type</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> isHelperOfType<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$helper_name</span>, <span style="color: #0080ff;">int</span> <span style="color: #339933;">$type</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers_types</span><span class="br0">&#91;</span><span style="color: #339933;">$helper_name</span><span class="br0">&#93;</span><span class="br0">&#41;</span></span>
<span style="color: black;">            ? in_array<span class="br0">&#40;</span><span style="color: #339933;">$type</span>, <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers_types</span><span class="br0">&#91;</span><span style="color: #339933;">$helper_name</span><span class="br0">&#93;</span><span class="br0">&#41;</span></span>
<span style="color: black;">            : <span style="color: #0080ff;">false</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  array $type      array of types [type]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  bool  $strict    when match, check if the helper has only the asked types</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array            [helper's name =&gt; closure]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> getHelpersByType<span class="br0">&#40;</span><span style="color: #0000ff;">array</span> <span style="color: #339933;">$type</span>, <span style="color: #0080ff;">bool</span> <span style="color: #339933;">$strict</span> = <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$data</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers_types</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$name</span> =&gt; <span style="color: #339933;">$v</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$intersect</span> = array_intersect<span class="br0">&#40;</span><span style="color: #339933;">$type</span>, <span style="color: #339933;">$v</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span> ! <span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$intersect</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span>count<span class="br0">&#40;</span><span style="color: #339933;">$type</span><span class="br0">&#41;</span> === count<span class="br0">&#40;</span><span style="color: #339933;">$intersect</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$strict</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">if</span>  <span class="br0">&#40;</span>count<span class="br0">&#40;</span><span style="color: #339933;">$type</span><span class="br0">&#41;</span> === count<span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                        <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #339933;">$name</span><span class="br0">&#93;</span> = <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #339933;">$name</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">                    <span class="br0">&#125;</span></span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #339933;">$name</span><span class="br0">&#93;</span> = <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #339933;">$name</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$data</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Change the helper's binding context to the given one in parameter</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Only for helpers bound to a class instance</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param object $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array        [helper's id =&gt; bound closure]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> bindHelpersTo<span class="br0">&#40;</span><span style="color: #0080ff;">object</span> <span style="color: #339933;">$p</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$helpers</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::getHelpersByType<span class="br0">&#40;</span><span class="br0">&#91;</span>HELPER_BOUND_TO_CLASS_INSTANCE<span class="br0">&#93;</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$name</span> =&gt; <span style="color: #339933;">$hlp</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #339933;">$name</span><span class="br0">&#93;</span> = <span style="color: #339933;">$hlp</span>-&gt;bindTo<span class="br0">&#40;</span><span style="color: #339933;">$p</span>, <span style="color: #339933;">$p</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$helpers</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;">    <span style="color: #808080;">//endregion</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// make the class directly available on the global namespace</span></span>
<span style="color: black;">class_alias<span class="br0">&#40;</span><span style="color: #FF0000;">'rawsrc\PhpEcho\PhpEcho'</span>, <span style="color: #FF0000;">'PhpEcho'</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;</span></pre></td></tr></table></pre>
</div><br />
<b><u><font size="3">4 - CODE DU FICHIER AVEC LES HELPERS DE BASE : stdHelpers.php</font></u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #339933;">$helpers</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Return the raw value from the key in parameter</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* CAREFUL : THIS VALUE IS NOT ESCAPED</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* This helper is linked to an instance of PhpEcho</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @param string $key</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @return mixed|null</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #339933;">$raw</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$key</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$key</span><span class="br0">&#93;</span> ?? <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">'$raw'</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span><span style="color: #339933;">$raw</span>, HELPER_BOUND_TO_CLASS_INSTANCE, HELPER_RETURN_ESCAPED_DATA<span class="br0">&#93;</span>;</span>
&nbsp;
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* This is a standalone helper</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @param $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #339933;">$is_scalar</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">return</span> is_scalar<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span>is_object<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> &amp;&amp; method_exists<span class="br0">&#40;</span><span style="color: #339933;">$p</span>, <span style="color: #FF0000;">'__toString'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">'$is_scalar'</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span><span style="color: #339933;">$is_scalar</span>, HELPER_RETURN_ESCAPED_DATA<span class="br0">&#93;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">'isScalar'</span><span class="br0">&#93;</span>   = <span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">'$is_scalar'</span><span class="br0">&#93;</span>; <span style="color: #808080;">// alias for method call</span></span>
&nbsp;
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Return an array of escaped values with htmlspecialchars(ENT_QUOTES, 'utf-8') for both keys and values</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Works for scalar and array type and transform any object having __toString() function implemented to a escaped string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Otherwise, keep the object as it</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* This is a standalone helper that is not directly accessible</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Use instead the common helper '$hsc' which is compatible with arrays</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @param  array $part</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @return array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #339933;">$hsc_array</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #0000ff;">array</span> <span style="color: #339933;">$part</span><span class="br0">&#41;</span> <span style="color: #0000ff;">use</span> <span class="br0">&#40;</span>&amp;<span style="color: #339933;">$hsc_array</span>, <span style="color: #339933;">$is_scalar</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #339933;">$data</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$part</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$k</span> =&gt; <span style="color: #339933;">$v</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$sk</span> = htmlspecialchars<span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$k</span>, ENT_QUOTES, <span style="color: #FF0000;">'utf-8'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_array<span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #339933;">$sk</span><span class="br0">&#93;</span> = <span style="color: #339933;">$hsc_array</span><span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #339933;">$sk</span><span class="br0">&#93;</span> = htmlspecialchars<span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$v</span>, ENT_QUOTES, <span style="color: #FF0000;">'utf-8'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #339933;">$sk</span><span class="br0">&#93;</span> = <span style="color: #339933;">$v</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$data</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span>;</span>
&nbsp;
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* This is a standalone helper</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @param  $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @return mixed</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #339933;">$hsc</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> <span style="color: #0000ff;">use</span> <span class="br0">&#40;</span><span style="color: #339933;">$hsc_array</span>, <span style="color: #339933;">$is_scalar</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> htmlspecialchars<span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$p</span>, ENT_QUOTES, <span style="color: #FF0000;">'utf-8'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span>is_array<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$hsc_array</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">'$hsc'</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span><span style="color: #339933;">$hsc</span>, HELPER_RETURN_ESCAPED_DATA<span class="br0">&#93;</span>;</span>
&nbsp;
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Return the html attribute &quot;selected&quot; if $p == $ref</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* This is a standalone helper</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @param $p        value to check</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @param $ref      selected value ref</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #339933;">$selected</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span>, <span style="color: #339933;">$ref</span><span class="br0">&#41;</span> <span style="color: #0000ff;">use</span> <span class="br0">&#40;</span><span style="color: #339933;">$is_scalar</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> &amp;&amp; <span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$ref</span><span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$p</span> === <span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$ref</span><span class="br0">&#41;</span> ? <span style="color: #FF0000;">' selected '</span> : <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">'$selected'</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span><span style="color: #339933;">$selected</span>, HELPER_RETURN_ESCAPED_DATA<span class="br0">&#93;</span>;</span>
&nbsp;
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Return the html attribute &quot;checked&quot; if $p == $ref</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* This is a standalone helper</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @param $p        value to check</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @param $ref      checked value ref</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #339933;">$checked</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span>, <span style="color: #339933;">$ref</span><span class="br0">&#41;</span> <span style="color: #0000ff;">use</span> <span class="br0">&#40;</span><span style="color: #339933;">$is_scalar</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> &amp;&amp; <span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$ref</span><span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$p</span> === <span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$ref</span><span class="br0">&#41;</span> ? <span style="color: #FF0000;">' checked '</span> : <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$helpers</span><span class="br0">&#91;</span><span style="color: #FF0000;">'$checked'</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span><span style="color: #339933;">$checked</span>, HELPER_RETURN_ESCAPED_DATA<span class="br0">&#93;</span>;</span>
&nbsp;
&nbsp;
<span style="color: black;"><span style="color: #808080;">// return the array of helpers to PhpEcho</span></span>
<span style="color: black;"><span style="color: #0000ff;">return</span> <span style="color: #339933;">$helpers</span>;</span></pre></td></tr></table></pre>
</div><br />
<b><u><font size="3">5 - CONCLUSION</font></u></b><br />
<br />
J'espère qu'avec cette évolution majeur de <b><font color="#0000FF">PhpEcho</font></b>, il vous sera possible dorénavant de produire plus facilement vos codes web.<br />
Si vous codez des helpers sympas, n'hésitez pas à les partager avec les membres de DVP.<br />
<br />
Juste pour finir, voici la version du tuto du précédent billet compatible avec <b><font color="#0000FF">PhpEcho</font></b> v.2.0.0 : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Layout.php</span><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    <span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= implode<span class="br0">&#40;</span><span style="color: #FF0000;">''</span>, <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$raw'</span>, <span style="color: #FF0000;">'meta'</span><span class="br0">&#41;</span> ?? <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>
    &lt;title&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'title'</span><span class="br0">&#93;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$raw'</span>, <span style="color: #FF0000;">'body'</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></pre>
</div>à comparer avec la version compatible <b><font color="#0000FF">PhpEcho</font></b> v.1.0.0<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    <span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= implode<span class="br0">&#40;</span><span style="color: #FF0000;">''</span>, <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'meta'</span><span class="br0">&#93;</span> ?? <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>
    &lt;title&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'title'</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'body'</span><span class="br0">&#93;</span> <span style="color: #0080ff;">?&gt;</span></span>
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></pre>
</div><br />
Bon code à tous :ccool:<br />
<br />
<b>rawsrc</b></blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b9154/phpecho-version-2-0-0/</guid>
		</item>
		<item>
			<title><![CDATA[PDOPlusPlus (PPP) : une nouvelle façon d'utiliser PDO]]></title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b9083/pdoplusplus-ppp-nouvelle-facon-d-utiliser-pdo/</link>
			<pubDate>Sat, 21 Mar 2020 13:01:51 GMT</pubDate>
			<description>Salut les codeurs, 
 
Ce...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Salut les codeurs,<br />
<br />
Ce billet me trottait dans la tête depuis un certain bout de temps. J'ai pu enfin trouver du temps pour le mettre noir sur blanc.<br />
Dans cet épisode, on va s'intéresser à PHP et plus particulièrement à la manière et aux outils à disposition pour interagir avec une base de données.<br />
Je vais principalement m'attarder au sous-ensemble limité à <b>PDO : PHP Data Object</b> qui est vaste et assez touffu quand un débarque pour la première fois dans le monde du PHP.<br />
Si vous aimez la lecture, <a href="https://www.php.net/manual/fr/book.pdo.php" target="_blank">la documentation officielle</a> est très bien faite et abondante.<br />
<br />
<u><b><font size="3">1 - INTRODUCTION</font></b></u><br />
<br />
L'objectif de cet billet est de vous expliquer et de mettre à disposition une classe et une seule qui va encapsuler de manière totalement autonome, la complexité de PDO.<br />
Le but pour vous sera juste de produire du SQL de manière la plus naturelle qui soit c'est-à-dire, une simple chaîne SQL banale. Vous allez voir que c'est faisable et qu'il est possible de laisser les méandres de PDO de côté. L'outil va se charger des échappements, de l'injection des données, des tags de la remontée des résultats, bref, de tout ce qu'un développeur a besoin au quotidien.<br />
<b>Bref, le but ultime c'est que vous n'ayez plus besoin d'utiliser les <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">prepare<span class="br0">&#40;</span><span class="br0">&#41;</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">bindValue<span class="br0">&#40;</span><span class="br0">&#41;</span></span> ou autre <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">bindParam<span class="br0">&#40;</span><span class="br0">&#41;</span></span> tout en continuant à utiliser PDO nativement.</b><br />
<br />
Comme dans mes billets précédents, j'ai toujours privilégié une approche objet des mes outils et comme vous pouvez d'ores-et-déjà vous l'imaginer, je ne vais pas déroger à la règle. Comme PDO est déjà un ensemble de classes, il est tout naturel d'imaginer que l'outil qui va encapsuler cet ensemble de classes soit lui aussi une classe.<br />
<br />
Je vais vous mettre à disposition ce que l'on appelle communément un : <b>PDO Wrapper</b>.<br />
Si vous cherchez sur le net, vous allez en trouver des tas, mais pas comme celui-ci. Du moins je n'en ai pas trouvé d'équivalent. À priori c'est une création originale.<br />
Si par hasard, vous tombez sur un exemplaire antérieur s'approchant, je vous invite à me faire passer l'info.<br />
Dans le cadre de la mise à jour de mes outils de développement, j'en profite pour libérer certains :ccool:<br />
<br />
Ceux qui me suivent sur DVP depuis un certain temps doivent savoir maintenant que j'ai une tendance minimaliste assez forte. Je ne suis pas partisan d'outils qui nécessitent 80 classes voire plus pour fonctionner. J'aime :heart: la légèreté :heart: et privilégie l'utilisation poussée des fonctionnalités du langage à un empilement plus ou moins touffu de code.<br />
<br />
Je vais vous démontrer qu'il est tout à fait possible d'avoir à disposition une seule et unique classe qui fera de PDO un jeu d'enfant et ne vous laissera sur les bras que l'écriture du SQL :D, comme d'antan.<br />
<br />
Voici le projet sur <a href="https://github.com/rawsrc/PDOPlusPlus" target="_blank">mon espace GitHub</a>.<br />
<br />
<u><b><font size="3">2 - OBJECTIF</font></b></u><br />
<br />
Produire une classe, qui encapsulera toute la machinerie de PDO et qui nous offrira la possibilité de faire simplement les 4 opérations élémentaires (CRUD) en plus des appels aux procédures stockées et à la gestion intégrale des transactions :  <br />
<ul><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">CREATE</span></span></li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">READ</span></span> ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">SELECT</span></span></li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">UPDATE</span></span></li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">DELETE</span></span></li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">CALL</span> pour les procédures stockées</li><li style="">Transactions</li></ul><br />
L'utilité majeur c'est de mettre à plat de manière unifiée les appels à PDO.<br />
<br />
Pour les procédures stockées, cet outil offre une gestion complète de :<br />
<ul><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">IN</span></span> param</li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">OUT</span></span> param</li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">INOUT</span></span> param</li><li style="">renvoie de plusieurs jeux de données en une seule fois</li><li style="">toutes les options mélangées...</li></ul><br />
<br />
<u><b><font size="3">3 - RAPPELS SUR PDO</font></b></u><br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">PDO</span> est un ensemble de classes qui permet d'abstraire et d'unifier les appels à une base de données.<br />
Par unification, il faut bien comprendre la puissance de l'approche objet : quelle que soient les moteurs de bases de données attaquées, le développeur PHP ne manipulera que l'objet <b><font color="#0000FF">PDO qui sera l'unique interface de communication entre son code et la base de données</font></b>. L'énorme avantage pour le développeur c'est que les petites ou grosses différences entre chaque moteur de base de données lui sont totalement étrangères, lui il ne voit et ne manipule que PDO.<br />
<br />
PDO vous permet d'attaquer une base de données de manière sécurisée. C'est-à-dire qu'il offre nativement un mécanisme d'échappement des caractères pouvant avoir un sens spécifique à chaque moteur de base de données. Pour que cela fonctionne de manière optimale, il faut qu'il soit connecté à la base afin d'adapter correctement les échappements. <br />
<br />
PDO offre 2 mécanismes de sécurisation des données : <br />
<br />
<img src="https://www.developpez.net/forums/attachments/p547566d1584718570/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/winsock-envoi-recuperation-d-image/2020-03-20_163331.png/" border="0" alt="Nom : 2020-03-20_163331.png
Affichages : 17588
Taille : 51,2 Ko"  style="float: CONFIG" /><br />
<br />
Une fois la connexion établie, il est possible d'échapper directement les données avec <a href="https://www.php.net/manual/fr/pdo.quote.php" target="_blank"><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">PDO::quote<span class="br0">&#40;</span><span class="br0">&#41;</span></span></a>. Cette fonction échappe les caractères spécifiques à la base de données et renvoie la valeur entourée de guillemets.<br />
Il faut bien noter que les seuls caractères pouvant être &quot;dangereux&quot; sont ceux des chaînes de caractères. <br />
Pour ce qui est des valeurs numériques, une fois que le développeur s'est assuré de la conformité au type attendu, la valeur ne présente plus aucun danger et n'a pas besoin d'échappement, un casting explicite est suffisant. N'oubliez pas que tout échappement a un coût.<br />
<br />
Le mécanisme de préparation est plus complexe mais il offre des avantages en contrepartie. Il fonctionne en deux étapes : la première consiste a présenter au serveur une chaîne SQL en bonne et due forme dans laquelle le développeur aura pris soin de remplacer toutes les valeurs dynamiques par des tags inoffensifs comme par exemple : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">:nom</span> ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">:prenom</span>. Et dans un second temps à l'exécution de la requête soit il injecte les valeurs sous forme de tableau (<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span class="br0">&#91;</span>:tag =&gt; valeur<span class="br0">&#93;</span></span>) et dans ce cas, toutes les valeurs sont considérées comme du texte, soit il les rattache une par une avec <a href="https://www.php.net/manual/fr/pdostatement.bindvalue.php" target="_blank"><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">bindValue<span class="br0">&#40;</span>:tag, valeur, type<span class="br0">&#41;</span></span></a> ou <a href="https://www.php.net/manual/fr/pdostatement.bindparam.php" target="_blank"><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">bindParam<span class="br0">&#40;</span>:tag, valeur, type<span class="br0">&#41;</span></span></a>. Dans les deux derniers cas, il est possible de définir le type de chaque variable selon la liste définie à cette page <a href="https://www.php.net/manual/fr/pdo.constants.php" target="_blank"><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">PDO::PARAM_xxx</span></a>. Notez qu'il existe une légère différence entre <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">bindValue<span class="br0">&#40;</span><span class="br0">&#41;</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">bindParam<span class="br0">&#40;</span><span class="br0">&#41;</span></span> au niveau du passage des valeurs : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">bindValue<span class="br0">&#40;</span><span class="br0">&#41;</span></span> les passe par valeur alors que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">bindParam<span class="br0">&#40;</span><span class="br0">&#41;</span></span> par référence. <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">bindParam<span class="br0">&#40;</span><span class="br0">&#41;</span></span> est indiquée dans les cas où la même requête doit être exécutée plusieurs fois d'affilée. Comme par exemple dans l'insertion de plusieurs jeux de données (nous reverrons ce point un peu plus loin).<br />
Enfin, l'autre avantage du mécanisme de préparation, c'est la mise en cache par le serveur de la requête SQL pour la session en cours. Ainsi, si la même requête est représentée au cours de la même session, elle sera exécutée un poil plus vite. <br />
<u>Attention :</u> bien que le mécanisme de préparation soit performant, il arrive dans certains cas de requête complexe où l'injection des valeurs rattachées aux tags pose problème, il faudra se rabattre sur un échappement SQL direct qui lui passe quelle que soit la chaîne SQL à traîter.<br />
<br />
<b><font color="#0000FF">L'échappement des données est obligatoire et n'est pas une chose triviale.</font></b> Vous allez trouver sur le net des fonctions d'échappement de données qui vous évitent d'avoir une connexion ouverte avec la base de données, manipulez les avec moult précautions. Comme les encodages maintenant sont quasiment tous en multioctets  (utf8, utf8mb4...), si vous faites un loupé dans la gestion des encodages entre le PHP et votre SGBDR, vous vous exposez à des attaques basées sur les encodages. Donc, par précaution et pour la sécurité de vos développements, je vous invite à toujours privilégier et utiliser les outils natifs fournis par votre environnement.<br />
<br />
<br />
<b><u><font size="3">4 - SUPPORT PRATIQUE</font></u></b><br />
<br />
Tout au long de cet billet, je vais me servir d'un support pratique très simple afin de faciliter le passage des nouveaux concepts.<br />
Je vais utiliser une base de données <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">db_pdo_plus_plus</span> contenant une seule et unique table <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">t_video</span> permettant le suivi d'une mini vidéothèque dont voici la DDL (Data Definition Language) : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">OR</span> <span style="color: #0000ff;">REPLACE</span> <span style="color: #0000ff;">TABLE</span> db_pdo_plus_plus.t_video
<span class="br0">&#40;</span>
    video_id            <span style="color: #0000ff;">int</span> <span style="color: #0000ff;">auto_increment</span> <span style="color: #0000ff;">primary</span> <span style="color: #0000ff;">key</span>,
    video_title         <span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">255</span><span class="br0">&#41;</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>,
    video_support       <span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">30</span><span class="br0">&#41;</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span> comment <span style="color: #FF0000;">'DVD DIVX BLU-RAY'</span>,
    video_multilingual  <span style="color: #0000ff;">tinyint</span><span class="br0">&#40;</span><span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span style="color: #0000ff;">default</span> <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>,
    video_chapter       <span style="color: #0000ff;">int</span> <span style="color: #0000ff;">null</span>,
    video_year          <span style="color: #0000ff;">int</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>,
    video_summary       <span style="color: #0000ff;">text</span> <span style="color: #0000ff;">null</span>,
    video_stock         <span style="color: #0000ff;">int</span> <span style="color: #0000ff;">default</span> <span style="color: #cc66cc;">0</span>
<span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
<br />
<b><u><font size="3">5 - CODE DE LA CLASSE : PDOPlusPlus alias PPP pour PHP 7+</font></u></b><br />
<br />
Voici le code de la classe qui encapsule totalement PDO. Les explications et comment l'utiliser viennent juste après à travers quelques cas pratiques : <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br />322<br />323<br />324<br />325<br />326<br />327<br />328<br />329<br />330<br />331<br />332<br />333<br />334<br />335<br />336<br />337<br />338<br />339<br />340<br />341<br />342<br />343<br />344<br />345<br />346<br />347<br />348<br />349<br />350<br />351<br />352<br />353<br />354<br />355<br />356<br />357<br />358<br />359<br />360<br />361<br />362<br />363<br />364<br />365<br />366<br />367<br />368<br />369<br />370<br />371<br />372<br />373<br />374<br />375<br />376<br />377<br />378<br />379<br />380<br />381<br />382<br />383<br />384<br />385<br />386<br />387<br />388<br />389<br />390<br />391<br />392<br />393<br />394<br />395<br />396<br />397<br />398<br />399<br />400<br />401<br />402<br />403<br />404<br />405<br />406<br />407<br />408<br />409<br />410<br />411<br />412<br />413<br />414<br />415<br />416<br />417<br />418<br />419<br />420<br />421<br />422<br />423<br />424<br />425<br />426<br />427<br />428<br />429<br />430<br />431<br />432<br />433<br />434<br />435<br />436<br />437<br />438<br />439<br />440<br />441<br />442<br />443<br />444<br />445<br />446<br />447<br />448<br />449<br />450<br />451<br />452<br />453<br />454<br />455<br />456<br />457<br />458<br />459<br />460<br />461<br />462<br />463<br />464<br />465<br />466<br />467<br />468<br />469<br />470<br />471<br />472<br />473<br />474<br />475<br />476<br />477<br />478<br />479<br />480<br />481<br />482<br />483<br />484<br />485<br />486<br />487<br />488<br />489<br />490<br />491<br />492<br />493<br />494<br />495<br />496<br />497<br />498<br />499<br />500<br />501<br />502<br />503<br />504<br />505<br />506<br />507<br />508<br />509<br />510<br />511<br />512<br />513<br />514<br />515<br />516<br />517<br />518<br />519<br />520<br />521<br />522<br />523<br />524<br />525<br />526<br />527<br />528<br />529<br />530<br />531<br />532<br />533<br />534<br />535<br />536<br />537<br />538<br />539<br />540<br />541<br />542<br />543<br />544<br />545<br />546<br />547<br />548<br />549<br />550<br />551<br />552<br />553<br />554<br />555<br />556<br />557<br />558<br />559<br />560<br />561<br />562<br />563<br />564<br />565<br />566<br />567<br />568<br />569<br />570<br />571<br />572<br />573<br />574<br />575<br />576<br />577<br />578<br />579<br />580<br />581<br />582<br />583<br />584<br />585<br />586<br />587<br />588<br />589<br />590<br />591<br />592<br />593<br />594<br />595<br />596<br />597<br />598<br />599<br />600<br />601<br />602<br />603<br />604<br />605<br />606<br />607<br />608<br />609<br />610<br />611<br />612<br />613<br />614<br />615<br />616<br />617<br />618<br />619<br />620<br />621<br />622<br />623<br />624<br />625<br />626<br />627<br />628<br />629<br />630<br />631<br />632<br />633<br />634<br />635<br />636<br />637<br />638<br />639<br />640<br />641<br />642<br />643<br />644<br />645<br />646<br />647<br />648<br />649<br />650<br />651<br />652<br />653<br />654<br />655<br />656<br />657<br />658<br />659<br />660<br />661<br />662<br />663<br />664<br />665<br />666<br />667<br />668<br />669<br />670<br />671<br />672<br />673<br />674<br />675<br />676<br />677<br />678<br />679<br />680<br />681<br />682<br />683<br />684<br />685<br />686<br />687<br />688<br />689<br />690<br />691<br />692<br />693<br />694<br />695<br />696<br />697<br />698<br />699<br />700<br />701<br />702<br />703<br />704<br />705<br />706<br />707<br />708<br />709<br />710<br />711<br />712<br />713<br />714<br />715<br />716<br />717<br />718<br />719<br />720<br />721<br />722<br />723<br />724<br />725<br />726<br />727<br />728<br />729<br />730<br />731<br />732<br />733<br />734<br />735<br />736<br />737<br />738<br />739<br />740<br />741<br />742<br />743<br />744<br />745<br />746<br />747<br />748<br />749<br />750<br />751<br />752<br />753<br />754<br />755<br />756<br />757<br />758<br />759<br />760<br />761<br />762<br />763<br />764<br />765<br />766<br />767<br />768<br />769<br />770<br />771<br />772<br />773<br />774<br />775<br />776<br />777<br />778<br />779<br />780<br />781<br />782<br />783<br />784<br />785<br />786<br />787<br />788<br />789<br />790<br />791<br />792<br />793<br />794<br />795<br />796<br />797<br />798<br />799<br />800<br />801<br />802<br />803<br />804<br />805<br />806<br />807<br />808<br />809<br />810<br />811<br />812<br />813<br />814<br />815<br />816<br />817<br />818<br />819<br />820<br />821<br />822<br />823<br />824<br />825<br />826<br />827<br />828<br />829<br />830<br />831<br />832<br />833<br />834<br />835<br />836<br />837<br />838<br />839<br />840<br />841<br />842<br />843<br />844<br />845<br />846<br />847<br />848<br />849<br />850<br />851<br />852<br />853<br />854<br />855<br />856<br />857<br />858<br />859<br />860<br />861<br />862<br />863<br />864<br />865<br />866<br />867<br />868<br />869<br />870<br />871<br />872<br />873<br />874<br />875<br />876<br />877<br />878<br />879<br />880<br />881<br />882<br />883<br />884<br />885<br />886<br />887<br />888<br />889<br />890<br />891<br />892<br />893<br />894<br />895<br />896<br />897<br />898<br />899<br />900<br />901<br />902<br />903<br />904<br />905<br />906<br />907<br />908<br />909<br />910<br />911<br />912<br />913<br />914<br />915<br />916<br />917<br />918<br />919<br />920<br />921<br />922<br />923<br />924<br />925<br />926<br />927<br />928<br />929<br />930<br />931<br />932<br />933<br />934<br />935<br />936<br />937<br />938<br />939<br />940<br />941<br />942<br />943<br />944<br />945<br />946<br />947<br />948<br />949<br />950<br />951<br />952<br />953<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">namespace</span> rawsrc\PDOPlusPlus;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">use</span> BadMethodCallException;</span>
<span style="color: black;"><span style="color: #0000ff;">use</span> Exception;</span>
<span style="color: black;"><span style="color: #0000ff;">use</span> PDO;</span>
<span style="color: black;"><span style="color: #0000ff;">use</span> PDOStatement;</span>
<span style="color: black;"><span style="color: #0000ff;">use</span> TypeError;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* PDOPlusPlus : A PHP Full Object PDO Wrapper with a new revolutionary fluid SQL syntax</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link        https://www.developpez.net/forums/blogs/32058-rawsrc/b9083/pdoplusplus-nouvelle-facon-dutiliser-pdo/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link        https://github.com/rawsrc/PDOPlusPlus</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @author      rawsrc - https://www.developpez.net/forums/u32058/rawsrc/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @copyright   MIT License</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              Copyright (c) 2020 rawsrc</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              Permission is hereby granted, free of charge, to any person obtaining a copy</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              of this software and associated documentation files (the &quot;Software&quot;), to deal</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              in the Software without restriction, including without limitation the rights</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              copies of the Software, and to permit persons to whom the Software is</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              furnished to do so, subject to the following conditions:</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              The above copyright notice and this permission notice shall be included in all</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              copies or substantial portions of the Software.</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              SOFTWARE.</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> PDOPlusPlus</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @const string    Used by tag generator</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">const</span> ALPHA = <span style="color: #FF0000;">'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @const string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">const</span> MODE_PREPARE_VALUES = <span style="color: #FF0000;">'prepare_values'</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @const string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">const</span> MODE_PREPARE_PARAMS = <span style="color: #FF0000;">'prepare_params'</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @const string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">const</span> MODE_SQL_DIRECT = <span style="color: #FF0000;">'sql_direct'</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var PDO</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">static</span> <span style="color: #339933;">$pdo</span> = <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">static</span> <span style="color: #339933;">$tags</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array   [tag =&gt; value]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #339933;">$values</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array   [tag =&gt; PDO::PARAM_xxx]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #339933;">$types</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #339933;">$in_params</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Used only for OUT Params in stored procedure</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array  [param]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #339933;">$out_params</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Used only for OUT and IN_OUT Params in stored procedure</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #339933;">$inout_params</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #339933;">$mode</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #339933;">$debug</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var PDOStatement</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #339933;">$stmt</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #339933;">$params_already_bound</span> = <span style="color: #0080ff;">false</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #339933;">$is_transactional</span> = <span style="color: #0080ff;">false</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array used by nested transactions</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #339933;">$save_points</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> isModePrepareValues<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;mode === <span style="color: #0080ff;">self</span>::MODE_PREPARE_VALUES;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> isModePrepareParams<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;mode === <span style="color: #0080ff;">self</span>::MODE_PREPARE_PARAMS;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> isModeSQLDirect<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;mode === <span style="color: #0080ff;">self</span>::MODE_SQL_DIRECT;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> hasInParams<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> ! <span class="br0">&#40;</span><span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;in_params<span class="br0">&#41;</span> &amp;&amp; <span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;inout_params<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> hasInOutParams<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> ! <span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;inout_params<span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> hasOutParams<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> ! <span class="br0">&#40;</span><span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;out_params<span class="br0">&#41;</span> &amp;&amp; <span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;inout_params<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> outParams<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> array_merge<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;out_params, <span style="color: #339933;">$this</span>-&gt;inout_params<span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> mode<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;mode;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return PDO</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>: PDO</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::<span style="color: #339933;">$pdo</span> === <span style="color: #0080ff;">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0080ff;">self</span>::connect<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$pdo</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * 3 modes available :</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * - MODE_SQL_DIRECT     : omits the PDO prepare()</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * - MODE_PREPARE_VALUES : use PDO::prepare() with bindValue()</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * - MODE_PREPARE_PARAMS : use PDO::prepare() with bindParams()</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $mode</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param bool   $debug</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$mode</span> = <span style="color: #0080ff;">self</span>::MODE_SQL_DIRECT, <span style="color: #0080ff;">bool</span> <span style="color: #339933;">$debug</span> = <span style="color: #0080ff;">false</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$modes</span>       = <span class="br0">&#91;</span><span style="color: #0080ff;">self</span>::MODE_SQL_DIRECT, <span style="color: #0080ff;">self</span>::MODE_PREPARE_VALUES, <span style="color: #0080ff;">self</span>::MODE_PREPARE_PARAMS<span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;mode  = in_array<span class="br0">&#40;</span><span style="color: #339933;">$mode</span>, <span style="color: #339933;">$modes</span>, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span> ? <span style="color: #339933;">$mode</span> : <span style="color: #0080ff;">self</span>::MODE_SQL_DIRECT;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;debug = <span style="color: #339933;">$debug</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">//region DATABASE CONNECTION</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Default parameters for PDO are :</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *      \PDO::ATTR_ERRMODE            =&gt; \PDO::ERRMODE_EXCEPTION,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *      \PDO::ATTR_DEFAULT_FETCH_MODE =&gt; \PDO::FETCH_ASSOC,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *      \PDO::ATTR_EMULATE_PREPARES   =&gt; false</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $scheme     Ex: mysql pgsql...</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $host       server host</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $database   database name</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $user       user name</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $pwd        password</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $port       port number</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $timeout</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array  $pdo_params others parameters for PDO          [key =&gt; value]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array  $dsn_params other parameter for the dsn string [string]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> connect<span class="br0">&#40;</span></span>
<span style="color: black;">        <span style="color: #0080ff;">string</span> <span style="color: #339933;">$scheme</span> = DB_SCHEME, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$host</span> = DB_HOST, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$database</span> = DB_NAME, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$user</span> = DB_USER,</span>
<span style="color: black;">        <span style="color: #0080ff;">string</span> <span style="color: #339933;">$pwd</span> = DB_PWD, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$port</span> = DB_PORT, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$timeout</span> = DB_TIMEOUT, <span style="color: #0000ff;">array</span> <span style="color: #339933;">$pdo_params</span> = DB_PDO_PARAMS,</span>
<span style="color: black;">        <span style="color: #0000ff;">array</span> <span style="color: #339933;">$dsn_params</span> = DB_DSN_PARAMS</span>
<span style="color: black;">    <span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$dsn</span> = <span style="color: #FF0000;">&quot;<span style="color: #800000;">{$scheme}</span>:host=<span style="color: #800000;">{$host}</span>;dbname=<span style="color: #800000;">{$database}</span>;&quot;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span style="color: #339933;">$port</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$dsn</span> .= <span style="color: #FF0000;">'port='</span>.<span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$port</span>.<span style="color: #FF0000;">';'</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$timeout</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$dsn</span> .= <span style="color: #FF0000;">'connect_timeout='</span>.<span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$timeout</span>.<span style="color: #FF0000;">';'</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> ! <span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$dsn_params</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$dsn</span> .= implode<span class="br0">&#40;</span><span style="color: #FF0000;">';'</span>, <span style="color: #339933;">$dsn_params</span><span class="br0">&#41;</span>.<span style="color: #FF0000;">';'</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$params</span> = <span style="color: #339933;">$pdo_params</span> + <span class="br0">&#91;</span></span>
<span style="color: black;">            PDO::ATTR_ERRMODE            =&gt; PDO::ERRMODE_EXCEPTION,</span>
<span style="color: black;">            PDO::ATTR_DEFAULT_FETCH_MODE =&gt; PDO::FETCH_ASSOC,</span>
<span style="color: black;">            PDO::ATTR_EMULATE_PREPARES   =&gt; <span style="color: #0080ff;">false</span></span>
<span style="color: black;">        <span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">try</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$pdo</span> = <span style="color: #0000ff;">new</span> PDO<span class="br0">&#40;</span><span style="color: #339933;">$dsn</span>, <span style="color: #339933;">$user</span>, <span style="color: #339933;">$pwd</span>, <span style="color: #339933;">$params</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>Exception <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">throw</span> <span style="color: #339933;">$e</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;">    <span style="color: #808080;">//endregion</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * 3 parameters allowed :</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *    - the 1st is always reserved to the value</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *    - the 2 others are free, even in their placement</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *          - one boolean strict for the nullable attribute</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *          - one string for the type among: 'int', 'str', 'float', 'double', 'num', 'numeric', 'bool'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * By default all fields are strings and nullable</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array $args</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span>...<span style="color: #339933;">$args</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;injectorInByVal<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#40;</span>...<span style="color: #339933;">$args</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">//region TRANSACTION</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * The SQL &quot;SET TRANSACTION&quot; must be defined before starting</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * a new transaction otherwise it will be ignored</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $sql</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setTransaction<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$sql</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> ! <span style="color: #339933;">$this</span>-&gt;is_transactional<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;execTransaction<span class="br0">&#40;</span><span style="color: #339933;">$sql</span>, <span style="color: #FF0000;">'setTransaction'</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> startTransaction<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">// transaction already started</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;is_transactional<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">// for nested transaction create internally a save point</span></span>
<span style="color: black;">            <span style="color: #808080;">// to be able to rollback only the current transaction</span></span>
<span style="color: black;">            <span style="color: #808080;">// as PDO only rollback all the transactions</span></span>
<span style="color: black;">            <span style="color: #339933;">$save_point</span> = <span style="color: #0080ff;">self</span>::tag<span class="br0">&#40;</span><span style="color: #FF0000;">''</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;savePoint<span class="br0">&#40;</span><span style="color: #339933;">$save_point</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;execTransaction<span class="br0">&#40;</span><span style="color: #FF0000;">'START TRANSACTION;'</span>, <span style="color: #FF0000;">'startTransaction'</span>, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * The commit apply always to the whole transaction at once</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> commit<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;is_transactional<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;execTransaction<span class="br0">&#40;</span><span style="color: #FF0000;">'COMMIT;'</span>, <span style="color: #FF0000;">'commit'</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Rollback only the last transaction</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> rollback<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;is_transactional<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;save_points<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;execTransaction<span class="br0">&#40;</span><span style="color: #FF0000;">'ROLLBACK;'</span>, <span style="color: #FF0000;">'rollback'</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$save_point</span> = array_pop<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;save_points<span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;rollbackTo<span class="br0">&#40;</span><span style="color: #339933;">$save_point</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Rollback the whole transaction at once</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> rollbackAll<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;save_points = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;rollback<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Create a save point</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $point_name</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> savePoint<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$point_name</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;is_transactional<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;execTransaction<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;SAVEPOINT <span style="color: #800000;">{$point_name}</span>;&quot;</span>, <span style="color: #FF0000;">'savePoint'</span>, <span style="color: #0080ff;">null</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;save_points<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$point_name</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $point_name</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> rollbackTo<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$point_name</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;is_transactional<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;execTransaction<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;ROLLBACK TO <span style="color: #800000;">{$point_name}</span>;&quot;</span>, <span style="color: #FF0000;">'rollbackTo'</span>, <span style="color: #0080ff;">null</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Release a save point</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $point_name</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> release<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$point_name</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;is_transactional &amp;&amp; in_array<span class="br0">&#40;</span><span style="color: #339933;">$point_name</span>, <span style="color: #339933;">$this</span>-&gt;save_points, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;execTransaction<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;RELEASE SAVEPOINT <span style="color: #800000;">{$point_name}</span>;&quot;</span>, <span style="color: #FF0000;">'release'</span>, <span style="color: #0080ff;">null</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #339933;">$pos</span> = array_search<span class="br0">&#40;</span><span style="color: #339933;">$point_name</span>, <span style="color: #339933;">$this</span>-&gt;save_points, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">unset</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;save_points<span class="br0">&#91;</span><span style="color: #339933;">$pos</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> releaseAll<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;save_points <span style="color: #0000ff;">as</span> <span style="color: #339933;">$point</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;release<span class="br0">&#40;</span><span style="color: #339933;">$point</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Common code</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string    $sql</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string    $func_name</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param bool|null $final_transaction_status</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> execTransaction<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$sql</span>, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$func_name</span>, ?<span style="color: #0080ff;">bool</span> <span style="color: #339933;">$final_transaction_status</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">try</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0080ff;">self</span>::pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;exec<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_bool<span class="br0">&#40;</span><span style="color: #339933;">$final_transaction_status</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;is_transactional = <span style="color: #339933;">$final_transaction_status</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;is_transactional === <span style="color: #0080ff;">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;save_points = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>Exception <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;debug<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                var_dump<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            error_log<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;PPP::execTransaction::<span style="color: #800000;">{$func_name}</span> - &quot;</span>.<span style="color: #339933;">$e</span>-&gt;getMessage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">throw</span> <span style="color: #339933;">$e</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;">    <span style="color: #808080;">//endregion</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">//region INJECTORS</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Return the corresponding params/value injector to the current mode</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $type // among: in out inout</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return object</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> injector<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$type</span> = <span style="color: #FF0000;">'in'</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">object</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$type</span> === <span style="color: #FF0000;">'out'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;injectorOut<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$type</span> === <span style="color: #FF0000;">'inout'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;isModePrepareParams<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;injectorInOutByRef<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;injectorInOutByVal<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$type</span> === <span style="color: #FF0000;">'in'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;isModePrepareParams<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;injectorInByRef<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// by default</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;injectorInByVal<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Default injector</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return object</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> injectorInByVal<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">object</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">class</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span><span class="br0">&#41;</span> <span style="color: #0000ff;">extends</span> PDOPlusPlus <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @var PDOPlusPlus</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            */</span></span>
<span style="color: black;">            <span style="color: #0000ff;">private</span> <span style="color: #339933;">$ppp</span>;</span>
&nbsp;
<span style="color: black;">            <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param PDOPlusPlus $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            */</span></span>
<span style="color: black;">            <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span>PDOPlusPlus <span style="color: #339933;">$p</span><span class="br0">&#41;</span></span>
<span style="color: black;">            <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;ppp = <span style="color: #339933;">$p</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span>...<span style="color: #339933;">$args</span><span class="br0">&#41;</span></span>
<span style="color: black;">            <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$args</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> BadMethodCallException<span class="br0">&#40;</span><span style="color: #FF0000;">'Missing value'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">                <span style="color: #339933;">$value</span> = <span style="color: #339933;">$args</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$type</span>  = <span style="color: #339933;">$args</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> ?? <span style="color: #FF0000;">'str'</span>;</span>
&nbsp;
<span style="color: black;">                <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;                * @param $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;                * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;                */</span></span>
<span style="color: black;">                <span style="color: #339933;">$is_scalar</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span><span style="color: #339933;">$p</span> === <span style="color: #0080ff;">null</span><span class="br0">&#41;</span> || is_scalar<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span>is_object<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> &amp;&amp; method_exists<span class="br0">&#40;</span><span style="color: #339933;">$p</span>, <span style="color: #FF0000;">'__toString'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> ! <span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$value</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> TypeError<span class="br0">&#40;</span><span style="color: #FF0000;">'Null or scalar value expected or class with __toString() implemented'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;ppp-&gt;isModePrepareValues<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$tag</span> = PDOPlusPlus::tag<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                    <span style="color: #339933;">$this</span>-&gt;ppp-&gt;values<span class="br0">&#91;</span><span style="color: #339933;">$tag</span><span class="br0">&#93;</span> = <span style="color: #339933;">$value</span>;</span>
<span style="color: black;">                    <span style="color: #339933;">$this</span>-&gt;ppp-&gt;types<span class="br0">&#91;</span><span style="color: #339933;">$tag</span><span class="br0">&#93;</span>  = <span style="color: #339933;">$type</span>;</span>
<span style="color: black;">                    <span style="color: #339933;">$this</span>-&gt;ppp-&gt;in_params<span class="br0">&#91;</span><span class="br0">&#93;</span>  = <span style="color: #339933;">$tag</span>;</span>
<span style="color: black;">                    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$tag</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;ppp-&gt;isModeSQLDirect<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">return</span> PDOPlusPlus::sqlValue<span class="br0">&#40;</span><span style="color: #339933;">$value</span>, <span style="color: #339933;">$type</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> BadMethodCallException<span class="br0">&#40;</span></span>
<span style="color: black;">                        <span style="color: #FF0000;">'For prepared statement using reference, you must use a specific injector &quot;by reference&quot;'</span></span>
<span style="color: black;">                    <span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Default injector for referenced params</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return object</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> injectorInByRef<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">object</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">class</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;values, <span style="color: #339933;">$this</span>-&gt;types, <span style="color: #339933;">$this</span>-&gt;in_params<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">private</span> <span style="color: #339933;">$values</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">private</span> <span style="color: #339933;">$types</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">private</span> <span style="color: #339933;">$in_params</span>;</span>
&nbsp;
<span style="color: black;">            <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param $values</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param $types</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param $in_params</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            */</span></span>
<span style="color: black;">            <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span>&amp;<span style="color: #339933;">$values</span>, &amp;<span style="color: #339933;">$types</span>, &amp;<span style="color: #339933;">$in_params</span><span class="br0">&#41;</span></span>
<span style="color: black;">            <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;values    =&amp; <span style="color: #339933;">$values</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;types     =&amp; <span style="color: #339933;">$types</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;in_params =&amp; <span style="color: #339933;">$in_params</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param         $value</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param  string $type     among: int str float double num numeric bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            */</span></span>
<span style="color: black;">            <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span>&amp;<span style="color: #339933;">$value</span>, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$type</span> = <span style="color: #FF0000;">'str'</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">            <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$tag</span> = PDOPlusPlus::tag<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;values<span class="br0">&#91;</span><span style="color: #339933;">$tag</span><span class="br0">&#93;</span> =&amp; <span style="color: #339933;">$value</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;types<span class="br0">&#91;</span><span style="color: #339933;">$tag</span><span class="br0">&#93;</span>  =  <span style="color: #339933;">$type</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;in_params<span class="br0">&#91;</span><span class="br0">&#93;</span>  =  <span style="color: #339933;">$tag</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$tag</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Injector for params having only OUT attribute</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return object</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> injectorOut<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">object</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">class</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;out_params<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">private</span> <span style="color: #339933;">$out_params</span>;</span>
&nbsp;
<span style="color: black;">            <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param $out_params</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            */</span></span>
<span style="color: black;">            <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span>&amp;<span style="color: #339933;">$out_params</span><span class="br0">&#41;</span></span>
<span style="color: black;">            <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;out_params =&amp; <span style="color: #339933;">$out_params</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param  string $out_param // ex:'@id'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            */</span></span>
<span style="color: black;">            <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$out_param</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">            <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;out_params<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$out_param</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$out_param</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Injector for by val params having IN OUT attribute</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return object</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> injectorInOutByVal<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">object</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">class</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;values, <span style="color: #339933;">$this</span>-&gt;types, <span style="color: #339933;">$this</span>-&gt;inout_params<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">private</span> <span style="color: #339933;">$values</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">private</span> <span style="color: #339933;">$types</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">private</span> <span style="color: #339933;">$inout_params</span>;</span>
&nbsp;
<span style="color: black;">            <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param $values</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param $types</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param $inout_params</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            */</span></span>
<span style="color: black;">            <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span>&amp;<span style="color: #339933;">$values</span>, &amp;<span style="color: #339933;">$types</span>, &amp;<span style="color: #339933;">$inout_params</span><span class="br0">&#41;</span></span>
<span style="color: black;">            <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;values       =&amp; <span style="color: #339933;">$values</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;types        =&amp; <span style="color: #339933;">$types</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;inout_params =&amp; <span style="color: #339933;">$inout_params</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param         $value</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param string  $inout_param // ex: '@id'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param string  $type        among: int str float double num numeric bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            */</span></span>
<span style="color: black;">            <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span style="color: #339933;">$value</span>, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$inout_param</span>, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$type</span> = <span style="color: #FF0000;">'str'</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">            <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;values<span class="br0">&#91;</span><span style="color: #339933;">$inout_param</span><span class="br0">&#93;</span> = <span style="color: #339933;">$value</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;types<span class="br0">&#91;</span><span style="color: #339933;">$inout_param</span><span class="br0">&#93;</span>  = <span style="color: #339933;">$type</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;inout_params<span class="br0">&#91;</span><span class="br0">&#93;</span>       = <span style="color: #339933;">$inout_param</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$inout_param</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Injector for by ref params having IN OUT attribute</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return object</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span> injectorInOutByRef<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">object</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">class</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;values, <span style="color: #339933;">$this</span>-&gt;types, <span style="color: #339933;">$this</span>-&gt;inout_params<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">private</span> <span style="color: #339933;">$values</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">private</span> <span style="color: #339933;">$types</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">private</span> <span style="color: #339933;">$inout_params</span>;</span>
&nbsp;
<span style="color: black;">            <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param $values</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param $types</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param $inout_params</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            */</span></span>
<span style="color: black;">            <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span>&amp;<span style="color: #339933;">$values</span>, &amp;<span style="color: #339933;">$types</span>, &amp;<span style="color: #339933;">$inout_params</span><span class="br0">&#41;</span></span>
<span style="color: black;">            <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;values       =&amp; <span style="color: #339933;">$values</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;types        =&amp; <span style="color: #339933;">$types</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;inout_params =&amp; <span style="color: #339933;">$inout_params</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param        $value</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param string $inout_param   // ex: '@id'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @param string $type          among: int str float double num numeric bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;            */</span></span>
<span style="color: black;">            <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span>&amp;<span style="color: #339933;">$value</span>, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$inout_param</span>, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$type</span> = <span style="color: #FF0000;">'str'</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">            <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;values<span class="br0">&#91;</span><span style="color: #339933;">$inout_param</span><span class="br0">&#93;</span> =&amp; <span style="color: #339933;">$value</span>;            <span style="color: #808080;">// by ref</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;types<span class="br0">&#91;</span><span style="color: #339933;">$inout_param</span><span class="br0">&#93;</span>  =  <span style="color: #339933;">$type</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;inout_params<span class="br0">&#91;</span><span class="br0">&#93;</span>       =  <span style="color: #339933;">$inout_param</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$inout_param</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;">    <span style="color: #808080;">//endregion</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $sql</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int|null           lastInsertId() | null on error</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> insert<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$sql</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">try</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$pdo</span> = <span style="color: #0080ff;">self</span>::pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;isModeSQLDirect<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$pdo</span>-&gt;exec<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;prepareAndAttachValuesOrParams<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;stmt-&gt;execute<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$pdo</span>-&gt;lastInsertId<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>Exception <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;debug<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                var_dump<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            error_log<span class="br0">&#40;</span><span style="color: #FF0000;">'PPP::insert - '</span>.<span style="color: #339933;">$e</span>-&gt;getMessage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">throw</span> <span style="color: #339933;">$e</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  mixed $sql</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> select<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">try</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;isModeSQLDirect<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;stmt = <span style="color: #0080ff;">self</span>::pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;query<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;prepareAndAttachValuesOrParams<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;stmt-&gt;execute<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;stmt-&gt;fetchAll<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>Exception <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;debug<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                var_dump<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            error_log<span class="br0">&#40;</span><span style="color: #FF0000;">'PPP::select - '</span>.<span style="color: #339933;">$e</span>-&gt;getMessage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">throw</span> <span style="color: #339933;">$e</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  string $sql</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int           nb of affected rows</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> update<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$sql</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;execute<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  string $sql</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int           nb of affected rows</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> delete<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$sql</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;execute<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $sql</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int             nb of affected rows</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> execute<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$sql</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">try</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;isModeSQLDirect<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">self</span>::pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;exec<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;prepareAndAttachValuesOrParams<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;stmt-&gt;execute<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;stmt-&gt;rowCount<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>Exception <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;debug<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                var_dump<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            error_log<span class="br0">&#40;</span><span style="color: #FF0000;">'PPP::execute - '</span>.<span style="color: #339933;">$e</span>-&gt;getMessage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">throw</span> <span style="color: #339933;">$e</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $sql</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param bool   $is_query</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> call<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$sql</span>, <span style="color: #0080ff;">bool</span> <span style="color: #339933;">$is_query</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">try</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$pdo</span> = <span style="color: #0080ff;">self</span>::pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">            <span style="color: #339933;">$inject_io_values</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">use</span> <span class="br0">&#40;</span><span style="color: #339933;">$pdo</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;hasInOutParams<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$sql</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">                    <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;inout_params <span style="color: #0000ff;">as</span> <span style="color: #339933;">$io</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                        <span style="color: #808080;">// Injecting one by one io_params's value using SQL syntax : &quot;SET @io_param = value&quot;</span></span>
<span style="color: black;">                        <span style="color: #339933;">$sql</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #FF0000;">&quot;SET <span style="color: #800000;">{$io}</span> = &quot;</span>.<span style="color: #0080ff;">self</span>::sqlValue<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;values<span class="br0">&#91;</span><span style="color: #339933;">$io</span><span class="br0">&#93;</span>, <span style="color: #339933;">$this</span>-&gt;types<span class="br0">&#91;</span><span style="color: #339933;">$io</span><span class="br0">&#93;</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                    <span class="br0">&#125;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$sql</span> = implode<span class="br0">&#40;</span><span style="color: #FF0000;">';'</span>, <span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                    <span style="color: #339933;">$pdo</span>-&gt;exec<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">            <span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> ! <span style="color: #339933;">$this</span>-&gt;isModeSQLDirect<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;prepareAndAttachValuesOrParams<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #339933;">$inject_io_values</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;isModePrepareValues<span class="br0">&#40;</span><span class="br0">&#41;</span> || <span style="color: #339933;">$this</span>-&gt;isModePrepareParams<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;stmt-&gt;execute<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$is_query</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #808080;">// SQL Direct and Query</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;stmt = <span style="color: #339933;">$pdo</span>-&gt;query<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #808080;">// SQL Direct</span></span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;hasOutParams<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$pdo</span>-&gt;exec<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                    <span style="color: #0000ff;">return</span> <span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span> =&gt; <span style="color: #339933;">$this</span>-&gt;extractOutParams<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$pdo</span>-&gt;exec<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #339933;">$data</span>    = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">            <span style="color: #339933;">$nb_rows</span> = <span style="color: #cc66cc;">0</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$is_query</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">do</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$row</span> = <span style="color: #339933;">$this</span>-&gt;stmt-&gt;fetchAll<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$row</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                        <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$row</span>;</span>
<span style="color: black;">                        ++<span style="color: #339933;">$nb_rows</span>;</span>
<span style="color: black;">                    <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                        <span style="color: #0000ff;">break</span>;</span>
<span style="color: black;">                    <span class="br0">&#125;</span></span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">while</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;stmt-&gt;nextRowset<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #808080;">// adding the OUT params values</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;hasOutParams<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#93;</span> = <span style="color: #339933;">$this</span>-&gt;extractOutParams<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$data</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>Exception <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;debug<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                var_dump<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            error_log<span class="br0">&#40;</span><span style="color: #FF0000;">'PPP::call - '</span>.<span style="color: #339933;">$e</span>-&gt;getMessage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">throw</span> <span style="color: #339933;">$e</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array|null       [out_param =&gt; value]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws Exception</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> extractOutParams<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;hasOutParams<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">try</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$sql</span>  = <span style="color: #FF0000;">'SELECT '</span>.implode<span class="br0">&#40;</span><span style="color: #FF0000;">', '</span>, <span style="color: #339933;">$this</span>-&gt;outParams<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$stmt</span> = <span style="color: #0080ff;">self</span>::pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;query<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$stmt</span>-&gt;fetchAll<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>Exception <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;debug<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    var_dump<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">                error_log<span class="br0">&#40;</span><span style="color: #FF0000;">'PPP::extractOutParams - '</span>.<span style="color: #339933;">$e</span>-&gt;getMessage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">throw</span> <span style="color: #339933;">$e</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $sql</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> prepareAndAttachValuesOrParams<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$sql</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @param  string $p    among: int str float double num numeric bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        */</span></span>
<span style="color: black;">        <span style="color: #339933;">$pdo_type</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$p</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span class="br0">&#91;</span></span>
<span style="color: black;">                <span style="color: #FF0000;">'null'</span> =&gt; PDO::PARAM_NULL,</span>
<span style="color: black;">                <span style="color: #FF0000;">'int'</span>  =&gt; PDO::PARAM_INT,</span>
<span style="color: black;">                <span style="color: #FF0000;">'bool'</span> =&gt; PDO::PARAM_BOOL,</span>
<span style="color: black;">            <span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #339933;">$p</span><span class="br0">&#93;</span> ?? PDO::PARAM_STR;</span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> ! <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;stmt <span style="color: #0000ff;">instanceof</span> PDOStatement<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;stmt = <span style="color: #0080ff;">self</span>::pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;prepare<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;isModePrepareValues<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;hasInParams<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;values <span style="color: #0000ff;">as</span> <span style="color: #339933;">$token</span> =&gt; <span style="color: #339933;">$v</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$this</span>-&gt;stmt-&gt;bindValue<span class="br0">&#40;</span><span style="color: #339933;">$token</span>, <span style="color: #339933;">$v</span>, <span style="color: #339933;">$pdo_type</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;types<span class="br0">&#91;</span><span style="color: #339933;">$token</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;isModePrepareParams<span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;&amp; <span style="color: #339933;">$this</span>-&gt;hasInParams<span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span> ! <span style="color: #339933;">$this</span>-&gt;params_already_bound<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;values <span style="color: #0000ff;">as</span> <span style="color: #339933;">$token</span> =&gt; &amp;<span style="color: #339933;">$v</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;stmt-&gt;bindParam<span class="br0">&#40;</span><span style="color: #339933;">$token</span>, <span style="color: #339933;">$v</span>, <span style="color: #339933;">$pdo_type</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;types<span class="br0">&#91;</span><span style="color: #339933;">$token</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;params_already_bound = <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> closeCursor<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;stmt<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;stmt-&gt;closeCursor<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Unique tag generator</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * The tag is always unique for the whole current session</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $prepend</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> tag<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$prepend</span> = <span style="color: #FF0000;">':'</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">do</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$tag</span> = <span style="color: #339933;">$prepend</span>.substr<span class="br0">&#40;</span>str_shuffle<span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::ALPHA<span class="br0">&#41;</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">6</span><span class="br0">&#41;</span>.mt_rand<span class="br0">&#40;</span><span style="color: #cc66cc;">1000</span>, <span style="color: #cc66cc;">9999</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">while</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #0080ff;">self</span>::<span style="color: #339933;">$tags</span><span class="br0">&#91;</span><span style="color: #339933;">$tag</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #0080ff;">self</span>::<span style="color: #339933;">$tags</span><span class="br0">&#91;</span><span style="color: #339933;">$tag</span><span class="br0">&#93;</span> = <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$tag</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Unique tags generator</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * The tags are always unique for the whole current session</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  array $keys</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array        [key =&gt; tag]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> tags<span class="br0">&#40;</span><span style="color: #0000ff;">array</span> <span style="color: #339933;">$keys</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$tags</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">for</span> <span class="br0">&#40;</span><span style="color: #339933;">$i</span> = <span style="color: #cc66cc;">0</span>, <span style="color: #339933;">$nb</span> = count<span class="br0">&#40;</span><span style="color: #339933;">$keys</span><span class="br0">&#41;</span> ; <span style="color: #339933;">$i</span> &lt; <span style="color: #339933;">$nb</span> ; ++<span style="color: #339933;">$i</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$tags</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #0080ff;">self</span>::tag<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> array_combine<span class="br0">&#40;</span><span style="color: #339933;">$keys</span>, <span style="color: #339933;">$tags</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param        $value</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $type      among: int str float double num numeric bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param bool   $for_pdo</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed|array      if $for_pdo =&gt; [0 =&gt; value, 1 =&gt; pdo type] | plain escaped value</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> sqlValue<span class="br0">&#40;</span><span style="color: #339933;">$value</span>, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$type</span>, <span style="color: #0080ff;">bool</span> <span style="color: #339933;">$for_pdo</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$value</span> === <span style="color: #0080ff;">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$for_pdo</span> ? <span class="br0">&#91;</span><span style="color: #0080ff;">null</span>, PDO::PARAM_NULL<span class="br0">&#93;</span> : <span style="color: #FF0000;">'NULL'</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$type</span> === <span style="color: #FF0000;">'int'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$v</span> = <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$value</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$for_pdo</span> ? <span class="br0">&#91;</span><span style="color: #339933;">$v</span>, PDO::PARAM_INT<span class="br0">&#93;</span> : <span style="color: #339933;">$v</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$type</span> === <span style="color: #FF0000;">'bool'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$v</span> = <span class="br0">&#40;</span><span style="color: #0080ff;">bool</span><span class="br0">&#41;</span><span style="color: #339933;">$value</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$for_pdo</span> ? <span class="br0">&#91;</span><span style="color: #339933;">$v</span>, PDO::PARAM_BOOL<span class="br0">&#93;</span> : <span style="color: #339933;">$v</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span>in_array<span class="br0">&#40;</span><span style="color: #339933;">$type</span>, <span class="br0">&#91;</span><span style="color: #FF0000;">'float'</span>, <span style="color: #FF0000;">'double'</span>, <span style="color: #FF0000;">'num'</span>, <span style="color: #FF0000;">'numeric'</span><span class="br0">&#93;</span>, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$v</span> = <span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span class="br0">&#40;</span>double<span class="br0">&#41;</span><span style="color: #339933;">$value</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$for_pdo</span> ? <span class="br0">&#91;</span><span style="color: #339933;">$v</span>, PDO::PARAM_STR<span class="br0">&#93;</span> : <span style="color: #339933;">$v</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$v</span> = <span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$value</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$for_pdo</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span class="br0">&#91;</span><span style="color: #339933;">$v</span>, PDO::PARAM_STR<span class="br0">&#93;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">self</span>::pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;quote<span class="br0">&#40;</span><span style="color: #339933;">$v</span>, PDO::PARAM_STR<span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// make the class available on the global namespace :</span></span>
<span style="color: black;">class_alias<span class="br0">&#40;</span><span style="color: #FF0000;">'rawsrc\PDOPlusPlus\PDOPlusPlus'</span>, <span style="color: #FF0000;">'PDOPlusPlus'</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">class_alias<span class="br0">&#40;</span><span style="color: #FF0000;">'rawsrc\PDOPlusPlus\PDOPlusPlus'</span>, <span style="color: #FF0000;">'PPP'</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;            <span style="color: #808080;">// PPP is an official alias for PDOPlusPlus</span></span></pre></td></tr></table></pre>
</div>Si vous vous penchez sur le code de cette classe, vous verrez qu'il est pêchu et nécessite un niveau avancé en PHP. L'ingénierie qui est mise en oeuvre dans ce code fait appel aux concepts les plus avancés du langage PHP. Néanmoins et en vertu des principes de la Programmation Orientée Objet, la classe s'utilise très facilement sans être obligé d'aller mettre les mains dans le cambouis. :ccool:<br />
<br />
L'atout de cet classe réside dans la manière d'insérer les valeurs dans la chaîne SQL et en même temps paramétrer PDO. Les deux étapes sont faites en une fois.<br />
Pour que cela fonctionne, en plus d'être une classe, PDOPlusPlus se comporte aussi comme une fonction grâce à la méthode magique <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span>. Méthode magique déjà employée dans le code du petit moteur de rendu qui tient en une seule classe <a href="https://www.developpez.net/forums/blogs/32058-rawsrc/b8215/phpecho-moteur-rendu-php-classe-gouverner/" target="_blank"><font color="#0000FF"><b>PHPEcho</b></font></a>.<br />
<br />
<b><u>Principe de fonctionnement</u></b><br />
<br />
Tout se passe au moment de l'injection des valeurs, comme schématisé ci-après : <br />
<br />
<img src="https://www.developpez.net/forums/attachments/p550022d1585313812/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/winsock-envoi-recuperation-d-image/dvp_concept.png/" border="0" alt="Nom : dvp_concept.png
Affichages : 8973
Taille : 56,9 Ko"  style="float: CONFIG" /><br />
<br />
<b><u><font color="#0000FF">ATTENTION :</font></u></b> le mode <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">MODE_PREPARE_PARAMS</span> nécessite une petite adaptation dans l'écriture du SQL, veuillez vous reporter au paragraphe <b>8.3 - ÉCHAPPEMENT AVEC LE MÉCANISME DE PRÉPARATION ET PASSAGE DES VALEURS PAR RÉFÉRENCE</b>.<br />
<br />
<b><u>Pour le passage des paramètres dans les procédure stockées, il existe deux injecteurs spécifiques : </u></b> <br />
- un pour les paramètres de type <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">OUT</span></span>,<br />
- un pour les paramètres de type <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">INOUT</span></span>.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p550033d1585314806/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/winsock-envoi-recuperation-d-image/dvp_out_param.png/" border="0" alt="Nom : dvp_out_param.png
Affichages : 8805
Taille : 11,2 Ko"  style="float: CONFIG" /><br />
<img src="https://www.developpez.net/forums/attachments/p550035d1585314819/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/winsock-envoi-recuperation-d-image/dvp_inout_param.png/" border="0" alt="Nom : dvp_inout_param.png
Affichages : 9166
Taille : 22,1 Ko"  style="float: CONFIG" /><br />
<br />
Pour chaque cas traité, je vais vous présenter le code standard compatible avec PDO puis le code équivalent faisant appel à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">PDOPlusPlus</span>.<br />
Comme PDO offre 3 mécanismes d'échappement, il va de soi que PDOPlusPlus reprend les 3 mêmes mécanismes.<br />
<br />
<b><u><font size="3">6 - CONNEXION À LA BASE DE DONNÉES</font></u></b><br />
<br />
Pour éviter d'aller tripatouiller le code à chaque fois, il est très fortement conseillé de faire appel à des constantes qui représentent des données immuables (qui ne changent pas). Les paramètres de connexion à votre base de données ne changeant généralement pas, la classe attend par défaut que vous définissiez des constantes relatives à votre paramétrage comme ceci : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PHP :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// d&eacute;finition des param&egrave;tres de connexion &agrave; la base de donn&eacute;es</span>
<span style="color: #808080;">// constantes attendues par la fonction &quot;private static function connect()&quot;</span>
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_SCHEME'</span>, <span style="color: #FF0000;">'mysql'</span><span class="br0">&#41;</span>;
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_HOST'</span>, <span style="color: #FF0000;">'localhost'</span><span class="br0">&#41;</span>;
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_NAME'</span>, <span style="color: #FF0000;">'db_pdo_plus_plus'</span><span class="br0">&#41;</span>;
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_USER'</span>, <span style="color: #FF0000;">'root'</span><span class="br0">&#41;</span>;   <span style="color: #808080;">// utilisateur</span>
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_PWD'</span>, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>;        <span style="color: #808080;">// mot de passe</span>
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_PORT'</span>, <span style="color: #FF0000;">'3306'</span><span class="br0">&#41;</span>;
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_TIMEOUT'</span>, <span style="color: #FF0000;">'5'</span><span class="br0">&#41;</span>;
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_PDO_PARAMS'</span>, <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_DSN_PARAMS'</span>, <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
<b><u><font size="3">7 - JEU DE DONNÉES D'EXEMPLE</font></u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$data</span> = <span class="br0">&#91;</span><span class="br0">&#91;</span>
    <span style="color: #FF0000;">'title'</span>        =&gt; <span style="color: #FF0000;">&quot;The Lord of the Rings - The Fellowship of the Ring&quot;</span>,
    <span style="color: #FF0000;">'support'</span>      =&gt; <span style="color: #FF0000;">'BLU-RAY'</span>,
    <span style="color: #FF0000;">'multilingual'</span> =&gt; <span style="color: #0080ff;">true</span>,
    <span style="color: #FF0000;">'chapter'</span>      =&gt; <span style="color: #cc66cc;">1</span>,
    <span style="color: #FF0000;">'year'</span>         =&gt; <span style="color: #cc66cc;">2001</span>,
    <span style="color: #FF0000;">'summary'</span>      =&gt; <span style="color: #0080ff;">null</span>,
    <span style="color: #FF0000;">'stock'</span>        =&gt; <span style="color: #cc66cc;">10</span>
<span class="br0">&#93;</span>, <span class="br0">&#91;</span>
    <span style="color: #FF0000;">'title'</span>        =&gt; <span style="color: #FF0000;">&quot;The Lord of the Rings - The two towers&quot;</span>,
    <span style="color: #FF0000;">'support'</span>      =&gt; <span style="color: #FF0000;">'BLU-RAY'</span>,
    <span style="color: #FF0000;">'multilingual'</span> =&gt; <span style="color: #0080ff;">true</span>,
    <span style="color: #FF0000;">'chapter'</span>      =&gt; <span style="color: #cc66cc;">2</span>,
    <span style="color: #FF0000;">'year'</span>         =&gt; <span style="color: #cc66cc;">2002</span>,
    <span style="color: #FF0000;">'summary'</span>      =&gt; <span style="color: #0080ff;">null</span>,
    <span style="color: #FF0000;">'stock'</span>        =&gt; <span style="color: #cc66cc;">0</span>
<span class="br0">&#93;</span>, <span class="br0">&#91;</span>
    <span style="color: #FF0000;">'title'</span>        =&gt; <span style="color: #FF0000;">&quot;The Lord of the Rings - The return of the King&quot;</span>,
    <span style="color: #FF0000;">'support'</span>      =&gt; <span style="color: #FF0000;">'DVD'</span>,
    <span style="color: #FF0000;">'multilingual'</span> =&gt; <span style="color: #0080ff;">true</span>,
    <span style="color: #FF0000;">'chapter'</span>      =&gt; <span style="color: #cc66cc;">3</span>,
    <span style="color: #FF0000;">'year'</span>         =&gt; <span style="color: #cc66cc;">2003</span>,
    <span style="color: #FF0000;">'summary'</span>      =&gt; <span style="color: #0080ff;">null</span>,
    <span style="color: #FF0000;">'stock'</span>        =&gt; <span style="color: #cc66cc;">1</span>
<span class="br0">&#93;</span><span class="br0">&#93;</span>;</pre></td></tr></table></pre>
</div><br />
<b><u><font size="3">8 - INSERTION</font></u></b><br />
<br />
La classe offre la possibilité d'accéder à la ressource PDO sous-jacente qui a été ouverte, donc on va s'en servir simplement pour tous nos exemples.<br />
<br />
<b><u><font size="2">8.1 - ÉCHAPPEMENT SQL DIRECT</font></u></b><br />
<br />
Ajoutons notre premier film dans la table <b><u>avec PDO</u></b> (ce qui correspond à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span></span> dans notre tableau d'exemple) :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// &agrave; la toute fin du fichier, la classe a plusieurs alias dont PPP ;-)</span>
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$pdo</span>  = <span style="color: #339933;">$ppp</span>-&gt;pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>;   <span style="color: #808080;">// extraction de la ressource ouverte par PDOPlusPlus</span>
<span style="color: #339933;">$film</span> = <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>;
&nbsp;
<span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
    <span style="color: #808080;">// pr&eacute;paration des donn&eacute;es et &eacute;chappement manuel des donn&eacute;es num&eacute;riques et gestion des NULL (je consid&egrave;re que les champs obligatoires sont d&eacute;finis (ceux not&eacute;s NOT NULL dans la DDL)) :</span>
    <span style="color: #339933;">$values</span> = <span class="br0">&#91;</span>
        <span style="color: #FF0000;">'title'</span>        =&gt; <span style="color: #339933;">$pdo</span>-&gt;quote<span class="br0">&#40;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'title'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>,
        <span style="color: #FF0000;">'support'</span>      =&gt; <span style="color: #339933;">$pdo</span>-&gt;quote<span class="br0">&#40;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'support'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>,
        <span style="color: #FF0000;">'multilingual'</span> =&gt; <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'multilingual'</span><span class="br0">&#93;</span>,
        <span style="color: #FF0000;">'chapter'</span>      =&gt; <span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'chapter'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'chapter'</span><span class="br0">&#93;</span> : <span style="color: #FF0000;">'NULL'</span>,
        <span style="color: #FF0000;">'year'</span>         =&gt; <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'year'</span><span class="br0">&#93;</span>,
        <span style="color: #FF0000;">'summary'</span>      =&gt; <span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'summary'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span style="color: #339933;">$pdo</span>-&gt;quote<span class="br0">&#40;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'summary'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> : <span style="color: #FF0000;">'NULL'</span>,
        <span style="color: #FF0000;">'stock'</span>        =&gt; <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'stock'</span><span class="br0">&#93;</span>
    <span class="br0">&#93;</span>;
&nbsp;
    <span style="color: #808080;">// cr&eacute;ation de la cha&icirc;ne SQL d'insertion </span>
    <span style="color: #339933;">$sql</span> = <span style="color: #FF0000;">'INSERT INTO t_video (video_title, video_support, video_multilingual, video_chapter, video_year, video_summary, video_stock) VALUES ('</span>.implode<span class="br0">&#40;</span><span style="color: #FF0000;">', '</span>, <span style="color: #339933;">$values</span><span class="br0">&#41;</span>.<span style="color: #FF0000;">')'</span>;
&nbsp;
    <span style="color: #339933;">$pdo</span>-&gt;exec<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;
    <span style="color: #339933;">$id</span> = <span style="color: #339933;">$pdo</span>-&gt;lastInsertId<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>PDOException <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">throw</span> <span style="color: #339933;">$e</span>;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
Maintenant la même opération en utilisant <b>PDOPlusPlus</b> : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$film</span> = <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$sql</span>  = &lt;&lt;&lt;<span style="color: #FF0000;">sql</span></span>
<span style="color: black;"><span style="color: #FF0000;">INSERT INTO t_video (video_title, video_support, video_multilingual, video_chapter, video_year, video_summary, video_stock) VALUES (</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   {$ppp($film['title'])}, {$ppp($film['support'])}, {$ppp($film['multilingual'], 'bool')}, </span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   {$ppp($film['chapter'], 'int')}, {$ppp($film['year'], 'int')}, {$ppp($film['summary'])}, {$ppp($film['stock'], 'int')}</span></span>
<span style="color: black;"><span style="color: #FF0000;">);</span></span>
<span style="color: black;"><span style="color: #FF0000;">sql</span>;</span>
<span style="color: black;"><span style="color: #339933;">$id</span> = <span style="color: #339933;">$ppp</span>-&gt;insert<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</span></pre></td></tr></table></pre>
</div><br />
<b><u><font size="2">8.2 - ÉCHAPPEMENT AVEC LE MÉCANISME DE PRÉPARATION ET PASSAGE DES VALEURS PAR VALEUR</font></u></b><br />
<br />
Ajoutons notre deuxième film dans la table <b><u>avec PDO : via <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-&gt;bindValue<span class="br0">&#40;</span><span class="br0">&#41;</span></span></u></b> (ce qui correspond à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span></span> dans notre tableau d'exemple) :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PDOPlusPlus<span class="br0">&#40;</span>PDOPlusPlus::MODE_PREPARE_VALUES<span class="br0">&#41;</span>;
<span style="color: #339933;">$pdo</span>  = <span style="color: #339933;">$ppp</span>-&gt;pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$film</span> = <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>;
&nbsp;
<span style="color: #339933;">$sql</span> = &lt;&lt;&lt;<span style="color: #FF0000;">sql</span>
<span style="color: #FF0000;">INSERT INTO t_video (video_title, video_support, video_multilingual, video_chapter, video_year, video_summary, video_stock) </span>
<span style="color: #FF0000;">&nbsp;    VALUES (:title, :support, :multilingual, :chapter, :year, :summary, :stock)</span>
<span style="color: #FF0000;">sql</span>;
<span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
    <span style="color: #339933;">$stmt</span> = <span style="color: #339933;">$pdo</span>-&gt;prepare<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;
    <span style="color: #339933;">$stmt</span>-&gt;bindValue<span class="br0">&#40;</span><span style="color: #FF0000;">':title'</span>, <span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'title'</span><span class="br0">&#93;</span>, PDO::PARAM_STR<span class="br0">&#41;</span>;
    <span style="color: #339933;">$stmt</span>-&gt;bindValue<span class="br0">&#40;</span><span style="color: #FF0000;">':support'</span>, <span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'support'</span><span class="br0">&#93;</span>, PDO::PARAM_STR<span class="br0">&#41;</span>;
    <span style="color: #339933;">$stmt</span>-&gt;bindValue<span class="br0">&#40;</span><span style="color: #FF0000;">':multilingual'</span>, <span class="br0">&#40;</span><span style="color: #0080ff;">bool</span><span class="br0">&#41;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'multilingual'</span><span class="br0">&#93;</span>, PDO::PARAM_BOOL<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'chapter'</span><span class="br0">&#93;</span> === <span style="color: #0080ff;">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span style="color: #339933;">$stmt</span>-&gt;bindValue<span class="br0">&#40;</span><span style="color: #FF0000;">':chapter'</span>, <span style="color: #0080ff;">null</span>, PDO::PARAM_NULL<span class="br0">&#41;</span>;
    <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span>
        <span style="color: #339933;">$stmt</span>-&gt;bindValue<span class="br0">&#40;</span><span style="color: #FF0000;">':chapter'</span>, <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'chapter'</span><span class="br0">&#93;</span>, PDO::PARAM_INT<span class="br0">&#41;</span>;
    <span class="br0">&#125;</span>
    <span style="color: #339933;">$stmt</span>-&gt;bindValue<span class="br0">&#40;</span><span style="color: #FF0000;">':year'</span>, <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'year'</span><span class="br0">&#93;</span>, PDO::PARAM_INT<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'resume'</span><span class="br0">&#93;</span> === <span style="color: #0080ff;">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span style="color: #339933;">$stmt</span>-&gt;bindValue<span class="br0">&#40;</span><span style="color: #FF0000;">':summary'</span>, <span style="color: #0080ff;">null</span>, PDO::PARAM_NULL<span class="br0">&#41;</span>;
    <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span>
        <span style="color: #339933;">$stmt</span>-&gt;bindValue<span class="br0">&#40;</span><span style="color: #FF0000;">':summary'</span>, <span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'summary'</span><span class="br0">&#93;</span>, PDO::PARAM_STR<span class="br0">&#41;</span>;
    <span class="br0">&#125;</span>
    <span style="color: #339933;">$stmt</span>-&gt;bindValue<span class="br0">&#40;</span><span style="color: #FF0000;">':stock'</span>, <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$film</span><span class="br0">&#91;</span><span style="color: #FF0000;">'stock'</span><span class="br0">&#93;</span>, PDO::PARAM_INT<span class="br0">&#41;</span>;
    <span style="color: #339933;">$stmt</span>-&gt;execute<span class="br0">&#40;</span><span class="br0">&#41;</span>;
    <span style="color: #339933;">$id</span> = <span style="color: #339933;">$pdo</span>-&gt;lastInsertId<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>PDOException <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">throw</span> <span style="color: #339933;">$e</span>;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Maintenant la même opération en utilisant <b>PDOPlusPlus</b> : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_PREPARE_VALUES<span class="br0">&#41;</span>;
<span style="color: #339933;">$film</span> = <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>;
<span style="color: #339933;">$sql</span>  = &lt;&lt;&lt;<span style="color: #FF0000;">sql</span>
<span style="color: #FF0000;">INSERT INTO t_video (video_title, video_support, video_multilingual, video_chapter, video_year, video_summary, video_stock) VALUES (</span>
<span style="color: #FF0000;">&nbsp;   {$ppp($film['title'])}, {$ppp($film['support'])}, {$ppp($film['multilingual'], 'bool')}, </span>
<span style="color: #FF0000;">&nbsp;   {$ppp($film['chapter'], 'int')}, {$ppp($film['year'], 'int')}, {$ppp($film['summary'])}, {$ppp($film['stock'], 'int')}</span>
<span style="color: #FF0000;">);</span>
<span style="color: #FF0000;">sql</span>;
<span style="color: #339933;">$id</span> = <span style="color: #339933;">$ppp</span>-&gt;insert<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>Voici la chaîne intermédiaire qui a été générée par PDOPlusPlus pendant le traitement : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> t_video <span class="br0">&#40;</span>video_title, video_support, video_multilingual, video_chapter, video_year, video_summary, video_stock<span class="br0">&#41;</span> 
     <span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span>:XMEDem6153, :oASqvP7440, :mbfaTY4236, :FJzRWx7446, :FVHvqL4843, :tcCvZo8956, :JRtazM4176<span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>On remarque bien la présence de jetons d'identification pour l'injection des données (les &quot;:tag&quot;).<br />
<br />
<b>J'attire votre attention sur l'unique changement de code pour basculer d'une méthode à l'autre : </b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;      <span style="color: #808080;">// &eacute;chappement direct</span>
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_PREPARE_VALUES<span class="br0">&#41;</span>;  <span style="color: #808080;">// pr&eacute;paration et passage par valeur</span></pre></td></tr></table></pre>
</div><b><font color="#0000FF"><u>Tout le reste du code n'a pas bougé d'un iota.</u></font></b> Alors que le traitement en arrière plan de la requête a été complètement différent ! C'est la magie de la POO.<br />
<br />
<br />
<b><u><font size="2">8.3 - ÉCHAPPEMENT AVEC LE MÉCANISME DE PRÉPARATION ET PASSAGE DES VALEURS PAR RÉFÉRENCE</font></u></b><br />
<br />
Après avoir purgé notre table, ajoutons la totalité de nos films <b><u>avec PDO : via <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-&gt;bindParam<span class="br0">&#40;</span><span class="br0">&#41;</span></span></u></b>. Je vous rappelle que le mécanisme de préparation couplé au passage des valeurs par référence est uniquement indiqué quand vous devez <b>exécuter plusieurs fois d'affilée la même requête mais avec des données différentes</b>. PDO offre dans ce cas de figure une optimisation de taille afin de ne pas alourdir le traitement : c'est le passage par référence des variables. Ainsi, on pourra faire changer très rapidement les valeurs de nos variables et ré-exécuter notre requête d'insertion sans avoir à la préparer à nouveau. <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$ppp</span> = <span style="color: #0000ff;">new</span> PDOPlusPlus<span class="br0">&#40;</span>PDOPlusPlus::MODE_PREPARE_PARAMS<span class="br0">&#41;</span>;
<span style="color: #339933;">$pdo</span> = <span style="color: #339933;">$ppp</span>-&gt;pdo<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$ids</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;
&nbsp;
<span style="color: #339933;">$sql</span> = &lt;&lt;&lt;<span style="color: #FF0000;">sql</span>
<span style="color: #FF0000;">INSERT INTO t_video (video_title, video_support, video_multilingual, video_chapter, video_year, video_summary, video_stock) </span>
<span style="color: #FF0000;">&nbsp;    VALUES (:title, :support, :multilingual, :chapter, :year, :summary, :stock)</span>
<span style="color: #FF0000;">sql</span>;
<span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
    <span style="color: #339933;">$stmt</span> = <span style="color: #339933;">$pdo</span>-&gt;prepare<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;
    <span style="color: #808080;">// &agrave; ce stade on d&eacute;fini des variables ($title, $support...) sans aucune valeur mais avec une existence en m&eacute;moire (une simple r&eacute;f&eacute;rence ou adresse m&eacute;moire)</span>
    <span style="color: #808080;">// par la suite notre code ira rattacher des valeurs &agrave; ces variables mais PDO ne lira que la valeur contenue &agrave; l'adresse m&eacute;moire qui a &eacute;t&eacute; d&eacute;finie</span>
    <span style="color: #339933;">$stmt</span>-&gt;bindParam<span class="br0">&#40;</span><span style="color: #FF0000;">':title'</span>, <span style="color: #339933;">$title</span>, PDO::PARAM_STR<span class="br0">&#41;</span>;
    <span style="color: #339933;">$stmt</span>-&gt;bindParam<span class="br0">&#40;</span><span style="color: #FF0000;">':support'</span>, <span style="color: #339933;">$support</span>, PDO::PARAM_STR<span class="br0">&#41;</span>;
    <span style="color: #339933;">$stmt</span>-&gt;bindParam<span class="br0">&#40;</span><span style="color: #FF0000;">':multilingual'</span>, <span style="color: #339933;">$multilingual</span>, PDO::PARAM_BOOL<span class="br0">&#41;</span>;
    <span style="color: #339933;">$stmt</span>-&gt;bindParam<span class="br0">&#40;</span><span style="color: #FF0000;">':chapter'</span>, <span style="color: #339933;">$chapter</span>, PDO::PARAM_INT<span class="br0">&#41;</span>;
    <span style="color: #339933;">$stmt</span>-&gt;bindParam<span class="br0">&#40;</span><span style="color: #FF0000;">':year'</span>, <span style="color: #339933;">$year</span>, PDO::PARAM_INT<span class="br0">&#41;</span>;
    <span style="color: #339933;">$stmt</span>-&gt;bindParam<span class="br0">&#40;</span><span style="color: #FF0000;">':summary'</span>, <span style="color: #339933;">$summary</span>, PDO::PARAM_STR<span class="br0">&#41;</span>;
    <span style="color: #339933;">$stmt</span>-&gt;bindParam<span class="br0">&#40;</span><span style="color: #FF0000;">':stock'</span>, <span style="color: #339933;">$stock</span>, PDO::PARAM_INT<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$data</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$film</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span style="color: #808080;">// on d&eacute;structure notre tableau pour coller aux variables attendues par bindParam() : $titre, $support...</span>
        <span style="color: #808080;">// avantageusement les nom des variables correspondent aux noms des cl&eacute;s du tableau $film</span>
        <span style="color: #808080;">// donc PHP offre un raccourci : extract()</span>
        extract<span class="br0">&#40;</span><span style="color: #339933;">$film</span><span class="br0">&#41;</span>; <span style="color: #808080;">// chaque cl&eacute; du tableau devient une variable ayant pour valeur celle d&eacute;finie dans le tableau</span>
        <span style="color: #808080;">// on ex&eacute;cute la requ&ecirc;te autant de fois que n&eacute;cessaire sans l'&eacute;tape de la pr&eacute;paration</span>
        <span style="color: #808080;">// &agrave; chaque tour de boucle, les valeurs des variables sont mises &agrave; jour gr&acirc;ce &agrave; extract()</span>
        <span style="color: #339933;">$stmt</span>-&gt;execute<span class="br0">&#40;</span><span class="br0">&#41;</span>;
        <span style="color: #339933;">$ids</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$pdo</span>-&gt;lastInsertId<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// &agrave; la fin : [1, 2, 3] : nos 3 films ont bien &eacute;t&eacute; ajout&eacute;s</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>PDOException <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">throw</span> <span style="color: #339933;">$e</span>;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Après avoir purgé notre table, maintenant la même opération en utilisant <b>PDOPlusPlus</b> : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$ppp</span>     = <span style="color: #0000ff;">new</span> PDOPlusPlus<span class="br0">&#40;</span>PDOPlusPlus::MODE_PREPARE_PARAMS<span class="br0">&#41;</span>;
<span style="color: #339933;">$in</span>  = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// injecteur de r&eacute;f&eacute;rence</span>
<span style="color: #339933;">$ids</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;
<span style="color: #339933;">$sql</span>     = &lt;&lt;&lt;<span style="color: #FF0000;">sql</span>
<span style="color: #FF0000;">INSERT INTO t_video (video_title, video_support, video_multilingual, video_chapter, video_year, video_summary, video_stock) </span>
<span style="color: #FF0000;">&nbsp;    VALUES ({$in($title)}, {$in($support)}, {$in($multilingual, 'bool')}, {$in($chapter, 'int')}, {$in($year, 'int')}, {$in($summary)}, {$in($stock, 'int')})</span>
<span style="color: #FF0000;">sql</span>;
&nbsp;
<span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$data</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$film</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    extract<span class="br0">&#40;</span><span style="color: #339933;">$film</span><span class="br0">&#41;</span>;
    <span style="color: #339933;">$ids</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$ppp</span>-&gt;insert<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;    <span style="color: #808080;">// &agrave; la fin : [1, 2, 3] : nos 3 films ont bien &eacute;t&eacute; ajout&eacute;s</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><b>ATTENTION : pour que le passage par référence fonctionne, il faut passer par un injecteur de référence : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$in</span> = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// injecteur de r&eacute;f&eacute;rence</span></span> et c'est lui qui DOIT ÊTRE UTILISÉ dans la chaîne SQL pour l'injection des valeurs.</b><br />
<br />
<hr /><br />
<b><font color="#0000FF">Je vais faire un aparté pour les développeurs experts en PHP, histoire de fournir une explication technique de la problématique.</font></b><br />
Comme pour toute technologie et PHP en fait partie, il existe des règles et des limites. Là, on est au-delà des limites de PHP. Limites qu'il a fallu contourner afin de préserver le fonctionnement très  simple de cet outil. <br />
Depuis PHP 5.4, lors de l'appel d'une fonction il est impossible de forcer la passage des paramètres par référence sous peine de ramasser une erreur fatale :<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				PHP Fatal error: Call-time pass-by-reference has been removed
			
		</div>
	</div>
</div>en conséquence, lors de l'appel de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span>, j'ai maintenu le passage des variables par valeur pour les appels en mode <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">MODE_SQL_DIRECT</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">MODE_PREPARE_VALUES</span> et j'ai dû redéfinir le comportement de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span> pour pouvoir récupérer les références des variables pour le mode <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">MODE_PREPARE_PARAMS</span>. <br />
Une classe anonyme dérivant de la classe mère était tout indiquée pour ce travail. Conceptuellement, la nouvelle classe étant de même nature que la classe parente, la dérivation étant utile pour conserver un code minimaliste tout en préservant les accès nécessaires à la génération de code. Mais là vous devez faire face à une autre limite de PHP : la redéfinition des méthodes dans le cadre de l'héritage d'objet est permise mais très restrictive et contraignante sur les prototypes des méthodes. Comme la signature de la fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span> s'en est trouvée modifiée, vous ramassez là-aussi une belle erreur fatale : <br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				PHP Fatal error: Declaration of ...::__invoke() must be compatible with PDOPlusPlus::__invoke()
			
		</div>
	</div>
</div>Ce qui explique le code un tantinet exotique des fonctions <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> injectorXXX<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">object</span></span>, code qui a permis de contourner assez élégamment les limitations de PHP 7+.<br />
<br />
Bref, si vous ne comprenez pas trop ces explications, n'en faites quand même pas des cauchemars. D'ailleurs, tout reste utilisable sans pour autant avoir la nécessité de saisir toutes les subtilités du code source. Ça fonctionne, c'est le principal. :ccool:<br />
<hr /><br />
<br />
<b>Maintenant que l'on a vu les 3 manières de fonctionnement de PDOPlusPlus, on va pouvoir tester les autres fonctionnalités en s'affranchissant totalement de PDO.</b><br />
Je vais juste vous montrer de brefs exemples.<br />
<br />
<b><u><font size="3">9 - SELECTION</font></u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$ppp</span> = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_PREPARE_VALUES<span class="br0">&#41;</span>;
<span style="color: #339933;">$sql</span> = <span style="color: #FF0000;">&quot;SELECT video_id FROM t_video WHERE video_support = <span style="color: #800000;">{$ppp('BLU-RAY')}</span>&quot;</span>;
<span style="color: #339933;">$ids</span> = <span style="color: #339933;">$ppp</span>-&gt;select<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>Pour utiliser un <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">LIKE</span></span> :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$ppp</span> = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_PREPARE_VALUES<span class="br0">&#41;</span>;
<span style="color: #339933;">$sql</span> = <span style="color: #FF0000;">&quot;SELECT video_id FROM t_video WHERE video_support LIKE <span style="color: #800000;">{$ppp('%RAY%')}</span>&quot;</span>;
<span style="color: #339933;">$ids</span> = <span style="color: #339933;">$ppp</span>-&gt;select<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
<b><u><font size="3">9 - MODIFICATION</font></u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$ppp</span> = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$sql</span> = <span style="color: #FF0000;">&quot;UPDATE t_video SET video_support = <span style="color: #800000;">{$ppp('DVD')}</span> WHERE video_id = <span style="color: #800000;">{$ppp('1', 'int')}</span>&quot;</span>;
<span style="color: #339933;">$ppp</span>-&gt;update<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$ppp</span> = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_PREPARE_VALUES, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$summary</span> = &lt;&lt;&lt;<span style="color: #FF0000;">'txt'</span>
<span style="color: #FF0000;">Sur la Terre du Milieu, dans la paisible r&eacute;gion de la Comt&eacute;, vit le Hobbit Frodon Sacquet. Comme tous les Hobbits, Frodon est un bon vivant, </span>
<span style="color: #FF0000;">amoureux de la terre bien cultiv&eacute;e et de la bonne ch&egrave;re. Orphelin alors qu'il n'&eacute;tait qu'un enfant, il s'est install&eacute; &agrave; Cul-de-Sac chez son oncle Bilbon, </span>
<span style="color: #FF0000;">connu de toute la Comt&eacute; pour les aventures extraordinaires qu'il a v&eacute;cues &eacute;tant jeune et les tr&eacute;sors qu'il en a tir&eacute;s. Le jour de ses 111 ans, Bilbon </span>
<span style="color: #FF0000;">donne une f&ecirc;te grandiose &agrave; laquelle est convi&eacute; le puissant magicien Gandalf le Gris. C'est en ce jour particulier que Bilbon d&eacute;cide de se retirer chez les Elfes </span>
<span style="color: #FF0000;">pour y finir sa vie. Il laisse en h&eacute;ritage &agrave; Frodon son trou de Hobbit ainsi qu'un anneau, qu'il a autrefois trouv&eacute; dans la caverne d'une cr&eacute;ature nomm&eacute;e Gollum </span>
<span style="color: #FF0000;">dans les Monts Brumeux, et qui a le pouvoir de rendre invisible quiconque le porte &agrave; son doigt.</span>
<span style="color: #FF0000;">Gandalf est intrigu&eacute; par l'anneau laiss&eacute; &agrave; Frodon et surtout par les circonstances confuses dans lesquelles Bilbon l'a trouv&eacute;. Apr&egrave;s s'&ecirc;tre rendu &agrave; Minas Tirith, </span>
<span style="color: #FF0000;">la capitale du Gondor, pour lire le r&eacute;cit de la vie d'Isildur, un ancien roi de l'Arnor et du Gondor, il d&eacute;couvre que cet objet n'est autre que l'Anneau unique </span>
<span style="color: #FF0000;">forg&eacute; il y a bien longtemps par Sauron, le Seigneur des T&eacute;n&egrave;bres, et qui fut perdu 3 000 ans auparavant. Cet anneau mal&eacute;fique est une arme redoutable qui </span>
<span style="color: #FF0000;">permettrait au seigneur du Mordor de r&eacute;gner sur la Terre du Milieu et de r&eacute;duire tous ses peuples en esclavage. Gandalf relate alors &agrave; Frodon la mal&eacute;diction de </span>
<span style="color: #FF0000;">l'Anneau et l'informe que les serviteurs de Sauron sont d&eacute;j&agrave; en route pour retrouver le pr&eacute;cieux objet. Il lui demande de l'emporter en secret &agrave; Fondcombe, </span>
<span style="color: #FF0000;">demeure de l'Elfe Elrond, o&ugrave; l'on pourra prendre une d&eacute;cision &agrave; son sujet, pendant que Gandalf va sur les terres d'Isengard afin de consulter Saroumane, </span>
<span style="color: #FF0000;">le sup&eacute;rieur de son ordre.</span>
<span style="color: #FF0000;">Un anneau en or...</span>
<span style="color: #FF0000;">txt</span>;
<span style="color: #339933;">$sql</span> = <span style="color: #FF0000;">&quot;UPDATE t_video SET video_summary = <span style="color: #800000;">{$ppp($summary)}</span> WHERE video_id = <span style="color: #800000;">{$ppp('1', 'int')}</span>&quot;</span>;
<span style="color: #339933;">$ppp</span>-&gt;update<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
<b><u><font size="3">10 - SUPPRESSION</font></u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$ppp</span> = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_PREPARE_VALUES<span class="br0">&#41;</span>;
<span style="color: #339933;">$sql</span> = <span style="color: #FF0000;">&quot;DELETE FROM t_video WHERE video_id = <span style="color: #800000;">{$ppp('1', 'int')}</span>&quot;</span>;
<span style="color: #339933;">$ppp</span>-&gt;delete<span class="br0">&#40;</span><span style="color: #339933;">$sql</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>Quand vous n'avez pas besoin d'injecter des valeurs, utilisez toujours le mode <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">MODE_SQL_DIRECT</span>, comme ceci : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$ppp</span> = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$ppp</span>-&gt;execute<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;TRUNCATE TABLE t_video&quot;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
<br />
<b><u><font size="3">11 - PROCÉDURES STOCKÉES</font></u></b><br />
<br />
Les procédures stockées sont une évolution majeure de cet outil à plusieurs titres d'ailleurs.<br />
Compte tenu que PDO n'a pas une prise en charge totalement satisfaisante dans la gestion des procédures stockées paramétrées avec des <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">OUT</span></span> et/ou des <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">INOUT</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">PDOPlusPlus</span> utilise une méthode universelle en deux requêtes SQL qui permet de s'affranchir des problèmes posés par PDO.<br />
<br />
Comme indiqué en introduction, nous verrons les différentes possibilités d'interaction avec les procédures stockées qu'elles soient très simples à très complexes.<br />
<br />
<b><u><font size="2">11.1 - PROCÉDURE STOCKÉE QUI RENVOIE UN JEU DE DONNÉES</font></u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:192px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// ONE ROWSET</span>
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$exec</span> = <span style="color: #339933;">$ppp</span>-&gt;execute<span class="br0">&#40;</span>&lt;&lt;&lt;<span style="color: #FF0000;">'sql'</span>
<span style="color: #FF0000;">CREATE OR REPLACE DEFINER = root@localhost PROCEDURE db_pdo_plus_plus.sp_list_films()</span>
<span style="color: #FF0000;">BEGIN</span>
<span style="color: #FF0000;">&nbsp;   SELECT * FROM t_video;</span>
<span style="color: #FF0000;">END;</span>
<span style="color: #FF0000;">sql</span>
<span class="br0">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$rows</span> = <span style="color: #339933;">$ppp</span>-&gt;call<span class="br0">&#40;</span><span style="color: #FF0000;">'CALL sp_list_films()'</span>, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span>; <span style="color: #808080;">// n'oubliez pas le true qui indique que la proc&eacute;dure stock&eacute;e renvoie des donn&eacute;es</span></pre></td></tr></table></pre>
</div><br />
<b><u><font size="2">11.2 - PROCÉDURE STOCKÉE QUI RENVOIE DEUX JEUX DE DONNÉES SIMULTANÉMENT</font></u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// MULTIPLE ROWSETS</span>
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$exec</span> = <span style="color: #339933;">$ppp</span>-&gt;execute<span class="br0">&#40;</span>&lt;&lt;&lt;<span style="color: #FF0000;">'sql'</span>
<span style="color: #FF0000;">CREATE OR REPLACE DEFINER = root@localhost PROCEDURE db_pdo_plus_plus.sp_list_films_group_by_support()</span>
<span style="color: #FF0000;">BEGIN</span>
<span style="color: #FF0000;">&nbsp;   SELECT * FROM t_video WHERE video_support = 'BLU-RAY';</span>
<span style="color: #FF0000;">&nbsp;   SELECT * FROM t_video WHERE video_support = 'DVD';</span>
<span style="color: #FF0000;">END;</span>
<span style="color: #FF0000;">sql</span>
<span class="br0">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$rows</span> = <span style="color: #339933;">$ppp</span>-&gt;call<span class="br0">&#40;</span><span style="color: #FF0000;">'CALL sp_list_films_group_by_support()'</span>, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span>;
<span style="color: #808080;">// rows[0] est un tableau de films BLU-RAY : le 0 pointe sur le premier jeu de donn&eacute;es</span>
<span style="color: #808080;">// rows[1] est un tableau de films DVD : le 1 pointe sur le second jeu de donn&eacute;es</span></pre></td></tr></table></pre>
</div><br />
<b><u><font size="2">11.3 - PROCÉDURE STOCKÉE AVEC DES PARAMÈTRES IN</font></u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// WITH TWO IN PARAM</span>
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$exec</span> = <span style="color: #339933;">$ppp</span>-&gt;execute<span class="br0">&#40;</span>&lt;&lt;&lt;<span style="color: #FF0000;">'sql'</span>
<span style="color: #FF0000;">CREATE OR REPLACE DEFINER = root@localhost PROCEDURE db_pdo_plus_plus.sp_list_films_two_in_param(</span>
<span style="color: #FF0000;">&nbsp;   p_support VARCHAR(30), </span>
<span style="color: #FF0000;">&nbsp;   p_year INT</span>
<span style="color: #FF0000;">)</span>
<span style="color: #FF0000;">BEGIN</span>
<span style="color: #FF0000;">&nbsp;   SELECT * FROM t_video WHERE video_support = p_support AND video_year = p_year;</span>
<span style="color: #FF0000;">END;</span>
<span style="color: #FF0000;">sql</span>
<span class="br0">&#41;</span>;
&nbsp;
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$rows</span> = <span style="color: #339933;">$ppp</span>-&gt;call<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;CALL sp_list_films_two_in_param(<span style="color: #800000;">{$ppp('DVD')}</span>, <span style="color: #800000;">{$ppp('2001', 'int')}</span>)&quot;</span>, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span>;
&nbsp;
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_PREPARE_VALUES<span class="br0">&#41;</span>;
<span style="color: #339933;">$rows</span> = <span style="color: #339933;">$ppp</span>-&gt;call<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;CALL sp_list_films_two_in_param(<span style="color: #800000;">{$ppp('DVD')}</span>, <span style="color: #800000;">{$ppp('2003', 'int')}</span>)&quot;</span>, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span>;
&nbsp;
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_PREPARE_PARAMS<span class="br0">&#41;</span>;
<span style="color: #339933;">$in</span>   = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$sup</span>  = <span style="color: #FF0000;">'BLU-RAY'</span>;
<span style="color: #339933;">$year</span> = <span style="color: #FF0000;">'2002'</span>;
<span style="color: #339933;">$rows</span> = <span style="color: #339933;">$ppp</span>-&gt;call<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;CALL sp_list_films_two_in_param(<span style="color: #800000;">{$in($sup)}</span>, <span style="color: #800000;">{$in($year, 'int')}</span>)&quot;</span>, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>Comme vous pouvez le remarquer c'est toujours dans la continuité des utilisations précédentes :ccool:<br />
<br />
<b><u><font size="2">11.4 - PROCÉDURE STOCKÉE AVEC UN PARAMÈTRE OUT</font></u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// WITH ONE OUT PARAM</span>
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$exec</span> = <span style="color: #339933;">$ppp</span>-&gt;execute<span class="br0">&#40;</span>&lt;&lt;&lt;<span style="color: #FF0000;">'sql'</span>
<span style="color: #FF0000;">CREATE OR REPLACE DEFINER = root@localhost PROCEDURE db_pdo_plus_plus.sp_nb_films_one_out_param(OUT p_nb INT)</span>
<span style="color: #FF0000;">BEGIN</span>
<span style="color: #FF0000;">&nbsp;   SELECT COUNT(video_id) INTO p_nb FROM t_video;</span>
<span style="color: #FF0000;">END;</span>
<span style="color: #FF0000;">sql</span>
<span class="br0">&#41;</span>;
&nbsp;
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$out</span>  = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$exec</span> = <span style="color: #339933;">$ppp</span>-&gt;call<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;CALL sp_nb_films_one_out_param(<span style="color: #800000;">{$out('@nb')}</span>)&quot;</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$nb</span>   = <span style="color: #339933;">$exec</span><span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'@nb'</span><span class="br0">&#93;</span>;
&nbsp;
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_PREPARE_VALUES<span class="br0">&#41;</span>;
<span style="color: #339933;">$out</span>  = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$exec</span> = <span style="color: #339933;">$ppp</span>-&gt;call<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;CALL sp_nb_films_one_out_param(<span style="color: #800000;">{$out('@nb')}</span>)&quot;</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$nb</span>   = <span style="color: #339933;">$exec</span><span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'@nb'</span><span class="br0">&#93;</span>;</pre></td></tr></table></pre>
</div>Veuillez noter dans ce code l'utilisation d'un injecteur spécifique : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$out</span>  = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#41;</span>;</span>.<br />
<br />
<b><u><font size="2">11.5 - PROCÉDURE STOCKÉE AVEC UN JEU DE DONNÉES ET 2 PARAMÈTRES OUT</font></u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// WITH ROWSET AND TWO OUT PARAM</span>
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$exec</span> = <span style="color: #339933;">$ppp</span>-&gt;execute<span class="br0">&#40;</span>&lt;&lt;&lt;<span style="color: #FF0000;">'sql'</span>
<span style="color: #FF0000;">CREATE OR REPLACE DEFINER = root@localhost PROCEDURE db_pdo_plus_plus.sp_nb_films_rowset_two_out_param(</span>
<span style="color: #FF0000;">&nbsp;   OUT p_nb_blu_ray INT,</span>
<span style="color: #FF0000;">&nbsp;   OUT p_nb_dvd INT</span>
<span style="color: #FF0000;">)</span>
<span style="color: #FF0000;">BEGIN</span>
<span style="color: #FF0000;">&nbsp;   SELECT * FROM t_video ORDER BY video_year DESC;</span>
<span style="color: #FF0000;">&nbsp;   SELECT COUNT(video_id) INTO p_nb_blu_ray FROM t_video WHERE video_support = 'BLU-RAY';</span>
<span style="color: #FF0000;">&nbsp;   SELECT COUNT(video_id) INTO p_nb_dvd FROM t_video WHERE video_support = 'DVD';</span>
<span style="color: #FF0000;">END;</span>
<span style="color: #FF0000;">sql</span>
<span class="br0">&#41;</span>;
&nbsp;
<span style="color: #339933;">$ppp</span>   = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$out</span>   = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$exec</span>  = <span style="color: #339933;">$ppp</span>-&gt;call<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;CALL sp_nb_films_rowset_two_out_param(<span style="color: #800000;">{$out('@nb_blu_ray')}</span>, <span style="color: #800000;">{$out('@nb_dvd')}</span>)&quot;</span>, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$rows</span>  = <span style="color: #339933;">$exec</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>;  <span style="color: #808080;">// $exec[0] =&gt; pointe sur le le premier jeu de donn&eacute;es qui est un tableau de tous les films tri&eacute; par ann&eacute;e d&eacute;croissante</span>
<span style="color: #339933;">$nb_br</span> = <span style="color: #339933;">$exec</span><span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'@nb_blu_ray'</span><span class="br0">&#93;</span>;
<span style="color: #339933;">$nb_dv</span> = <span style="color: #339933;">$exec</span><span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'@nb_dvd'</span><span class="br0">&#93;</span>;
&nbsp;
<span style="color: #339933;">$ppp</span>   = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_PREPARE_VALUES<span class="br0">&#41;</span>;
<span style="color: #339933;">$out</span>   = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$exec</span>  = <span style="color: #339933;">$ppp</span>-&gt;call<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;CALL sp_nb_films_rowset_two_out_param(<span style="color: #800000;">{$out('@nb_blu_ray')}</span>, <span style="color: #800000;">{$out('@nb_dvd')}</span>)&quot;</span>, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$rows</span>  = <span style="color: #339933;">$exec</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>;  <span style="color: #808080;">// $exec[0] =&gt; pointe sur le le premier jeu de donn&eacute;es qui est un tableau de tous les films tri&eacute; par ann&eacute;e d&eacute;croissante</span>
<span style="color: #339933;">$nb_br</span> = <span style="color: #339933;">$exec</span><span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'@nb_blu_ray'</span><span class="br0">&#93;</span>;
<span style="color: #339933;">$nb_dv</span> = <span style="color: #339933;">$exec</span><span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'@nb_dvd'</span><span class="br0">&#93;</span>;</pre></td></tr></table></pre>
</div><br />
<b><u><font size="2">11.6 - PROCÉDURE STOCKÉE AVEC UN PARAMÈTRE INOUT ET 2 PARAMÈTRES OUT</font></u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// WITH ONE INOUT PARAM AND TWO OUT PARAM</span>
<span style="color: #339933;">$ppp</span>  = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$exec</span> = <span style="color: #339933;">$ppp</span>-&gt;execute<span class="br0">&#40;</span>&lt;&lt;&lt;<span style="color: #FF0000;">'sql'</span>
<span style="color: #FF0000;">CREATE OR REPLACE DEFINER = root@localhost PROCEDURE db_pdo_plus_plus.sp_nb_films_one_inout_two_out_param(</span>
<span style="color: #FF0000;">&nbsp;   INOUT p_qty INT, </span>
<span style="color: #FF0000;">&nbsp;   OUT p_nb_blu_ray INT, </span>
<span style="color: #FF0000;">&nbsp;   OUT p_nb_dvd INT</span>
<span style="color: #FF0000;">)</span>
<span style="color: #FF0000;">BEGIN</span>
<span style="color: #FF0000;">&nbsp;   DECLARE v_nb INT;</span>
<span style="color: #FF0000;">&nbsp;   SELECT SUM(video_stock) INTO v_nb FROM t_video;</span>
<span style="color: #FF0000;">&nbsp;   SET p_qty = v_nb - p_qty;</span>
<span style="color: #FF0000;">&nbsp;   SELECT COUNT(video_id) INTO p_nb_blu_ray FROM t_video WHERE video_support = 'BLU-RAY';</span>
<span style="color: #FF0000;">&nbsp;   SELECT COUNT(video_id) INTO p_nb_dvd FROM t_video WHERE video_support = 'DVD';</span>
<span style="color: #FF0000;">END;</span>
<span style="color: #FF0000;">sql</span>
<span class="br0">&#41;</span>;
&nbsp;
<span style="color: #339933;">$ppp</span>   = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP::MODE_SQL_DIRECT<span class="br0">&#41;</span>;
<span style="color: #339933;">$io</span>    = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span style="color: #FF0000;">'inout'</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$out</span>   = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$exec</span>  = <span style="color: #339933;">$ppp</span>-&gt;call<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;CALL sp_nb_films_one_inout_two_out_param(<span style="color: #800000;">{$io('25', '@stock', 'int')}</span>, <span style="color: #800000;">{$out('@nb_blu_ray')}</span>, <span style="color: #800000;">{$out('@nb_dvd')}</span>)&quot;</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$stock</span> = <span style="color: #339933;">$exec</span><span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'@stock'</span><span class="br0">&#93;</span>;
<span style="color: #339933;">$nb_br</span> = <span style="color: #339933;">$exec</span><span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'@nb_blu_ray'</span><span class="br0">&#93;</span>;
<span style="color: #339933;">$nb_dv</span> = <span style="color: #339933;">$exec</span><span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'@nb_dvd'</span><span class="br0">&#93;</span>;</pre></td></tr></table></pre>
</div>Veuillez noter dans ce code l'utilisation de deux injecteurs spécifiques : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$io</span>  = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span style="color: #FF0000;">'inout'</span><span class="br0">&#41;</span>;</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$out</span>  = <span style="color: #339933;">$ppp</span>-&gt;injector<span class="br0">&#40;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#41;</span>;</span>.<br />
<br />
<b><u><font size="2">11.7 - PROCÉDURE STOCKÉE : RÈGLE GÉNÉRALE CONCERNANT LES PARAMÈTRES OUT</font></u></b><br />
<br />
Les valeurs <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">OUT</span></span> renvoyées par une procédure stockée sont <b>TOUJOURS</b> dans le tableau résultat à la clé <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$result</span><span class="br0">&#91;</span><span style="color: #FF0000;">'out'</span><span class="br0">&#93;</span></span>, toutes les clés numériques correspondent aux jeux de données que la procédure stockée peut renvoyer.<br />
<br />
<b><u><font size="3">12 - TRANSACTIONS</font></u></b><br />
<br />
Cette dernière version vous apporte le support complet des transactions.<br />
<b><font color="#0000FF">PDO++</font></b> vous met à disposition un ensemble de méthodes explicites pour gérer vos transactions : <br />
<br />
<ul><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">setTransaction<span class="br0">&#40;</span><span class="br0">&#41;</span></span> définit le paramétrage de la transaction qui va être démarrée</li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">startTransaction<span class="br0">&#40;</span><span class="br0">&#41;</span></span> démarre une nouvelle transaction</li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">commit<span class="br0">&#40;</span><span class="br0">&#41;</span></span> valide la transaction et enregistre les données en base</li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">rollback<span class="br0">&#40;</span><span class="br0">&#41;</span></span> annule la dernière exécution du code</li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">rollbackTo<span class="br0">&#40;</span><span class="br0">&#41;</span></span> annule le code exécuté jusqu'au point de sauvegarde nommé</li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">rollbackAll<span class="br0">&#40;</span><span class="br0">&#41;</span></span> annule la totalité du code exécuté</li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">savePoint<span class="br0">&#40;</span><span class="br0">&#41;</span></span> création d'un point de sauvegarde (marqueur de votre choix dans le code SQL)</li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">release<span class="br0">&#40;</span><span class="br0">&#41;</span></span> libère et efface un point de sauvegarde</li><li style=""><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">releaseAll<span class="br0">&#40;</span><span class="br0">&#41;</span></span> libère et efface tous les points de sauvegarde</li></ul><br />
<br />
C'est toujours aussi simple qu'avant : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:132px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
    <span style="color: #339933;">$ppp</span> = <span style="color: #0000ff;">new</span> PPP<span class="br0">&#40;</span>PPP:MODE_SQL_DIRECT<span class="br0">&#41;</span>;
    <span style="color: #339933;">$ppp</span>-&gt;startTransaction<span class="br0">&#40;</span><span class="br0">&#41;</span>;
    <span style="color: #808080;">// VOTRE CODE SQL</span>
    <span style="color: #339933;">$ppp</span>-&gt;commit<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>\Exception <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span style="color: #339933;">$ppp</span>-&gt;rollback<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
<b><u><font size="3">13 - GESTION DES ERREURS</font></u></b><br />
<br />
Comme PDO est une ressource, je vous conseille très fortement de toujours englober votre code d'accès à la base de données dans un bloc <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">try</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>\Excpetion <span style="color: #339933;">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span></span>. Ainsi vous intercepterez toutes les erreurs remontées par PDO++<br />
<br />
<b><u><font size="3">14 - CONCLUSION</font></u></b><br />
<br />
Chers collègues développeurs, nous voilà rendus à la fin de ce long billet entièrement consacré à PDO et au nouvel sur-ensemble de ma conception <b><font color="#0000FF">PDOPlusPlus</font></b>.<br />
Cet outil doit normalement vous révolutionner l'écriture sécurisée de vos requêtes SQL. <br />
Plus besoin de s'occuper de aspects redondants de la couche PDO. Vous continuez à conserver un accès à toutes les fonctionnalités de PDO, tout en ayant un code souple, léger et entièrement sécurisé nativement. Bref, que des avantages :ccool:<br />
Ne vous en faites pas si la conception de cet outil vous échappe, l'ingénierie logicielle derrière le code est d'un niveau très avancé et nécessite une grande pratique de PHP doublée d'une connaissance théorique très complète du langage et de ses concepts objets. <br />
<br />
J'espère en tout cas, que vous allez vous l'approprier, l'étudier et lui trouver une utilité de premier ordre. Et par la suite, l'améliorer encore. Dans ce cas, je me ferai un plaisir d'échanger avec vous.<br />
Comme à l'accoutumé, j'ai disséminé des commentaires dans mon code pour expliquer certains points et faciliter ainsi la compréhension (une fois n'est pas coutume, je les ai laissés en français). <br />
Enfin, vous allez trouver d'autres fonctions utiles dans cette classe, des fonctions qui ne nécessitent pas d'explications mais qui peuvent vous servir dans l'écosystème PDO.<br />
<br />
Bon code à tous :ccool:<br />
<br />
<b>rawsrc</b><br />
<br />
<br />
<b>EDIT 2020-04-10 : <font color="#0000FF">Mise à jour du code de la classe : ajout de la gestion complète des transactions</font></b></blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b9083/pdoplusplus-ppp-nouvelle-facon-d-utiliser-pdo/</guid>
		</item>
		<item>
			<title><![CDATA[[POO] : Gestion d'une partie de tennis en PHP et en objet]]></title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b8721/poo-gestion-d-partie-tennis-php-objet/</link>
			<pubDate>Thu, 09 Jan 2020 22:48:40 GMT</pubDate>
			<description>Salut les développeurs, 
...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Salut les développeurs,<br />
<br />
comme nous sommes en début d'année, je vous souhaite tout plein de bonnes choses pour 2020 avec une tonne de chouettes imprévus.<br />
Et si dans la sempiternelle liste des bonnes résolutions, il y avait l'envie de se mettre à la programmation objet, ça tombe bien que vous lisiez ce billet car ça va être principalement l'objet de la présente publication.<br />
<br />
<u><b><font size="3">1 - INTRODUCTION</font></b></u><br />
<br />
L'idée de ce billet m'est venue simplement suite à une discussion sur le forum PHP où un apprenant essayait avec son code de suivre le déroulé d'un match de tennis. <br />
A priori, et au pifomètre on se dit que c'est du gâteau, et puis les règles du tennis sont tellement enfantines ! <br />
Avant de lire plus en avant ce billet, je vous invite donc à vous pencher un peu dessus... Et revenir quand vous aurez pondu une soluce de génie ;)<br />
Vous verrez, on se rend très vite compte que c'est loin d'être trivial et que suivre correctement le déroulé d'une partie de tennis et des scores est loin de se faire en un claquement de doigts. D'ailleurs, je trouve que c'est un super exercice d'école.<br />
<br />
Dans les échanges sur le forum, très rapidement les codes postés commençaient à avoir des variables nommées : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$jeux11</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$jeux21</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$jeux13</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$jeux23</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$newpoints13</span></span> avec des chaînages de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">if</span></span> à n'en plus finir. Quand on arrive à ce genre de nommage et de code spaghetti, c'est que la fin du développeur est proche. L’expérience vous apprendra que le code est foutu même en le documentant à mort. Et quand bien même, cela resterait accessible, cela dénote un énorme problème de modélisation.<br />
<br />
<u><b><font size="3">2 - POO - PROGRAMMATION ORIENTÉE OBJET</font></b></u><br />
<br />
A un moment, le code classique à base de fonctions avec une tonne de variables montre ses limites tant au niveau du codage que de la lisibilité et même de la compréhension. Il est alors nécessaire d'avoir à disposition la possibilité de conceptualiser à un niveau supérieur. C'est là que rentre en jeu la <b>Programmation Orientée Objet</b> ou <b>POO</b>. La POO apporte ce niveau d'abstraction qui de par ses fondations ouvre une infinité de voies. La POO poursuit plusieurs buts :<br />
<br />
<ul><li style="">découpage,</li><li style="">organisation,</li><li style="">généricité,</li><li style="">réutilisation</li></ul><br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				<div class="bbcode_postedby">
					<img src="https://forum.developpez.be/images/misc/quote_icon.png" alt="Citation" /> Envoyé par <strong>rawsrc</strong>
					
				</div>
				<div class="message">L’utilité principale de la programmation objet réside dans <b>la possibilité de représenter des éléments tangibles sous forme de concepts abstraits</b> (équivalent à une représentation purement informatique). <a href="https://www.developpez.net/forums/blogs/32058-rawsrc/b7804/php-7p-developpement-selon-l-approche-mvc-modele-vue-controleur-cas-pratique/" target="_blank">Source.</a></div>
			
		</div>
	</div>
</div>Donc, les principes élémentaires de la POO vont nous permettre de diviser notre problématique en <b>concepts distincts autonomes</b>. C'est la mise en œuvre directe du principe phare en informatique : <b>diviser pour mieux régner</b>.<br />
<br />
Il va de soi que ve billet n'a pas pour vocation de mettre à plat toute la théorie de la programmation orientée objet mais juste de vous la faire découvrir par l'entremise d'une résolution garantie 100 % objet, d'une problématique réelle. Je vous invite quand même à aller vous documenter sur les aspects de base pour ne pas trop être largué.<br />
<br />
<u><b><font size="3">3 - OBJECTIF</font></b></u><br />
<br />
L'objectif est de créer un programme en PHP nous permettant de suivre une partie de tennis tout en respectant les règles du jeu en vigueur à aujourd'hui.<br />
<br />
Cet outil devra <br />
<ul><li style="">suivre le déroulé de la partie</li><li style="">suivre les scores</li></ul><br />
Par déroulé de la partie, j'entends le fait que l'on n'ait pas à se soucier de l'ouverture des sets, des jeux, des jeux décisifs (tie-break) et des scores, etc. <br />
Comme les règles de ce sport sont parfaitement connues : <b><font color="#0000FF">le programme devra les suivre scrupuleusement et <u>être totalement autonome</u> sur tous ces aspects</font></b>.<br />
<br />
<b><font size="3"><i><font color="#FF0000">L'utilisateur ne doit rentrer que les points gagnants. Pour tout le reste cela doit être automatiquement géré.</font></i></font></b><br />
<br />
Là, je sens que vous vous dites : &quot;la vache, ça pique !&quot; C'est ambitieux mais largement faisable. :ccool: Et puis si c'est juste pour coder une calculette 4 opérations, autant rester couché, non ? :lol:<br />
<br />
<u><b><font size="3">4 - ANALYSE DE LA PROBLÉMATIQUE</font></b></u><br />
<br />
Tout l'analyse primaire démarre à partir des règles du tennis extraites à partir du site <a href="https://www.artengo.fr/conseils/les-regles-de-base-du-tennis-tp_56381.html" target="_blank">www.artengo.fr</a> :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				<div class="bbcode_postedby">
					<img src="https://forum.developpez.be/images/misc/quote_icon.png" alt="Citation" /> Envoyé par <strong>www.artengo.fr</strong>
					
				</div>
				<div class="message">Le décompte des points, au tennis, un jeu se compose de 4 points.<br />
<br />
On compte les points du serveur en premier.<br />
<br />
Pas de point : « zéro »<br />
Premier point : « 15 »<br />
Deuxième point : « 30 »<br />
Troisième point : « 40 »<br />
Quatrième point : « jeu »<br />
<br />
Si les 2 joueurs ont marqué 3 points, alors on compte « 40A ».<br />
<br />
Après « 40A », le point suivant se note « Avantage » pour le joueur qui le gagne. Si le même joueur gagne un autre point alors il gagne le « jeu ». Sinon les deux joueurs repartent à « égalité » (soit « 40A »).<br />
<br />
Pour gagner un match il faut gagner 2 sets (ou manche).<br />
<br />
Un set, correspond à 6 jeux. Lorsqu'il y a « 5-5 », il faut aller jusqu’à 7 jeux. S’il y a « 6-6 » on réalise alors un « jeu décisif » (tie break). <br />
Le « jeu décisif » se compte différemment des autres jeux. En effet, la marque des points est compté « zéro », « 1 », « 2 », « 3 », … jusqu'à 7. <br />
Le premier joueur allant à 7 points remporte le « jeu décisif » et le set, à condition d’avoir 2 points d’écart sur son adversaire. <br />
S’il y a « 6-6 », alors le jeu décisif continuera jusqu'à ce qu'il y ait 2 points d’écart.</div>
			
		</div>
	</div>
</div>A ces règles, on va ajouter : <br />
- qu'une partie se joue qu'en 3 ou 5 sets<br />
<br />
<u><b><font size="3">5 - ABSTRACTION DES RÈGLES DU JEU ET CONCEPTUALISATION OBJET</font></b></u><br />
<br />
Là, on se jette à l'eau et on commence à décortiquer ce qu'il ressort des règles.<br />
<br />
- Une partie se joue avec 2 joueurs<br />
- Une partie se décompose en sets<br />
- Un set se décompose en jeux<br />
<br />
A ce stade, on peut déjà isoler sous forme de <b><u><font color="#0000FF">concepts</font></u></b> (<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">class</span></span>) les éléments essentiels au jeu du tennis : <br />
<ul><li style=""> Un joueur &#8658; <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">class</span> Joueur</span>,</li><li style=""> Une partie &#8658; <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">class</span> Partie</span>,</li><li style=""> Un set &#8658; <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">class</span> Set</span>,</li><li style=""> Un jeu &#8658; <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">class</span> Jeu</span></li></ul><br />
A ce stade, on ne connait pas encore précisément ce que fera chaque concept, mais on a commencé à découper notre problématique en éléments abstraits délimités. D'ores-et-déjà se dessinent les liens qui vont exister entre tous ces concepts... Je vais enfoncer une porte ouverte (même avec de l'élan) mais pour résoudre un problème, quel qu'il soit, il faut commencer par le dégrossir. Cette étape est essentielle, ça s'appelle tout simplement : la conception.<br />
<br />
<b>Faites bien attention dans le découpage de votre problématique à ne pas trop vous limiter ou à l'inverse trop diluer les concepts. Il est important que chaque concept reste cohérent et ne soit ni trop limité, ni trop généraliste. S'il est trop limité, vous allez avoir un empilement de concepts qui ne feront pas grand chose et à l'inverse si c'est trop généraliste, vous allez vous retrouver avec des concepts qui feront même le café... Chaque classe ne doit pas avoir trop de responsabilités ou à l'inverse trop peu.<br />
Pour arriver à ne pas tomber dans ces travers, il n'y a qu'une seule solution : la pratique, encore et toujours en y mettant en plus les mains dans le cambouis.</b><br />
<br />
<br />
On ne va pas paraphraser les règles mais juste préciser plus logiquement certains aspects qui ont été présentés de manière plus littéraire : <br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				Un set est remporté par le premier joueur à cumuler 6 ou 7 jeux gagnants à condition qu'il y ait <b>au moins</b> 2 jeux d'écart,<br />
Si les deux joueurs cumulent chacun 6 jeux gagnés : le jeu se transforme en jeu-décisif (tie-break).<br />
<br />
Une partie est gagnée par le joueur ayant cumulé : <br />
- 2 sets gagnants dans une partie en 3 sets<br />
- 3 sets gagnants dans une partie en 5 sets
			
		</div>
	</div>
</div><u><b><font size="2">5.1 - CONCEPTUALISATION AVANCÉE</font></b></u><br />
<br />
A ce stade, on va pouvoir définir quelques propriétés élémentaires et règles pour nos concepts.<br />
<br />
<b><u>À NOTER :</u></b><br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				Bien que généralement, je code toujours dans la langue de Shakespeare, je vais faire une dérogation à des fin de compréhension et coder dans la langue de Molière.<br />
Le nommage des variables dans tout le code sera long, verbeux et le plus auto-descriptif possible.<br />
Je ne ferais pas non plus référence aux théories plus pointues de la POO : abstraction, traits, interfaces, héritage, polymorphisme. Cela relève d'une étude beaucoup plus poussée de la POO. Etude qui va bien au-delà de l'objectif de ce billet.<br />
<br />
Pas d'utilisation d'espace de nom, d'autloader et autres joyeusetés qui rajouterait de la complexité à la complexité déjà présente. Je vais faire simple.<br />
La seule entorse c'est pour le code de test, je vais utiliser mon petit moteur de rendu en une seule classe <a href="https://www.developpez.net/forums/blogs/32058-rawsrc/b8215/phpecho-moteur-rendu-php-classe-gouverner/" target="_blank">PhpEcho</a>
			
		</div>
	</div>
</div><u><b><font size="2"><font color="#0000FF">5.1.1 - JOUEUR</font></font></b></u><br />
<br />
Maintenant il faut faire preuve d'imagination. Il faut s'imaginer le concept Joueur. Plus prosaïquement, cela correspondrait à la fiche d'un joueur. Qu'est ce qu'il est possible de suivre et qu'est-ce qu'on va décider de suivre.<br />
Pour ce qui est possible de suivre, la liste peut être très très longue (nom, prénom, date de naissance, classement ATP, taille, régime alimentaire, manies, droitier, gaucher...)<br />
Pour ce billet, on va aller à l'essentiel et juste se contenter de suivre le minimum : <br />
<br />
<ul><li style="">identifiant</li><li style="">nom</li><li style="">prénom</li></ul><br />
Ce qui se traduit en classe ainsi <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Joueur.php</span> : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Classe repr&eacute;sentant le concept de Joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @see https://www.developpez.net/forums/blogs/32058-rawsrc/b8721/poo-gestion-partie-tennis-php-objet/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @date 2020-01-08</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @author rawsrc http://www.developpez.net/forums/u32058/rawsrc</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> Joueur</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$id</span>;</span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$nom</span>;</span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$prenom</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span><span style="color: #339933;">$id</span>, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$nom</span>, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$prenom</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;id     = <span style="color: #339933;">$id</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;nom    = <span style="color: #339933;">$nom</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;prenom = <span style="color: #339933;">$prenom</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> id<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;id;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> nom<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;nom;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> prenom<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;prenom;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> nomComplet<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;prenom.<span style="color: #FF0000;">' '</span>.<span style="color: #339933;">$this</span>-&gt;nom;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div>Le code de la classe reste simple à appréhender, pour peu que vous ne soyez pas complètement néophyte en programmation.<br />
<br />
Il faut bien comprendre un point important avec l'objet c'est l'abstraction que cela apporte et surtout les bienfaits.<br />
<b><font color="#0000FF">Ici, notre classe <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Joueur</span> est un concept. Rien de plus. Un concept totalement abstrait. À ce stade, aucun joueur n'existe</font></b>. Tout ce que l'on sait c'est qu'on a une possibilité de disposer et de manipuler un pur concept abstrait dénommé : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Joueur</span>. Comme cela est corrélé à la notion d'un joueur (de tennis dans notre étude), on en déduit assez facilement les contours. Mais n'empêche que cela doit bien rester abstrait dans votre esprit, c'est important pour la suite, notre classe <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Joueur</span> est un modèle théorique d'un joueur (une représentation purement informatique).<br />
<br />
J'ai décidé unilatéralement, qu'un joueur ne pouvait exister que parce qu'il avait un nom, prénom et un identifiant. C'est la raison pour laquelle ces 3 informations sont à fournir au moment où l'on crée un joueur.<br />
Pour créer un joueur, on instancie simplement la classe : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$joueur</span> = <span style="color: #0000ff;">new</span> Joueur<span class="br0">&#40;</span><span style="color: #FF0000;">'rf'</span>, <span style="color: #FF0000;">'FEDERER'</span>, <span style="color: #FF0000;">'Roger'</span><span class="br0">&#41;</span>;</span>. Cette étape vous fait quitter l'environnement abstrait, le mot-clé <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">new</span></span> fait qu'un joueur avec des caractéristiques définies existe dans votre environnement informatique. <b>On est passé du concept abstrait à une réalité immatérielle mais réalité quand même !</b><br />
<br />
La force de l'objet c'est qu'il est possible de créer autant d'instances d'une classe que l'on a besoin.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$roger_federer</span> = <span style="color: #0000ff;">new</span> Joueur<span class="br0">&#40;</span><span style="color: #FF0000;">'rf'</span>, <span style="color: #FF0000;">'FEDERER'</span>, <span style="color: #FF0000;">'Roger'</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$rafael_nadal</span> = <span style="color: #0000ff;">new</span> Joueur<span class="br0">&#40;</span><span style="color: #FF0000;">'rn'</span>, <span style="color: #FF0000;">'NADAL'</span>, <span style="color: #FF0000;">'Rafael'</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$andy_murray</span> = <span style="color: #0000ff;">new</span> Joueur<span class="br0">&#40;</span><span style="color: #FF0000;">'am'</span>, <span style="color: #FF0000;">'MURRAY'</span>, <span style="color: #FF0000;">'Andy'</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><b>Il faut bien comprendre que chacun de ces joueurs est unique mais ça reste quoi qu'il arrive un <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Joueur</span> au sens conceptuel.</b><br />
Ainsi si par exemple vous paramétrez une fonction : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">function</span> classementATP<span class="br0">&#40;</span>Joueur <span style="color: #339933;">$j</span><span class="br0">&#41;</span></span>, n'importe quel de ces joueurs sera accepté, vous pouvez faire : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$atp_rf</span> = classementATP<span class="br0">&#40;</span><span style="color: #339933;">$roger_federer</span><span class="br0">&#41;</span>; <span style="color: #808080;">// ici $roger_federer est un Joueur car il est une instance de la classe Joueur</span>
<span style="color: #339933;">$atp_rn</span> = classementATP<span class="br0">&#40;</span><span style="color: #339933;">$rafael_nadal</span><span class="br0">&#41;</span>; <span style="color: #808080;">// ici $rafael_nadal est un Joueur car il est une instance de la classe Joueur</span></pre></td></tr></table></pre>
</div><br />
<u><b><font size="2"><font color="#0000FF">5.1.2 - RÉFLEXION SUR LE DÉROULÉ D'UNE PARTIE DE TENNIS</font></font></b></u><br />
<br />
Avant d'aller plus loin, il faut s'arrêter et réfléchir sur l'organisation et les rôles de chaque concept.<br />
<br />
On a traité notre concept <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Joueur</span>, parfait. <br />
<br />
Maintenant observons comment se déroule dans la réalité une partie de tennis et essayons d'en tirer une modélisation conceptuelle.<br />
- On sait que le points sont comptés dans chaque jeu : 0 15 30 40 40A AD<br />
- Chaque jeu a un gagnant<br />
- Pour chaque joueur le total des jeux gagnés doit être comptés<br />
- Chaque set à un gagnant<br />
- Pour chaque joueur le total des sets gagnés doit être comptés<br />
- Une partie est composée de sets qui sont composés de jeux<br />
- Une partie a un gagnant<br />
- On doit être capable de suivre toute la rencontre, ce qui veut dire : conserver l'historique des échanges, des points et des gagnants.<br />
<br />
On peut d'ores-et-déjà conclure que le décompte des points sera fait dans la classe <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Jeu</span>.<br />
<br />
Maintenant, posons nous la question suivante : comment savoir quand devons-nous démarrer un nouveau jeu ou un nouveau set ? <br />
Revoyons les bases : <br />
<ul><li style=""> un jeu ne sert qu'à stocker des points pour les deux joueurs et en l'état actuel du règlement il ne fait rien d'autre.</li><li style=""> un set ne sert qu'a stocker des jeux pour les deux joueurs. Le décompte des jeux influe directement sur le comportement du set. Pour preuve : si le nombre de jeux atteint un seuil particulier, on peut considérer par exemple que le set courant est fini, ou encore si le décompte des jeux arrive pour chaque joueur à 6, le set se termine en tie break. Donc, on peut affirmer qu'à priori la décision de démarrer ou pas un nouveau <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Jeu</span> appartient au concept <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Set</span>.</li><li style=""> une partie ne sert qu'à stocker des sets pour les deux joueurs. Le décompte des sets influe directement sur le déroulement de la partie. Pour preuve : si le nombre de sets remportés atteint 2 alors que la partie se joue en 3 sets, la partie est déclarée finie. Ou encore, si le nombre de sets remportés atteint 3 alors que la partie se joue en 5 sets, la partie est déclarée finie. Donc, on peut affirmer qu'à priori la décision de démarrer ou pas un nouveau <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Set</span> appartient au concept <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Partie</span>.</li></ul><br />
Ce qui schématiquement nous donne : <br />
<img src="https://www.developpez.net/forums/attachments/p529066d1578433823/environnements-developpement/delphi/langage/consersion-chaine-type-dos/vue_ensemble-75-.jpg/" border="0" alt="Nom : vue_ensemble-75%.jpg
Affichages : 20678
Taille : 85,0 Ko"  style="float: CONFIG" /><br />
<br />
<u><b><font size="2"><font color="#0000FF">5.1.3 - NOTION DE RÉFÉRENCE</font></font></b></u><br />
<br />
Quand vous manipulez des objets, vous ne faites que manipuler des références. Les instances manipulées sont originales et <b>JAMAIS</b> copiées.<br />
En reprenant notre exemple de tout à l'heure : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">function</span> classementATP<span class="br0">&#40;</span>Joueur <span style="color: #339933;">$j</span><span class="br0">&#41;</span></span>, le joueur que vous passez à cette fonction est la version originale de l'instance. C'est très important de bien comprendre ce qui se passe : à l'inverse du passage de variables scalaires par copie, les instances de classes sont passées par référence. Si votre fonction modifie l'instance du joueur qui lui a été passée, c'est la version originale du joueur qui sera modifiée et non une copie. <b>Donc, en sortie de fonction, votre joueur sera définitivement modifié pour le reste de votre application.</b> <br />
Il y a un énorme avantage à coder en POO, c'est que le passage des paramètres ne coûte absolument rien en terme de ressources.<br />
<br />
Comme l'indique le schéma, et grâce au mécanisme des références, il sera possible de matérialiser l'appartenance de chaque concept enfant à un concept englobant.<br />
Une partie englobe des sets qui englobent des jeux.<br />
Donc dans chaque jeu, on aura un pointeur qui référencera le set courant parent qui lui même référencera la partie en cours.<br />
<br />
<u><b><font size="2"><font color="#0000FF">5.1.4 - CONCEPT : PARTIE</font></font></b></u><br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Partie.php</span><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Classe repr&eacute;sentant le concept de Partie au tennis</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @see https://www.developpez.net/forums/blogs/32058-rawsrc/b8721/poo-gestion-partie-tennis-php-objet/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @date 2020-01-08</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @author rawsrc http://www.developpez.net/forums/u32058/rawsrc</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> Partie</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Nombre total de sets pour la partie : 3 ou 5</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$nb_sets</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array   [num_set =&gt; [Set]]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$sets</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>; <span style="color: #808080;">// suivi des sets</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$joueur1</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$joueur2</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Set</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$set_courant</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$gagnant</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$est_finie</span> = <span style="color: #0080ff;">false</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $j1      Joueur num&eacute;ro 1</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $j2      Joueur num&eacute;ro 2</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param int    $nb_sets nombre de sets &agrave; jouer : 3 ou 5</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span>Joueur <span style="color: #339933;">$j1</span>, Joueur <span style="color: #339933;">$j2</span>, <span style="color: #0080ff;">int</span> <span style="color: #339933;">$nb_sets</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;joueur1 = <span style="color: #339933;">$j1</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;joueur2 = <span style="color: #339933;">$j2</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #339933;">$nb_sets</span> === <span style="color: #cc66cc;">3</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span><span style="color: #339933;">$nb_sets</span> === <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;nb_sets = <span style="color: #339933;">$nb_sets</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;nb_sets = <span style="color: #cc66cc;">3</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;startNouveauSet<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> joueur1<span class="br0">&#40;</span><span class="br0">&#41;</span>: Joueur</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;joueur1;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> joueur2<span class="br0">&#40;</span><span class="br0">&#41;</span>: Joueur</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;joueur2;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> estFinie<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;est_finie;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> estLeDernierSetDeLaPartie<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;set_courant-&gt;numero<span class="br0">&#40;</span><span class="br0">&#41;</span> === <span style="color: #339933;">$this</span>-&gt;nb_sets;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Pointeur vers le set en cours de jeu</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Set</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>: Set</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;set_courant;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> nbSetsPrevu<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;nb_sets;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Fonction &agrave; appeler quand le Joueur 1 marque le point</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> pointGagnantJoueur1<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;point<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;joueur1, <span style="color: #339933;">$this</span>-&gt;joueur2<span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Fonction &agrave; appeler quand le Joueur 2 marque le point</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> pointGagnantJoueur2<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;point<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;joueur2, <span style="color: #339933;">$this</span>-&gt;joueur1<span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Joueur|null</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> gagnant<span class="br0">&#40;</span><span class="br0">&#41;</span>: ?Joueur</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;gagnant;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> startNouveauSet<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">void</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;sets<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$num</span> = <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">// on incr&eacute;mente de 1 le num&eacute;ro du set courant</span></span>
<span style="color: black;">            <span style="color: #339933;">$num</span> = <span style="color: #339933;">$this</span>-&gt;set_courant-&gt;numero<span class="br0">&#40;</span><span class="br0">&#41;</span> + <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #808080;">// la classe Set attend dans son constructeur une r&eacute;f&eacute;rence &agrave; la partie en cours :</span></span>
<span style="color: black;">        <span style="color: #808080;">//         public function __construct(Partie $partie, int $numero)</span></span>
<span style="color: black;">        <span style="color: #808080;">// l'instance en cours est d&eacute;sign&eacute;e par $this</span></span>
<span style="color: black;">        <span style="color: #808080;">// comme nous somme dans le code source de la classe Partie, $this r&eacute;f&eacute;rence bien une Partie</span></span>
<span style="color: black;">        <span style="color: #339933;">$set</span> = <span style="color: #0000ff;">new</span> Set<span class="br0">&#40;</span><span style="color: #339933;">$this</span>, <span style="color: #339933;">$num</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #808080;">// on enregistre le nouveau set dans le tableau de suivi des sets</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;sets<span class="br0">&#91;</span><span style="color: #339933;">$num</span><span class="br0">&#93;</span> = <span style="color: #339933;">$set</span>;</span>
<span style="color: black;">        <span style="color: #808080;">// pour une question de commodit&eacute;, on garde un acc&egrave;s direct au set en cours de jeu</span></span>
<span style="color: black;">        <span style="color: #808080;">// comme $set est une instance de classe donc une r&eacute;f&eacute;rence &agrave; un objet, ici on a un acc&egrave;s direct</span></span>
<span style="color: black;">        <span style="color: #808080;">// &agrave; l'objet original</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;set_courant = <span style="color: #339933;">$set</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Fonction qui g&egrave;re toute la logique d'une partie de tennis</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $gagnant</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $perdant</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> point<span class="br0">&#40;</span>Joueur <span style="color: #339933;">$gagnant</span>, Joueur <span style="color: #339933;">$perdant</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">// calcul des points pour le set courant</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;set_courant-&gt;point<span class="br0">&#40;</span><span style="color: #339933;">$gagnant</span>, <span style="color: #339933;">$perdant</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// si le set n'est pas fini on continue la suite de la partie</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;set_courant-&gt;estFini<span class="br0">&#40;</span><span class="br0">&#41;</span> === <span style="color: #0080ff;">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// set fini : on v&eacute;rifie si la partie n'est pas finie</span></span>
<span style="color: black;">        <span style="color: #339933;">$nb_actuel_sets_du_gagnant</span> = <span style="color: #339933;">$this</span>-&gt;nbSetsGagnes<span class="br0">&#40;</span><span style="color: #339933;">$gagnant</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$nb_actuel_sets_du_gagnant</span> / <span style="color: #339933;">$this</span>-&gt;nb_sets &gt;= <span style="color: #cc66cc;">0.5</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;est_finie = <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;gagnant   = <span style="color: #339933;">$gagnant</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">// le set est fini mais la partie n'est pas finie =&gt; on d&eacute;marre un nouveau set</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;startNouveauSet<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Pour la partie en cours renvoie le nombre total</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * de sets gagn&eacute;s par le joueur en param&egrave;tre</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> nbSetsGagnes<span class="br0">&#40;</span>Joueur <span style="color: #339933;">$joueur</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$nb</span> = <span style="color: #cc66cc;">0</span>;</span>
<span style="color: black;">        <span style="color: #808080;">// ici $this-&gt;sets est un tableau d'instances de la classe Set</span></span>
<span style="color: black;">        <span style="color: #808080;">// et comme chaque $set est un objet, on a acc&egrave;s &agrave; ses propri&eacute;t&eacute;s publiques</span></span>
<span style="color: black;">        <span style="color: #808080;">// en particulier on peut savoir si le set est fini et s'il a un gagnant</span></span>
<span style="color: black;">        <span style="color: #808080;">/** @var Set $set */</span></span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;sets <span style="color: #0000ff;">as</span> <span style="color: #339933;">$num</span> =&gt; <span style="color: #339933;">$set</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$set</span>-&gt;estFini<span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span><span style="color: #339933;">$set</span>-&gt;gagnant<span class="br0">&#40;</span><span class="br0">&#41;</span> === <span style="color: #339933;">$joueur</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                ++<span style="color: #339933;">$nb</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$nb</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Pour la partie en cours, renvoie le nombre total</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * de jeux gagn&eacute;s dans un set pour le joueur en param&egrave;tre</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  Joueur $joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  int    $numero_set</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> nbJeuxGagnesDansUnSet<span class="br0">&#40;</span>Joueur <span style="color: #339933;">$joueur</span>, <span style="color: #0080ff;">int</span> <span style="color: #339933;">$numero_set</span><span class="br0">&#41;</span> : <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$nb</span> = <span style="color: #cc66cc;">0</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;sets<span class="br0">&#91;</span><span style="color: #339933;">$numero_set</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">/** @var Set $set */</span></span>
<span style="color: black;">            <span style="color: #339933;">$set</span> = <span style="color: #339933;">$this</span>-&gt;sets<span class="br0">&#91;</span><span style="color: #339933;">$numero_set</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">            <span style="color: #339933;">$nb</span> = <span style="color: #339933;">$set</span>-&gt;nbJeuxGagnes<span class="br0">&#40;</span><span style="color: #339933;">$joueur</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$nb</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div>À la lecture de ce code et en particulier du constructeur, on voit immédiatement comment il faudra faire pour démarrer une nouvelle partie en 5 sets : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:192px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// d&eacute;pendances</span></span>
<span style="color: black;"><span style="color: #0000ff;">include</span> <span style="color: #FF0000;">'Joueur.php'</span>;</span>
<span style="color: black;"><span style="color: #0000ff;">include</span> <span style="color: #FF0000;">'Partie.php'</span>;</span>
<span style="color: black;"><span style="color: #0000ff;">include</span> <span style="color: #FF0000;">'Set.php'</span>;</span>
<span style="color: black;"><span style="color: #0000ff;">include</span> <span style="color: #FF0000;">'Jeu.php'</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// cr&eacute;ation de 2 joueurs distincts</span></span>
<span style="color: black;"><span style="color: #339933;">$joueur1</span> = <span style="color: #0000ff;">new</span> Joueur<span class="br0">&#40;</span><span style="color: #FF0000;">'rf'</span>, <span style="color: #FF0000;">'FEDERER'</span>, <span style="color: #FF0000;">'Roger'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$joueur2</span> = <span style="color: #0000ff;">new</span> Joueur<span class="br0">&#40;</span><span style="color: #FF0000;">'rn'</span>, <span style="color: #FF0000;">'NADAL'</span>, <span style="color: #FF0000;">'Rafael'</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// d&eacute;marrage d'une nouvelle partie de tennis en 5 sets</span></span>
<span style="color: black;"><span style="color: #339933;">$partie</span>  = <span style="color: #0000ff;">new</span> Partie<span class="br0">&#40;</span><span style="color: #339933;">$joueur1</span>, <span style="color: #339933;">$joueur2</span>, <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>;</span></pre></td></tr></table></pre>
</div>Comme il a été indiqué au début, l'utilisateur ne devra suivre que les points gagnants, tout le reste doit lui rester inconnu. Cela ne doit pas l'empêcher de faire fonctionner ce système même s'il est ignare en matière de règles du tennis. Le contrat est rempli : la classe <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Partie</span>, fournit deux fonctions qui se chargent de comptabiliser les points gagnants. Donc après avoir démarré la partie, tout ce que l'utilisateur a à faire se résume à l'appel d'une des fonctions à sa disposition <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$partie</span>-&gt;pointGagnantJoueur1<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span> ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$partie</span>-&gt;pointGagnantJoueur2<span class="br0">&#40;</span><span class="br0">&#41;</span></span>.<br />
<br />
<u><b><font size="2"><font color="#0000FF">5.1.5 - CONCEPT : SET (OU MANCHE)</font></font></b></u><br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Set.php</span><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Classe repr&eacute;sentant le concept de Set au tennis</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @see https://www.developpez.net/forums/blogs/32058-rawsrc/b8721/poo-gestion-partie-tennis-php-objet/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @date 2020-01-08</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @author rawsrc http://www.developpez.net/forums/u32058/rawsrc</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> Set</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Partie</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$partie</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$numero</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array   suivi des jeux</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$jeux</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Jeu</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$jeu_courant</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Joueur ayant remport&eacute; le set</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$gagnant</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$est_fini</span> = <span style="color: #0080ff;">false</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Partie $partie</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param int    $numero</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span>Partie <span style="color: #339933;">$partie</span>, <span style="color: #0080ff;">int</span> <span style="color: #339933;">$numero</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;partie = <span style="color: #339933;">$partie</span>;    <span style="color: #808080;">// chaque set appartient &agrave; une partie</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;numero = <span style="color: #339933;">$numero</span>;    <span style="color: #808080;">// chaque set est num&eacute;rot&eacute; de 1 &agrave; 7</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;startNouveauJeu<span class="br0">&#40;</span><span class="br0">&#41;</span>;   <span style="color: #808080;">// on pr&eacute;pare directement un nouveau jeu</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Partie</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> partie<span class="br0">&#40;</span><span class="br0">&#41;</span>: Partie</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;partie;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> numero<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;numero;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> estFini<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;est_fini;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Quand le set est fini, on enregistre le joueur gagnant</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Joueur|null</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> gagnant<span class="br0">&#40;</span><span class="br0">&#41;</span>: ?Joueur</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;gagnant;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param bool $tie_break</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> startNouveauJeu<span class="br0">&#40;</span><span style="color: #0080ff;">bool</span> <span style="color: #339933;">$tie_break</span> = <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">void</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;jeux<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$num</span> = <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">// on incr&eacute;mente de 1 le num&eacute;ro du jeu courant</span></span>
<span style="color: black;">            <span style="color: #339933;">$num</span> = <span style="color: #339933;">$this</span>-&gt;jeu_courant-&gt;numero<span class="br0">&#40;</span><span class="br0">&#41;</span> + <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #339933;">$jeu</span> = <span style="color: #0000ff;">new</span> Jeu<span class="br0">&#40;</span><span style="color: #339933;">$this</span>, <span style="color: #339933;">$num</span>, <span style="color: #339933;">$tie_break</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;jeu_courant = <span style="color: #339933;">$jeu</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;jeux<span class="br0">&#91;</span><span style="color: #339933;">$num</span><span class="br0">&#93;</span>  = <span style="color: #339933;">$jeu</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Jeu</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> jeuCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>: Jeu</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;jeu_courant;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $gagnant</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $perdant</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> point<span class="br0">&#40;</span>Joueur <span style="color: #339933;">$gagnant</span>, Joueur <span style="color: #339933;">$perdant</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">// on comptabilise le point dans le jeu courant</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;jeu_courant-&gt;point<span class="br0">&#40;</span><span style="color: #339933;">$gagnant</span>, <span style="color: #339933;">$perdant</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// si le jeu courant est fini on regarde la suite du jeu</span></span>
<span style="color: black;">        <span style="color: #808080;">// sinon le set continue</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;jeu_courant-&gt;estFini<span class="br0">&#40;</span><span class="br0">&#41;</span> === <span style="color: #0080ff;">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;jeu_courant-&gt;estTieBreak<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">// tie break termin&eacute;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;est_fini = <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;gagnant  = <span style="color: #339933;">$gagnant</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">return</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// r&eacute;cup&eacute;ration du d&eacute;compte des jeux gagn&eacute;s pour chaque joueur pour le set en cours</span></span>
<span style="color: black;">        <span style="color: #339933;">$nb_actuel_jeux_du_gagnant</span> = <span style="color: #339933;">$this</span>-&gt;nbJeuxGagnes<span class="br0">&#40;</span><span style="color: #339933;">$gagnant</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$nb_actuel_jeux_du_perdant</span> = <span style="color: #339933;">$this</span>-&gt;nbJeuxGagnes<span class="br0">&#40;</span><span style="color: #339933;">$perdant</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$ecart</span> = <span style="color: #339933;">$nb_actuel_jeux_du_gagnant</span> - <span style="color: #339933;">$nb_actuel_jeux_du_perdant</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// si strictement inf&eacute;rieur &agrave; 6 =&gt; le jeu continue</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$nb_actuel_jeux_du_gagnant</span> &lt; <span style="color: #cc66cc;">6</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;startNouveauJeu<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$ecart</span> &gt;= <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">// si &gt;= 6 =&gt; si &eacute;cart de sets &gt;= 2 alors le set est fini</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;est_fini = <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;gagnant = <span style="color: #339933;">$gagnant</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$nb_actuel_jeux_du_perdant</span> === <span style="color: #cc66cc;">6</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">// jeu d&eacute;cisif =&gt; tie break</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;startNouveauJeu<span class="br0">&#40;</span><span style="color: #0080ff;">true</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;startNouveauJeu<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Pour le set en cours renvoie le nombre</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * de jeux gagn&eacute;s par le joueur en param&egrave;tre</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> nbJeuxGagnes<span class="br0">&#40;</span>Joueur <span style="color: #339933;">$joueur</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$nb</span> = <span style="color: #cc66cc;">0</span>;</span>
<span style="color: black;">        <span style="color: #808080;">/** @var Jeu $jeu */</span></span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;jeux <span style="color: #0000ff;">as</span> <span style="color: #339933;">$num</span> =&gt; <span style="color: #339933;">$jeu</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$jeu</span>-&gt;estFini<span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span><span style="color: #339933;">$jeu</span>-&gt;gagnant<span class="br0">&#40;</span><span class="br0">&#41;</span> === <span style="color: #339933;">$joueur</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                ++<span style="color: #339933;">$nb</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$nb</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div><br />
<u><b><font size="2"><font color="#0000FF">5.1.6 - CONCEPT : JEU</font></font></b></u><br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Jeu.php</span><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Classe repr&eacute;sentant le concept de Jeu au tennis</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @see https://www.developpez.net/forums/blogs/32058-rawsrc/b8721/poo-gestion-partie-tennis-php-objet/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @date 2020-04-11</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @author rawsrc http://www.developpez.net/forums/u32058/rawsrc</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> Jeu</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Set</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$set</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$numero</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * A chaque coup jou&eacute;, on suit les scores</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * [num coup jou&eacute; =&gt; [joueur1 =&gt; score, joueur2 =&gt; score]]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$score</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Joueur ayant remport&eacute; le set</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$gagnant</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Indique si le set est fini</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$est_fini</span> = <span style="color: #0080ff;">false</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array   suivi du score du tie_break</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$tie_break</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Set  $set</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param int  $numero</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param bool $tie_break</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span>Set <span style="color: #339933;">$set</span>, <span style="color: #0080ff;">int</span> <span style="color: #339933;">$numero</span>, <span style="color: #0080ff;">bool</span> <span style="color: #339933;">$tie_break</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;set    = <span style="color: #339933;">$set</span>;    <span style="color: #808080;">// chaque jeu appartient &agrave; un set</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;numero = <span style="color: #339933;">$numero</span>; <span style="color: #808080;">// chaque jeu est num&eacute;rot&eacute;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// initialisation du tableau des scores</span></span>
<span style="color: black;">        <span style="color: #808080;">// ici on remonte les r&eacute;f&eacute;rences parentes pour atteindre la liste des joueurs</span></span>
<span style="color: black;">        <span style="color: #808080;">// qui est disponible que dans le concept Partie</span></span>
<span style="color: black;">        <span style="color: #339933;">$scores</span> = <span class="br0">&#91;</span></span>
<span style="color: black;">            <span style="color: #339933;">$set</span>-&gt;partie<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;joueur1<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;id<span class="br0">&#40;</span><span class="br0">&#41;</span> =&gt; <span style="color: #cc66cc;">0</span>,</span>
<span style="color: black;">            <span style="color: #339933;">$set</span>-&gt;partie<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;joueur2<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;id<span class="br0">&#40;</span><span class="br0">&#41;</span> =&gt; <span style="color: #cc66cc;">0</span></span>
<span style="color: black;">        <span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$tie_break</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;tie_break<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$scores</span>;   <span style="color: #808080;">// initialisation du jeu d&eacute;cisif</span></span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;score<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$scores</span>;       <span style="color: #808080;">// initialisation d'un jeu standard</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> numero<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;numero;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> estFini<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;est_fini;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Quand le jeu est fini, on enregistre le joueur gagnant</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Joueur|null</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> gagnant<span class="br0">&#40;</span><span class="br0">&#41;</span>: ?Joueur</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;gagnant;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array    [num coup jou&eacute; =&gt; [joueur1 =&gt; score, joueur2 =&gt; score]]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> tableauDesScore<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;score;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Renvoie le dernier score connu pour le joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  Joueur $joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> score<span class="br0">&#40;</span>Joueur <span style="color: #339933;">$joueur</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span>end<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;score<span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #339933;">$joueur</span>-&gt;id<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> estTieBreak<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span> ! <span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;tie_break<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $gagnant</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $perdant</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> point<span class="br0">&#40;</span>Joueur <span style="color: #339933;">$gagnant</span>, Joueur <span style="color: #339933;">$perdant</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">// traitement particulier si on est dans un tie-break</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;estTieBreak<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;pointTieBreak<span class="br0">&#40;</span><span style="color: #339933;">$gagnant</span>, <span style="color: #339933;">$perdant</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">return</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$id_gagnant</span> = <span style="color: #339933;">$gagnant</span>-&gt;id<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$id_perdant</span> = <span style="color: #339933;">$perdant</span>-&gt;id<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// score actuel du joueur ayant marqu&eacute; le point</span></span>
<span style="color: black;">        <span style="color: #339933;">$score_actuel_gagnant</span> = end<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;score<span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #339933;">$id_gagnant</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span style="color: #808080;">// score actuel de l'adversaire</span></span>
<span style="color: black;">        <span style="color: #339933;">$score_actuel_perdant</span> = end<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;score<span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #339933;">$id_perdant</span><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// Par d&eacute;faut le score du perdant ne bouge pas</span></span>
<span style="color: black;">        <span style="color: #808080;">// sauf dans le cas de l'&eacute;galit&eacute; not&eacute;e 40A et de l'avantage not&eacute; AD ou de sa perte</span></span>
<span style="color: black;">        <span style="color: #339933;">$nouveau_score_perdant</span> = <span style="color: #339933;">$score_actuel_perdant</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// d&eacute;termination du prochain score des joueurs</span></span>
<span style="color: black;">        <span style="color: #808080;">// ajout d'un coup jou&eacute; et sauvegarde des scores</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$score_actuel_gagnant</span> === <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$nouveau_score_gagnant</span> = <span style="color: #cc66cc;">15</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$score_actuel_gagnant</span> === <span style="color: #cc66cc;">15</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$nouveau_score_gagnant</span> = <span style="color: #cc66cc;">30</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$score_actuel_gagnant</span> === <span style="color: #cc66cc;">30</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$score_actuel_perdant</span> === <span style="color: #cc66cc;">40</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #808080;">// score &eacute;galit&eacute; pour les deux joueurs</span></span>
<span style="color: black;">                <span style="color: #339933;">$nouveau_score_gagnant</span> = <span style="color: #FF0000;">'40A'</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$nouveau_score_perdant</span> = <span style="color: #FF0000;">'40A'</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$nouveau_score_gagnant</span> = <span style="color: #cc66cc;">40</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$score_actuel_gagnant</span> === <span style="color: #FF0000;">'40A'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$score_actuel_perdant</span> === <span style="color: #FF0000;">'AD'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #808080;">// perte de l'avantage : retour &agrave; l'&eacute;galit&eacute; pour les deux joueurs</span></span>
<span style="color: black;">                <span style="color: #339933;">$nouveau_score_gagnant</span> = <span style="color: #FF0000;">'40A'</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$nouveau_score_perdant</span> = <span style="color: #FF0000;">'40A'</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$nouveau_score_gagnant</span> = <span style="color: #FF0000;">'AD'</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #339933;">$score_actuel_gagnant</span> === <span style="color: #cc66cc;">40</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span><span style="color: #339933;">$score_actuel_gagnant</span> === <span style="color: #FF0000;">'AD'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">// l'augmentation du score provoque la fin du jeu</span></span>
<span style="color: black;">            <span style="color: #808080;">// on conserve le gagnant du jeu</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;gagnant = <span style="color: #339933;">$gagnant</span>;</span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;est_fini = <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">            <span style="color: #808080;">// on va sauvegarder le coup jou&eacute; avec des valeur particuli&egrave;res</span></span>
<span style="color: black;">            <span style="color: #808080;">// pour bien rep&eacute;rer la fin du jeu</span></span>
<span style="color: black;">            <span style="color: #339933;">$nouveau_score_gagnant</span> = <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">            <span style="color: #339933;">$nouveau_score_perdant</span> = <span style="color: #0080ff;">false</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;score<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span></span>
<span style="color: black;">            <span style="color: #339933;">$id_gagnant</span> =&gt; <span style="color: #339933;">$nouveau_score_gagnant</span>,</span>
<span style="color: black;">            <span style="color: #339933;">$id_perdant</span> =&gt; <span style="color: #339933;">$nouveau_score_perdant</span></span>
<span style="color: black;">        <span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $gagnant</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Joueur $perdant</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> pointTieBreak<span class="br0">&#40;</span>Joueur <span style="color: #339933;">$gagnant</span>, Joueur <span style="color: #339933;">$perdant</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$id_gagnant</span> = <span style="color: #339933;">$gagnant</span>-&gt;id<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$id_perdant</span> = <span style="color: #339933;">$perdant</span>-&gt;id<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// r&eacute;cup&eacute;ration du d&eacute;compte des points pour chaque joueur</span></span>
<span style="color: black;">        <span style="color: #339933;">$score_actuel_tie_break_du_gagnant</span> = end<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;tie_break<span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #339933;">$id_gagnant</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$score_actuel_tie_break_du_perdant</span> = end<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;tie_break<span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #339933;">$id_perdant</span><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// le tie-break se joue en 7 points de base et il continue jusqu'&agrave; obtenir un &eacute;cart de 2 points</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$nouveau_score_tie_break_du_gagnant</span> = <span style="color: #339933;">$score_actuel_tie_break_du_gagnant</span> + <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$ecart</span> = <span style="color: #339933;">$nouveau_score_tie_break_du_gagnant</span> - <span style="color: #339933;">$score_actuel_tie_break_du_perdant</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$nouveau_score_tie_break_du_gagnant</span> &gt;= <span style="color: #cc66cc;">7</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$ecart</span> &gt;= <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;est_fini = <span style="color: #0080ff;">true</span>;    <span style="color: #808080;">// cl&ocirc;ture du jeu</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;gagnant = <span style="color: #339933;">$gagnant</span>; <span style="color: #808080;">// enregistrement du gagnant</span></span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #808080;">// enregistrement du score du tie-break</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;tie_break<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span></span>
<span style="color: black;">            <span style="color: #339933;">$id_gagnant</span> =&gt; <span style="color: #339933;">$nouveau_score_tie_break_du_gagnant</span>,</span>
<span style="color: black;">            <span style="color: #339933;">$id_perdant</span> =&gt; <span style="color: #339933;">$score_actuel_tie_break_du_perdant</span></span>
<span style="color: black;">        <span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  Joueur $joueur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> scoreTieBreak<span class="br0">&#40;</span>Joueur <span style="color: #339933;">$joueur</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$score</span> = <span style="color: #cc66cc;">0</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;estTieBreak<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$nb</span> = end<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;tie_break<span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #339933;">$joueur</span>-&gt;id<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$score</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div><br />
<u><b><font size="2"><font color="#0000FF">5.1.7 - INDEX</font></font></b></u><br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">index.php</span><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;">define<span class="br0">&#40;</span><span style="color: #FF0000;">'DIR_ROOT'</span>, <span style="color: #339933;">__DIR__</span>.DIRECTORY_SEPARATOR<span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// d&eacute;pendances</span></span>
<span style="color: black;"><span style="color: #0000ff;">include</span> <span style="color: #FF0000;">'PhpEcho.php'</span>;  <span style="color: #808080;">// moteur de rendu pour l'affichage</span></span>
<span style="color: black;"><span style="color: #808080;">// mod&eacute;lisation : concepts d'une partie de tennis</span></span>
<span style="color: black;"><span style="color: #0000ff;">include</span> <span style="color: #FF0000;">'src/Joueur.php'</span>;</span>
<span style="color: black;"><span style="color: #0000ff;">include</span> <span style="color: #FF0000;">'src/Partie.php'</span>;</span>
<span style="color: black;"><span style="color: #0000ff;">include</span> <span style="color: #FF0000;">'src/Set.php'</span>;</span>
<span style="color: black;"><span style="color: #0000ff;">include</span> <span style="color: #FF0000;">'src/Jeu.php'</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// routage tr&egrave;s basique</span></span>
<span style="color: black;"><span style="color: #339933;">$routes</span> = <span class="br0">&#91;</span></span>
<span style="color: black;">    <span style="color: #FF0000;">'start'</span> =&gt; <span style="color: #FF0000;">'actions/start.php'</span>, <span style="color: #808080;">// soumission du formulaire de cr&eacute;ation d'une nouvelle partie de tennis</span></span>
<span style="color: black;">    <span style="color: #FF0000;">'point'</span> =&gt; <span style="color: #FF0000;">'actions/point.php'</span>  <span style="color: #808080;">// soumission d'un point marqu&eacute; par un joueur</span></span>
<span style="color: black;"><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;">parse_str<span class="br0">&#40;</span><span style="color: #339933;">$_SERVER</span><span class="br0">&#91;</span><span style="color: #FF0000;">'QUERY_STRING'</span><span class="br0">&#93;</span>, <span style="color: #339933;">$query</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$action</span> = <span style="color: #339933;">$query</span><span class="br0">&#91;</span><span style="color: #FF0000;">'action'</span><span class="br0">&#93;</span> ?? <span style="color: #FF0000;">''</span>;</span>
&nbsp;
<span style="color: black;">session_start<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// page d'accueil</span></span>
<span style="color: black;"><span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$action</span> === <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$_SESSION</span><span class="br0">&#91;</span><span style="color: #FF0000;">'partie'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">// demande de la page d'accueil : alors qu'une partie est en cours =&gt; r&eacute;initialisation de la partie</span></span>
<span style="color: black;">        <span style="color: #0000ff;">unset</span><span class="br0">&#40;</span><span style="color: #339933;">$_SESSION</span><span class="br0">&#91;</span><span style="color: #FF0000;">'partie'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">echo</span> <span style="color: #0000ff;">new</span> PhpEcho<span class="br0">&#40;</span><span class="br0">&#91;</span>DIR_ROOT, <span style="color: #FF0000;">'vue Nouvelle_Partie.php'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$routes</span><span class="br0">&#91;</span><span style="color: #339933;">$query</span><span class="br0">&#91;</span><span style="color: #FF0000;">'action'</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">include</span> DIR_ROOT.<span style="color: #339933;">$routes</span><span class="br0">&#91;</span><span style="color: #339933;">$query</span><span class="br0">&#91;</span><span style="color: #FF0000;">'action'</span><span class="br0">&#93;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">echo</span> <span style="color: #FF0000;">'Action non g&eacute;r&eacute;e'</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div>Il faut noter que pour enregistrer les scores de la partie en cours, j'utilise une simple session dans laquelle je sauvegarde directement l'instance complète de ma classe Partie. Ce mécanisme particulier permet de conserver des objets entre les appels : le fonctionnement sous-jacent est basé sur les mécanismes de sérialisation et de déserialisation des objets. Je vous invite à aller consulter la doc de PHP sur ces aspects (<a href="https://www.php.net/manual/fr/function.serialize.php" target="_blank">serialize()</a> et <a href="https://www.php.net/manual/fr/function.unserialize.php" target="_blank">unserialize()</a>). À noter qu'au sein d'une session, ces deux mécanismes sont appelés automatiquement sans que l'on ait à s'en préoccuper.<br />
<br />
<u><b><font size="3"><font color="#0000FF">6 - PREUVE DU CONCEPT</font></font></b></u><br />
<br />
Afin que vous puissiez faire vos propres tests et autre décortiquage, j'ai également codé un petite application qui vous permet de vérifier le fonctionnement de l'application.<br />
<b><font color="#0000FF"><a href="https://rawsrc.developpez.com/tools/tennis/index.php" target="_blank">Vous pouvez faire un test grandeur nature par ici</a></font></b><br />
Dans le zip du programme, vous trouverez les 4 fichiers supplémentaires qui pilotent cette mini-app.<br />
<br />
Comme je vous l'avais déjà annoncé, j'ai utilisé mon <a href="https://www.developpez.net/forums/blogs/32058-rawsrc/b8215/phpecho-moteur-rendu-php-classe-gouverner/" target="_blank">moteur de rendu en une seule classe PhpEcho</a> pour bâtir les vues.<br />
<br />
La vue la plus intéressante est celle qui affiche le déroulé de la partie de tennis : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/** @var Partie $partie */</span></span>
<span style="color: black;"><span style="color: #339933;">$partie</span> = <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'partie'</span><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #339933;">$en_5sets</span> = <span class="br0">&#40;</span><span style="color: #339933;">$partie</span>-&gt;nbSetsPrevu<span class="br0">&#40;</span><span class="br0">&#41;</span> === <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// pointeur vers les instances de classe des joueurs</span></span>
<span style="color: black;"><span style="color: #339933;">$j1</span> = <span style="color: #339933;">$partie</span>-&gt;joueur1<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$j2</span> = <span style="color: #339933;">$partie</span>-&gt;joueur2<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #339933;">$j1_nom</span> = <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$hsc'</span>, <span style="color: #339933;">$j1</span>-&gt;nomComplet<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$j2_nom</span> = <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$hsc'</span>, <span style="color: #339933;">$j2</span>-&gt;nomComplet<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// score en cours</span></span>
<span style="color: black;"><span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$partie</span>-&gt;setCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;jeuCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;estTieBreak<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #339933;">$titre</span>    = <span style="color: #FF0000;">' - TIE BREAK'</span>;</span>
<span style="color: black;">    <span style="color: #339933;">$j1_score</span> = <span style="color: #339933;">$partie</span>-&gt;setCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;jeuCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;scoreTieBreak<span class="br0">&#40;</span><span style="color: #339933;">$j1</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span style="color: #339933;">$j2_score</span> = <span style="color: #339933;">$partie</span>-&gt;setCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;jeuCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;scoreTieBreak<span class="br0">&#40;</span><span style="color: #339933;">$j2</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #339933;">$titre</span>    = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #339933;">$j1_score</span> = <span style="color: #339933;">$partie</span>-&gt;setCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;jeuCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;score<span class="br0">&#40;</span><span style="color: #339933;">$j1</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span style="color: #339933;">$j2_score</span> = <span style="color: #339933;">$partie</span>-&gt;setCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;jeuCourant<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;score<span class="br0">&#40;</span><span style="color: #339933;">$j2</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span></span>
<span style="color: black;"><span style="color: #0080ff;">?&gt;</span></span>
&lt;style&gt;
  * {
    font-family: Arial;
    font-size: 14px;
  }
  table {
    border: solid 1px black;
    border-collapse: collapse;
  }
  th, td {
    text-align: center;
    padding: 5px;
    border: solid 1px black;
    border-collapse: collapse;
  }
&lt;/style&gt;
&lt;p&gt;D&Eacute;ROULEMENT DE LA PARTIE&lt;br&gt;SUIVI DES POINTS&lt;/p&gt;&lt;br&gt;
<span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$partie</span>-&gt;estFinie<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0080ff;">?&gt;</span></span>
&lt;br&gt;&lt;p&gt;LA PARTIE EST FINIE : VICTOIRE DE : <span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'$hsc'</span>, <span style="color: #339933;">$partie</span>-&gt;gagnant<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;nomComplet<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/p&gt;&lt;br&gt;
<span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> <span class="br0">&#125;</span> <span style="color: #0080ff;">?&gt;</span></span>
&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;JOUEUR&lt;/th&gt;
            &lt;th&gt;Set 1&lt;/th&gt;
            &lt;th&gt;Set 2&lt;/th&gt;
            &lt;th&gt;Set 3&lt;/th&gt;
            <span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$en_5sets</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0080ff;">?&gt;</span></span>
            &lt;th&gt;Set 4&lt;/th&gt;
            &lt;th&gt;Set 5&lt;/th&gt;
            <span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> <span class="br0">&#125;</span> <span style="color: #0080ff;">?&gt;</span></span>
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$j1_nom</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
            &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$partie</span>-&gt;nbJeuxGagnesDansUnSet<span class="br0">&#40;</span><span style="color: #339933;">$j1</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
            &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$partie</span>-&gt;nbJeuxGagnesDansUnSet<span class="br0">&#40;</span><span style="color: #339933;">$j1</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
            &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$partie</span>-&gt;nbJeuxGagnesDansUnSet<span class="br0">&#40;</span><span style="color: #339933;">$j1</span>, <span style="color: #cc66cc;">3</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
            <span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$en_5sets</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0080ff;">?&gt;</span></span>
            &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$partie</span>-&gt;nbJeuxGagnesDansUnSet<span class="br0">&#40;</span><span style="color: #339933;">$j1</span>, <span style="color: #cc66cc;">4</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
            &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$partie</span>-&gt;nbJeuxGagnesDansUnSet<span class="br0">&#40;</span><span style="color: #339933;">$j1</span>, <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
            <span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> <span class="br0">&#125;</span> <span style="color: #0080ff;">?&gt;</span></span>
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$j2_nom</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
          &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$partie</span>-&gt;nbJeuxGagnesDansUnSet<span class="br0">&#40;</span><span style="color: #339933;">$j2</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
          &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$partie</span>-&gt;nbJeuxGagnesDansUnSet<span class="br0">&#40;</span><span style="color: #339933;">$j2</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
          &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$partie</span>-&gt;nbJeuxGagnesDansUnSet<span class="br0">&#40;</span><span style="color: #339933;">$j2</span>, <span style="color: #cc66cc;">3</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
            <span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$en_5sets</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0080ff;">?&gt;</span></span>
              &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$partie</span>-&gt;nbJeuxGagnesDansUnSet<span class="br0">&#40;</span><span style="color: #339933;">$j2</span>, <span style="color: #cc66cc;">4</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
              &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$partie</span>-&gt;nbJeuxGagnesDansUnSet<span class="br0">&#40;</span><span style="color: #339933;">$j2</span>, <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
            <span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> <span class="br0">&#125;</span> <span style="color: #0080ff;">?&gt;</span></span>
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;&lt;br&gt;
<span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$partie</span>-&gt;estFinie<span class="br0">&#40;</span><span class="br0">&#41;</span> === <span style="color: #0080ff;">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0080ff;">?&gt;</span></span>
&lt;form method=&quot;post&quot; action=&quot;index.php?action=point&quot;&gt;
    &lt;p&gt;POINT GAGN&Eacute; PAR&lt;/p&gt;
    &lt;input type=&quot;submit&quot; name=&quot;pointJoueur1&quot; value=&quot;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$j1_nom</span> <span style="color: #0080ff;">?&gt;</span></span>&quot;&gt;&amp;nbsp;
    &lt;input type=&quot;submit&quot; name=&quot;pointJoueur2&quot; value=&quot;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$j2_nom</span> <span style="color: #0080ff;">?&gt;</span></span>&quot;&gt;
&lt;/form&gt;
&lt;br&gt;&lt;br&gt;
&lt;p&gt;JEU EN COURS<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$titre</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/p&gt;
&lt;table&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$j1_nom</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
            &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$j1_score</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$j2_nom</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
          &lt;td&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$j2_score</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
<span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> <span class="br0">&#125;</span> <span style="color: #0080ff;">?&gt;</span></span></pre></td></tr></table></pre>
</div>Il faut bien voir l'économie de variables que procure l'objet. Au lieu d'avoir 15 variables à passer à la vue, on se contente juste de passer directement l'instance de notre classe Partie qui contient absolument toutes les données relative à la partie en cours.<br />
<br />
<u><b><font size="3"><font color="#0000FF">7 - CONCLUSION</font></font></b></u><br />
<br />
Nous voilà rendus à la fin de ce billet. J'espère que cet exercice va vous permettre de prendre le temps nécessaire pour vous frotter à la pensée objet. J'ai tenté de réaliser ce tuto de la manière la plus simple et didactique possible en appuyant surtout sur les avantages que peut procurer une approche et une modélisation objet en général.<br />
N'oubliez pas que le code cette application est volontairement verbeux et pas optimisé afin de faciliter la compréhension des concepts et mécanismes mis en jeu dans une résolution 100% objet d'une problématique réelle. <br />
<br />
Le plus important est le découpage de notre problématique en briques simples et assez élémentaires qui collent assez finement à la réalité d'une partie de tennis. Ces concepts parlent à tout le monde et n'importe quel développeur saura immédiatement ce qu'il manipule rien qu'en s'appuyant sur le nommage : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Joueur</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Partie</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Set</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Jeu</span>. De même les fonctions sont explicites sans que l'on soit obligé d'aller tartiner le code d'explications inutiles : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> estFini<span class="br0">&#40;</span><span class="br0">&#41;</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> gagnant<span class="br0">&#40;</span><span class="br0">&#41;</span></span>, etc.<br />
<br />
Comme toujours si vous avez des questions ou si vous relevez des erreurs, n'hésitez pas à m'en faire part.<br />
<br />
Bon code à tous :ccool:<br />
<br />
Fichier ZIP : <a href="https://www.developpez.net/forums/attachments/p555078d1586590013/environnements-developpement/delphi/langage/consersion-chaine-type-dos/blog_rawsrc_tennis.zip/"  title="Nom : blog_rawsrc_tennis.zip
Affichages : 144
Taille : 14,3 Ko">blog_rawsrc_tennis.zip</a><br />
<br />
<b>EDIT 2020-04-11 : MISE À JOUR DU CODE DES VUES POUR LA COMPATIBILITÉ AVEC LA DERNIÈRE VERSION DE PhpEcho</b></blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b8721/poo-gestion-d-partie-tennis-php-objet/</guid>
		</item>
		<item>
			<title><![CDATA[PhpEcho : moteur de rendu PHP &#8658; une classe pour les gouverner tous]]></title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b8215/phpecho-moteur-rendu-php-classe-gouverner/</link>
			<pubDate>Fri, 11 Oct 2019 15:42:32 GMT</pubDate>
			<description>Salut les développeurs, après...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Salut les développeurs, après deux billets de blog assez ardus (je dois le reconnaître), aujourd'hui on va aller dans la simplicité et surtout dans une extrême utilité : je vais vous présenter un petit moteur de rendu PHP de ma conception qui est bâti que sur une seule et unique classe : la programmation orientée objet réduite à sa plus simple expression.<br />
<br />
Pas d'autoloading, pas de code ni de concepts compliqués, juste de simples <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">include</span></span>, comme à l'ancienne et avec une facilité de travail proche de la maternelle.<br />
Ce moteur s'occupe de tout : gestion des inclusions, des échappements, du passage de variables et aussi de la récupération du code généré ;)<br />
<br />
Il est également disponible sur <a href="https://github.com/rawsrc/PhpEcho" target="_blank">mon espace Github</a>.<br />
<br />
<b>ATTENTION :</b> Ce projet est mis à jour régulièrement, pensez plutôt à consulter le dépôt sur GitHub.<br />
<br />
<u><b><font size="3">1 - CONSTRUCTION D'UNE PAGE WEB</font></b></u><br />
<br />
Généralement, la construction d'une page web nécessite une bonne organisation et un découpage fin des différents éléments visuels qui une fois agencés correctement produiront le résultat escompté.<br />
C'est un principe phare en informatique en général : <i><b>Diviser pour mieux régner</b></i>.<br />
On ne va pas déroger à cette règle et on va l'appliquer totalement.<br />
<br />
Pour illustrer le propos, on va prendre un tout petit bout de votre site préféré : developpez.net, forum PHP : <br />
<br />
<img src="https://www.developpez.net/forums/attachments/p509089d1570741227/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/detection-touches-enfoncees-api/2019-10-10_224159.jpg/" border="0" alt="Nom : 2019-10-10_224159.jpg
Affichages : 1822
Taille : 275,4 Ko"  style="float: CONFIG" /><br />
<br />
Comme vous pouvez le constater, la présentation des messages du forum est totalement standardisée. Il va donc être possible de générer le rendu de manière <u>uniforme</u> à partir de simples informations textuelles qui auront été au préalable extraites et <b>parfaitement identifiées</b>. J'insiste sur le ce dernier point : chaque information que vous manipulez doit être identifiée de manière unique. Il faut toujours faire très attention à ce que les identifiants (clés des tableaux dans la plupart des cas), quand ils s'empilent, ne s'écrasent pas les uns les autres.<br />
<br />
Pour suivre notre exemple, il est tout à fait sensé que la vue en charge de rendre un message attende un tableau de valeurs de ce genre : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$vars</span> = <span class="br0">&#91;</span>
    <span style="color: #FF0000;">'titre_message'</span>          =&gt; <span style="color: #FF0000;">'[POO] classe non trouv&eacute;e malgr&eacute; autoloader ET include du fichier contenant la classe'</span>,
    <span style="color: #FF0000;">'auteur'</span>                 =&gt; <span style="color: #FF0000;">'laurentSc'</span>,
    <span style="color: #FF0000;">'horodatage'</span>             =&gt; <span style="color: #FF0000;">'2019-10-09 21:26'</span>,
    <span style="color: #FF0000;">'nb_reponses'</span>            =&gt; <span style="color: #FF0000;">'10'</span>,
    <span style="color: #FF0000;">'nb_affichages'</span>          =&gt; <span style="color: #FF0000;">'87'</span>,
    <span style="color: #FF0000;">'forum'</span>                  =&gt; <span style="color: #FF0000;">'D&eacute;buter'</span>,
    <span style="color: #FF0000;">'dernier_message'</span>        =&gt; <span style="color: #FF0000;">'2019-10-10 22:17'</span>,
    <span style="color: #FF0000;">'auteur_dernier_message'</span> =&gt; <span style="color: #FF0000;">'laurentSc'</span>    
<span class="br0">&#93;</span>;</pre></td></tr></table></pre>
</div>N'oubliez pas que ce tableau se répétera autant de fois que de messages à afficher (tableau de tableaux).<br />
<br />
Comme la page va être divisée en plein de blocs, il va falloir bien identifier les éléments nécessaires au bon fonctionnement de chaque bloc vue (en particuliers les valeurs attendues). De même, il est possible de diviser à l'infini les blocs vue en d'autres sous-blocs vue et ainsi de suite. C'est au développeur qu'il appartient d'organiser le découpage. <br />
<br />
<b>Position de la vue dans la chaîne de traitement</b><br />
<br />
Nous arrivons à un point fondamental dans la compréhension de la construction d'un site, comme l'exemple vous le démontre, une vue n'est rien d'autre qu'un afficheur de données. <br />
La vue est ce que l'on appelle <b>une terminaison</b> dans le traitement : elle ne fait que recevoir des données à afficher mais ne se préoccupe pas de savoir comment ces données ont été extraites, comment elles ont été travaillées ou même à quoi elles servent... <b>Attention : <font color="#0000FF">Une vue n'a pas à extraire des données.</font></b><br />
<br />
<b><font color="#0000FF"><font size="3">La vue ne fait que de la mise en forme.</font></font></b><br />
Attention ! Comme souvent : le terme de <i>mise en forme</i> est volontairement générique. <br />
Une mise en forme peut être : <ul><li style="">une page html</li><li style="">un fichier .pdf</li><li style="">un fichier .zip</li><li style="">etc.</li></ul><br />
<br />
<br />
<u><b><font size="3">2 - GÉNÉRATION D'UNE PAGE WEB EN PHP</font></b></u><br />
<br />
N'oublions pas que PHP est déjà à lui seul un moteur de rendu. Il sait parfaitement injecter des valeurs dans des chaînes de caractères, inclure des fichiers entiers les uns dans les autres, sécuriser les valeurs renvoyées au navigateur, être très souple dans sa manipulation pour permettre une mise en forme aisée selon ses besoins. Bref, il faut se rendre à l'évidence, à priori, il ne lui manque rien quand on le connait un peu.<br />
Le hic, c'est que, quand on le connait un peu (et c'est mon cas ;)), la gestion des rendus manque de souplesse, amène rapidement un code redondant et ne tolère aucun oubli dans les échappements. Bref, faire un rendu à coup d'<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">include</span></span> devient vite une vraie galère (je compatis les gars, je compatis). C'est partant de ce constat, que des développeurs ont eu l'idée d'améliorer tout ça et ont créé une tonne de moteurs de rendu (template engine) : Smarty, Twig, Blade, Volt...<br />
La contrepartie quoi qu'on en dise, ils rajoutent tous une couche non négligeable de traitements et d'autres contraintes. Sans compter qu'il faut prendre le temps de les découvrir, apprendre leur syntaxe, règles internes et enfin pour la plupart d'entre-eux avoir l'obligation de mettre en place un moteur de cache performant.<br />
<br />
<br />
<u><b><font size="3">3 - ATTENTES D'UN MOTEUR DE RENDU EN PHP</font></b></u><br />
<br />
<ul><li style="">Gestion des inclusions de fichiers (ou blocs)</li><li style="">Aide à la construction des chemins des fichiers à inclure</li><li style="">Transmission aisée de variables aux vues sous forme de tableau [clé &#8658; valeur]</li><li style="">Échappement automatique des valeurs</li><li style="">Échappement sur demande des valeurs</li><li style="">Légèreté dans son fonctionnement</li><li style="">Ne pas avoir à apprendre une nouvelle syntaxe</li></ul><br />
La version minimale visée est PHP 7+ mais vu la simplicité du truc, cela fonctionnera aussi sur les versions antérieures PHP 5.3+.<br />
<br />
<b><u>Contrainte unique :</u></b> <b><font color="#0000FF">Il est admis qu'aucun espace n'est inséré dans le nommage des éléments tels que répertoires et noms de fichier</font></b>. C'est déjà le cas dans 100% des développements (je m'avance un peu, là :aie:), malgré tout si vous avez l'habitude d'en insérer, perdez la vite car cela crée plus de problèmes qu'autre chose. Il est possible de remplacer avantageusement l'espace par le tiret bas : _ <br />
<br />
Règle d'or : <b>EN DÉVELOPPEMENT INFORMATIQUE, NE JAMAIS INSÉRER D'ESPACE DANS QUOI QUE CE SOIT. ÇA PEUT VOUS SAUVER LA VIE ;)</b><br />
<br />
<br />
<u><b><font size="3">4 - CONCEPTS RELATIFS À LA PROGRAMMATION ORIENTÉE OBJET</font></b></u><br />
<br />
Dans ce passage, on va passer en revue les concepts qu'il faut maîtriser pour bien comprendre le fonctionnement de l'outil.<br />
<br />
<br />
<u><b><font size="2">4.1 - CLASSES : DÉFINITION DES DONNÉES - ACCESSEURS ET MUTATEURS</font></b></u><br />
<br />
Si vous prenez une classe standard, pour lui modifier une valeur interne, plusieurs méthodes sont possibles : il faut soit lui définir des mutateurs (les fameuses fonctions commençant généralement par <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">set</span> comme <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">setNom<span class="br0">&#40;</span><span style="color: #339933;">$nom</span><span class="br0">&#41;</span></span>), soit rendre ses attributs publics.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// AVEC MUTATEUR</span>
<span style="color: #0000ff;">class</span> Foo
<span class="br0">&#123;</span>
    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$nom</span>;
&nbsp;
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setNom<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$nom</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #339933;">$this</span>-&gt;nom = <span style="color: #339933;">$nom</span>;
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span style="color: #339933;">$foo</span> = <span style="color: #0000ff;">new</span> Foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$foo</span>-&gt;setNom<span class="br0">&#40;</span><span style="color: #FF0000;">'rawsrc'</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// AVEC ACC&Egrave;S PUBLIC</span>
<span style="color: #0000ff;">class</span> Foo
<span class="br0">&#123;</span>
    <span style="color: #0000ff;">public</span> <span style="color: #339933;">$nom</span>;
<span class="br0">&#125;</span>
<span style="color: #339933;">$foo</span> = <span style="color: #0000ff;">new</span> Foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$foo</span>-&gt;nom = <span style="color: #FF0000;">'rawsrc'</span>;</pre></td></tr></table></pre>
</div>Quand on code en objet, il est rare que l'on laisse les attributs publics. Généralement, il est important de bien savoir ce qui est manipulé et l'utilisation des mutateurs permet d'effectuer des contrôles sur ce qui rentre dans l'instance de la classe. <br />
Par exemple, on veut s'assurer que seuls les noms ayant au minimum 5 caractères soient acceptés, cela donnera ce code : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// AVEC MUTATEUR</span>
<span style="color: #0000ff;">class</span> Foo
<span class="br0">&#123;</span>
    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$nom</span> = <span style="color: #FF0000;">''</span>;
&nbsp;
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setNom<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$nom</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #808080;">// SI ET SEULEMENT SI LA LONGUEUR DU NOM EST &gt;= 5</span>
        <span style="color: #808080;">// SINON L'ATTRIBUT $nom N'EST PAS D&Eacute;FINI</span>
        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>mb_strlen<span class="br0">&#40;</span><span style="color: #339933;">$nom</span><span class="br0">&#41;</span> &gt;= <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #339933;">$this</span>-&gt;nom = <span style="color: #339933;">$nom</span>;    
        <span class="br0">&#125;</span>        
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> getNom<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;nom;
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span style="color: #339933;">$foo</span> = <span style="color: #0000ff;">new</span> Foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$foo</span>-&gt;setNom<span class="br0">&#40;</span><span style="color: #FF0000;">'rawsrc'</span><span class="br0">&#41;</span>; <span style="color: #808080;">// 6 caract&egrave;res, &ccedil;a passe</span>
<span style="color: #339933;">$nom</span> = <span style="color: #339933;">$foo</span>-&gt;getNom<span class="br0">&#40;</span><span class="br0">&#41;</span>;  <span style="color: #808080;">// $nom = rawsrc</span>
&nbsp;
<span style="color: #339933;">$foo</span> = <span style="color: #0000ff;">new</span> Foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$foo</span>-&gt;setNom<span class="br0">&#40;</span><span style="color: #FF0000;">'luc'</span><span class="br0">&#41;</span>;    <span style="color: #808080;">// 3 caract&egrave;res, le nom ne sera pas d&eacute;fini dans l'instance $foo</span>
<span style="color: #339933;">$nom</span> = <span style="color: #339933;">$foo</span>-&gt;getNom<span class="br0">&#40;</span><span class="br0">&#41;</span>;  <span style="color: #808080;">// $nom = ''</span></pre></td></tr></table></pre>
</div>Maintenant, si on avait laissé l'attribut public, on aurait l'obligation de faire la vérification sur la contrainte de longueur partout avant d'utiliser le nom :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> Foo
<span class="br0">&#123;</span>
    <span style="color: #0000ff;">public</span> <span style="color: #339933;">$nom</span>;
<span class="br0">&#125;</span>
<span style="color: #339933;">$foo</span> = <span style="color: #0000ff;">new</span> Foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$foo</span>-&gt;nom = <span style="color: #FF0000;">'luc'</span>;  <span style="color: #808080;">// aucun contr&ocirc;le, c'est la f&ecirc;te au village</span>
<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>mb_strlen<span class="br0">&#40;</span><span style="color: #339933;">$foo</span>-&gt;nom<span class="br0">&#41;</span> &gt;= <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span style="color: #808080;">// traitement quand le nom est valide</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>C'est tout simplement ingérable.<br />
<br />
<br />
<u><b><font size="2">4.2 - CLASSES : INTERFACES SYSTÈMES ET IMPLÉMENTATION</font></b></u><br />
<br />
Après avoir vu ce préalable, revenons à nos moutons. <br />
Quand vous développez en programmation orientée objet, il est possible de conférer certains comportements à vos classes pour peu que vous implémentiez certaines interfaces systèmes. <br />
Je m'explique : si vous souhaitez avoir la possibilité de manipuler un objet (instance de classe) comme un tableau, c'est-à-dire être capable de coder ainsi : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> Foo
<span class="br0">&#123;</span>
    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$vars</span> = <span style="color: #FF0000;">''</span>;
<span class="br0">&#125;</span>
<span style="color: #339933;">$foo</span>        = <span style="color: #0000ff;">new</span> Foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$foo</span><span class="br0">&#91;</span><span style="color: #FF0000;">'nom'</span><span class="br0">&#93;</span> = <span style="color: #FF0000;">'rawsrc'</span>; <span style="color: #808080;">// voyez la notation tableau</span></pre></td></tr></table></pre>
</div>PHP vous en donne la possibilité à <b>l'unique condition</b> que votre classe implémente l'interface système <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">ArrayAccess</span>, c'est une interface définie dans la <a href="https://www.php.net/manual/fr/class.arrayaccess.php" target="_blank">documentation PHP</a> qui vous oblige à implémenter 4 fonctions spéciales qui une fois insérées dans le code de votre classe, vont vous permettre de disposer de ce comportement. Génial, non ?<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> Foo
<span style="color: #0000ff;">implements</span> \ArrayAccess
<span class="br0">&#123;</span>
    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$vars</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>; <span style="color: #808080;">// tableau qui va servir &agrave; stocker toutes les valeurs</span>
&nbsp;
    <span style="color: #808080;">/**</span>
<span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span>
<span style="color: #808080;">&nbsp;    * @param mixed $offset</span>
<span style="color: #808080;">&nbsp;    * @return bool</span>
<span style="color: #808080;">&nbsp;    */</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetExists<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// on v&eacute;rifie que la cl&eacute; est d&eacute;finie et diff&eacute;rente de null</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080;">/**</span>
<span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span>
<span style="color: #808080;">&nbsp;    * @param mixed $offset</span>
<span style="color: #808080;">&nbsp;    * @return mixed|null</span>
<span style="color: #808080;">&nbsp;    */</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetGet<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span> ?? <span style="color: #0080ff;">null</span>;
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080;">/**</span>
<span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span>
<span style="color: #808080;">&nbsp;    * @param mixed $offset</span>
<span style="color: #808080;">&nbsp;    * @param mixed $value</span>
<span style="color: #808080;">&nbsp;    */</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetSet<span class="br0">&#40;</span><span style="color: #339933;">$offset</span>, <span style="color: #339933;">$value</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span> = <span style="color: #339933;">$value</span>;
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080;">/**</span>
<span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span>
<span style="color: #808080;">&nbsp;    * @param mixed $offset</span>
<span style="color: #808080;">&nbsp;    */</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetUnset<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">unset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span style="color: #808080;">// ET LA TECHNIQUE OP&Egrave;RE</span>
<span style="color: #339933;">$foo</span>        = <span style="color: #0000ff;">new</span> Foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;  <span style="color: #808080;">// ici vous manipulez une instance de classe</span>
<span style="color: #339933;">$foo</span><span class="br0">&#91;</span><span style="color: #FF0000;">'nom'</span><span class="br0">&#93;</span> = <span style="color: #FF0000;">'rawsrc'</span>;   <span style="color: #808080;">// qui se comporte comme un tableau</span></pre></td></tr></table></pre>
</div>Maintenant, vous voulez compter le nombre d'éléments définis dans votre instance de classe comme si s'était un tableau, pas de problème, l'interface <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Countable</span> est là pour ça : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> Foo
<span style="color: #0000ff;">implements</span> \ArrayAccess, \Countable
<span class="br0">&#123;</span>
    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$vars</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>; <span style="color: #808080;">// tableau qui va servir &agrave; stocker toutes les valeurs</span>
&nbsp;
    <span style="color: #808080;">/**</span>
<span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span>
<span style="color: #808080;">&nbsp;    * @param mixed $offset</span>
<span style="color: #808080;">&nbsp;    * @return bool</span>
<span style="color: #808080;">&nbsp;    */</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetExists<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// on v&eacute;rifie que la cl&eacute; est d&eacute;finie et diff&eacute;rente de null</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080;">/**</span>
<span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span>
<span style="color: #808080;">&nbsp;    * @param mixed $offset</span>
<span style="color: #808080;">&nbsp;    * @return mixed|null</span>
<span style="color: #808080;">&nbsp;    */</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetGet<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span> ?? <span style="color: #0080ff;">null</span>;
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080;">/**</span>
<span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span>
<span style="color: #808080;">&nbsp;    * @param mixed $offset</span>
<span style="color: #808080;">&nbsp;    * @param mixed $value</span>
<span style="color: #808080;">&nbsp;    */</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetSet<span class="br0">&#40;</span><span style="color: #339933;">$offset</span>, <span style="color: #339933;">$value</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span> = <span style="color: #339933;">$value</span>;
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080;">/**</span>
<span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span>
<span style="color: #808080;">&nbsp;    * @param mixed $offset</span>
<span style="color: #808080;">&nbsp;    */</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetUnset<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">unset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080;">/**</span>
<span style="color: #808080;">&nbsp;    * Interface Countable</span>
<span style="color: #808080;">&nbsp;    * @return int</span>
<span style="color: #808080;">&nbsp;    */</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> count<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">return</span> count<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#41;</span>;
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span style="color: #808080;">// ET LA TECHNIQUE OP&Egrave;RE</span>
<span style="color: #339933;">$foo</span>        = <span style="color: #0000ff;">new</span> Foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$foo</span><span class="br0">&#91;</span><span style="color: #FF0000;">'nom'</span><span class="br0">&#93;</span> = <span style="color: #FF0000;">'rawsrc'</span>;
<span style="color: #339933;">$nb_elem</span>    = count<span class="br0">&#40;</span><span style="color: #339933;">$foo</span><span class="br0">&#41;</span>;   <span style="color: #808080;">// $nb_elem = 1</span></pre></td></tr></table></pre>
</div><br />
Une dernière pour la route, tout en gardant le comportement tableau, on veut que si la clé est 'nom' alors ne sont acceptées que les valeurs dont la longueur est supérieure ou égale à 5.<br />
On corrige légèrement la fonction en charge de la définition des valeurs en y intégrant le contrôle adéquate et hop le tour est joué : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td valign="top"><pre style="margin: 0">    <span style="color: #808080;">/**</span>
<span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span>
<span style="color: #808080;">&nbsp;    * @param mixed $offset</span>
<span style="color: #808080;">&nbsp;    * @param mixed $value</span>
<span style="color: #808080;">&nbsp;    */</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetSet<span class="br0">&#40;</span><span style="color: #339933;">$offset</span>, <span style="color: #339933;">$value</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$offset</span> === <span style="color: #FF0000;">'nom'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_scalar<span class="br0">&#40;</span><span style="color: #339933;">$value</span><span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span>mb_strlen<span class="br0">&#40;</span><span style="color: #339933;">$value</span><span class="br0">&#41;</span> &gt;= <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span> = <span style="color: #339933;">$value</span>;        
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span>
            <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span> = <span style="color: #339933;">$value</span>;
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
<b>CONCLUSION</b> : tout ça pour vous dire qu'il existe des tas de manières pour rendre votre code objet très souple sans perdre pour autant les éléments de contrôle et de vérification nécessaires à tout bon code robuste. Un développeur doit <b>TOUJOURS</b> savoir ce qu'il manipule, même si le langage est dynamique et permissif sur le typage.<br />
<br />
<br />
<u><b><font size="2">4.3 - CLASSES : MÉTHODES MAGIQUES</font></b></u><br />
<br />
PHP offre une autre fonctionnalité très puissante : <a href="https://www.php.net/manual/fr/language.oop5.magic.php" target="_blank">les méthodes magiques</a>. Ces méthodes permettent d'adapter le fonctionnement d'une classe à certains contextes spécifiques. Oui je sais, lu comme ça, ça pique un peu.<br />
Un exemple, va vite vous éclairer.<br />
Quand nous faisons un simple <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">echo</span></span>, ce qui est attendu après ce mot clé est une chaîne de caractères (<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">string</span></span>). Ici, on peut dire que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">echo</span></span> détermine un contexte fermé avec une contrainte. Pareil, si on écrit au sein d'un bloc heredoc, le contexte est clairement défini et il faut produire du texte : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$str</span> = &lt;&lt;&lt;<span style="color: #FF0000;">str</span>
<span style="color: #FF0000;">Ici je suis dans un contexte qui attend du texte pour fonctionner correctement</span>
<span style="color: #FF0000;">L&agrave; aussi</span>
<span style="color: #FF0000;">Et jusqu'&agrave; que ce contexte soit ferm&eacute;.</span>
<span style="color: #FF0000;">str</span>;</pre></td></tr></table></pre>
</div>Comme l'orienté objet existe depuis belle lurette au sein de PHP, il a été prévu depuis fort longtemps d'avoir la possibilité d'adapter <b>automatiquement</b> le comportement d'une instance de classe à son contexte d'exécution.<br />
Dans notre cas, la méthode magique en charge de renvoyer automatiquement du texte quand c'est nécessaire à partir d'une instance est <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>.<br />
Regardez bien : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> Foo
<span class="br0">&#123;</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;je suis du texte en provenance d'une instance de la classe Foo&quot;</span>;
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span style="color: #339933;">$foo</span> = <span style="color: #0000ff;">new</span> Foo<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// instance de la classe Foo</span>
<span style="color: #808080;">// voyez ici, on renvoie directement l'instance de la classe comme si c'&eacute;tait du texte</span>
<span style="color: #0000ff;">echo</span> <span style="color: #339933;">$foo</span>;   <span style="color: #808080;">// ce qui est affich&eacute; : je suis du texte en provenance d'une instance de la classe Foo</span></pre></td></tr></table></pre>
</div>Le moteur de PHP va vérifier si la classe définit la méthode magique <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">__toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span> et si oui, va l'appeler automatiquement, ainsi aucune erreur ne sera générée.<br />
Si notre classe n'avait pas cette méthode magique, on aurait récupéré une belle erreur fatale : <br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				Catchable fatal error: Object of class Foo could not be converted to string
			
		</div>
	</div>
</div>La classe du moteur de rendu fait massivement appel à cette méthode magique.<br />
<br />
Il y a plein de méthode magiques pour répondre à des tas de besoins.<br />
<br />
Il y a une autre méthode magique qui va nous intéresser : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span>.<br />
Cette méthode nous offre la possibilité d'utiliser une instance de classe comme une fonction !<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> Foo
<span class="br0">&#123;</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> add<span class="br0">&#40;</span><span style="color: #0080ff;">int</span> <span style="color: #339933;">$x</span>, <span style="color: #0080ff;">int</span> <span style="color: #339933;">$y</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$x</span> + <span style="color: #339933;">$y</span>;
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> substract<span class="br0">&#40;</span><span style="color: #0080ff;">int</span> <span style="color: #339933;">$x</span>, <span style="color: #0080ff;">int</span> <span style="color: #339933;">$y</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$x</span> - <span style="color: #339933;">$y</span>;
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$op</span>, <span style="color: #0080ff;">int</span> <span style="color: #339933;">$x</span>, <span style="color: #0080ff;">int</span> <span style="color: #339933;">$y</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$op</span> === <span style="color: #FF0000;">'add'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;add<span class="br0">&#40;</span><span style="color: #339933;">$x</span>, <span style="color: #339933;">$y</span><span class="br0">&#41;</span>;    
        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$op</span> === <span style="color: #FF0000;">'substract'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;substract<span class="br0">&#40;</span><span style="color: #339933;">$x</span>, <span style="color: #339933;">$y</span><span class="br0">&#41;</span>;
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span style="color: #339933;">$foo</span> = <span style="color: #0000ff;">new</span> Foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$sum</span> = <span style="color: #339933;">$foo</span>-&gt;add<span class="br0">&#40;</span><span style="color: #cc66cc;">10</span>, <span style="color: #cc66cc;">25</span><span class="br0">&#41;</span>;  <span style="color: #808080;">// 35</span>
<span style="color: #339933;">$sub</span> = <span style="color: #339933;">$foo</span>-&gt;substract<span class="br0">&#40;</span><span style="color: #cc66cc;">25</span>, <span style="color: #cc66cc;">10</span><span class="br0">&#41;</span>; <span style="color: #808080;">// 15</span>
&nbsp;
<span style="color: #808080;">// il est possible d'utiliser l'instance comme une fonction pour arriver au m&ecirc;me r&eacute;sultat : gr&acirc;ce &agrave; la m&eacute;thode magique __invoke()</span>
<span style="color: #339933;">$sum</span> = <span style="color: #339933;">$foo</span><span class="br0">&#40;</span><span style="color: #FF0000;">'add'</span>, <span style="color: #cc66cc;">10</span>, <span style="color: #cc66cc;">20</span><span class="br0">&#41;</span>;         <span style="color: #808080;">// ici nous appelons une fonction $foo() alors que $foo est une instance de classe... </span>
<span style="color: #339933;">$sub</span> = <span style="color: #339933;">$foo</span><span class="br0">&#40;</span><span style="color: #FF0000;">'substract'</span>, <span style="color: #cc66cc;">25</span>, <span style="color: #cc66cc;">10</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>Sans cette fonction magique, notre code aurait produit une erreur fatale : <br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				Fatal error: Uncaught Error: Function name must be a string
			
		</div>
	</div>
</div>Sans vous en rendre compte mais à chaque fois que vous faites <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">new</span> MaClasse</span>, vous utilisez la méthode magique <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span>. C'est dire combien vous appréciez son utilité quotidiennement :lol:<br />
Enfin juste pour finir, il est possible de bloquer le contexte défini par <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">new</span></span>, si par exemple vous ne souhaitez pas que la classe soit instanciée (cas du Singleton) en rendant la méthode magique privée : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> Foo
<span class="br0">&#123;</span>
    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span style="color: #339933;">$foo</span> = <span style="color: #0000ff;">new</span> Foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>On récupère une belle erreur fatale : <br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				Fatal Error: Call to private Foo::__construct() from invalid context
			
		</div>
	</div>
</div>J'espère que vous commencez à apercevoir l'étendu du monde de l'orienté objet, c'est très vaste.<br />
Cela offre des possibilités inouïes en terme de modélisation.<br />
<br />
Allez, assez bavardé, on passe aux choses sérieuses.<br />
<br />
<br />
<u><b><font size="3">5 - MOTEUR DE RENDU - PHP 7+</font></b></u><br />
<br />
Ci-après, vous trouverez le code commenté du moteur de rendu. Le code fait appel massivement aux concepts abordés et détaillés précédemment.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">namespace</span> rawsrc\PhpEcho;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* PhpEcho : PHP Template engine : One class to rule them all ;-)</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link        https://www.developpez.net/forums/blogs/32058-rawsrc/b8215/phpecho-moteur-rendu-php-classe-gouverner/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @author      rawsrc - https://www.developpez.net/forums/u32058/rawsrc/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @copyright   MIT License</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              Copyright (c) 2020 rawsrc</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              Permission is hereby granted, free of charge, to any person obtaining a copy</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              of this software and associated documentation files (the &quot;Software&quot;), to deal</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              in the Software without restriction, including without limitation the rights</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              copies of the Software, and to permit persons to whom the Software is</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              furnished to do so, subject to the following conditions:</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              The above copyright notice and this permission notice shall be included in all</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              copies or substantial portions of the Software.</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              SOFTWARE.</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> PhpEcho</span>
<span style="color: black;"><span style="color: #0000ff;">implements</span> \ArrayAccess</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$id</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$vars</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Full resolved filepath to the external view file</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$file</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$code</span> = <span style="color: #FF0000;">''</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed  $file   see setFile() below</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array  $vars</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $id     if empty then auto-generated</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span><span style="color: #339933;">$file</span> = <span style="color: #FF0000;">''</span>, <span style="color: #0000ff;">array</span> <span style="color: #339933;">$vars</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>, <span style="color: #0080ff;">string</span> <span style="color: #339933;">$id</span> = <span style="color: #FF0000;">''</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$file</span> !== <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;setFile<span class="br0">&#40;</span><span style="color: #339933;">$file</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$id</span> === <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;generateId<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;id = <span style="color: #339933;">$id</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;vars = <span style="color: #339933;">$vars</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $id</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setId<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$id</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;id = <span style="color: #339933;">$id</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> id<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;id;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Generate an unique execution id based on random_bytes()</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Always start with a letter</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> generateId<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;id = chr<span class="br0">&#40;</span>mt_rand<span class="br0">&#40;</span><span style="color: #cc66cc;">97</span>, <span style="color: #cc66cc;">122</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.bin2hex<span class="br0">&#40;</span>random_bytes<span class="br0">&#40;</span><span style="color: #cc66cc;">4</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetExists<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> array_key_exists<span class="br0">&#40;</span><span style="color: #339933;">$offset</span>, <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed|null</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetGet<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span> ?? <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $value</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetSet<span class="br0">&#40;</span><span style="color: #339933;">$offset</span>, <span style="color: #339933;">$value</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span> = <span style="color: #339933;">$value</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetUnset<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">unset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Define the filepath to the external view file to include</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Rule R001 : Any space inside a name will be automatically converted to DIRECTORY_SEPARATOR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * For strings : $parts = 'www user view login.php';</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www/user/view/login.php&quot;  if DIRECTORY_SEPARATOR = '/'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www\user\view\login.php&quot;  if DIRECTORY_SEPARATOR = '\'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * For arrays, same rule (R001) for all values inside : $parts = ['www/user', 'view login.php'];</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www/user/view/login.php&quot;  if DIRECTORY_SEPARATOR = '/'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www/user\view\login.php&quot;  if DIRECTORY_SEPARATOR = '\'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * File inclusion remove the inline code</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $parts string|array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setFile<span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$file</span>  = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$parts</span> = is_string<span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#41;</span> ? explode<span class="br0">&#40;</span><span style="color: #FF0000;">' '</span>, <span style="color: #339933;">$parts</span><span class="br0">&#41;</span> : <span style="color: #339933;">$parts</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$parts</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$file</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = str_replace<span class="br0">&#40;</span><span style="color: #FF0000;">' '</span>, DIRECTORY_SEPARATOR, <span style="color: #339933;">$p</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;file = str_replace<span class="br0">&#40;</span>DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR, implode<span class="br0">&#40;</span>DIRECTORY_SEPARATOR, <span style="color: #339933;">$file</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;code = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Instead on including an external file, use inline code for the view</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * CAREFUL : when you use inline code with dynamic values from the array $vars, you must</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * be absolutely sure that the values are already defined before, otherwise you will only have empty strings</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Inline code remove the included file</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $code</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setCode<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$code</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;code = <span style="color: #339933;">$code</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;file = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * This function return always escaped value with htmlspecialchars() from the array $vars</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * You escape on demand anywhere in your code by calling this class like this :</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * $this('hsc', 'any scalar value you would like to escape');</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * NOTE : a scalar value is a value that return true on PHP is_scalar() function</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * or an instance of class that implements the magic function __toString()</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  array  $args</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span>...<span style="color: #339933;">$args</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$nb</span> = count<span class="br0">&#40;</span><span style="color: #339933;">$args</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$args</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span><span style="color: #339933;">$nb</span> &gt; <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @param $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        */</span></span>
<span style="color: black;">        <span style="color: #339933;">$is_scalar</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> is_scalar<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span>is_object<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> &amp;&amp; method_exists<span class="br0">&#40;</span><span style="color: #339933;">$p</span>, <span style="color: #FF0000;">'__toString'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @param  $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        */</span></span>
<span style="color: black;">        <span style="color: #339933;">$hsc</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> htmlspecialchars<span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$p</span>, ENT_QUOTES, <span style="color: #FF0000;">'utf-8'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * Return an array of escaped values with htmlspecialchars(ENT_QUOTES, 'utf-8') for both keys and values</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * Works for scalar and array type and transform any object having __toString() function implemented to a escaped string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * Otherwise, keep the object as it</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @param  array $part</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @return array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        */</span></span>
<span style="color: black;">        <span style="color: #339933;">$hsc_array</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #0000ff;">array</span> <span style="color: #339933;">$part</span><span class="br0">&#41;</span> <span style="color: #0000ff;">use</span> <span class="br0">&#40;</span>&amp;<span style="color: #339933;">$hsc_array</span>, <span style="color: #339933;">$hsc</span>, <span style="color: #339933;">$is_scalar</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$data</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$part</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$k</span> =&gt; <span style="color: #339933;">$v</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$sk</span> = <span style="color: #339933;">$hsc</span><span class="br0">&#40;</span><span style="color: #339933;">$k</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_array<span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #339933;">$sk</span><span class="br0">&#93;</span> = <span style="color: #339933;">$hsc_array</span><span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #339933;">$sk</span><span class="br0">&#93;</span> = <span style="color: #339933;">$hsc</span><span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #339933;">$sk</span><span class="br0">&#93;</span> = <span style="color: #339933;">$v</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$data</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$value</span> = <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #339933;">$nb</span> === <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> &amp;&amp; <span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$args</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$value</span> = <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$args</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$args</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> === <span style="color: #FF0000;">'hsc'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$value</span> = <span style="color: #339933;">$args</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$value</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$hsc</span><span class="br0">&#40;</span><span style="color: #339933;">$value</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span>is_array<span class="br0">&#40;</span><span style="color: #339933;">$value</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$hsc_array</span><span class="br0">&#40;</span><span style="color: #339933;">$value</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Magic method that returns a string instead of current instance of the class in a string context</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;file !== <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> &amp;&amp; is_file<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;file<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            ob_start<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">include</span> <span style="color: #339933;">$this</span>-&gt;file;</span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> ob_get_clean<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;code;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// make the class directly available on the global namespace</span></span>
<span style="color: black;">class_alias<span class="br0">&#40;</span><span style="color: #FF0000;">'rawsrc\PhpEcho\PhpEcho'</span>, <span style="color: #FF0000;">'PhpEcho'</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;</span></pre></td></tr></table></pre>
</div><b><i>La version compatible PHP5.3+ est disponible à la fin de ce billet.</i></b><br />
<br />
<br />
<b><u>Quelques explications : </u></b><br />
Avec ce code, si on utilise la notation tableau, on va récupérer la valeur rattachée à la clé telle qu'elle a été définie.<br />
Si on utilise la notation fonction, on va récupérer la valeur rattachée à la clé telle qu'elle a été définie mais échappée avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">htmlspecialchars<span class="br0">&#40;</span><span class="br0">&#41;</span></span>.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$engine</span> = <span style="color: #0000ff;">new</span> PhpEcho<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$engine</span><span class="br0">&#91;</span><span style="color: #FF0000;">'abc'</span><span class="br0">&#93;</span> = <span style="color: #FF0000;">'abc &quot; &lt; &gt;'</span>;  <span style="color: #808080;">// on stocke une paire cl&eacute;-valeur dans notre classe (utilisation de l'interface ArrayAccess offsetSet())</span>
<span style="color: #808080;">// maintenant si on fait : </span>
<span style="color: #339933;">$x</span> = <span style="color: #339933;">$engine</span><span class="br0">&#91;</span><span style="color: #FF0000;">'abc'</span><span class="br0">&#93;</span>; <span style="color: #808080;">// $x = 'abc &quot; &lt; &gt;'              // notation tableau, valeur brut renvoy&eacute;e</span>
<span style="color: #339933;">$y</span> = <span style="color: #339933;">$engine</span><span class="br0">&#40;</span><span style="color: #FF0000;">'abc'</span><span class="br0">&#41;</span>; <span style="color: #808080;">// $y = 'abc &amp;_quot; &amp;lt; &amp;gt;'  // notation fonction : valeur &eacute;chapp&eacute;e, inoffensive, pour le &amp;_quote; c'est sans le _ bien s&ucirc;r (c'est juste pour l'affichage)</span></pre></td></tr></table></pre>
</div>Donc dans votre code HTML, préférez la notation fonction qui sécurise automatiquement les valeurs et ne gardez la notation tableau quand vous êtes absolument certain que les données ont été échappées correctement.<br />
Où que vous soyez, dans le code, si vous avez besoin d'échapper une valeur, il est possible de faire appel à la fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">htmlspecialchars<span class="br0">&#40;</span><span class="br0">&#41;</span></span> nativement : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #339933;">$z</span> = <span style="color: #339933;">$engine</span><span class="br0">&#40;</span><span style="color: #FF0000;">'hsc'</span>, <span style="color: #FF0000;">'une valeur quelconque &agrave; &eacute;chapper'</span><span class="br0">&#41;</span>;</pre>
</div>Le mot clé <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #FF0000;">'hsc'</span></span> est réservé et s'il est suivi d'une valeur, alors la classe reconnait ce contexte d'appel et adapte son fonctionnement en appelant la fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">htmlspecialchars<span class="br0">&#40;</span><span class="br0">&#41;</span></span>.<br />
Regardez bien le code la fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span>, tout se passe dedans.<br />
<br />
Pour fonctionner, ce moteur attend que les différents éléments de la vue produisent un rendu soit avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">echo</span></span>, soit en utilisant l'output buffering, c'est-à-dire l'écriture de code HTML en dehors des balises <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> ... <span style="color: #0080ff;">?&gt;</span></span></span>.<br />
<br />
Enfin, il est important de bien comprendre comment fonctionnent les inclusions en php avec le mot clé <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">include</span></span>, je vous invite à lire directement <a href="https://www.php.net/manual/fr/function.include.php" target="_blank">la documentation sur le site officiel de PHP</a>.<br />
<br />
<b>Voilà, nous en avons fait le tour, il n'y a plus qu'à le tester en situation réelle :ccool:</b><br />
<br />
<br />
<u><b><font size="3">6 - CAS PRATIQUE POUR LE MOTEUR DE RENDU <font color="#0000FF">PhpEcho</font></font></b></u><br />
<br />
On va faire un simple formulaire de connexion avec PhpEcho.<br />
Pour cela on va avoir besoin de 4 fichiers !<br />
Arborescence :<br />
<div style="margin: 20px; margin-top: 5px"><pre class="alt2" style="border: 1px inset; padding: 5px">www
  |---index.php              &lt;- Point d'entrée du site, démarrage de l'environnement
  |---src
  |    |---Login.php         &lt;- Gestion du traitement pour afficher le formulaire de connexion
  |---view
  |    |---Layout.php        &lt;- Gabarit HTML de page par défaut
  |    |---LoginForm.php     &lt;- Formulaire HTML de connexion
  |---vendor
  |      |---PhpEcho                
  |             |---PhpEcho.php   &lt;- Classe du moteur de rendu</pre></div>Un fichier <b>index.php</b> à la racine du site :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// quelques constantes utiles</span></span>
<span style="color: black;">define<span class="br0">&#40;</span><span style="color: #FF0000;">'DIR_ROOT'</span>, <span style="color: #339933;">__DIR__</span>.DIRECTORY_SEPARATOR<span class="br0">&#41;</span>;</span>
<span style="color: black;">define<span class="br0">&#40;</span><span style="color: #FF0000;">'URL_HOME'</span>, <span style="color: #FF0000;">'http://dev.dvp.fr'</span><span class="br0">&#41;</span>;    <span style="color: #808080;">// sur mon serveur j'utilise cette adresse</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// ici on va chercher notre classe de moteur de rendu</span></span>
<span style="color: black;"><span style="color: #0000ff;">include</span> DIR_ROOT.<span style="color: #FF0000;">'vendor'</span>.DIRECTORY_SEPARATOR.<span style="color: #FF0000;">'PhpEcho'</span>.DIRECTORY_SEPARATOR.<span style="color: #FF0000;">'PhpEcho.php'</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// d&eacute;marrage de l'application : formulaire de connexion</span></span>
<span style="color: black;"><span style="color: #0000ff;">include</span> DIR_ROOT.<span style="color: #FF0000;">'src'</span>.DIRECTORY_SEPARATOR.<span style="color: #FF0000;">'Login.php'</span>;</span></pre></td></tr></table></pre>
</div><br />
Une page <b>Layout.php</b> enregistrée dans /view<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code html :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">&lt;!DOCTYPE html&gt;</span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">html</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">head</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">meta</span> <span style="color: #0080ff;">charset</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;UTF-8&quot;</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= implode<span class="br0">&#40;</span><span style="color: #FF0000;">''</span>, <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'meta'</span><span class="br0">&#93;</span> ?? <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">title</span><span style="color: #0000ff;">&gt;</span></span><span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'title'</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">title</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">head</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">body</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'body'</span><span class="br0">&#93;</span> <span style="color: #0080ff;">?&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">body</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">html</span><span style="color: #0000ff;">&gt;</span></span></pre></td></tr></table></pre>
</div>Dans ce code notez l'utilisation de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$this</span></span>, comme on fait des inclusions, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$this</span></span> représente une instance de la classe <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">PhpEcho</span>, du coup on a à disposition les fonctionnalités offertes par celle-ci (regardez le code source de la fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">__toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span> pour bien comprendre l'origine de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$this</span></span>).<br />
<br />
<b>NB : </b> Pour les inclusions de fichiers (<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">include</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">include_once</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">require</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">require_once</span></span>), la doc PHP stipule : <br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				<div class="bbcode_postedby">
					<img src="https://forum.developpez.be/images/misc/quote_icon.png" alt="Citation" /> Envoyé par <strong>PHP Manuel</strong>
					
				</div>
				<div class="message">Lorsqu'un fichier est inclus, le code le composant hérite de la portée des variables de la ligne où l'inclusion apparaît. Toutes les variables disponibles à cette ligne dans le fichier appelant seront disponibles dans le fichier appelé, à partir de ce point.</div>
			
		</div>
	</div>
</div>Quand on est dans le code d'une classe, l'instance de cette dernière est toujours représentée par la variable <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$this</span></span>, donc au moment de la génération du rendu par inclusion de fichier externe et en vertu du fonctionnement interne de PHP, le fichier inclus a à sa disposition un accès à la variable présente avant son inclusion : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$this</span></span>.<br />
N'oubliez pas que l'inclusion est faite à l'intérieur de la classe PhpEcho <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span>, d'où l'existence de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$this</span></span> dans le fichier inclus.<br />
<br />
<br />
Dans notre layout, on offre la possibilité <br />
- d'avoir un tableau de balises <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">meta</span><span style="color: #0000ff;">&gt;</span></span></span> qui, s'il est défini, sera transformé en texte : notez la notation tableau : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'meta'</span><span class="br0">&#93;</span></span>, les données dedans ne seront pas échappées.<br />
- de personnaliser un titre qui sera échappé à l'affichage : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'title'</span><span class="br0">&#41;</span></span>, notez la notation fonction<br />
- et un corps de page qui lui est déjà échappé dans la mesure où il est assemblé par bouts qui sont tous théoriquement déjà échappés &#8658; notation tableau : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'body'</span><span class="br0">&#93;</span></span>.<br />
<br />
Une page <b>LoginForm.php</b> enregistrée dans /view : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code html :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">p</span><span style="color: #0000ff;">&gt;</span></span>Veuillez vous identifier<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">p</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">form</span> <span style="color: #0080ff;">method</span><span style="color: #0000ff;">=</span>post <span style="color: #0080ff;">action</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'url_submit'</span><span class="br0">&#93;</span> <span style="color: #0080ff;">?&gt;</span></span>&gt;&quot;</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">label</span><span style="color: #0000ff;">&gt;</span></span>Identifiant<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">label</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">input</span> <span style="color: #0080ff;">type</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;text&quot;</span> <span style="color: #0080ff;">name</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;login&quot;</span> <span style="color: #0080ff;">value</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'login'</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&quot;</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">br</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">label</span><span style="color: #0000ff;">&gt;</span></span>Mot de passe<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">label</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">input</span> <span style="color: #0080ff;">type</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;password&quot;</span> <span style="color: #0080ff;">name</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;pwd&quot;</span> <span style="color: #0080ff;">value</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;"><span style="color: #FF0000;">&quot;&quot;</span></span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">br</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">input</span> <span style="color: #0080ff;">type</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;submit&quot;</span> <span style="color: #0080ff;">name</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;submit&quot;</span> <span style="color: #0080ff;">value</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;SE CONNECTER&quot;</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">form</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">br</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">p</span> <span style="color: #0080ff;">style</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;display:<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'show_error'</span><span class="br0">&#93;</span> ?? <span style="color: #FF0000;">'none'</span> <span style="color: #0080ff;">?&gt;</span></span>&quot;</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">strong</span><span style="color: #0000ff;">&gt;</span></span><span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'err_msg'</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">strong</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">p</span><span style="color: #0000ff;">&gt;</span></span></pre></td></tr></table></pre>
</div>Voyez ce qui est attendu par le formulaire, même raisonnement que précédemment.<br />
<br />
Enfin un dernier script <b>Login.php</b> enregistré dans /src qui lui pilote la fonctionnalité : affichage du formulaire de connexion.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// pour tous les blocs, on utilise PhpEcho</span></span>
<span style="color: black;"><span style="color: #808080;">// on charge notre Layout</span></span>
<span style="color: black;"><span style="color: #339933;">$page</span> = <span style="color: #0000ff;">new</span> PhpEcho<span class="br0">&#40;</span><span class="br0">&#91;</span>DIR_ROOT, <span style="color: #FF0000;">'view Layout.php'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$page</span><span class="br0">&#91;</span><span style="color: #FF0000;">'title'</span><span class="br0">&#93;</span> = <span style="color: #FF0000;">'Connexion au site'</span>;               <span style="color: #808080;">// d&eacute;finition d'un param&egrave;tre attendu par notre Layout</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// construction du corps de la page : variable 'body'</span></span>
<span style="color: black;"><span style="color: #808080;">// le corps de la page sera notre formulaire de connexion</span></span>
<span style="color: black;"><span style="color: #808080;">// on lui passe ce qui est attendu pour son fonctionnement</span></span>
<span style="color: black;"><span style="color: #339933;">$body</span> = <span style="color: #0000ff;">new</span> PhpEcho<span class="br0">&#40;</span><span class="br0">&#91;</span>DIR_ROOT, <span style="color: #FF0000;">'view LoginForm.php'</span><span class="br0">&#93;</span>, <span class="br0">&#91;</span></span>
<span style="color: black;">    <span style="color: #FF0000;">'url_submit'</span> =&gt; <span style="color: #FF0000;">'/index.php?page=loginsubmit'</span>,</span>
<span style="color: black;">    <span style="color: #FF0000;">'login'</span>      =&gt; <span style="color: #FF0000;">'rawsrc'</span></span>
<span style="color: black;"><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #808080;">// on rattache le corps de page au layout</span></span>
<span style="color: black;"><span style="color: #808080;">// notez que la valeur de la cl&eacute; 'body' est directement une instance de la classe PhpEcho</span></span>
<span style="color: black;"><span style="color: #339933;">$page</span><span class="br0">&#91;</span><span style="color: #FF0000;">'body'</span><span class="br0">&#93;</span> = <span style="color: #339933;">$body</span>; </span>
<span style="color: black;"><span style="color: #808080;">/** </span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* dans le layout, voici comment cette valeur est trait&eacute;e : &lt;?= $this['body'] ?&gt;</span></span>
 * l'instance est directement transform&eacute;e en string avec echo
 * aucun probl&egrave;me car on sait que PhpEcho impl&eacute;mente la m&eacute;thode magique __toString()
 * dans ce contexte la commande echo dans sa forme abr&eacute;g&eacute;e <span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= recevra bien du texte</span>
<span style="color: black;"> */</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// on renvoie au navigateur la page assembl&eacute;e</span></span>
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #339933;">$page</span>;</span></pre></td></tr></table></pre>
</div>Ou en version courte <b>Login.php</b> : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #0000ff;">new</span> PhpEcho<span class="br0">&#40;</span><span class="br0">&#91;</span>DIR_ROOT, <span style="color: #FF0000;">'view Layout.php'</span><span class="br0">&#93;</span>, <span class="br0">&#91;</span></span>
<span style="color: black;">    <span style="color: #FF0000;">'title'</span> =&gt; <span style="color: #FF0000;">'Connexion au site'</span>,</span>
<span style="color: black;">    <span style="color: #FF0000;">'body'</span>  =&gt; <span style="color: #0000ff;">new</span> PhpEcho<span class="br0">&#40;</span><span class="br0">&#91;</span>DIR_ROOT, <span style="color: #FF0000;">'view LoginForm.php'</span><span class="br0">&#93;</span>, <span class="br0">&#91;</span></span>
<span style="color: black;">        <span style="color: #FF0000;">'url_submit'</span> =&gt; <span style="color: #FF0000;">'/index.php?page=loginsubmit'</span>,</span>
<span style="color: black;">        <span style="color: #FF0000;">'login'</span>      =&gt; <span style="color: #FF0000;">'rawsrc'</span></span>
<span style="color: black;">    <span class="br0">&#93;</span><span class="br0">&#41;</span></span>
<span style="color: black;"><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span></pre></td></tr></table></pre>
</div>Concis, lisible, compréhensible et assez élégant, c'est pas tip-top ?<br />
<br />
<br />
<u><b><font size="2">6.1 - CODE DE RENDU SANS L'INCLUSION DE FICHIER EXTERNE</font></b></u><br />
<br />
Il est possible de construire un code de rendu sans passer par le mécanisme d'inclusion de fichier.<br />
On va reprendre notre exemple et on va omettre le fichier <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">LoginForm.php</span>, on va inclure directement son code source dans le fichier construisant la vue : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Login.php</span>.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// pour tous les blocs, on utilise PhpEcho</span></span>
<span style="color: black;"><span style="color: #808080;">// on charge notre Layout</span></span>
<span style="color: black;"><span style="color: #339933;">$page</span> = <span style="color: #0000ff;">new</span> PhpEcho<span class="br0">&#40;</span><span class="br0">&#91;</span>DIR_ROOT, <span style="color: #FF0000;">'view Layout.php'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$page</span><span class="br0">&#91;</span><span style="color: #FF0000;">'title'</span><span class="br0">&#93;</span> = <span style="color: #FF0000;">'Connexion au site'</span>;               <span style="color: #808080;">// d&eacute;finition d'un param&egrave;tre attendu par notre Layout</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// construction du corps de la page : variable 'body'</span></span>
<span style="color: black;"><span style="color: #808080;">// le corps de la page sera le code source de notre formulaire de connexion</span></span>
<span style="color: black;"><span style="color: #808080;">// on lui passe ce qui est attendu pour son fonctionnement</span></span>
<span style="color: black;"><span style="color: #339933;">$body</span> = <span style="color: #0000ff;">new</span> PhpEcho<span class="br0">&#40;</span><span style="color: #FF0000;">''</span>, <span class="br0">&#91;</span></span>
<span style="color: black;">    <span style="color: #FF0000;">'url_submit'</span> =&gt; <span style="color: #FF0000;">'/index.php?page=loginsubmit'</span>,</span>
<span style="color: black;">    <span style="color: #FF0000;">'login'</span>      =&gt; <span style="color: #FF0000;">'rawsrc'</span></span>
<span style="color: black;"><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #808080;">// ICI on d&eacute;finit directement le code de rendu sans passer par l'inclusion de fichier</span></span>
<span style="color: black;"><span style="color: #808080;">// ATTENTION : dans ce cas d'utilisation, $this est remplac&eacute; par $body</span></span>
<span style="color: black;"><span style="color: #808080;">// vous avez toujours &agrave; disposition les notations tableau et fonction</span></span>
<span style="color: black;"><span style="color: #339933;">$body</span>-&gt;setCode<span class="br0">&#40;</span>&lt;&lt;&lt;<span style="color: #FF0000;">html</span></span>
<span style="color: black;"><span style="color: #FF0000;">&lt;p&gt;Veuillez vous identifier&lt;/p&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&lt;form method=post action=&quot;{$body['url_submit']}&gt;&quot;&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   &lt;label&gt;Identifiant&lt;/label&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   &lt;input type=&quot;text&quot; name=&quot;login&quot; value=&quot;{$body('login')}&quot;&gt;&lt;br&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   &lt;label&gt;Mot de passe&lt;/label&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   &lt;input type=&quot;password&quot; name=&quot;pwd&quot; value=&quot;&quot;&gt;&lt;br&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;SE CONNECTER&quot;&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&lt;/form&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">html</span></span>
<span style="color: black;">    <span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #808080;">// on rattache le corps de page au layout</span></span>
<span style="color: black;"><span style="color: #808080;">// notez que la valeur de la cl&eacute; body est une instance de la classe PhpEcho</span></span>
<span style="color: black;"><span style="color: #339933;">$page</span><span class="br0">&#91;</span><span style="color: #FF0000;">'body'</span><span class="br0">&#93;</span> = <span style="color: #339933;">$body</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// on renvoie au navigateur la page assembl&eacute;e</span></span>
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #339933;">$page</span>;</span></pre></td></tr></table></pre>
</div><br />
<br />
<u><b><font size="2">6.2 - UTILISATION DE L'ID D'EXÉCUTION UNIQUE</font></b></u><br />
<br />
Avec la dernière mise à jour, j'y ai inclus la génération d'un id d'exécution unique pour chaque instance de la classe <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">PhpEcho</span>. <br />
Cet id va permettre de définir facilement un contexte d'exécution fermé propre à l'instance courante, l'utilité est grande dans la mesure où le HTML gère cela parfaitement avec l'attribut <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">id</span> disponible pour chaque tag.<br />
<br />
Comment s'en servir et pour quels usages : <br />
On va reprendre notre fichier LoginForm.php et par exemple on veut faire des essais de mise en forme de ce petit bloc sans altérer le rendu des autres blocs vue du site.<br />
Par exemple, on veut refaire un peu la mise en page et revoir certains aspects esthétiques de notre formulaire de connexion.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span> <span style="color: #339933;">$id</span> = <span style="color: #339933;">$this</span>-&gt;id<span class="br0">&#40;</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>
&lt;style&gt;
#<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$id</span> <span style="color: #0080ff;">?&gt;</span></span> label {
    color: blue;
    float: left;
    font-weight: bold;
    width: 30%;
}
#<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$id</span> <span style="color: #0080ff;">?&gt;</span></span> input {
    float: right;
}
&lt;/style&gt;
&lt;div id=&quot;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$id</span> <span style="color: #0080ff;">?&gt;</span></span>&quot;&gt;
  &lt;p&gt;Veuillez vous identifier&lt;/p&gt;
  &lt;form method=&quot;post&quot; action=&quot;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'url_submit'</span><span class="br0">&#93;</span> <span style="color: #0080ff;">?&gt;</span></span>&gt;&quot;&gt;
    &lt;label&gt;Identifiant&lt;/label&gt;
    &lt;input type=&quot;text&quot; name=&quot;login&quot; value=&quot;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'login'</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&quot;&gt;&lt;br&gt;
    &lt;label&gt;Mot de passe&lt;/label&gt;
    &lt;input type=&quot;password&quot; name=&quot;pwd&quot; value=&quot;&quot;&gt;&lt;br&gt;
    &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;SE CONNECTER&quot;&gt;
  &lt;/form&gt;&lt;br&gt;
  &lt;p style=&quot;display:<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'show_error'</span><span class="br0">&#93;</span> ?? <span style="color: #FF0000;">'none'</span> <span style="color: #0080ff;">?&gt;</span></span>&quot;&gt;&lt;strong&gt;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'err_msg'</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;</pre></td></tr></table></pre>
</div>Voyez comment il est possible d'utiliser à bon escient le contexte créé par l'identifiant de chaque instance de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">PhpEcho</span>. Le fait de définir un id de bloc <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">div</span> <span style="color: #0080ff;">id</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$id</span> <span style="color: #0080ff;">?&gt;</span></span>&quot;</span><span style="color: #0000ff;">&gt;</span></span></span> vous met immédiatement à disposition un contexte qui offre des tas de possibilités pratiques.<br />
Et cerise sur le gâteau : cela fonctionne aussi pour du javascript personnalisé au bloc !<br />
<br />
Même code sans l'utilisation de l'inclusion de fichier (tiré du paragraphe précédent) : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// code pr&eacute;c&eacute;dent le bloc</span></span>
&nbsp;
<span style="color: black;"><span style="color: #339933;">$id</span> = <span style="color: #339933;">$body</span>-&gt;id<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$body</span>-&gt;setCode<span class="br0">&#40;</span>&lt;&lt;&lt;<span style="color: #FF0000;">html</span></span>
<span style="color: black;"><span style="color: #FF0000;">&lt;style&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">#{$id} &gt; p {</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   font-weight: bold;</span></span>
<span style="color: black;"><span style="color: #FF0000;">}</span></span>
<span style="color: black;"><span style="color: #FF0000;">#{$id} label {</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   color: blue;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   float: left;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   font-weight: bold;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   width: 30%;</span></span>
<span style="color: black;"><span style="color: #FF0000;">}</span></span>
<span style="color: black;"><span style="color: #FF0000;">#{$id} input {</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   float: right;</span></span>
<span style="color: black;"><span style="color: #FF0000;">}</span></span>
<span style="color: black;"><span style="color: #FF0000;">&lt;/style&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&lt;div id=&quot;{$id}&quot;&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp; &lt;p&gt;Veuillez vous identifier&lt;/p&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp; &lt;form method=post action=&quot;{$body['url_submit']}&gt;&quot;&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   &lt;label&gt;Identifiant&lt;/label&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   &lt;input type=&quot;text&quot; name=&quot;login&quot; value=&quot;{$body('login')}&quot;&gt;&lt;br&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   &lt;label&gt;Mot de passe&lt;/label&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   &lt;input type=&quot;password&quot; name=&quot;pwd&quot; value=&quot;&quot;&gt;&lt;br&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp;   &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;SE CONNECTER&quot;&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&nbsp; &lt;/form&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">&lt;/div&gt;</span></span>
<span style="color: black;"><span style="color: #FF0000;">html</span></span>
<span style="color: black;">    <span class="br0">&#41;</span>;</span></pre></td></tr></table></pre>
</div>Si vous poussez le concept jusqu'au bout, il est tout à fait possible avec ce système d'avoir des blocs vue totalement autonomes (contenu, formatage, comportement dynamique).<br />
C'est une approche équivalente au concept plus global de Widgets.<br />
<br />
<br />
<u><b><font size="3">7 - CONCLUSION</font></b></u><br />
<br />
Nous sommes arrivés au terme de cet article de blog, et encore une fois je vous ai mis une de ces tartine ! Code, explications, concepts... Désolé :ptdr:<br />
<br />
Ce système élégant de rendu n'est possible que parce qu'on a fait appel aux concepts et fonctionnalités de la programmation orientée objet. Avec une approche fonctionnelle, cela doit être faisable mais à quel prix...<br />
J'espère que cela vous donnera envie de plonger dans le monde la programmation orientée objet et d'aller explorer plus en avant tout le monde des possibles. <br />
<br />
Vous voilà libre maintenant d'utiliser ce petit moteur de rendu à votre guise en fonction de vos projets. J'espère que PhpEcho vous rendra des tas de services et qu'il vous aidera à produire du beau code.<br />
Il est évident que PhpEcho est améliorable. Si vous le faites et que vous en avez envie, n'hésitez pas à poster vos upgrades et j'essaierais de vous donner mon avis.<br />
Essayez de privilégier la légèreté dans votre code : cela n'enlève rien à l'aspect fonctionnel. Après en avoir fait le tour, vous viendrez peut-être à vous intéresser à des poids &quot;lourds&quot; du rendu PHP comme ceux cités au début de cet article, cela vous donnera sûrement des pistes d'amélioration. <br />
<br />
<br />
<b><u>EDIT 2019-10-21:</u></b><br />
Pour résumer la technique : cette classe ne fait ni plus ni moins qu'encapsuler le code de rendu dans un écrin (la classe <b><font color="#0000FF">PhpEcho</font></b>). Écrin (appelé aussi objet) qui lui apporte des fonctionnalités nouvelles : lecture des valeurs transmises, échappement des caractères, renvoi de texte quand c'est nécessaire...<br />
<br />
<b><u>EDIT 2019-11-25 :</u></b><br />
Rajout de la gestion d'un id d'exécution unique pour chaque instance de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">PhpEcho</span>.<br />
<br />
<b><u>EDIT 2020-03-18 :</u></b><br />
Rajout de la possibilité de manipuler et d'échapper :<br />
<ul><li style="">les tableaux récursivement, sont échappées les clés et les valeurs.</li><li style="">les instances de classe implémentant la fonction magique <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">__toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span></li></ul><br />
<br />
<u><b><font size="3"><font color="#0000FF">PhpEcho</font> pour PHP 5.3+</font></b></u><br />
Pour ceux qui utiliseraient encore une ancienne branche de PHP, voici le code fonctionnel sous PHP 5.3+ : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">namespace</span> rawsrc\PhpEcho;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* PhpEcho : PHP Template engine : One class to rule them all ;-)</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link        https://www.developpez.net/forums/blogs/32058-rawsrc/b8215/phpecho-moteur-rendu-php-classe-gouverner/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @author      rawsrc - https://www.developpez.net/forums/u32058/rawsrc/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @copyright   MIT License</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              Copyright (c) 2020 rawsrc</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              Permission is hereby granted, free of charge, to any person obtaining a copy</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              of this software and associated documentation files (the &quot;Software&quot;), to deal</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              in the Software without restriction, including without limitation the rights</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              copies of the Software, and to permit persons to whom the Software is</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              furnished to do so, subject to the following conditions:</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              The above copyright notice and this permission notice shall be included in all</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              copies or substantial portions of the Software.</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*              SOFTWARE.</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> PhpEcho</span>
<span style="color: black;"><span style="color: #0000ff;">implements</span> \ArrayAccess</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$id</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$vars</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Full resolved filepath to the external view file</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$file</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$code</span> = <span style="color: #FF0000;">''</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed  $file   see setFile() below</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array  $vars</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $id     if empty then auto-generated</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span><span style="color: #339933;">$file</span> = <span style="color: #FF0000;">''</span>, <span style="color: #0000ff;">array</span> <span style="color: #339933;">$vars</span> = <span style="color: #0000ff;">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span style="color: #339933;">$id</span> = <span style="color: #FF0000;">''</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$file</span> !== <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;setFile<span class="br0">&#40;</span><span style="color: #339933;">$file</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$id</span> === <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;generateId<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;id = <span style="color: #339933;">$id</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;vars = <span style="color: #339933;">$vars</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $id</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setId<span class="br0">&#40;</span><span style="color: #339933;">$id</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;id = <span style="color: #339933;">$id</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> id<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;id;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Generate an unique execution id</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Always start with a letter</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> generateId<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$alnum</span>    = <span style="color: #FF0000;">'abcdefghiklmnopqrstuvwxyzABCDEFGHIKLMNOPQRSTUVWXYZ0123456789'</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;id = chr<span class="br0">&#40;</span>mt_rand<span class="br0">&#40;</span><span style="color: #cc66cc;">97</span>, <span style="color: #cc66cc;">122</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.substr<span class="br0">&#40;</span>str_shuffle<span class="br0">&#40;</span><span style="color: #339933;">$alnum</span><span class="br0">&#41;</span>, <span style="color: #cc66cc;">8</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetExists<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> array_key_exists<span class="br0">&#40;</span><span style="color: #339933;">$offset</span>, <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed|null</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetGet<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span> : <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $value</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetSet<span class="br0">&#40;</span><span style="color: #339933;">$offset</span>, <span style="color: #339933;">$value</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span> = <span style="color: #339933;">$value</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Interface ArrayAccess</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $offset</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> offsetUnset<span class="br0">&#40;</span><span style="color: #339933;">$offset</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">unset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$offset</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Define the filepath to the external view file to include</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Rule R001 : Any space inside a name will be automatically converted to DIRECTORY_SEPARATOR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * For strings : $parts = 'www user view login.php';</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www/user/view/login.php&quot;  if DIRECTORY_SEPARATOR = '/'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www\user\view\login.php&quot;  if DIRECTORY_SEPARATOR = '\'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * For arrays, same rule (R001) for all values inside : $parts = ['www/user', 'view login.php'];</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www/user/view/login.php&quot;  if DIRECTORY_SEPARATOR = '/'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *  - become &quot;www/user\view\login.php&quot;  if DIRECTORY_SEPARATOR = '\'</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * File inclusion remove the inline code</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $parts string|array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setFile<span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$file</span>  = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$parts</span> = is_string<span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#41;</span> ? explode<span class="br0">&#40;</span><span style="color: #FF0000;">' '</span>, <span style="color: #339933;">$parts</span><span class="br0">&#41;</span> : <span style="color: #339933;">$parts</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$parts</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$file</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = str_replace<span class="br0">&#40;</span><span style="color: #FF0000;">' '</span>, DIRECTORY_SEPARATOR, <span style="color: #339933;">$p</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;file = str_replace<span class="br0">&#40;</span>DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR, implode<span class="br0">&#40;</span>DIRECTORY_SEPARATOR, <span style="color: #339933;">$file</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;code = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Instead on including an external file, use inline code for the view</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * CAREFUL : when you use inline code with dynamic values from the array $vars, you must</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * be absolutely sure that the values are already defined before, otherwise you will only have empty strings</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Inline code remove the included file</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $code</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setCode<span class="br0">&#40;</span><span style="color: #339933;">$code</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;code = <span style="color: #339933;">$code</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;file = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * This function return always escaped value with htmlspecialchars() from the array $vars</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * You escape on demand anywhere in your code by calling this class like this :</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * $this('hsc', 'any value you would like to escape');</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * The key 'hsc' is reserved and if a second value is passed, then the function adapt itself</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * to that context and return the second value escaped</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  string $key</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param         $value</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__invoke</span><span class="br0">&#40;</span><span style="color: #339933;">$key</span>, <span style="color: #339933;">$value</span> = <span style="color: #0080ff;">null</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$nb</span> = count<span class="br0">&#40;</span><span style="color: #339933;">$args</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$args</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span><span style="color: #339933;">$nb</span> &gt; <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @param $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        */</span></span>
<span style="color: black;">        <span style="color: #339933;">$is_scalar</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> is_scalar<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span>is_object<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> &amp;&amp; method_exists<span class="br0">&#40;</span><span style="color: #339933;">$p</span>, <span style="color: #FF0000;">'__toString'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @param  $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        */</span></span>
<span style="color: black;">        <span style="color: #339933;">$hsc</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> htmlspecialchars<span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span><span class="br0">&#41;</span><span style="color: #339933;">$p</span>, ENT_QUOTES, <span style="color: #FF0000;">'utf-8'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * Return an array of escaped values with htmlspecialchars(ENT_QUOTES, 'utf-8') for both keys and values</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * Works for scalar and array type and transform any object having __toString() function implemented to a escaped string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * Otherwise, keep the object as it</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @param  array $part</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * @return array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        */</span></span>
<span style="color: black;">        <span style="color: #339933;">$hsc_array</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #0000ff;">array</span> <span style="color: #339933;">$part</span><span class="br0">&#41;</span> <span style="color: #0000ff;">use</span> <span class="br0">&#40;</span>&amp;<span style="color: #339933;">$hsc_array</span>, <span style="color: #339933;">$hsc</span>, <span style="color: #339933;">$is_scalar</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$data</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$part</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$k</span> =&gt; <span style="color: #339933;">$v</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$sk</span> = <span style="color: #339933;">$hsc</span><span class="br0">&#40;</span><span style="color: #339933;">$k</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_array<span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #339933;">$sk</span><span class="br0">&#93;</span> = <span style="color: #339933;">$hsc_array</span><span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #339933;">$sk</span><span class="br0">&#93;</span> = <span style="color: #339933;">$hsc</span><span class="br0">&#40;</span><span style="color: #339933;">$v</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$data</span><span class="br0">&#91;</span><span style="color: #339933;">$sk</span><span class="br0">&#93;</span> = <span style="color: #339933;">$v</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$data</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$value</span> = <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #339933;">$nb</span> === <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> &amp;&amp; <span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$args</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$value</span> = <span style="color: #339933;">$this</span>-&gt;vars<span class="br0">&#91;</span><span style="color: #339933;">$args</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$args</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> === <span style="color: #FF0000;">'hsc'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$value</span> = <span style="color: #339933;">$args</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$is_scalar</span><span class="br0">&#40;</span><span style="color: #339933;">$value</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$hsc</span><span class="br0">&#40;</span><span style="color: #339933;">$value</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span>is_array<span class="br0">&#40;</span><span style="color: #339933;">$value</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$hsc_array</span><span class="br0">&#40;</span><span style="color: #339933;">$value</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Magic method that returns a string instead of current instance of the class in a string context</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;file !== <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> &amp;&amp; is_file<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;file<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            ob_start<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">include</span> <span style="color: #339933;">$this</span>-&gt;file;</span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> ob_get_clean<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;code;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// make the class directly available on the global namespace</span></span>
<span style="color: black;">class_alias<span class="br0">&#40;</span><span style="color: #FF0000;">'rawsrc\PhpEcho\PhpEcho'</span>, <span style="color: #FF0000;">'PhpEcho'</span>, <span style="color: #0080ff;">false</span><span class="br0">&#41;</span>;</span></pre></td></tr></table></pre>
</div><br />
<br />
Bon code à tous<br />
<br />
:ccool:<br />
<br />
<b>rawsrc</b></blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b8215/phpecho-moteur-rendu-php-classe-gouverner/</guid>
		</item>
		<item>
			<title><![CDATA[PHP 7+ // Développement selon l'approche MVC : Modèle - Vue - Contrôleur - Cas pratique]]></title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b7804/php-7p-developpement-selon-l-approche-mvc-modele-vue-controleur-cas-pratique/</link>
			<pubDate>Mon, 29 Jul 2019 23:41:12 GMT</pubDate>
			<description>Bonjour les développeurs, 
...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour les développeurs,<br />
<br />
j'espère que vous avez bien assimilé la théorie du développement selon l'approche MVC Modèle - Vue - Contrôleur de <a href="https://www.developpez.net/forums/blogs/32058-rawsrc/b7786/developpement-selon-lapproche-mvc-modele-vue-controleur-retour-theorie/" target="_blank">mon précédent billet</a> parce qu'aujourd'hui on va se lancer dans le grand bain avec la mise en application de ce concept.<br />
Pour ceux qui auraient besoin de se rafraîchir la mémoire, c'est par <a href="https://www.developpez.net/forums/blogs/32058-rawsrc/b7786/developpement-selon-l-approche-mvc-modele-vue-controleur-retour-theorie/" target="_blank">là</a> que ça se passe.<br />
<br />
Pour corser le tout, je vais privilégier une approche objet de ce paradigme. <br />
Je vais essayer de vous exposer simplement les fondements de la <b>Programmation Orientée Obje</b>t (POO pour les intimes) et qui sait, en convertir un ou deux ;)<br />
Enfin, il faut aussi avoir assimilé au préalable la théorie et le fonctionnement des espaces de nom (<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">namespace</span></span>) et de l'autochargement des classes (<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">autoloading</span>), vous trouverez tout ce qu'il faut sur cet <a href="https://www.developpez.net/forums/blogs/32058-rawsrc/b5109/autoloader/" target="_blank">autre billet</a> rédigé aussi par mes soins.<br />
<br />
<br />
<b><u><font size="3">INTRODUCTION AUX BASES DE LA PROGRAMMATION ORIENTÉE OBJET</font></u></b><br />
<br />
<br />
On va prendre un cas hyper simple qui va parler à tout développeur web : un échange entre un navigateur et un serveur web.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p493956d1564164465/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/vb6-graphisme-arc-cercle-picturebox/2019-07-26_200729.jpg/" border="0" alt="Nom : 2019-07-26_200729.jpg
Affichages : 15427
Taille : 28,7 Ko"  style="float: CONFIG" /><br />
<br />
L’utilité principale de la programmation objet réside dans <b>la possibilité de représenter des éléments tangibles sous forme de concepts abstraits</b> (équivalent à une représentation purement informatique). <br />
<br />
Dans notre cas de figure, le serveur web devra envoyer une réponse (à ce stade on se pas encore laquelle, mais il doit envoyer une réponse), donc pour faciliter le traitement du côté du serveur web, on va <b>modéliser une représentation abstraite</b> de la réponse. C’est cette représentation qui va être manipulée par le programme. Autrement dit on va créer une <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">class</span> Response</span> qui va être l’alter ego <u>abstrait</u> de la réponse physique du serveur web.<br />
<br />
Ainsi quand le développeur manipulera une instance de Response, il saura immédiatement qu’il manipule la réponse finale du serveur qui va être envoyée au navigateur à la toute fin du traitement.<br />
<br />
Il va de soi que c’est exactement pareil pour une requête. Pour faciliter sa manipulation, elle aura une représentation abstraite dans le monde informatique qui sera l’alter ego de la requête physique reçue par le serveur. Nous aurons donc une autre classe, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">class</span> Request</span> en charge de tout ce qui se rapporte à une requête web.<br />
<br />
Plus généralement, il faut bien comprendre que le passage au monde objet correspond dans un premier temps à <b>une modélisation d'une problématique (ou d'une réalité) sous forme de concepts abstraits</b>.<br />
Cette abstraction va permettre à un développeur de savoir précisément ce qu'il manipule dans son monde dématérialisé. Généralement, le code devient plus parlant au premier coup d’œil.<br />
<br />
La POO offre énormément en terme de fonctionnalités. Pour vous en convaincre, prenez n'importe quel livre consacré à la théorie de ce paradigme et vous verrez que d'une part il est généralement gros et d'autre part que vous allez y consacrer un certain temps d'apprentissage pour vous familiariser avec le contenu. Dans un second temps, l'expérience finira par vous convaincre de que c'est, somme toute, &quot;évident&quot; ;).<br />
Pour couvrir la POO, il faudrait bien plus que ce billet, je vais rester succinct, juste ce qu'il faut pour vous faire saliver.<br />
<br />
Il faut reconnaître qu'il faut un peu de doigté pour modéliser correctement en POO. Le travers c'est qu'un débutant à tendance à créer des classes pour tout et n'importe quoi et cela finit immanquablement par une jolie noyade.<br />
<br />
Revenons à nos moutons ; comme la réalité diffère, il va de soi que les classes dans le monde informatique vont avoir leurs spécificités.<br />
Par exemple, le traitement d'une réponse est totalement différent d'une requête.<br />
<br />
Pour une réponse, on va avoir besoin au minimum de :<br />
<ul><li style="">connaître à l'avance les en-têtes à envoyer au navigateur en fonction du type de données à transmettre</li><li style="">avoir des données à envoyer</li></ul><br />
<br />
Pour une requête, on va avoir besoin au minimum de :<br />
<ul><li style="">d'avoir l'URL d'appel morcelée en composants selon la norme en vigueur RFC3986</li></ul><br />
<br />
Donc, <b>selon cette analyse</b>, on va pouvoir créer 2 classes qui vont se charger de répondre aux besoins : <br />
<br />
<b><u>Classe Response : </u></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">namespace</span> rawsrc;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* TUTORIAL DVP SUR LE CONCEPT MVC : MOD&Egrave;LE-VUE-CONTR&Ocirc;LEUR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7786/developpement-selon-l-approche-mvc-modele-vue-controleur-retour-theorie/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7804/developpement-selon-lapproche-mvc-modele-vue-controleur-cas-pratique/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Classe en charge de la gestion d'une r&eacute;ponse g&eacute;n&eacute;rique</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Pour une r&eacute;ponse valide, le serveur doit envoyer d'abord les en-t&ecirc;tes et ensuite la r&eacute;ponse proprement dite</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Cette classe est instanciable, car il est tout &agrave; fait possible de cr&eacute;er une r&eacute;ponse &agrave; la vol&eacute;e selon ses besoins</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* par exemple : renvoyer du xml, pdf... Il faudra juste adapter les en-t&ecirc;tes ($headers) et le corps de la r&eacute;ponse ($data)</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> Response</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #339933;">$headers</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Stocke les donn&eacute;es relatives &agrave; la r&eacute;ponse</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var mixed</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #339933;">$data</span> = <span style="color: #0080ff;">null</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param mixed $data</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array $headers  Array of headers to send first</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span><span style="color: #339933;">$data</span> = <span style="color: #0080ff;">null</span>, <span style="color: #0000ff;">array</span> <span style="color: #339933;">$headers</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;data    = <span style="color: #339933;">$data</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;headers = <span style="color: #339933;">$headers</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Envoi des donn&eacute;es de la r&eacute;ponse</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> send<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">// envoi des en-t&ecirc;tes (le type des donn&eacute;es qui vont suivre)</span></span>
<span style="color: black;">        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;headers <span style="color: #0000ff;">as</span> <span style="color: #339933;">$h</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            header<span class="br0">&#40;</span><span style="color: #339933;">$h</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// envoi des donn&eacute;es (le navigateur sait &agrave; quoi s'attendre)</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;data !== <span style="color: #0080ff;">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">echo</span> <span style="color: #339933;">$this</span>-&gt;data;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div><b><u>Classe Request :</u></b><br />
Si vous prenez le temps de lire la norme RFC, vous verrez que la classe ne fait que reprendre d'une manière simplifiée tous les composants d'une URL<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">namespace</span> rawsrc;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* TUTORIAL DVP SUR LE CONCEPT MVC : MOD&Egrave;LE-VUE-CONTR&Ocirc;LEUR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7786/developpement-selon-l-approche-mvc-modele-vue-controleur-retour-theorie/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7804/developpement-selon-lapproche-mvc-modele-vue-controleur-cas-pratique/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Classe en charge de la gestion d'une requ&ecirc;te g&eacute;n&eacute;rique</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Anlalyse compl&egrave;te de l'URL</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> Request</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">// composants d'une URL</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$scheme</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$user</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$pwd</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$host</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$port</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$path</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$query</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$fragment</span> = <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$is_ajax</span> = <span style="color: #0080ff;">false</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$is_valid</span> = <span style="color: #0080ff;">false</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param string $url</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$url</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;parse<span class="br0">&#40;</span><span style="color: #339933;">$url</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> scheme<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;scheme;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> user<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;user;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> host<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;host;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> path<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;path;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> port<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;port;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> query<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;query;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> fragment<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;fragment;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> isAjax<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;is_ajax;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> isValid<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;is_valid;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * PARSEUR d'url</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * S&eacute;pare l'URL en composants selon la norme RFC3986</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> parse<span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$url</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">// ici la fonction d&eacute;compose l'url en composants</span></span>
<span style="color: black;">        <span style="color: #808080;">// quand vous manipulez une instance de la classe Request</span></span>
<span style="color: black;">        <span style="color: #808080;">// vous ne savez pas comment ce travail est fait =&gt; on va parler d'IMPL&Eacute;MENTATION</span></span>
<span style="color: black;">        <span style="color: #808080;">// pour vous c'est transparent : vous utilisez simplement la classe qui ENCAPSULE cette impl&eacute;mentation</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$parts</span> = parse_url<span class="br0">&#40;</span><span style="color: #339933;">$url</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$parts</span> === <span style="color: #0080ff;">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'scheme'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;scheme = <span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'scheme'</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'host'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;host = <span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'host'</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'port'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;port = <span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'port'</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'user'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;user = <span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'user'</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;pwd  = <span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'pass'</span><span class="br0">&#93;</span> ?? <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'path'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;path = explode<span class="br0">&#40;</span><span style="color: #FF0000;">'/'</span>, trim<span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'path'</span><span class="br0">&#93;</span>, <span style="color: #FF0000;">'/'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'query'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;query = parse_str<span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'query'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'fragment'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;fragment = <span style="color: #339933;">$parts</span><span class="br0">&#91;</span><span style="color: #FF0000;">'fragment'</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$_SERVER</span><span class="br0">&#91;</span><span style="color: #FF0000;">'HTTP_X_REQUESTED_WITH'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;is_ajax = <span class="br0">&#40;</span>strtoupper<span class="br0">&#40;</span><span style="color: #339933;">$_SERVER</span><span class="br0">&#91;</span><span style="color: #FF0000;">'HTTP_X_REQUESTED_WITH'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> === <span style="color: #FF0000;">'XMLHTTPREQUEST'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;is_valid = <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div><br />
Pour manipuler ces 2 concepts, rien de plus simple : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// ici on d&eacute;clare les d&eacute;pendances du code ci-dessous</span></span>
<span style="color: black;"><span style="color: #808080;">// cela permet au m&eacute;canisme d'autoloading de localiser les fichiers contenant la d&eacute;finition des classes</span></span>
<span style="color: black;"><span style="color: #0000ff;">use</span> rawsrc\Request;</span>
<span style="color: black;"><span style="color: #0000ff;">use</span> rawsrc\Response;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// vous n'avez plus &agrave; vous pr&eacute;occuper de comment &ccedil;a fonctionne en interne</span></span>
<span style="color: black;"><span style="color: #808080;">// les classes encapsulent tout le code, vous ne manipulez que des concepts abstraits</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// par exemple, on veut avoir des d&eacute;tails sur une requ&ecirc;te </span></span>
<span style="color: black;"><span style="color: #339933;">$request</span> = <span style="color: #0000ff;">new</span> Request<span class="br0">&#40;</span><span style="color: #FF0000;">'https://www.developpez.net/forums/blogs/32058-rawsrc/b7804/developpement-selon-lapproche-mvc-modele-vue-controleur-cas-pratique/'</span><span class="br0">&#41;</span></span>
<span style="color: black;"><span style="color: #808080;">// notez que le constructeur de la classe attend en param&egrave;tre : string $url</span></span>
<span style="color: black;"><span style="color: #808080;">// et il d&eacute;clenche l'analyse automatiquement d&egrave;s l'instanciation avec : $this-&gt;parse($url);</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// ici comme vous pouvez le constater vous ne vous pr&eacute;occupez pas de savoir comment</span></span>
<span style="color: black;"><span style="color: #808080;">// le parsage de l'url a &eacute;t&eacute; fait, vous acc&eacute;dez directement au r&eacute;sultat : la classe Request </span></span>
<span style="color: black;"><span style="color: #808080;">// encapsule les traitements et devient pour ainsi dire une boite noire</span></span>
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #339933;">$request</span>-&gt;scheme<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">'&lt;br&gt;'</span>;    <span style="color: #808080;">// https</span></span>
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #339933;">$request</span>-&gt;host<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">'&lt;br&gt;'</span>;      <span style="color: #808080;">// www.developpez.net</span></span>
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #339933;">$request</span>-&gt;path<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, <span style="color: #FF0000;">'&lt;br&gt;'</span>;   <span style="color: #808080;">// forums</span></span>
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #339933;">$request</span>-&gt;path<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, <span style="color: #FF0000;">'&lt;br&gt;'</span>;   <span style="color: #808080;">// blogs</span></span>
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #339933;">$request</span>-&gt;path<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span>, <span style="color: #FF0000;">'&lt;br&gt;'</span>;   <span style="color: #808080;">// 32058-rawsrc</span></span>
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #339933;">$request</span>-&gt;path<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span>, <span style="color: #FF0000;">'&lt;br&gt;'</span>;   <span style="color: #808080;">// b7804</span></span>
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #339933;">$request</span>-&gt;path<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">4</span><span class="br0">&#93;</span>, <span style="color: #FF0000;">'&lt;br&gt;'</span>;   <span style="color: #808080;">// developpement-selon-lapproche-mvc-modele-vue-controleur-cas-pratique</span></span>
&nbsp;
&nbsp;
<span style="color: black;"><span style="color: #808080;">// maintenant voyons une r&eacute;ponse</span></span>
<span style="color: black;"><span style="color: #339933;">$response</span> = <span style="color: #0000ff;">new</span> Response<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// je souhaite envoyer des donn&eacute;es json</span></span>
<span style="color: black;"><span style="color: #808080;">// je param&egrave;tre la r&eacute;ponse : </span></span>
<span style="color: black;"><span style="color: #339933;">$response</span>-&gt;headers<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #FF0000;">'content-type: application/json'</span>;</span>
<span style="color: black;"><span style="color: #339933;">$response</span>-&gt;data      = json_encode<span class="br0">&#40;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'a'</span>, <span style="color: #FF0000;">'b'</span>, <span style="color: #FF0000;">'c'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$response</span>-&gt;send<span class="br0">&#40;</span><span class="br0">&#41;</span>;   <span style="color: #808080;">// le navigateur recevra du json</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// il aurait aussi &eacute;t&eacute; possible de faire tout en une seule ligne</span></span>
<span style="color: black;"><span style="color: #808080;">// le constructeur de la classe Response le permet</span></span>
<span style="color: black;"><span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Response<span class="br0">&#40;</span>json_encode<span class="br0">&#40;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'a'</span>, <span style="color: #FF0000;">'b'</span>, <span style="color: #FF0000;">'c'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, <span class="br0">&#91;</span><span style="color: #FF0000;">'content-type: application/json'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>-&gt;send<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span></pre></td></tr></table></pre>
</div>Ces 2 exemples triviaux ne servent que d'illustration dans le cadre d'une initiation au vaste monde de la POO.<br />
<br />
<br />
<b><u><font size="3">UNE PINCÉE D'HÉRITAGE</font></u></b><br />
<br />
<br />
Il va falloir aborder ce concept assez succinctement, car il va être nécessaire dans notre cas pratique MVC.<br />
<br />
Comme les classes ne sont qu'une représentation théorique, elles peuvent être très générales et très abstraites. Comme la POO a été conçue pour répondre à des besoins réels, la spécialisation d'une classe très générale est tout à fait possible via un mécanisme appelé l'héritage. Une classe fille va hériter de sa classe mère, elle va spécialiser la classe mère.<br />
<br />
Par exemple, prenons le cas de la classe générique <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Response</span>, le code de  cette classe est très ouvert, vous pouvez à la volée paramétrer une réponse avec 2 lignes de code.<br />
Si par exemple, vous devez envoyer très souvent des réponses au format JSON, cela va s'avérer très vite fastidieux de toujours recopier le paramétrage de la réponse, sans compter la redondance de code et le risque d'erreur qui va avec.<br />
Donc pour palier à cet état de fait, on va spécialiser la classe mère et figer le paramétrage des en-têtes dans la classe fille de manière à n'avoir plus que des données à passer : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">namespace</span> rawsrc;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">use</span> rawsrc\Response;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* TUTORIAL DVP SUR LE CONCEPT MVC : MOD&Egrave;LE-VUE-CONTR&Ocirc;LEUR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7786/developpement-selon-l-approche-mvc-modele-vue-controleur-retour-theorie/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7804/developpement-selon-lapproche-mvc-modele-vue-controleur-cas-pratique/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* R&eacute;ponse : au format JSON</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> Json</span>
<span style="color: black;"><span style="color: #0000ff;">extends</span> Response</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">// red&eacute;finition de la m&eacute;thode send() de la classe parente</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> send<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">// ici on force les en-t&ecirc;tes, on ne tient pas compte des en-t&ecirc;tes qui auraient pu &ecirc;tre d&eacute;finis dans $headers</span></span>
<span style="color: black;">        <span style="color: #808080;">// comparez ce code avec celui de la classe parente</span></span>
<span style="color: black;">        <span style="color: #808080;">// on a la certitude d'envoyer le bon type au navigateur</span></span>
<span style="color: black;">        <span style="color: #808080;">// LA CLASSE M&Egrave;RE A &Eacute;T&Eacute; SP&Eacute;CIALIS&Eacute;E</span></span>
<span style="color: black;">        <span style="color: #808080;">// il est tout &agrave; fait possible au d&eacute;veloppeur de mettre n'importe quoi dans $data</span></span>
<span style="color: black;">        <span style="color: #808080;">// g&eacute;n&eacute;ralement on consid&egrave;re le d&eacute;veloppeur comme intelligent</span></span>
<span style="color: black;">        <span style="color: #808080;">// apr&egrave;s le navigateur fera ce qu'il pourra avec ce qu'il re&ccedil;oit si le mime-type ne correspond pas</span></span>
&nbsp;
<span style="color: black;">        header<span class="br0">&#40;</span><span style="color: #FF0000;">'content-type: application/json'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">echo</span> <span style="color: #339933;">$this</span>-&gt;data;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div><br />
Un exemple :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:132px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">use</span> rawsrc\Json;</span>
&nbsp;
<span style="color: black;"><span style="color: #339933;">$response</span> = <span style="color: #0000ff;">new</span> Json<span class="br0">&#40;</span>json_encode<span class="br0">&#40;</span><span class="br0">&#91;</span><span style="color: #FF0000;">'a'</span>, <span style="color: #FF0000;">'b'</span>, <span style="color: #FF0000;">'c'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;"><span style="color: #339933;">$response</span>-&gt;send<span class="br0">&#40;</span><span class="br0">&#41;</span>;   <span style="color: #808080;">// quoi qu'il arrive les bons en-t&ecirc;tes seront envoy&eacute;s au client, la classe Json s'en charge</span></span></pre></td></tr></table></pre>
</div><b>J'espère que vous commencez à saisir l'étendue du paradigme objet.</b><br />
<br />
On en a vu assez pour se lancer dans notre cas pratique : attachez votre ceinture et mettez vos bretelles :D<br />
<br />
<br />
<b><u><font size="3">MISE EN APPLICATION DU MVC : CAS PRATIQUE</font></u></b><br />
<br />
Le support à la démonstration sera une page d'authentification basique : identifiant/mot de passe avec formulaire et accès à la base de données.<br />
<br />
<br />
<b><u>ANALYSE DE LA SITUATION</u></b><br />
<br />
2 problèmes seront traités simultanément : <br />
<ul><li style="">modélisation sous forme objet du MVC</li><li style="">modélisation sous forme objet de la problématique d'exemple</li></ul><br />
<br />
Dites-vous bien que les choix que j'opère ne sont pas l'unique solution possible, ils sont simplifiés de manière à pouvoir appréhender le concept plus facilement.<br />
<br />
<br />
<b><u>MODÉLISATION SOUS FORME OBJET DU MVC</u></b><br />
<br />
Le serveur traitera chaque requête reçue comme une tâche (Task). Chaque tâche sera donc composée d'une requête et d'une réponse, comme ceci : <br />
<br />
<img src="https://www.developpez.net/forums/attachments/p494395d1564439866/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/vb6-graphisme-arc-cercle-picturebox/2019-07-30_003724.jpg/" border="0" alt="Nom : 2019-07-30_003724.jpg
Affichages : 10607
Taille : 31,9 Ko"  style="float: CONFIG" /><br />
<br />
La tâche devra être capable de prendre en charge absolument <b>TOUTES LES REQUÊTES</b> qui se présenteront selon un processus standardisé. Ceci va permettre de rajouter des fonctionnalités au site sans avoir à chaque fois à se poser des tas de questions sur le comment vais-je bien donc pouvoir faire.<br />
La <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">class</span> Task</span> devra dispatcher la requête, trouver le modèle qui sera en mesure de la traiter, passer le flux de traitement au contrôleur approprié et au final collecter la réponse à envoyer.<br />
<br />
Code source de la <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">class</span> Task</span><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">namespace</span> rawsrc;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">use</span> rawsrc\<span class="br0">&#123;</span> Controller, Request, Response <span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* TUTORIAL DVP SUR LE CONCEPT MVC : MOD&Egrave;LE-VUE-CONTR&Ocirc;LEUR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7786/developpement-selon-l-approche-mvc-modele-vue-controleur-retour-theorie/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7804/developpement-selon-lapproche-mvc-modele-vue-controleur-cas-pratique/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Repr&eacute;sentation d'une t&acirc;che serveur g&eacute;n&eacute;rique</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Est consid&eacute;r&eacute; comme t&acirc;che serveur, une requ&ecirc;te envoy&eacute;e au serveur &agrave; laquelle une r&eacute;ponse devra &ecirc;tre fournie</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*      (r&eacute;ponse au sens g&eacute;n&eacute;rique : succ&egrave;s ou erreur), &agrave; ce stade on en sait encore rien</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Le traitement correspond &agrave; :</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*  - l'analyse de la requ&ecirc;te (&eacute;tape du PARSAGE de l'URL =&gt; s&eacute;paration de l'url en ses constituants)</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*  - recherche d'une action correspondant &agrave; la requ&ecirc;te (&eacute;tape du ROUTAGE =&gt; analyse des constituants de l'URL)</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*  - si action trouv&eacute;e : transfert du flux de traitement au contr&ocirc;leur rattach&eacute; &agrave; l'action</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*  - sinon             : g&eacute;n&eacute;ration d'une r&eacute;ponse de type Error avec le code (400 Bad Request, 404 Not Found, etc.)</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Le contr&ocirc;leur doit par principe fournir une r&eacute;ponse quelle qu'elle soit, c'est-&agrave;-dire mouvementer la valeur de $response de la pr&eacute;sente classe</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> Task</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Request</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$request</span> = <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Response</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$response</span> = <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Action</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$action</span> = <span style="color: #0080ff;">null</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Url</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> request<span class="br0">&#40;</span><span class="br0">&#41;</span>: ?Request</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;request;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param Response $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setResponse<span class="br0">&#40;</span>Response <span style="color: #339933;">$p</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;response = <span style="color: #339933;">$p</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Response</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> response<span class="br0">&#40;</span><span class="br0">&#41;</span>: ?Response</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;response;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Action</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> action<span class="br0">&#40;</span><span class="br0">&#41;</span>: ?Action</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;action;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Fonction en charge d'apporter une R&eacute;ponse &agrave; la requ&ecirc;te</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Pour y parvenir, elle va essayer d'abord de trouver l'action correspondante &agrave; la requ&ecirc;te ;</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * si la recherche est fructueuse alors elle va automatiquement appeler le Contr&ocirc;leur rattach&eacute; &agrave;</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * l'action qui se chargera de fournir une r&eacute;ponse &agrave; la t&acirc;che</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> dispatch<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">// reconstruction de l'uri compl&egrave;te</span></span>
<span style="color: black;">        <span style="color: #339933;">$scheme</span> = <span style="color: #FF0000;">'http'</span>.<span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$_SERVER</span><span class="br0">&#91;</span><span style="color: #FF0000;">'HTTPS'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &amp;&amp; <span style="color: #339933;">$_SERVER</span><span class="br0">&#91;</span><span style="color: #FF0000;">'HTTPS'</span><span class="br0">&#93;</span> === <span style="color: #FF0000;">'on'</span> ? <span style="color: #FF0000;">'s'</span> : <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$uri</span>    = <span style="color: #339933;">$scheme</span>.<span style="color: #FF0000;">'://'</span>.<span style="color: #339933;">$_SERVER</span><span class="br0">&#91;</span><span style="color: #FF0000;">'HTTP_HOST'</span><span class="br0">&#93;</span>.<span style="color: #339933;">$_SERVER</span><span class="br0">&#91;</span><span style="color: #FF0000;">'REQUEST_URI'</span><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// le parsage de l'url est automatique &agrave; l'instanciation (voir le code Request::__construct())</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;request = <span style="color: #0000ff;">new</span> Request<span class="br0">&#40;</span><span style="color: #339933;">$uri</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;request-&gt;isValid<span class="br0">&#40;</span><span class="br0">&#41;</span> === <span style="color: #0080ff;">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">// BAD REQUEST : cr&eacute;ation de la r&eacute;ponse &agrave; la vol&eacute;e</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;response = <span style="color: #0000ff;">new</span> Response<span class="br0">&#40;</span><span style="color: #FF0000;">'Invalid request'</span>, <span style="color: #FF0000;">'400 Bad Request'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">return</span>; <span style="color: #808080;">// fin de traitement</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">/***********</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        * ROUTAGE *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;        ***********/</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">/** @param string $full_class_name  Nom pleinement qualifi&eacute; de la classe en charge du concept */</span></span>
<span style="color: black;">        <span style="color: #339933;">$search_action_controller</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #0080ff;">string</span> <span style="color: #339933;">$full_class_name</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$obj</span> = <span style="color: #0000ff;">new</span> <span style="color: #339933;">$full_class_name</span>;</span>
&nbsp;
<span style="color: black;">            <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$obj</span>-&gt;actions<span class="br0">&#40;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$action</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #808080;">/** @var Action */</span></span>
<span style="color: black;">                <span style="color: #339933;">$action</span>-&gt;setTask<span class="br0">&#40;</span><span style="color: #339933;">$this</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$action</span>-&gt;handleRequest<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;request<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #808080;">// l'action est en mesure de prendre en charge la requ&ecirc;te</span></span>
<span style="color: black;">                    <span style="color: #808080;">// on renvoie le nom pleinement qualifi&eacute; du contr&ocirc;leur qui va s'en charger</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$action</span>-&gt;controller<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">false</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// on extrait la valeur du premier segment du path</span></span>
<span style="color: black;">        <span style="color: #808080;">// par principe on a d&eacute;fini que cela correspondait &agrave;</span></span>
<span style="color: black;">        <span style="color: #808080;">// l'identifiant du concept dans l'application</span></span>
<span style="color: black;">        <span style="color: #339933;">$concept</span>    = <span style="color: #339933;">$this</span>-&gt;request-&gt;path<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> ?? <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">        <span style="color: #808080;">// on recherche une correspondance dans la table des concepts</span></span>
<span style="color: black;">        <span style="color: #339933;">$class</span>      = CONCEPTS<span class="br0">&#91;</span><span style="color: #339933;">$concept</span><span class="br0">&#93;</span> ?? <span style="color: #FF0000;">''</span>;</span>
<span style="color: black;">        <span style="color: #808080;">// on pr&eacute;pare un controller g&eacute;n&eacute;rique qui va prendre en charge la requ&ecirc;te</span></span>
<span style="color: black;">        <span style="color: #339933;">$controller</span> = <span style="color: #0080ff;">false</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// si aucune correspondance directe trouv&eacute;e</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$class</span> === <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #808080;">// on parcourt les concepts de l'application &agrave; la recherche</span></span>
<span style="color: black;">            <span style="color: #808080;">// de l'action capable de prendre en charge la requ&ecirc;te</span></span>
<span style="color: black;">            <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span>CONCEPTS <span style="color: #0000ff;">as</span> <span style="color: #339933;">$cls</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$controller</span> = <span style="color: #339933;">$search_action_controller</span><span class="br0">&#40;</span><span style="color: #339933;">$cls</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$controller</span> !== <span style="color: #0080ff;">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">break</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$controller</span> = <span style="color: #339933;">$search_action_controller</span><span class="br0">&#40;</span><span style="color: #339933;">$class</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$controller</span> === <span style="color: #0080ff;">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;response = <span style="color: #0000ff;">new</span> Response<span class="br0">&#40;</span><span style="color: #FF0000;">'Unable to manage the request'</span>, <span style="color: #FF0000;">'400 Bad Request'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">return</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// on passe le flux d'ex&eacute;cution au contr&ocirc;leur qui</span></span>
<span style="color: black;">        <span style="color: #808080;">// lui doit obligatoirement fournir une r&eacute;ponse</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">/** @var Controller */</span></span>
<span style="color: black;">        <span style="color: #339933;">$controller</span> = <span style="color: #0000ff;">new</span> <span style="color: #339933;">$controller</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$controller</span>-&gt;setTask<span class="br0">&#40;</span><span style="color: #339933;">$this</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span style="color: #339933;">$controller</span>-&gt;invoke<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// on s'assure que la r&eacute;ponse a bien &eacute;t&eacute; fournie par le contr&ocirc;leur</span></span>
<span style="color: black;">        <span style="color: #808080;">// sinon on en fournit une remontant l'erreur</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> ! <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;response <span style="color: #0000ff;">instanceof</span> Response<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;response = <span style="color: #0000ff;">new</span> Response<span class="br0">&#40;</span><span style="color: #FF0000;">'Invalid response format'</span>, <span style="color: #FF0000;">'500 Internal Server Error'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// &agrave; la fin de cette fonction : on est ABSOLUMENT certain</span></span>
<span style="color: black;">        <span style="color: #808080;">// que le programme a fourni une r&eacute;ponse &agrave; la requ&ecirc;te</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div><br />
<br />
<b><u>MODÉLISATION SOUS FORME OBJET DE LA PROBLÉMATIQUE D'EXEMPLE</u></b><br />
<br />
Pour modéliser plus facilement une problématique, il faut diviser la totalité en morceaux plus petits et plus facilement gérables.<br />
Personnellement, j'ai l'habitude de tout diviser en concepts et chaque concept est le plus autonome possible : il va contenir ses contrôleurs, ses vues, son modèle... (c'est comme si c'était un mini MVC)<br />
Par exemple, la page d'accueil va correspondre au concept <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Home</span>, la gestion d'un utilisateur au concept <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Utilisateur</span>, etc.<br />
De cette conception va découler naturellement une organisation des fichiers très simple : <br />
<br />
<img src="https://www.developpez.net/forums/attachments/p509899d1571072501/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/vb6-graphisme-arc-cercle-picturebox/2019-10-14_185950.jpg/" border="0" alt="Nom : 2019-10-14_185950.jpg
Affichages : 7955
Taille : 191,6 Ko"  style="float: CONFIG" /><br />
<br />
N'oubliez pas que chaque fichier ne comporte qu'une seule et unique classe, ainsi on est capable de très rapidement savoir qui fait quoi. C'est beaucoup plus lisible, non ?<br />
<br />
Comme nous l'avons vu précédemment, tout ce qui se passe sur le serveur correspond à une <b>Action</b>.<br />
Et pour chaque <b>Action</b> devra correspondre une route et un contrôleur : <br />
<br />
<img src="https://www.developpez.net/forums/attachments/p494404d1564441352/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/vb6-graphisme-arc-cercle-picturebox/2019-07-30_010215.jpg/" border="0" alt="Nom : 2019-07-30_010215.jpg
Affichages : 10576
Taille : 32,2 Ko"  style="float: CONFIG" /><br />
<br />
Ce qui nous donne : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">namespace</span> rawsrc;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">use</span> rawsrc\<span class="br0">&#123;</span> Controller, Request, Response <span class="br0">&#125;</span>;</span>
<span style="color: black;"><span style="color: #0000ff;">use</span> BadFunctionCallException;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* TUTORIAL DVP SUR LE CONCEPT MVC : MOD&Egrave;LE-VUE-CONTR&Ocirc;LEUR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7786/developpement-selon-l-approche-mvc-modele-vue-controleur-retour-theorie/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7804/developpement-selon-lapproche-mvc-modele-vue-controleur-cas-pratique/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Repr&eacute;sentation d'une action g&eacute;n&eacute;rique</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Une action va correspondre &agrave; un traitement sur le serveur web</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Elle fournira tout ce qui est n&eacute;cessaire &agrave; l'application pour &ecirc;tre pilot&eacute;e de mani&egrave;re la plus autonome possible</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* ainsi on pourra empiler des actions sans avoir pour autant &agrave; toucher au code de traitement d'une requ&ecirc;te et d'une r&eacute;ponse</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Comme il &eacute;t&eacute; vu dans le tuto :</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* &Agrave; CHAQUE ACTION DISPONIBLE DANS LE SITE WEB DEVRA CORRESPONDRE UNE SEULE ET UNIQUE URL/ROUTE/CONTR&Ocirc;LEUR</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* QUI SERA DE FAIT L'UNIQUE POINT D'ENTR&Eacute;E DU SITE POUR CE TRAITEMENT</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> Action</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Si l'action correspond &agrave; celle demand&eacute;e par la requ&ecirc;te alors une instance</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * de la t&acirc;che serveur en cours sera dynamiquement inject&eacute;e au cas o&ugrave; l'action</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * aurait besoin de conna&icirc;tre son environnement d'ex&eacute;cution pour s'ex&eacute;cuter</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Task</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$task</span> = <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Route</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$route</span> = <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Controller</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$controller</span> = <span style="color: #0080ff;">null</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var Response</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$response</span> = <span style="color: #0080ff;">null</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array $p [route, controller, response]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span><span style="color: #0000ff;">array</span> <span style="color: #339933;">$p</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;set<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  Task $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return self</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setTask<span class="br0">&#40;</span>Task <span style="color: #339933;">$p</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">self</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;task = <span style="color: #339933;">$p</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;controller <span style="color: #0000ff;">instanceof</span> Controller<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;controller-&gt;setTask<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Task</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> task<span class="br0">&#40;</span><span class="br0">&#41;</span>: ?Task</span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;task;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  mixed $p     closure that return a strict boolean value | null</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return self</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setRoute<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">self</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_callable<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span><span style="color: #339933;">$p</span> === <span style="color: #0080ff;">null</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;route = <span style="color: #339933;">$p</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed Closure|null</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> route<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;route;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  mixed $p     Controller | closure that return a Controller object | null | string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return slef</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setController<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">self</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_string<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span><span style="color: #339933;">$p</span> <span style="color: #0000ff;">instanceof</span> Controller<span class="br0">&#41;</span> || is_callable<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span><span style="color: #339933;">$p</span> === <span style="color: #0080ff;">null</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;controller = <span style="color: #339933;">$p</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed Controller|\Closure|null|string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> controller<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;controller;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  mixed $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return self         Response | closure that return a Response object | null | string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setResponse<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">self</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_string<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span><span style="color: #339933;">$p</span> <span style="color: #0000ff;">instanceof</span> Response<span class="br0">&#41;</span> || is_callable<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> || <span class="br0">&#40;</span><span style="color: #339933;">$p</span> === <span style="color: #0080ff;">null</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;response = <span style="color: #339933;">$p</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return mixed    Response|closure|null|string</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> response<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;response;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Set many at once</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array $p  [acl, route, controller, response]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> set<span class="br0">&#40;</span><span style="color: #0000ff;">array</span> <span style="color: #339933;">$p</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#91;</span><span style="color: #FF0000;">'route'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;setRoute<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#91;</span><span style="color: #FF0000;">'route'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#91;</span><span style="color: #FF0000;">'controller'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;setController<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#91;</span><span style="color: #FF0000;">'controller'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#91;</span><span style="color: #FF0000;">'response'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;setResponse<span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#91;</span><span style="color: #FF0000;">'response'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param  Request $p</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @throws BadFunctionCallException</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> handleRequest<span class="br0">&#40;</span>Request <span style="color: #339933;">$p</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_callable<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;route<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$func</span>  = <span style="color: #339933;">$this</span>-&gt;route;</span>
<span style="color: black;">            <span style="color: #339933;">$match</span> = <span style="color: #339933;">$func</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_bool<span class="br0">&#40;</span><span style="color: #339933;">$match</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span style="color: #339933;">$match</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> BadFunctionCallException<span class="br0">&#40;</span><span style="color: #FF0000;">'Callable does not return a strict boolean'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">false</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div><br />
<br />
<b><u>CONCEPTS MÉTIER</u></b><br />
<br />
Tout est concept dans l'organisation , attardons nous sur le concept <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Utilisateur</span>, comme tout concept il est générique c'est-à-dire qu'il est capable de gérer n'importe quel utilisateur sans exception. <b>Tous les cas de figure doivent être prévus</b>, c'est le boulot d'un développeur aguerri.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">namespace</span> src\Utilisateur;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">use</span> rawsrc\Action;</span>
<span style="color: black;"><span style="color: #0000ff;">use</span> rawsrc\Request;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">use</span> src\Utilisateur\Controller\<span class="br0">&#123;</span> Login, Connect, Dashboard <span class="br0">&#125;</span>;</span>
<span style="color: black;"><span style="color: #0000ff;">use</span> src\Utilisateur\Model\Data;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Classe repr&eacute;sentant le concept Utilisateur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> Utilisateur</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Liste des actions possibles pour un utilisateur</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array [Action]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> actions<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">// pour bien comprendre les concepts, je vais aller au plus simple</span></span>
<span style="color: black;">        <span style="color: #808080;">// il est tout &agrave; fait possible d'&eacute;crire son code autrement afin de gagner en souplesse et possibilit&eacute;s</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span class="br0">&#91;</span></span>
<span style="color: black;">            <span style="color: #808080;">// action 1 = /utilisateur/login    pour afficher le formulaire de connexion</span></span>
<span style="color: black;">            <span style="color: #0000ff;">new</span> Action<span class="br0">&#40;</span><span class="br0">&#91;</span></span>
<span style="color: black;">                <span style="color: #808080;">// cette fonction (route) ne fait que v&eacute;rifier si les composants de la requ&ecirc;te en param&egrave;tre lui correspondent</span></span>
<span style="color: black;">                <span style="color: #808080;">// si la correspondance est totale alors cette action sera retenue et consid&eacute;r&eacute;e comme l'action en cours</span></span>
<span style="color: black;">                <span style="color: #808080;">// donc c'est le controller rattach&eacute; &agrave; cette action qui h&eacute;ritera du flux de traitement</span></span>
<span style="color: black;">                <span style="color: #808080;">// route = /utilisateur/login</span></span>
<span style="color: black;">                <span style="color: #FF0000;">'route'</span>      =&gt; <span style="color: #0000ff;">function</span><span class="br0">&#40;</span>Request <span style="color: #339933;">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">return</span> <span style="color: #339933;">$p</span>-&gt;path<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> === <span style="color: #FF0000;">'login'</span>; <span class="br0">&#125;</span>,</span>
<span style="color: black;">                <span style="color: #FF0000;">'controller'</span> =&gt; Login::<span style="color: #0000ff;">class</span></span>
<span style="color: black;">            <span class="br0">&#93;</span><span class="br0">&#41;</span>,</span>
<span style="color: black;">            <span style="color: #808080;">// route = /utilisateur/connect  pour la soumission du formulaire de connexion</span></span>
<span style="color: black;">            <span style="color: #0000ff;">new</span> Action<span class="br0">&#40;</span><span class="br0">&#91;</span></span>
<span style="color: black;">                <span style="color: #FF0000;">'route'</span>      =&gt; <span style="color: #0000ff;">function</span><span class="br0">&#40;</span>Request <span style="color: #339933;">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">return</span> <span style="color: #339933;">$p</span>-&gt;path<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> === <span style="color: #FF0000;">'connect'</span>; <span class="br0">&#125;</span>,</span>
<span style="color: black;">                <span style="color: #FF0000;">'controller'</span> =&gt; Connect::<span style="color: #0000ff;">class</span></span>
<span style="color: black;">            <span class="br0">&#93;</span><span class="br0">&#41;</span>,</span>
<span style="color: black;">            <span style="color: #808080;">// route = /utilisateur/dashboard       (tableau de bord)</span></span>
<span style="color: black;">            <span style="color: #0000ff;">new</span> Action<span class="br0">&#40;</span><span class="br0">&#91;</span></span>
<span style="color: black;">                <span style="color: #FF0000;">'route'</span>      =&gt; <span style="color: #0000ff;">function</span><span class="br0">&#40;</span>Request <span style="color: #339933;">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">return</span> <span style="color: #339933;">$p</span>-&gt;path<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> === <span style="color: #FF0000;">'dashboard'</span>; <span class="br0">&#125;</span>,</span>
<span style="color: black;">                <span style="color: #FF0000;">'controller'</span> =&gt; Dashboard::<span style="color: #0000ff;">class</span></span>
<span style="color: black;">            <span class="br0">&#93;</span><span class="br0">&#41;</span>,</span>
<span style="color: black;">        <span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Pointeur vers la classe en charge de la gestion des donn&eacute;es -&gt; LE MODELE</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return Data</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> data<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> Model\Data::<span style="color: #0000ff;">class</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div>Comme à chaque fois, je vous invite à bien lire les commentaires disséminés un peu partout dans le code source. Vous allez trouver déjà beaucoup de réponses à vos interrogations.<br />
<br />
Vu que l'organisation est générique et l'approche du code standardisée, il va être dorénavant beaucoup plus simple d'étendre les fonctionnalités du site sans se noyer. <b>Il fat toujours s'efforcer de préserver la même architecture tout au long du développement</b>. Le MVC vous permet assez facilement de le faire.<br />
<br />
<br />
<b><u>LES VUES</u></b><br />
<br />
Les vues reposent sur un petit moteur de rendu de ma conception : <b><font color="#0000FF">PhpEcho</font></b>. Ce moteur reposant sur une seule et unique classe est disponible et détaillé sur <a href="https://www.developpez.net/forums/blogs/32058-rawsrc/b8215/phpecho-moteur-rendu-php-classe-gouverner/" target="_blank">un de mes autres articles de blog DVP.</a><br />
<br />
Par exemple le formulaire de connexion d'un utilisateur est codé ainsi : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code html :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">p</span><span style="color: #0000ff;">&gt;</span></span> Blog de <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">strong</span><span style="color: #0000ff;">&gt;</span></span>rawsrc<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">strong</span><span style="color: #0000ff;">&gt;</span></span> sur DVP <span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">p</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">p</span><span style="color: #0000ff;">&gt;</span></span>Veuillez vous identifier<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">p</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">form</span> <span style="color: #0080ff;">method</span><span style="color: #0000ff;">=</span>post <span style="color: #0080ff;">action</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'url_submit'</span><span class="br0">&#93;</span> <span style="color: #0080ff;">?&gt;</span></span>&quot;</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">label</span><span style="color: #0000ff;">&gt;</span></span>Identifiant<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">label</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">input</span> <span style="color: #0080ff;">type</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;text&quot;</span> <span style="color: #0080ff;">name</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;login&quot;</span> <span style="color: #0080ff;">value</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'login'</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span>&quot;</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">br</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">label</span><span style="color: #0000ff;">&gt;</span></span>Mot de passe<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">label</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">input</span> <span style="color: #0080ff;">type</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;password&quot;</span> <span style="color: #0080ff;">name</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;pwd&quot;</span> <span style="color: #0080ff;">value</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;"><span style="color: #FF0000;">&quot;&quot;</span></span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">br</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">input</span> <span style="color: #0080ff;">type</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;submit&quot;</span> <span style="color: #0080ff;">name</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;submit&quot;</span> <span style="color: #0080ff;">value</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;SE CONNECTER&quot;</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">form</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">br</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">p</span> <span style="color: #0080ff;">style</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;display:<span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#91;</span><span style="color: #FF0000;">'error'</span><span class="br0">&#93;</span> ? <span style="color: #FF0000;">'block'</span> : <span style="color: #FF0000;">'none'</span> <span style="color: #0080ff;">?&gt;</span></span>&quot;</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">strong</span><span style="color: #0000ff;">&gt;</span></span><span style="color: black;"><span style="color: #0080ff;">&lt;?</span>= <span style="color: #339933;">$this</span><span class="br0">&#40;</span><span style="color: #FF0000;">'error'</span><span class="br0">&#41;</span> <span style="color: #0080ff;">?&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">strong</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">p</span><span style="color: #0000ff;">&gt;</span></span></pre></td></tr></table></pre>
</div><br />
Le contrôleur s'occupe de paramétrer l'affichage du formulaire de connexion comme ceci : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">namespace</span> src\Utilisateur\Controller;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">use</span> rawsrc\<span class="br0">&#123;</span> Controller, Response <span class="br0">&#125;</span>;</span>
<span style="color: black;"><span style="color: #0000ff;">use</span> rawsrc\PhpEcho\PhpEcho;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">class</span> Login</span>
<span style="color: black;"><span style="color: #0000ff;">extends</span> Controller</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> invoke<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #808080;">// corps de la vue</span></span>
<span style="color: black;">        <span style="color: #339933;">$body</span> = <span style="color: #0000ff;">new</span> PhpEcho<span class="br0">&#40;</span><span class="br0">&#91;</span><span style="color: #339933;">__DIR__</span>, <span style="color: #FF0000;">'.. View Login.php'</span><span class="br0">&#93;</span>, <span class="br0">&#91;</span><span style="color: #FF0000;">'url_submit'</span> =&gt; <span style="color: #FF0000;">'/utilisateur/connect'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// layout de la page principale</span></span>
<span style="color: black;">        <span style="color: #339933;">$page</span> = <span style="color: #0000ff;">new</span> PhpEcho<span class="br0">&#40;</span><span class="br0">&#91;</span>DIR_ROOT, <span style="color: #FF0000;">'src View Layout.php'</span><span class="br0">&#93;</span>, <span class="br0">&#91;</span><span style="color: #FF0000;">'body'</span> =&gt; <span style="color: #339933;">$body</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$this</span>-&gt;setResponse<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Response<span class="br0">&#40;</span><span style="color: #339933;">$page</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div>Cela permet de morceler à loisir les fonctions de génération de l'affichage et de profiter de toutes les possibilités offertes par la POO.<br />
<br />
Il vous tout à fait possible d'opter pour n'importe quel autre moteur de génération de rendu. Le concept MVC s'accommode très facilement de toute extension ou nouvel ajout.<br />
<br />
<br />
<b><u><font size="3">SCHÉMA GLOBAL DU PRINCIPE MVC</font></u></b><br />
<br />
<br />
Compte tenu des problèmes de compréhension de certaines étapes, j'ai décidé de vous proposer un schéma global de l'approche MVC mettant à plat toute l'articulation de la logique sous-jacente.<br />
Voici globalement le travail accompli par ces <b>4 lignes de code situées dans index.php</b>: <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">use</span> rawsrc\Task;
&nbsp;
<span style="color: #339933;">$task</span> = <span style="color: #0000ff;">new</span> Task<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$task</span>-&gt;dispatch<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$task</span>-&gt;response<span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;send<span class="br0">&#40;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
<img src="https://www.developpez.net/forums/attachments/p495658d1565039681/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/vb6-graphisme-arc-cercle-picturebox/2019-08-05_231243.jpg/" border="0" alt="Nom : 2019-08-05_231243.jpg
Affichages : 10773
Taille : 515,1 Ko"  style="float: CONFIG" /><br />
<br />
<br />
<b><u><font size="3">NOTION DE CONCEPT</font></u></b><br />
<br />
<img src="https://www.developpez.net/forums/attachments/p509903d1571073033/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/vb6-graphisme-arc-cercle-picturebox/2019-10-14_190800.jpg/" border="0" alt="Nom : 2019-10-14_190800.jpg
Affichages : 7812
Taille : 220,6 Ko"  style="float: CONFIG" /><br />
<br />
<br />
<b><u><font size="3">FICHIERS DU PROJET ET MISE EN ROUTE</font></u></b><br />
<br />
Pour que vous puissiez tester le projet en réel, il vous faudra une petite base de données MySQL avec qu'une seule table :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:132px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> <span style="color: #FF0000;">`t_user`</span> <span class="br0">&#40;</span>
  <span style="color: #FF0000;">`user_id`</span> <span style="color: #0000ff;">INTEGER</span><span class="br0">&#40;</span><span style="color: #cc66cc;">10</span><span class="br0">&#41;</span> <span style="color: #0000ff;">UNSIGNED</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span> <span style="color: #0000ff;">AUTO_INCREMENT</span>,
  <span style="color: #FF0000;">`user_login`</span> <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span><span style="color: #cc66cc;">255</span><span class="br0">&#41;</span> <span style="color: #0000ff;">COLLATE</span> utf8_general_ci <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,
  <span style="color: #FF0000;">`user_pwd_hash`</span> <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span><span style="color: #cc66cc;">255</span><span class="br0">&#41;</span> <span style="color: #0000ff;">COLLATE</span> utf8_general_ci <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,
  <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span> <span style="color: #0000ff;">USING</span> BTREE <span class="br0">&#40;</span><span style="color: #FF0000;">`user_id`</span><span class="br0">&#41;</span>,
  <span style="color: #0000ff;">UNIQUE</span> <span style="color: #0000ff;">KEY</span> <span style="color: #FF0000;">`user_login`</span> <span style="color: #0000ff;">USING</span> BTREE <span class="br0">&#40;</span><span style="color: #FF0000;">`user_login`</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span style="color: #0000ff;">ENGINE</span>=InnoDB
<span style="color: #0000ff;">AUTO_INCREMENT</span>=<span style="color: #cc66cc;">1</span> ROW_FORMAT=DYNAMIC <span style="color: #0000ff;">CHARACTER</span> <span style="color: #0000ff;">SET</span> <span style="color: #FF0000;">'utf8'</span> <span style="color: #0000ff;">COLLATE</span> <span style="color: #FF0000;">'utf8_general_ci'</span>;</pre></td></tr></table></pre>
</div>et juste une seule ligne de données : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> <span style="color: #FF0000;">`t_user`</span> <span class="br0">&#40;</span><span style="color: #FF0000;">`user_login`</span>, <span style="color: #FF0000;">`user_pwd_hash`</span><span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span>
  <span class="br0">&#40;</span><span style="color: #FF0000;">'rawsrc'</span>, <span style="color: #FF0000;">'$argon2i$v=19$m=1024,t=2,p=2$Uzdldm5iWTJMOGp3cXdsZQ$4ZE9jZ8YyH4SGXsjT/ED/XYQpf0oVJe4TRWQXXS04eQ'</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>Pour tester une identification réussie : login = rawsrc, mot de passe = 123456<br />
<br />
<b>REDIRECTION VERS index.php</b><br />
<br />
Comme nous l'avons vu, un seul et unique point d'entrée de toutes les requêtes est nécessaire au bon fonctionnement du projet, pour cela il faudra faire une redirection au niveau du serveur web comme ceci pour apache : <br />
<div style="margin: 20px; margin-top: 5px"><pre class="alt2" style="border: 1px inset; padding: 5px">RewriteEngine on
RewriteCond %{REQUEST_URI} /(index)(\..{3,4})?$ [NC]
RewriteRule ^.* http://dev.mvc.fr [R=301,L]
RewriteCond %{REQUEST_FILENAME} !^/css/.*$
RewriteCond %{REQUEST_FILENAME} !^/js/.*$
RewriteCond %{REQUEST_FILENAME} !^/img/.*$
RewriteRule . /index.php [QSA,L]</pre></div><b>Paramétrage final</b><br />
<br />
Il y a quelques constantes à adapter à votre environnement dans le fichier index.php<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// Gestion des constantes</span>
define<span class="br0">&#40;</span><span style="color: #FF0000;">'URL_HOME'</span>, <span style="color: #FF0000;">'http://dev.mvc.fr'</span><span class="br0">&#41;</span>;
<span style="color: #808080;">// Base de donn&eacute;es</span>
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_SCHEME'</span>, <span style="color: #FF0000;">'mysql'</span><span class="br0">&#41;</span>;
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_HOST'</span>, <span style="color: #FF0000;">'localhost'</span><span class="br0">&#41;</span>;
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_NAME'</span>, <span style="color: #FF0000;">'db_mvc'</span><span class="br0">&#41;</span>;
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_PORT'</span>, <span style="color: #FF0000;">'3306'</span><span class="br0">&#41;</span>;
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_USER'</span>, <span style="color: #FF0000;">'root'</span><span class="br0">&#41;</span>;
define<span class="br0">&#40;</span><span style="color: #FF0000;">'DB_PWD'</span>, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>Rien d'extraordinaire que du standard.<br />
<br />
Et enfin, le ficher ZIP qui contient tous les fichiers du projet (fichiers mis à jour avec <b><font color="#0000FF">PhpEcho</font></b>)<br />
<a href="https://www.developpez.net/forums/attachments/p509914d1571074115/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/vb6-graphisme-arc-cercle-picturebox/mvc.zip/"  title="Nom : mvc.zip
Affichages : 280
Taille : 20,6 Ko">mvc.zip</a><br />
<br />
<br />
<b><u><font size="3">CONCLUSION</font></u></b><br />
<br />
Nous sommes arrivés au terme de ce tutoriel qui j'espère vous aura été très utile.<br />
Dites-vous bien que le passage à un codage MVC va nécessiter une nouvelle manière de penser (beaucoup mieux découplée) ainsi qu'un certain travail de reprise de vos codes existants, mais c'est pour du mieux alors !!!<br />
<br />
Bon code à tous, bienvenue aux p'tits nouveaux dans le vaste monde de la POO.<br />
<br />
<b>EDIT : </b> Reprise complète des vues en utilisant <b><font color="#0000FF">PhpEcho</font></b>, disponible à <a href="https://www.developpez.net/forums/blogs/32058-rawsrc/b8215/phpecho-moteur-rendu-php-classe-gouverner/" target="_blank">cette adresse</a>.<br />
<br />
:ccool:<br />
<br />
<b>rawsrc</b></blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b7804/php-7p-developpement-selon-l-approche-mvc-modele-vue-controleur-cas-pratique/</guid>
		</item>
		<item>
			<title><![CDATA[Développement selon l'approche MVC : Modèle - Vue - Contrôleur - Le retour - Théorie]]></title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b7786/developpement-selon-l-approche-mvc-modele-vue-controleur-retour-theorie/</link>
			<pubDate>Wed, 24 Jul 2019 08:10:19 GMT</pubDate>
			<description>Salut les développeurs, 
...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Salut les développeurs,<br />
<br />
aujourd'hui je vais vous faire un billet pour démystifier le concept de programmation en PHP avec l'approche Modèle-Vue-Contrôleur (MVC pour les intimes).<br />
<br />
Compte tenu que les applications web ont une fâcheuse tendance de nos jours à l'embonpoint voire à l'obésité :lol:, il est important d'organiser le code source de manière à pouvoir faciliter d'une part le développement de nouvelles fonctionnalités et d'autre part, la maintenance du code existant. Dans cette optique, l'expérience a montré qu'il était tout à fait possible de séparer le code source en trois parties distinctes relatives à chaque aspect des traitements : <br />
<br />
<ul><li style="">Le modèle qui regroupe tout ce qui est relatif au métier (aspects professionnels de l'application)</li><li style="">La vue qui regroupe tout ce qui est relatif au rendu</li><li style="">Le contrôleur qui regroupe tout ce qui est relatif aux entrées/contrôle du flux/sorties de l'application</li></ul><br />
<br />
Je pars d'une approche rigide pour bien poser le concept général. Avec l'expérience, il vous sera possible d'assouplir un peu cette approche, mais pour l'instant aucun écart ne vous sera profitable sauf à vous embrouiller.<br />
<br />
<br />
<b><u><font size="3">LE MODÈLE</font></u></b><br />
<br />
Comme précisé plus haut, cet aspect regroupe tout ce qui est propre à la couche métier de l'application.<br />
Par couche métier, il faut bien comprendre que cela correspond à la valeur ajoutée de l'application. <br />
Quand vous travaillez par exemple sur une application de gestion, la couche métier va englober la gestion des comptes (création, modification, suppression...), catégories, calculs des soldes selon les règles en vigueur, gestion des arrondis, éditions, etc.<br />
D'une application à l'autre, vous allez très vite vous rendre compte que certains aspects métiers sont communs et réutilisables : connexion à un compte, déconnexion, accès à une base de données (PDO)...<br />
Ainsi, vous allez très probablement vous poser la question du meilleur moyen pour réutiliser très facilement le code entre applications et vous allez inévitablement tomber sur la Programmation Orientée Objet (POO) conçue avec cette idée de portabilité dès le début. Je privilégierai cette approche dans ce billet.<br />
<br />
<br />
<b><u><font size="3">LA VUE</font></u></b><br />
<br />
Cet élément doit être pris au sens large du concept, par exemple les éléments de cette liste relèvent de la vue : <br />
<ul><li style="">générer du html</li><li style="">générer du xml</li><li style="">générer un pdf</li><li style="">etc.</li></ul><br />
Il faut bien comprendre que la vue est une <b>terminaison dans le traitement</b>. La vue est une fin, elle ne doit s'occuper que de bien générer <b>de manière autonome (le plus possible)</b> un élément qui devra être envoyé au navigateur. <br />
Plus clairement : la vue est passive, il faut lui passer en paramètre tous les éléments nécessaires à son travail de génération. Cela implique qu'avant d'appeler la vue, il faut au préalable que le traitement en cours collecte exhaustivement valeurs, variables et autres données qui seront utilisées au moment de la génération du rendu.<br />
Une vue ne doit avoir à sa disposition qu'un accès très limité aux autres parties de l'application. En conséquence,  les seules fonctions auxquelles elle peut accéder ne doivent avoir trait qu'à la vue par exemple une fonction d'échappement des caractères dangereux, une fonction de mise en forme de texte...<br />
En aucun cas, elle ne doit faire appel à la couche métier ou au contrôleur.<br />
<br />
<br />
<b><u><font size="3">LE CONTRÔLEUR</font></u></b><br />
<br />
C'est le chef d'orchestre du trio, il est le point d'entrée de chaque traitement, il pilote le déroulé du programme (le flux de traitement), appelle les éléments de la couche métier, collecte les données de réponse, appelle les éléments de vue et envoie une réponse au navigateur à la toute fin du traitement.<br />
<br />
Ici, il y a un point très important à saisir c'est la notion de <b>point d'entrée de chaque traitement</b>.<br />
Il faut bien percevoir qu'interagir avec une application web est équivalent à l'accomplissement d'une suite d'actions. <br />
<br />
Une action va correspondre par exemple à : <br />
<ul><li style="">demander l'affichage d'une page web</li><li style="">appeler un formulaire de saisie</li><li style="">soumettre un formulaire rempli</li><li style="">demander la génération d'un document pdf</li><li style="">récupérer des données au format xml</li><li style="">trier les données d'un tableau sur clic d'un en-tête de colonne</li><li style="">changer de page sur clic d'un élément de pagination</li><li style="">etc.</li></ul><br />
Conformément au principe ci-dessus,<br />
<font color="#0000FF"><b>A CHAQUE ACTION DISPONIBLE DANS LE SITE WEB DEVRA CORRESPONDRE UN SEUL ET UNIQUE CONTRÔLEUR QUI SERA DE FAIT L'UNIQUE POINT D'ENTRÉE DE L'APPLICATION POUR CE TRAITEMENT</b></font><br />
<br />
Ne vous inquiétez pas, sur les sites web d'une certaine taille, il n'est pas rare de trouver plus 1 000 contrôleurs... qui correspondent à 1 000 actions possibles sur le site...<br />
<br />
<br />
<b><u><font size="3">REQUÊTE SERVEUR</font></u></b><br />
<br />
Comme vous n'êtes pas sans le savoir ;), le navigateur ne dispose que d'un seul et unique moyen pour communiquer avec un serveur web : l'URL.<br />
Afin que le serveur web soit à même de différencier les actions et de ne pas s'emmêler les pinceaux, il sera obligatoire d'avoir une correspondance unique entre URL et action.<br />
En conséquence,<br />
<font color="#0000FF"><b>A CHAQUE ACTION DISPONIBLE DANS LE SITE WEB DEVRA CORRESPONDRE UNE SEULE ET UNIQUE URL QUI SERA DE FAIT L'UNIQUE POINT D'ENTRÉE DU SITE POUR CE TRAITEMENT</b></font><br />
<br />
<br />
<b><u><font size="3">ORGANISATION DU CODE SOURCE</font></u></b><br />
<br />
Depuis le début, je vous parle de la notion de point d'entrée, il est essentiel de bien la comprendre, car cela va directement influer sur la manière d'organiser le code source d'une application.<br />
Un serveur web tire son nom du fait qu'il n'a que pour seule et unique tâche de servir des réponses à des requêtes qu'il reçoit. Pour y parvenir, il exécute des scripts avec du code source que vous avez pris grand soin d'écrire. <br />
<br />
Maintenant, abordons un aspect plus technique : l'environnement d’exécution PHP a une particularité qui est à la fois une force et une faiblesse : PHP est dit &quot;<b>stateless</b>&quot;, ce qui veut tout simplement dire qu'il ne garde rien en mémoire entre chaque requête. <br />
C'est exactement comme s'il s'éteignait et se rallumait entre chaque appel. Comme si vous redémarriez votre ordinateur entre chaque appui de touche au clavier, c'est embêtant, non ? Bah pas tant que ça !<br />
<br />
La force réside dans le fait que l'environnement d'exécution est tout neuf et propre à chaque nouveau traitement, la faiblesse c'est que l'environnement d'exécution <u>spécifique à votre application</u> est détruit à chaque fin de traitement.<br />
Par environnement spécifique à votre application, il faut comprendre que cela correspond à votre connexion à la base de données, la définition de constantes utilisées partout dans le code, certains paramétrages d'exécution, la manière de charger des classes, etc. <br />
<b><i>Bref, c'est tout le socle commun et nécessaire et à la bonne exécution de votre code qui est supprimé de la mémoire une fois la réponse du serveur envoyée.</i></b><br />
<br />
Comme à chaque nouvelle requête cet environnement devra être reconstruit, il est nécessaire de bien réfléchir à la manière d'organiser son code afin que ce redémarrage ne soit pas une torture insupportable. <br />
<br />
On va voir qu'il existe deux manières d'appréhender la problématique, sauf qu'il ne faut en garder qu'une seule à la fin :D<br />
<br />
En simplifiant, dans la configuration d'un serveur web, il est explicitement défini un répertoire racine (généralement /www/) qui va servir à enregistrer tous les fichiers relatifs à votre application (.php, .jpeg, .css, .js, etc.) Il est également possible de créer autant de sous-répertoires que nécessaire afin de faciliter l'organisation de votre code.<br />
<br />
<b><u><font size="3">MULTIPLES POINTS D'ENTRÉE SUR LE SITE</font></u></b><br />
<br />
Comme nous l'avons vu, un serveur web ne fait simplement que correspondre une URL (côté navigateur) à une ressource (au sens abstrait) disponible sur ledit serveur (dans le système de fichiers sur le disque dur).<br />
Dans une approche décentralisée, il y a une correspondance directe entre : <br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p493158d1563955740/environnements-developpement/delphi/edi/kylix-erreur-l-installation/2019-07-23_215642.jpg/" border="0" alt="Nom : 2019-07-23_215642.jpg
Affichages : 11038
Taille : 15,1 Ko"  style="float: CONFIG" /></div>Votre application démarrera directement dans le fichier situé dans /abc/def/fichier.php Pourquoi pas, me direz-vous ? OK, poussons plus en avant la logique.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p493154d1563955733/environnements-developpement/delphi/edi/kylix-erreur-l-installation/2019-07-23_220136.jpg/" border="0" alt="Nom : 2019-07-23_220136.jpg
Affichages : 6886
Taille : 22,5 Ko"  style="float: CONFIG" /></div>Votre application démarrera directement dans le fichier situé dans /abc/def/ghi/jkl/mno/login.php<br />
<br />
Maintenant, revenons à nos moutons : votre application a besoin d'un environnement d'exécution spécifique pour que tout le code source puisse être exécuté sans problème. <br />
Donc pour reconstruire cet environnement et comme vous êtes un développeur sensé vous allez probablement créer un répertoire dans votre arborescence sous /www/bootstrap/ afin d'y loger tous les scripts d'initialisation : PDO, constantes, autoloader, durée d'exécution max, etc.<br />
Le hic c'est qu'à chaque nouveau script, vous allez devoir jongler avec les <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">require_once</span> __DIR_.<span style="color: #FF0000;">'/../../../../bootstrap/PDO.php;</span></span> le nombre de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">/../</span>, c'est 3 ou 4 ?<br />
Ça sera pareil quand il s'agira d'inclure les fichiers du modèle pour bâtir une réponse...<br />
Ça sera très vite ingérable et sacrément gonflant, croyez-moi et vous allez finir par vous maudire ainsi que vos descendants sur des générations et des générations :lol:<br />
<br />
<br />
<b><u><font size="3">UNIQUE POINT D'ENTRÉE SUR LE SITE</font></u></b><br />
<br />
L'autre approche, dite centralisée, va permettre de vous faciliter grandement la vie et de bénéficier d'un système très vite opérationnel et sans avoir à fournir trop d'efforts.<br />
On va poser le principe que toutes les requêtes arrivant sur le serveur soient <b>redirigées</b> sur un unique point d'entrée, un fichier PHP, appelé, attention ! Roulements de tambour : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">index.php</span>. Bon vous me direz quelle folie, hein !?!! M'enfin de temps en temps...<br />
Donc comme ce fichier va récupérer absolument toutes les requêtes, il va nous être très facile de procéder à l'amorçage de notre environnement d'exécution.<br />
Plus de gymnastique douloureuse, juste en début de fichier un simple <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">include</span> <span style="color: #FF0000;">'bootstrap/PDO.php'</span>;</span> suivi de la suite des fichiers nécessaires au démarrage.<br />
Et ce qui n'est pas négligeable, c'est que comme vous êtes à la racine de votre site, il est très facile de créer une constante qui contient le chemin physique de la racine du site sur le serveur, le classique <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">define<span class="br0">&#40;</span><span style="color: #FF0000;">'DIR_ROOT'</span>, <span style="color: #339933;">__DIR__</span>.DIRECTORY_SEPARATOR<span class="br0">&#41;</span>;</span>.<br />
<br />
Pour parvenir à ce résultat : 2 voies possibles : soit vous configurez le serveur web afin que lui se charge d'effectuer la redirection (ma solution préférée), soit vous codez toutes vos URL de manière à forcer la redirection quelque chose dans le genre : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">http://www.monsite.fr/index.php?page=login</span> ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">http://www.monsite.fr/index.php?page=loginsubmit</span>. <br />
<br />
Comme les URL sont dé-corrélées de la structure des répertoires et des fichiers sur le disque dur, la contrepartie de cette approche c'est qu'il va falloir disposer d'un système interne à l'application qui va être capable d'identifier quel fichier PHP exécuter pour chaque URL reçue.<br />
<br />
<hr /> <br />
Un petit aparté s'impose, comme le vocabulaire est très important dès qu'il s'agit de technique, il faut bien noter ceci :<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p493150d1563955632/environnements-developpement/delphi/edi/kylix-erreur-l-installation/2019-07-23_224723.jpg/" border="0" alt="Nom : 2019-07-23_224723.jpg
Affichages : 6907
Taille : 21,8 Ko"  style="float: CONFIG" /></div><br />
Quand vous êtes dans un navigateur (Firefox, Chrome, Opéra, Safari...), vous allez parler d'<b>URL</b>, mais quand vous allez vous placer du côté du serveur web, vous allez parler de <b>ROUTE</b>. La distinction est subtile, mais importante : <b>une route est une URL qui a été analysée</b>. C'est-à-dire que l'URL a été entièrement parsée afin d'extraire tous les composants séparément selon la norme <a href="https://tools.ietf.org/html/rfc3986" target="_blank">RFC3986</a>.<br />
<br />
<b>Une fois que les éléments constitutifs d'une URL sont connus, une application web va devoir les comparer avec son paramétrage interne afin d'essayer de trouver si elle dispose des ressources adéquates pour être en mesure de construire une réponse appropriée et de l'envoyer au navigateur client. Cette étape essentielle s'appelle le <font color="#0000FF">ROUTAGE</font></b> et s'appuie sur une ou plusieurs <b><font color="#0000FF">table de routage</font></b>. Si aucune route ne correspond à l'URL alors l'application enverra une réponse de type Error 404.<br />
<br />
Dans nos exemples, une table de routage indiquerait que :<br />
- quand <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">page = &quot;login&quot;</span> alors il faut aller transférer le flux de traitement à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">\Utilisateur\Controller\Login.php</span>, <br />
- quand <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">page = &quot;loginsubmit&quot;</span> alors il faut aller transférer le flux de traitement à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">\Utilisateur\Controller\LoginSubmit.php</span>, <br />
<br />
Maintenant nous pouvons compléter les assertions du début : <br />
<br />
<font color="#0000FF"><b>A CHAQUE ACTION DISPONIBLE DANS LE SITE WEB DEVRA CORRESPONDRE UN SEUL ET UNIQUE URL/ROUTE/CONTRÔLEUR QUI SERA DE FAIT L'UNIQUE POINT D'ENTRÉE DU SITE POUR CE TRAITEMENT</b></font><br />
<br />
Pour résumer schématiquement : <br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p493151d1563955717/environnements-developpement/delphi/edi/kylix-erreur-l-installation/action_url_controleur.jpg/" border="0" alt="Nom : action_url_controleur.jpg
Affichages : 6978
Taille : 28,4 Ko"  style="float: CONFIG" /></div>Simple, non ?<br />
<br />
<hr /><br />
<br />
L'énorme avantage de l'approche centralisée, c'est qu'il n'y a plus aucune exposition de votre arborescence partielle du disque dur sur le web. <br />
Par ailleurs, avec ce système, il vous sera tout à fait possible d'utiliser des URL personnalisées à souhait pour peu que vous ayez un système de routage souple.<br />
<br />
Nous arrivons à la fin de l'exposé théorique du concept MVC.<br />
<br />
Dans un autre <a href="https://www.developpez.net/forums/blogs/32058-rawsrc/b7804/php-7p-developpement-selon-lapproche-mvc-modele-vue-controleur-cas-pratique/" target="_blank"><b>billet de blog</b></a>, je vais coder entièrement un cas pratique afin d'exposer la mise en oeuvre de ce concept abstrait, mais fort pratique. Pour cela, je n'utiliserai que la Programmation Orientée Objet (d'une manière simple) et vous verrez ainsi comment tout cela se met en application.<br />
<br />
Bon code à tous :ccool:<br />
<br />
<b>rawsrc</b></blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b7786/developpement-selon-l-approche-mvc-modele-vue-controleur-retour-theorie/</guid>
		</item>
		<item>
			<title>Pagination</title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b7678/pagination/</link>
			<pubDate>Mon, 24 Jun 2019 17:16:44 GMT</pubDate>
			<description>Salut les développeurs, 
...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Salut les développeurs,<br />
<br />
aujourd'hui je vais vous parler pagination.<br />
<br />
La pagination est très pratique car elle permet d'afficher de gros volumes de données en les découpant en sous-ensembles humainement et informatiquement gérables.<br />
<br />
Quand une de vos requête renvoie par exemple 15 000 enregistrements, il n'est pas possible de les afficher sans réduire leur quantité. C'est le rôle de la pagination.<br />
Pour que cela fonctionne, il faut que le système de pagination soit capable de calculer et de positionner correctement le curseur des pages en fonction de beaucoup de paramètres dynamiques : <br />
<br />
<ul><li style="">le nombre total d'enregistrements</li><li style="">le numéro de page demandé</li><li style="">le nombre d'enregistrements par page</li><li style="">le nombre de pages à afficher dans le système de pagination</li><li style="">affichage opportun des accès directs tels que : premier, précédent, suivant, dernier</li></ul><br />
<br />
Bref, c'est un travail fastidieux et répétitif que je me propose de vous simplifier avec une classe qui fait tout le boulot et qui en plus (cerise sur le gâteau) permet de déterminer la clause SQL qui va vous permettre d'extraire correctement les données de votre base en fonction de tous ces paramètres dynamiques (la fameuse clause <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">LIMIT</span></span>)<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">declare</span><span class="br0">&#40;</span>strict_types=<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* 2019-06-24</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* Licence : vous en faite ce que vous voulez</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;* @author rawsrc   https://www.developpez.net/forums/u32058/rawsrc/</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;*/</span></span>
<span style="color: black;"><span style="color: #0000ff;">class</span> Paginator</span>
<span style="color: black;"><span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$show_first_prev</span> = <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$show_next_last</span> = <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$asked_page</span> = <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$nb_rows_per_page</span> = <span style="color: #cc66cc;">10</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var int   Total number of records in the dataset before pagination</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$nb_records</span> = <span style="color: #cc66cc;">0</span>;</span>
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @var int  How many cells to render between the min and max page index</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">private</span> <span style="color: #339933;">$pages_range</span> = <span style="color: #cc66cc;">10</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * params =&gt; [</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *     show_first_prev  =&gt; bool,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *     show_next_last   =&gt; bool,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *     asked_page       =&gt; int,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *     nb_rows_per_page =&gt; int,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *     nb_records       =&gt; int,</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *     pages_range      =&gt; int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * ]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @param array $params</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">__construct</span><span class="br0">&#40;</span><span style="color: #0000ff;">array</span> <span style="color: #339933;">$params</span><span class="br0">&#41;</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'show_first_prev'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;show_first_prev = <span class="br0">&#40;</span><span style="color: #0080ff;">bool</span><span class="br0">&#41;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'show_first_prev'</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'show_next_last'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;show_next_last = <span class="br0">&#40;</span><span style="color: #0080ff;">bool</span><span class="br0">&#41;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'show_next_last'</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'asked_page'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;asked_page = <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'asked_page'</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'nb_rows_per_page'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;nb_rows_per_page = <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'nb_rows_per_page'</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'nb_records'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;nb_records = <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'nb_records'</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'pages_range'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;pages_range = <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #339933;">$params</span><span class="br0">&#91;</span><span style="color: #FF0000;">'pages_range'</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> showFirstPrev<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;show_first_prev;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return bool</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> showNextLast<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">bool</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;show_next_last;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> askedPage<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;asked_page;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> nbRowsPerPage<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;nb_rows_per_page;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> nbRecords<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;nb_records;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> pagesRange<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$this</span>-&gt;pages_range;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return int</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> nbPages<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;nb_rows_per_page &gt; <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> ? ceil<span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;nb_records/<span style="color: #339933;">$this</span>-&gt;nb_rows_per_page<span class="br0">&#41;</span> : <span style="color: #cc66cc;">0</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Compute the page index manager and return an array of values</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * ex: first, prev, list of numeric page number, next, last</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * The current page will always be in the middle of the range</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> pageList<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;nb_records &gt; <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;nb_rows_per_page &lt;= <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;nb_rows_per_page = <span style="color: #cc66cc;">10</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;pages_range &lt;= <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$this</span>-&gt;pages_range = <span style="color: #cc66cc;">10</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #339933;">$nb_pages</span> = <span style="color: #339933;">$this</span>-&gt;nbPages<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$nb_pages</span> === <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #0000ff;">return</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$nb_pages</span> &lt;= <span style="color: #339933;">$this</span>-&gt;pages_range<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$start</span> = <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$end</span>   = <span style="color: #339933;">$nb_pages</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;asked_page === <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #339933;">$start</span> = <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">                <span style="color: #339933;">$end</span>   = <span style="color: #339933;">$this</span>-&gt;pages_range;</span>
<span style="color: black;">            <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                <span style="color: #808080;">// the current page number is in the middle of the limits</span></span>
<span style="color: black;">                <span style="color: #808080;">// $pages_range / 2 -&gt; if int value : nb of visible pages on left = nb of visible pages on right - 1</span></span>
<span style="color: black;">                <span style="color: #339933;">$half</span> = <span style="color: #339933;">$this</span>-&gt;pages_range / <span style="color: #cc66cc;">2</span>;</span>
<span style="color: black;">                <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;asked_page - <span style="color: #339933;">$half</span><span class="br0">&#41;</span> &lt;= <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$start</span> = <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">                    <span style="color: #339933;">$end</span>   = <span style="color: #339933;">$this</span>-&gt;pages_range;</span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;asked_page + <span style="color: #339933;">$half</span><span class="br0">&#41;</span> &gt;= <span style="color: #339933;">$nb_pages</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #339933;">$start</span> = <span style="color: #339933;">$nb_pages</span> - <span style="color: #339933;">$this</span>-&gt;pages_range + <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">                    <span style="color: #339933;">$end</span>   = <span style="color: #339933;">$nb_pages</span>;</span>
<span style="color: black;">                <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_int<span class="br0">&#40;</span><span style="color: #339933;">$half</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                        <span style="color: #339933;">$start</span> = <span style="color: #339933;">$this</span>-&gt;asked_page - <span style="color: #339933;">$half</span> + <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">                        <span style="color: #339933;">$end</span>   = <span style="color: #339933;">$this</span>-&gt;asked_page + <span style="color: #339933;">$half</span>;</span>
<span style="color: black;">                    <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                        <span style="color: #339933;">$start</span> = <span style="color: #339933;">$this</span>-&gt;asked_page - floor<span class="br0">&#40;</span><span style="color: #339933;">$half</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                        <span style="color: #339933;">$end</span>   = <span style="color: #339933;">$this</span>-&gt;asked_page + floor<span class="br0">&#40;</span><span style="color: #339933;">$half</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">                    <span class="br0">&#125;</span></span>
<span style="color: black;">                <span class="br0">&#125;</span></span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #339933;">$pages</span> = range<span class="br0">&#40;</span><span style="color: #339933;">$start</span>, <span style="color: #339933;">$end</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$nb_pages</span> &gt; <span style="color: #339933;">$this</span>-&gt;pages_range<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;show_first_prev<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                array_unshift<span class="br0">&#40;</span><span style="color: #339933;">$pages</span>, <span style="color: #FF0000;">'first'</span>, <span style="color: #FF0000;">'prev'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;show_next_last<span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">                array_push<span class="br0">&#40;</span><span style="color: #339933;">$pages</span>, <span style="color: #FF0000;">'next'</span>, <span style="color: #FF0000;">'last'</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">            <span class="br0">&#125;</span></span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #339933;">$pages</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">/**</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Compute the limit clause for a SQL statement</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * Careful: Zero based database records number</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    *</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    * @return array [0 =&gt; offset, 1 =&gt; length]</span></span>
<span style="color: black;"><span style="color: #808080;">&nbsp;    */</span></span>
<span style="color: black;">    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> limitClauseData<span class="br0">&#40;</span><span class="br0">&#41;</span>: <span style="color: #0000ff;">array</span></span>
<span style="color: black;">    <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$nb_pages</span> = <span style="color: #339933;">$this</span>-&gt;nbPages<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #808080;">// if $nb_pages &lt;= 0 -&gt; we lock the clause LIMIT -&gt; offset 0, length 0</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$nb_pages</span> &lt;= <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #0000ff;">return</span> <span class="br0">&#91;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;asked_page &gt;= <span style="color: #339933;">$nb_pages</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$this</span>-&gt;asked_page = <span style="color: #339933;">$nb_pages</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">        <span style="color: #339933;">$offset</span> = max<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, <span class="br0">&#40;</span><span style="color: #339933;">$this</span>-&gt;asked_page - <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> * <span style="color: #339933;">$this</span>-&gt;nb_rows_per_page<span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span class="br0">&#91;</span><span style="color: #339933;">$offset</span>, <span style="color: #339933;">$this</span>-&gt;nb_rows_per_page<span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span></pre></td></tr></table></pre>
</div><b><u>Comment l'utiliser ?</u></b><br />
<br />
On va prendre un cas concret : <div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				une requête filtrée renvoie 1436 enregistrements que vous devez paginer en affichant les boutons Premier, Précédent, Suivant, Dernier (si nécessaire), la page demandée est la 43<sup>ème</sup>, vous affichez 20 enregistrements par page et la pagination devra offrir l'accès à 15 pages de rang.
			
		</div>
	</div>
</div>Cela se codera ainsi : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$paginator</span> = <span style="color: #0000ff;">new</span> Paginator<span class="br0">&#40;</span><span class="br0">&#91;</span>
    <span style="color: #FF0000;">'show_first_prev'</span>  =&gt; <span style="color: #0080ff;">true</span>,
    <span style="color: #FF0000;">'show_next_last'</span>   =&gt; <span style="color: #0080ff;">true</span>,
    <span style="color: #FF0000;">'asked_page'</span>       =&gt; <span style="color: #cc66cc;">43</span>,
    <span style="color: #FF0000;">'nb_rows_per_page'</span> =&gt; <span style="color: #cc66cc;">20</span>,
    <span style="color: #FF0000;">'nb_records'</span>       =&gt; <span style="color: #cc66cc;">1436</span>,
    <span style="color: #FF0000;">'pages_range'</span>      =&gt; <span style="color: #cc66cc;">15</span>
<span class="br0">&#93;</span><span class="br0">&#41;</span>;
&nbsp;
<span style="color: #808080;">// pour n'extraire que les donn&eacute;es correspondant &agrave; la page demand&eacute;e 43&egrave;me, il faudra refaire une requ&ecirc;te SQL avec une clause LIMIT : </span>
<span style="color: #339933;">$limit</span> = <span style="color: #339933;">$paginator</span>-&gt;limitClauseData<span class="br0">&#40;</span><span class="br0">&#41;</span>;  <span style="color: #808080;">// return [840, 20]   ==&gt; en sql : LIMIT 840, 20</span>
<span style="color: #339933;">$pages</span> = <span style="color: #339933;">$paginator</span>-&gt;pageList<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// [first, prev, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, Next, Last]</span></pre></td></tr></table></pre>
</div><br />
Maintenant on va changer quelques données : <br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				une requête filtrée renvoie 100 enregistrements que vous devez paginer en affichant les boutons Premier, Précédent, Suivant, Dernier (<b>si nécessaire</b>), la page demandée est la 1<sup>ère</sup>, vous affichez 20 enregistrements par page et la pagination devra offrir l'accès à 15 pages de rang.
			
		</div>
	</div>
</div>Cela se codera ainsi : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$paginator</span> = <span style="color: #0000ff;">new</span> Paginator<span class="br0">&#40;</span><span class="br0">&#91;</span>
    <span style="color: #FF0000;">'show_first_prev'</span>  =&gt; <span style="color: #0080ff;">true</span>,
    <span style="color: #FF0000;">'show_next_last'</span>   =&gt; <span style="color: #0080ff;">true</span>,
    <span style="color: #FF0000;">'asked_page'</span>       =&gt; <span style="color: #cc66cc;">1</span>,
    <span style="color: #FF0000;">'nb_rows_per_page'</span> =&gt; <span style="color: #cc66cc;">20</span>,
    <span style="color: #FF0000;">'nb_records'</span>       =&gt; <span style="color: #cc66cc;">100</span>,
    <span style="color: #FF0000;">'pages_range'</span>      =&gt; <span style="color: #cc66cc;">15</span>
<span class="br0">&#93;</span><span class="br0">&#41;</span>;
&nbsp;
<span style="color: #808080;">// pour n'extraire que les donn&eacute;es correspondant &agrave; la page demand&eacute;e 1&egrave;re, il faudra refaire une requ&ecirc;te SQL avec une clause LIMIT : </span>
<span style="color: #339933;">$limit</span> = <span style="color: #339933;">$paginator</span>-&gt;limitClauseData<span class="br0">&#40;</span><span class="br0">&#41;</span>;  <span style="color: #808080;">// return [0, 20]   ==&gt; en sql : LIMIT 0, 20</span>
<span style="color: #339933;">$pages</span> = <span style="color: #339933;">$paginator</span>-&gt;pageList<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// [1, 2, 3, 4, 5]</span></pre></td></tr></table></pre>
</div>Remarquez que dans ce deuxième exemple, les boutons inutiles ne sont pas affichés.<br />
<br />
Enfin, veuillez noter que la page demandée est toujours centrée (dans la mesure du possible) entre les limites du nombre de pages à afficher dans la pagination (regardez la position de la page 43 du premier exemple dans l'index des pages).<br />
<br />
En espérant que cela vous sera utile et comme d'hab, n'hésitez pas à me poser des questions ou faire un retour sur cet outil qui pose une chouette base de travail :ccool: <br />
<br />
Bon codage :D</blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b7678/pagination/</guid>
		</item>
		<item>
			<title>Autoloader</title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b5109/autoloader/</link>
			<pubDate>Mon, 09 Apr 2018 20:11:52 GMT</pubDate>
			<description>Quand vous codez en POO...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Quand vous codez en POO (programmation orientée objet), le moteur PHP peut s'occuper à votre place de gérer les inclusions de fichiers contenant l'implémentation des classes moyennant la mise en place d'un découpage logique de votre application et l'utilisation des espaces de nom.<br />
<br />
Les espaces de nom <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">namespace</span></span> permettent de ranger logiquement le code source et éviter ainsi un véritable bordel quand la quantité de scripts augmente ainsi que les fonctionnalités d'un site web. Le découpage que cela induit offre une propriété intéressante qui permet également dans les cas courants de trouver physiquement l'emplacement d'un fichier.<br />
<br />
Concrètement le fichier définissant une classe <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Feuille</span> et définie sur l'espace de nom <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">namespace</span> Meuble\Tiroir\Classeur;</span> devra se trouver <b>physiquement</b> à cet emplacement <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Racine_du_site/Meuble/Tiroir/Classeur/Feuille.php</span>. Ainsi il sera possible de transformer facilement le nom de la classe pleinement qualifié <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Meuble\Tiroir\Classeur\Feuille</span> en chemin de fichier afin de s'assurer de son existence et dans l'affirmative, demander au moteur PHP de l'inclure automatiquement via le mécanisme d'autoloading.<br />
De cette manière vous n'aurez plus jamais à faire des <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">include</span></span> ou autre <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">require</span></span>.<br />
<br />
Le code ci-dessous s'occupe de cette transformation.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;">define<span class="br0">&#40;</span><span style="color: #FF0000;">'DIR_ROOT'</span>, <span style="color: #339933;">__DIR__</span>.DIRECTORY_SEPARATOR<span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #339933;">$autoloader</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$full_class_name</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #808080;">// on pr&eacute;pare le terrain : on remplace le s&eacute;parteur d'espace de nom par le s&eacute;parateur de r&eacute;pertoires du syst&egrave;me</span></span>
<span style="color: black;">    <span style="color: #339933;">$name</span> = str_replace<span class="br0">&#40;</span><span style="color: #FF0000;">'<span style="color: #800000;">\\</span>'</span>, DIRECTORY_SEPARATOR, <span style="color: #339933;">$full_class_name</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span style="color: #808080;">// on construit le chemin complet du fichier &agrave; inclure :a</span></span>
<span style="color: black;">    <span style="color: #808080;">// il faut que l'autoloader soit toujours &agrave; la racine du site</span></span>
<span style="color: black;">    <span style="color: #339933;">$path</span> = DIR_ROOT.<span style="color: #339933;">$name</span>.<span style="color: #FF0000;">'.php'</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #808080;">// on v&eacute;rfie que le fichier existe et on l'inclut</span></span>
<span style="color: black;">    <span style="color: #808080;">// sinon on passe la main &agrave; une autre autoloader (return false)</span></span>
<span style="color: black;">    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>is_file<span class="br0">&#40;</span><span style="color: #339933;">$path</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">include</span> <span style="color: #339933;">$path</span>;</span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">true</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">false</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span>;</span>
&nbsp;
<span style="color: black;">spl_autoload_register<span class="br0">&#40;</span><span style="color: #339933;">$autoloader</span><span class="br0">&#41;</span>;</span></pre></td></tr></table></pre>
</div>Une fois mis en place et déclaré, l'autoloader devrait vous faciliter grandement l'existence.<br />
<br />
Au lieu de faire <div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">include_once</span> ../../../Feuille.php;
&nbsp;
<span style="color: #339933;">$cls</span> = <span style="color: #0000ff;">new</span> Feuille<span class="br0">&#40;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div> il faudra dorénavant faire<b> où que vous soyez dans votre code</b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">use</span> Meuble\Tiroir\Classeur\Feuille;
&nbsp;
<span style="color: #339933;">$cls</span> = <span style="color: #0000ff;">new</span> Feuille<span class="br0">&#40;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>et dans le code source de la classe Feuille : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">namespace</span> Meuble\Tiroir\Classeur;
&nbsp;
<span style="color: #0000ff;">class</span> Feuille
<span class="br0">&#123;</span>
&nbsp;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>N'oubliez pas de l'enregistrer dans l'arborescence des répertoires adéquate : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Racine_du_site/Meuble/Tiroir/Classeur/Feuille.php</span>.<br />
<br />
Si vous observez bien, c'est la raison pour laquelle il est expressément exigé de n'avoir qu'une classe par fichier.</blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b5109/autoloader/</guid>
		</item>
		<item>
			<title>Manipulation de dates avec ICU</title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b4696/manipulation-dates-icu/</link>
			<pubDate>Tue, 13 Feb 2018 20:36:28 GMT</pubDate>
			<description>Pour ce qui est de...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Pour ce qui est de l'internationalisation, il est préférable (et de loin) de faire appel à la bibliothèque ICU fournie en standard par PHP.<br />
Pour formater une date localement, rien de bien compliqué : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$date</span> = <span style="color: #FF0000;">&quot;2018-02-13&quot;</span>;
<span style="color: #339933;">$fmt</span> = <span style="color: #0000ff;">new</span> IntlDateFormatter<span class="br0">&#40;</span><span style="color: #FF0000;">'fr_FR'</span>, IntlDateFormatter::NONE, IntlDateFormatter::NONE<span class="br0">&#41;</span>;
<span style="color: #339933;">$fmt</span>-&gt;setPattern<span class="br0">&#40;</span><span style="color: #FF0000;">'EEEE dd MMMM YYYY'</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">echo</span> <span style="color: #339933;">$fmt</span>-&gt;format<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> DateTime<span class="br0">&#40;</span><span style="color: #339933;">$date</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>Pour les formatages possibles, c'est par <a href="http://userguide.icu-project.org/formatparse/datetime" target="_blank">ici</a> que ça se passe.<br />
<br />
Pour afficher les mois de l'année : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$fmt</span> = <span style="color: #0000ff;">new</span> IntlDateFormatter<span class="br0">&#40;</span><span style="color: #FF0000;">'fr_FR'</span>, IntlDateFormatter::NONE, IntlDateFormatter::NONE<span class="br0">&#41;</span>;
<span style="color: #339933;">$fmt</span>-&gt;setPattern<span class="br0">&#40;</span><span style="color: #FF0000;">'MMMM'</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$dt</span>  = <span style="color: #0000ff;">new</span> DateTime<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span>range<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">12</span><span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$m</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">echo</span> <span style="color: #339933;">$fmt</span>-&gt;format<span class="br0">&#40;</span><span style="color: #339933;">$dt</span>-&gt;setDate<span class="br0">&#40;</span><span style="color: #cc66cc;">2018</span>, <span style="color: #339933;">$m</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">'&lt;br&gt;'</span>;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>ou encore une version équivalente : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">$fmt</span> = <span style="color: #0000ff;">new</span> IntlDateFormatter<span class="br0">&#40;</span><span style="color: #FF0000;">'fr_FR'</span>, IntlDateFormatter::NONE, IntlDateFormatter::NONE<span class="br0">&#41;</span>;
<span style="color: #339933;">$fmt</span>-&gt;setPattern<span class="br0">&#40;</span><span style="color: #FF0000;">'MMMM'</span><span class="br0">&#41;</span>;
<span style="color: #339933;">$dt</span>  = <span style="color: #0000ff;">new</span> DateTime<span class="br0">&#40;</span><span style="color: #FF0000;">'first day of december last year'</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span>range<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">12</span><span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$m</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">echo</span> <span style="color: #339933;">$fmt</span>-&gt;format<span class="br0">&#40;</span><span style="color: #339933;">$dt</span>-&gt;modify<span class="br0">&#40;</span><span style="color: #FF0000;">'next month'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">'&lt;br&gt;'</span>;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Ce qui produira : <br />
<div style="margin: 20px; margin-top: 5px"><pre class="alt2" style="border: 1px inset; padding: 5px">janvier
février
mars
avril
mai
juin
juillet
août
septembre
octobre
novembre
décembre</pre></div></blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b4696/manipulation-dates-icu/</guid>
		</item>
		<item>
			<title>Fonction de génération de grilles de loto</title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b4433/fonction-generation-grilles-loto/</link>
			<pubDate>Tue, 19 Dec 2017 21:19:23 GMT</pubDate>
			<description>Contraintes :  
 
* numéros...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Contraintes : <br />
<ul><li style="">numéros de 1 à 90</li><li style="">la grille mesure 9 x 3 (9 de long sur 3 de haut)</li><li style="">une ligne ne peut contenir au maximum que 5 numéros</li><li style="">une colonne ne peut contenir au maximum que 2 numéros</li></ul><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: black;"><span style="color: #0080ff;">&lt;?php</span></span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// sac de num&eacute;ros &agrave; tirer</span></span>
<span style="color: black;"><span style="color: #339933;">$bag</span> = array_fill_keys<span class="br0">&#40;</span>range<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">90</span><span class="br0">&#41;</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #808080;">// grille r&eacute;sultat</span></span>
<span style="color: black;"><span style="color: #339933;">$grid</span> = <span class="br0">&#91;</span></span>
<span style="color: black;">    <span style="color: #cc66cc;">1</span> =&gt; <span class="br0">&#91;</span><span class="br0">&#93;</span>,</span>
<span style="color: black;">    <span style="color: #cc66cc;">2</span> =&gt; <span class="br0">&#91;</span><span class="br0">&#93;</span>,</span>
<span style="color: black;">    <span style="color: #cc66cc;">3</span> =&gt; <span class="br0">&#91;</span><span class="br0">&#93;</span></span>
<span style="color: black;"><span class="br0">&#93;</span>;</span>
<span style="color: black;"><span style="color: #808080;">// lignes compl&egrave;tes : 5 num&eacute;ros</span></span>
<span style="color: black;"><span style="color: #339933;">$full_rows</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
<span style="color: black;"><span style="color: #808080;">// colonnes pleines : 2 num&eacute;ros</span></span>
<span style="color: black;"><span style="color: #339933;">$full_cols</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #339933;">$placed</span> = <span style="color: #cc66cc;">0</span>;</span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">while</span> <span class="br0">&#40;</span><span style="color: #339933;">$placed</span> &lt; <span style="color: #cc66cc;">15</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">     <span style="color: #808080;">// on tire un num&eacute;ro et on le retire du sac</span></span>
<span style="color: black;">    <span style="color: #339933;">$num</span> = array_rand<span class="br0">&#40;</span><span style="color: #339933;">$bag</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span style="color: #0000ff;">unset</span><span class="br0">&#40;</span><span style="color: #339933;">$bag</span><span class="br0">&#91;</span><span style="color: #339933;">$num</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$num</span> &lt; <span style="color: #cc66cc;">10</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$col</span> = <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span> <span style="color: #0000ff;">elseif</span> <span class="br0">&#40;</span><span style="color: #339933;">$num</span> &lt; <span style="color: #cc66cc;">90</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$col</span> = substr<span class="br0">&#40;</span><span style="color: #339933;">$num</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> + <span style="color: #cc66cc;">1</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$col</span> = <span style="color: #cc66cc;">9</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>in_array<span class="br0">&#40;</span><span style="color: #339933;">$col</span>, <span style="color: #339933;">$full_cols</span>, <span style="color: #0080ff;">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">continue</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #339933;">$rows</span> = <span style="color: #0000ff;">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span style="color: #0000ff;">foreach</span><span class="br0">&#40;</span>array_diff<span class="br0">&#40;</span><span style="color: #0000ff;">array</span><span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">3</span><span class="br0">&#41;</span>, <span style="color: #339933;">$full_rows</span><span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$v</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$grid</span><span class="br0">&#91;</span><span style="color: #339933;">$v</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #339933;">$col</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">            <span style="color: #339933;">$rows</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$v</span>;</span>
<span style="color: black;">        <span class="br0">&#125;</span></span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$rows</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">continue</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #339933;">$row</span>              = <span style="color: #339933;">$rows</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>;</span>
<span style="color: black;">    <span style="color: #339933;">$grid</span><span class="br0">&#91;</span><span style="color: #339933;">$row</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #339933;">$col</span><span class="br0">&#93;</span> = <span style="color: #339933;">$num</span>;</span>
<span style="color: black;">    ++<span style="color: #339933;">$placed</span>;</span>
&nbsp;
<span style="color: black;">    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>count<span class="br0">&#40;</span><span style="color: #339933;">$grid</span><span class="br0">&#91;</span><span style="color: #339933;">$row</span><span class="br0">&#93;</span><span class="br0">&#41;</span> === <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$full_rows</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$row</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;">    <span style="color: #339933;">$nb</span> = <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$grid</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #339933;">$col</span><span class="br0">&#93;</span><span class="br0">&#41;</span> + <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$grid</span><span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #339933;">$col</span><span class="br0">&#93;</span><span class="br0">&#41;</span> + <span class="br0">&#40;</span><span style="color: #0080ff;">int</span><span class="br0">&#41;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$grid</span><span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #339933;">$col</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</span>
<span style="color: black;">    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #339933;">$nb</span> === <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #339933;">$full_cols</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$col</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;"><span class="br0">&#125;</span></span>
&nbsp;
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #FF0000;">'&lt;table border=&quot;1&quot;&gt;'</span>;</span>
<span style="color: black;"><span style="color: #0000ff;">foreach</span><span class="br0">&#40;</span><span style="color: #339933;">$grid</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$row</span> =&gt; <span style="color: #339933;">$nums</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">echo</span> <span style="color: #FF0000;">'&lt;tr&gt;'</span>;</span>
<span style="color: black;">    <span style="color: #0000ff;">for</span><span class="br0">&#40;</span><span style="color: #339933;">$i</span> = <span style="color: #cc66cc;">1</span>; <span style="color: #339933;">$i</span> &lt;= <span style="color: #cc66cc;">9</span>; ++<span style="color: #339933;">$i</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span>
<span style="color: black;">        <span style="color: #0000ff;">echo</span> <span style="color: #FF0000;">'&lt;td width=&quot;20&quot; align=&quot;center&quot;&gt;'</span>, <span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0000ff;">isset</span><span class="br0">&#40;</span><span style="color: #339933;">$nums</span><span class="br0">&#91;</span><span style="color: #339933;">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ? <span style="color: #339933;">$nums</span><span class="br0">&#91;</span><span style="color: #339933;">$i</span><span class="br0">&#93;</span> : <span style="color: #FF0000;">'&amp;nbsp;'</span><span class="br0">&#41;</span> , <span style="color: #FF0000;">'&lt;/td&gt;'</span>;</span>
<span style="color: black;">    <span class="br0">&#125;</span></span>
<span style="color: black;">    <span style="color: #0000ff;">echo</span> <span style="color: #FF0000;">'&lt;/tr&gt;'</span>;</span>
<span style="color: black;"><span class="br0">&#125;</span></span>
<span style="color: black;"><span style="color: #0000ff;">echo</span> <span style="color: #FF0000;">'&lt;/table&gt;'</span>;</span></pre></td></tr></table></pre>
</div>Résultat d'exemple : <br />
<div class="cms_table"><table width="250" class="cms_table_grid" align="left"><tr valign="top" class="cms_table_grid_tr"><td class="cms_table_grid_td"></td>
<td class="cms_table_grid_td">15</td>
<td class="cms_table_grid_td">20</td>
<td class="cms_table_grid_td"></td>
<td class="cms_table_grid_td">49</td>
<td class="cms_table_grid_td">52</td>
<td class="cms_table_grid_td"></td>
<td class="cms_table_grid_td">74</td>
<td class="cms_table_grid_td"></td>
</tr>
<tr valign="top" class="cms_table_grid_tr"><td class="cms_table_grid_td">8</td>
<td class="cms_table_grid_td">12</td>
<td class="cms_table_grid_td"></td>
<td class="cms_table_grid_td"></td>
<td class="cms_table_grid_td">48</td>
<td class="cms_table_grid_td"></td>
<td class="cms_table_grid_td">60</td>
<td class="cms_table_grid_td">75</td>
<td class="cms_table_grid_td"></td>
</tr>
<tr valign="top" class="cms_table_grid_tr"><td class="cms_table_grid_td">9</td>
<td class="cms_table_grid_td"></td>
<td class="cms_table_grid_td">23</td>
<td class="cms_table_grid_td">39</td>
<td class="cms_table_grid_td"></td>
<td class="cms_table_grid_td"></td>
<td class="cms_table_grid_td">65</td>
<td class="cms_table_grid_td"></td>
<td class="cms_table_grid_td">86</td>
</tr>
</table></div>
</blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b4433/fonction-generation-grilles-loto/</guid>
		</item>
		<item>
			<title><![CDATA[Fonction de conversion d'un nombre de secondes en heures, minutes et secondes]]></title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b4430/fonction-conversion-d-nombre-secondes-heures-minutes-secondes/</link>
			<pubDate>Tue, 19 Dec 2017 21:03:20 GMT</pubDate>
			<description>function...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">function</span> secondsToHoursMinutesSeconds<span class="br0">&#40;</span><span style="color: #0080ff;">int</span> <span style="color: #339933;">$seconds</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span>
<span class="br0">&#123;</span>
    <span style="color: #339933;">$base_60</span> = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #339933;">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span><span style="color: #339933;">$p</span> &gt;= <span style="color: #cc66cc;">60</span><span class="br0">&#41;</span> ? <span class="br0">&#91;</span><span style="color: #339933;">$p</span> % <span style="color: #cc66cc;">60</span>, floor<span class="br0">&#40;</span><span style="color: #339933;">$p</span> / <span style="color: #cc66cc;">60</span><span class="br0">&#41;</span><span class="br0">&#93;</span> : <span class="br0">&#91;</span><span style="color: #339933;">$p</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>; <span class="br0">&#125;</span>;
    <span style="color: #808080;">// $base_60 = function($p) { return ($p &gt;= 60) ? [$p % 60, intdiv($p, 60)] : [$p, 0]; };   // PHP 7+</span>
    <span style="color: #339933;">$sec</span>     = <span style="color: #339933;">$base_60</span><span class="br0">&#40;</span><span style="color: #339933;">$seconds</span><span class="br0">&#41;</span>;
    <span style="color: #339933;">$min</span>     = <span style="color: #339933;">$base_60</span><span class="br0">&#40;</span><span style="color: #339933;">$sec</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
    <span style="color: #339933;">$hours</span>   = <span style="color: #339933;">$min</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>;
&nbsp;
    <span style="color: #0000ff;">return</span> sprintf<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;%02d:%02d:%02d&quot;</span>, <span style="color: #339933;">$hours</span>, <span style="color: #339933;">$min</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, <span style="color: #339933;">$sec</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Exemple : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">echo secondsToHoursMinutesSeconds(9999); // affiche : 02:46:39</pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b4430/fonction-conversion-d-nombre-secondes-heures-minutes-secondes/</guid>
		</item>
		<item>
			<title>Fonction de calcul du nombre de jours travaillés en France pour un mois et une année spécifiés</title>
			<link>https://www.developpez.net/forums/blogs/32058-rawsrc/b4425/fonction-calcul-nombre-jours-travailles-france-mois-annee-specifies/</link>
			<pubDate>Tue, 19 Dec 2017 20:39:16 GMT</pubDate>
			<description>Il est même possible de tenir...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Il est même possible de tenir compte des autres jours non fériés non travaillés comme les samedis et dimanches, il suffit pour cela d'indiquer les numéros des jours concernés avec pour règle Lundi = 1 et Dimanche = 7.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code php :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">function</span> countFrenchBusinessDays<span class="br0">&#40;</span><span style="color: #0080ff;">int</span> <span style="color: #339933;">$year</span>, <span style="color: #0080ff;">int</span> <span style="color: #339933;">$month</span>, <span style="color: #0000ff;">array</span> <span style="color: #339933;">$weekdays_off</span> = <span class="br0">&#91;</span><span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">7</span><span class="br0">&#93;</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">int</span>
<span class="br0">&#123;</span>
    <span style="color: #339933;">$holidays</span> = <span class="br0">&#91;</span>
        <span style="color: #cc66cc;">1</span>  =&gt; <span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>,       <span style="color: #808080;">// jour de l'an</span>
        <span style="color: #cc66cc;">5</span>  =&gt; <span class="br0">&#91;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">8</span><span class="br0">&#93;</span>,    <span style="color: #808080;">// f&ecirc;te du travail et armistice 39-45</span>
        <span style="color: #cc66cc;">7</span>  =&gt; <span class="br0">&#91;</span><span style="color: #cc66cc;">14</span><span class="br0">&#93;</span>,      <span style="color: #808080;">// f&ecirc;te nationale</span>
        <span style="color: #cc66cc;">8</span>  =&gt; <span class="br0">&#91;</span><span style="color: #cc66cc;">15</span><span class="br0">&#93;</span>,      <span style="color: #808080;">// Assomption</span>
        <span style="color: #cc66cc;">11</span> =&gt; <span class="br0">&#91;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">11</span><span class="br0">&#93;</span>,   <span style="color: #808080;">// Toussaint et armistice 14-18</span>
        <span style="color: #cc66cc;">12</span> =&gt; <span class="br0">&#91;</span><span style="color: #cc66cc;">25</span><span class="br0">&#93;</span>       <span style="color: #808080;">// no&euml;l</span>
    <span class="br0">&#93;</span>;
&nbsp;
    <span style="color: #339933;">$easter_day</span>                = <span class="br0">&#40;</span><span style="color: #0000ff;">new</span> DateTime<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #800000;">{$year}</span>-03-21&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>-&gt;modify<span class="br0">&#40;</span><span style="color: #FF0000;">'+'</span>.easter_days<span class="br0">&#40;</span><span style="color: #339933;">$year</span>, CAL_GREGORIAN<span class="br0">&#41;</span>.<span style="color: #FF0000;">' days'</span><span class="br0">&#41;</span>;
    <span style="color: #339933;">$easter_month</span>              = <span style="color: #339933;">$easter_day</span>-&gt;format<span class="br0">&#40;</span><span style="color: #FF0000;">'n'</span><span class="br0">&#41;</span>;
    <span style="color: #339933;">$holidays</span><span class="br0">&#91;</span><span style="color: #339933;">$easter_month</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$easter_day</span>-&gt;format<span class="br0">&#40;</span><span style="color: #FF0000;">'j'</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// no business days</span>
    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> ! <span style="color: #0000ff;">empty</span><span class="br0">&#40;</span><span style="color: #339933;">$weekdays_off</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span style="color: #339933;">$start</span> = <span style="color: #0000ff;">new</span> DateTimeImmutable<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #800000;">{$year}</span>-<span style="color: #800000;">{$month}</span>-01&quot;</span><span class="br0">&#41;</span>;
        <span style="color: #339933;">$end</span>   = <span style="color: #339933;">$start</span>-&gt;modify<span class="br0">&#40;</span><span style="color: #FF0000;">'first day of next month'</span><span class="br0">&#41;</span>;
        <span style="color: #339933;">$days</span>  = <span style="color: #0000ff;">new</span> DatePeriod<span class="br0">&#40;</span><span style="color: #339933;">$start</span>, <span style="color: #0000ff;">new</span> DateInterval<span class="br0">&#40;</span><span style="color: #FF0000;">'P1D'</span><span class="br0">&#41;</span>, <span style="color: #339933;">$end</span><span class="br0">&#41;</span>;
&nbsp;
        <span style="color: #0000ff;">foreach</span> <span class="br0">&#40;</span><span style="color: #339933;">$days</span> <span style="color: #0000ff;">as</span> <span style="color: #339933;">$dt</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>in_array<span class="br0">&#40;</span><span style="color: #339933;">$dt</span>-&gt;format<span class="br0">&#40;</span><span style="color: #FF0000;">'N'</span><span class="br0">&#41;</span>, <span style="color: #339933;">$weekdays_off</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span style="color: #339933;">$holidays</span><span class="br0">&#91;</span><span style="color: #339933;">$month</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span style="color: #339933;">$dt</span>-&gt;format<span class="br0">&#40;</span><span style="color: #FF0000;">'j'</span><span class="br0">&#41;</span>;
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #339933;">$start</span>-&gt;format<span class="br0">&#40;</span><span style="color: #FF0000;">'t'</span><span class="br0">&#41;</span> - count<span class="br0">&#40;</span>array_unique<span class="br0">&#40;</span><span style="color: #339933;">$holidays</span><span class="br0">&#91;</span><span style="color: #339933;">$month</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>rawsrc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/32058-rawsrc/b4425/fonction-calcul-nombre-jours-travailles-france-mois-annee-specifies/</guid>
		</item>
	</channel>
</rss>
