73d92d164e91096949640a3afa24624b7611b996
[hacks/simpleWebSlides.git] / unix_prog_web / unix_prog_web_07.xhtml
1 <?xml version="1.0" encoding="utf-8" ?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
4           >
5 <html xmlns="http://www.w3.org/1999/xhtml" >
6   <head>
7     <title>PHP : Fonctions</title>
8
9     <meta http-equiv="Content-Type"
10           content="text/html; charset=utf-8" />
11     <meta name="copyright"
12           content="Copyright &#169; 2013 Kim Nguyễn" />
13
14     <!-- Load jQuery -->
15     <script src="../jquery-2.0.3.min.js" type="text/javascript" ></script>
16     <script src="../libs/raphael-min.js" type="text/javascript" ></script>
17     <!-- Load the library -->
18     <script src="../simpleWebSlides.js" type="text/javascript" ></script>
19
20     <link rel="stylesheet" href="../simpleWebSlides.css" type="text/css"  media="all" />
21     <!-- Load a custom Theme, the class-element marks this style-sheet
22          a "theme" that can be swtiched dynamicaly -->
23     <link class="sws-theme" rel="stylesheet"  title="U-Psud style"  href="../themes/uPsud.css" type="text/css" />
24
25     <!-- Customize some templates and initialize -->
26
27     <script type="text/javascript">
28       SWS.Config['sws-slide-change'] = SWS.Effects.slideChangeFadeOutIn;
29       SWS.Config['sws-object-deactivate'] =  SWS.Effects.objectDeactivateFadeOut;
30       SWS.Config['sws-object-activate'] = SWS.Effects.objectActivateFadeIn;
31
32       //Ensures that we load SWS at the very end, after MathJax has
33       //been initialized
34
35       $(window).load(SWS.Presentation.init);
36     </script>
37   </head>
38   <body>
39     <a href="prog_internet_06.xhtml" class="sws-previous"/>
40     <div class="sws-slide sws-cover sws-option-nofooter">
41       <h1>Programmation Internet</h1>
42       <h1>Cours 7</h1>
43       <a href="mailto:kn@lri.fr">kn@lri.fr</a><br/>
44       <a href="http://www.lri.fr/~kn/">http://www.lri.fr/~kn</a>
45     </div>
46
47     <h1>Définitions de fonctions</h1>
48
49     <div class="sws-slide">
50       <h1>Fonctions</h1>
51       <p>Les fonctions sont déclarées à l'aide du
52       mot-clé <tt><em>function</em></tt>. On renvoie des résultats à
53       l'aide du mot-clé  <tt><em>return</em></tt>.</p>
54         <code><![CDATA[
55    <?php
56     ]]><em>function</em> double ($x)
57       <em>{</em>
58          <em>return</em> $x + $x;
59       <em>}</em>
60
61       echo double(10);
62   <![CDATA[?>]]>
63         </code>
64     </div>
65
66
67     <div class="sws-slide">
68       <h1>Portée des variables locales et globales
69         <b style="color:red">&#9888;</b>
70       </h1>
71       <div id="cont2" style="width:100%;position:relative;"
72            onresize="draw_arrows();" >
73         <div id="left2" style="display:inline-block;width:50%; position:relative;
74                                box-sizing:border-box;
75                                padding: 0 1em 0 2em;
76                                border-style:dashed;
77                                border-width: 0 1pt 0 0;
78                                border-color:gray; float:left;">
79 <code>  &lt;?php
80   <em style="color:red">$a</em> = 42;
81   function add_a($x)
82   {
83         <span id="leftend" />
84     return $x + <em style="color:red">$a</em>;<span id="leftstart" />
85   }
86   echo add_a(10);
87   ?&gt;
88 </code>
89         </div>
90         <div id="right2" style="display:inline-block;
91                                 width:50%; position:relative;
92                                 box-sizing:border-box;
93                                 padding: 0 2em 0 1em;
94                                 vertical-align:text-top;
95                                 ">
96 <code >  &lt;?php
97   <em>$a</em> = 42;<span id="rightend"/>
98   function add_a($x)
99   {
100     <em>global $a</em>;<span id="rightmid"/>
101     return $x + <em>$a</em>;<span id="rightstart"/>
102   }
103   echo add_a(10);
104   ?&gt;
105 </code>
106         </div>
107       </div>
108
109       <script type="text/javascript">
110
111         function overlay(id) {
112         var w = $("#" + id)[0].offsetWidth;
113         var h = $("#" + id)[0].offsetHeight;
114         $("#svg_"+id).remove();
115         var paper = Raphael(id, w, h);
116         paper.canvas.id = "svg_" + id;
117         return paper;
118         };
119
120         function curve_to(paper, start, end, style) {
121         var x1 = $(start)[0].offsetLeft;
122         var y1 = $(start)[0].offsetTop;
123         var x2 = $(end)[0].offsetLeft;
124         var y2 = $(end)[0].offsetTop;
125
126         var path_cmd =
127         "M" + x1 + " " + y1 + " S" + x1 + " " + y2 + " " + x2 + " " +   y2;
128         var p1 = paper.path(path_cmd);
129         p1.attr(style);
130
131         };
132
133         function draw_arrows(x) {
134
135         var paper = overlay("left2");
136         $("#svg_left2").css ( { 'z-index': '2', 'top':'0', 'left':'0', 'position':'absolute' } );
137
138         curve_to (paper, "#leftstart", "#leftend", { 'stroke': "red",
139         'stroke-dasharray' : "-",
140         'stroke-width': 2,
141         'arrow-end' : "block-wide-long" });
142
143         var paper = overlay("right2");
144         $("#svg_right2").css({ 'z-index': '2', 'top':'0', 'right':'0', 'position':'absolute' });
145
146         curve_to (paper, "#rightstart", "#rightmid", { 'stroke': "green",
147         'stroke-width': 2,
148         'arrow-end' : "block-wide-long" });
149         curve_to (paper, "#rightmid", "#rightend", { 'stroke': "green",
150         'stroke-width': 2,
151         'arrow-end' : "block-wide-long" });
152         };
153         SWS.Presentation.registerCallback(0, draw_arrows);
154       </script>
155       <p>Le code de gauche <em style="color:red">affiche 10</em> !
156       Les variables ont une portée <em style="color:red">locale</em>
157       par défaut. Si <tt>$a</tt> n'est pas définie dans le corps de la
158       fonction, sa valeur est <tt style="color:red">NULL</tt>
159       (variable non définie). <span >Pour référencer
160       des variables globales, on utilise le mot clé <tt><em>global</em></tt>.</span>
161       </p>
162     </div>
163     <div class="sws-slide">
164       <h1>Fonction : définition <b style="color:red">&#9888;</b></h1>
165       <p>On peut utiliser une fonction <s>« avant »</s> de la définir :</p>
166       <code>   &lt;?php
167         echo next(10);
168         echo &lt;br/&gt;;
169
170         function next($x)
171         {
172           return $x + 1;
173         }
174    ?&gt;</code>
175       <p>On définira <em>toujours</em> des fonctions <em>avant</em> de
176       les utiliser. On ne peut pas définir deux fonctions avec le même
177       nom.
178       </p>
179     </div>
180     <div class="sws-slide">
181       <h1>Fonctions : passage par référence</h1>
182       <p>On utiliser le modificateur <tt><em>&amp;</em></tt> devant
183       un paramètre de fonction pour indiquer que ce dernier est passé
184       par référence.</p>
185       <div class="twocol">
186         <div>
187           <code>&lt;?php
188   function add_a($tab)
189   {
190     $tab["a"] = 42;
191   }
192
193   $mytab = array();
194   add_a($mytab);
195   echo $mytab["a"];
196   //<s>n'affiche rien (car NULL ⇝ "")</s>
197 ?&gt;</code>
198         </div>
199         <div>
200           <code>&lt;?php
201   function add_a(<em>&amp;</em>$tab)
202   {
203     $tab["a"] = 42;
204   }
205
206   $mytab = array();
207   add_a($mytab);
208   echo $mytab["a"];
209   //<em>affiche 42</em>
210 ?&gt;</code>
211         </div>
212
213       </div>
214       <p>Lorsque l'on veut <em>modifier</em> un argument de la
215       fonction (plutot que de renvoyer une version modifiée, par
216       ex. mise à jour d'un tableau, d'une chaîne, …), on doit le
217       passer  par référence.
218       </p>
219     </div>
220     <h1>Manipulation des chaînes et expressions régulières</h1>
221     <div class="sws-slide">
222       <h1>Quelques fonctions utilitaires sur les chaînes</h1>
223       <dl>
224         <dt><tt>explode($delim, $entree)</tt></dt>
225         <dd>Découpe la chaîne <tt>$entre
226 e</tt> suivant la
227         sous-chaîne <tt>$delim</tt> et renvoie les morceaux dans un
228         tableau.</dd>
229         <dt><tt>implode($delim, $tab)</tt></dt>
230         <dd>Réunit les chaînes se trouvant dans le
231         tableau <tt>$tab</tt> en les séparant par la
232         chaîne <tt>$delim</tt>.
233         </dd>
234         <dt><tt>ltrim($entree)</tt></dt>
235         <dd>Retire les caractères blancs en début de chaîne.</dd>
236         <dt><tt>rtrim($entree)</tt></dt>
237         <dd>Retire les caractères blancs en fin de chaîne.</dd>
238         <dt><tt>trim($entree)</tt></dt>
239         <dd>Retire les caractères blancs en début et en fin de
240         chaîne.</dd>
241         <dt><tt>htmlspecialchars($entree)</tt></dt>
242         <dd>converti les caractères <tt>&amp;</tt>, <tt>&quot;</tt>,
243           <tt>&apos;</tt>, <tt>&lt;</tt> et <tt>&gt;</tt> en
244           <tt>&amp;amp;</tt>, <tt>&amp;quot;</tt>,
245           <tt>&amp;apos;</tt>, <tt>&amp;lt;</tt> et <tt>&amp;gt;</tt>.
246         </dd>
247
248       </dl>
249     </div>
250     <div class="sws-slide">
251       <h1>Expressions régulières : syntaxe</h1>
252       <p>Les expressions régulières de PHP sont au format PCRE (Perl
253       Common Regular Expressions) <tt><em>'/r/'</em></tt>
254       où <tt>r</tt> est une expression de la forme:</p>
255 <code>      <table style="margin:0em 2em">
256     <tr>
257       <td>r ::=</td>    <td>    <it>a</it>    </td>         <td>    (un caractère)</td></tr>
258     <tr><td>    |</td>     <td>    <em>.</em></td>        <td>    (n'importe quel caractère)</td></tr>
259     <tr><td>    |</td><td>    r<sub>1</sub> <em>|</em> r<sub>2</sub></td> <td>    (r<sub>1</sub> ou r<sub>2</sub>)</td></tr>
260     <tr><td>    |</td><td>    r<em>?</em></td><td>    (r répétée au plus 1 fois)</td></tr>
261     <tr><td>    |</td><td>    r<em>*</em></td><td>    (r répétée 0 fois ou plus)</td></tr>
262     <tr><td>    |</td><td>    r<em>+</em></td><td>    (r répétée 1 fois ou plus)</td></tr>
263     <tr><td>    |</td><td>    <em>[</em>c<sub>1</sub> … c<sub>n</sub><em>]</em></td> <td>    (un caractère parmis c<sub>1</sub>, …, c<sub>n</sub>)</td></tr>
264     <tr><td>    |</td><td>    <em>[</em>c<sub>1</sub><em>-</em>c<sub>n</sub><em>]</em></td> <td>    (un caractère parmis c<sub>1</sub>, …, c<sub>n</sub>)</td></tr>
265     <tr><td>    |</td><td>    <em>[^</em>c<sub>1</sub> … c<sub>n</sub><em>]</em></td> <td>    (un caractère sauf c<sub>1</sub>, …, c<sub>n</sub>)</td></tr>
266     <tr><td>    |</td><td>    <em>[^</em>c<sub>1</sub><em>-</em>c<sub>n</sub><em>]</em></td> <td>    (un caractère sauf c<sub>1</sub>, …, c<sub>n</sub>)</td></tr>
267     <tr><td>    |</td>     <td>    <em>^</em></td>        <td>    (début de texte)</td></tr>
268     <tr><td>    |</td>     <td>    <em>$</em></td>        <td>    (fin de texte)</td></tr>
269     <tr><td>    |</td>     <td>    <em>(</em>r<em>)</em></td>        <td>    (r elle même)</td></tr>
270
271 <!--       |    <em>(</em>r<em>)</em>       (r elle même)
272 -->
273 </table>
274 </code>
275     </div>
276 <div class="sws-slide">
277   <h1>Expressions régulières : recherche</h1>
278   <code style="text-align:center"> <em>preg_match</em>($regexp, $chaine)</code>
279   <p>renvoie <em>1</em> si une sous-chaine de <tt>$chaine</tt>
280   correspond à <tt>$regexp</tt>, <em>0</em> si aucune sous-chaine ne correspond
281   et <s><tt>FALSE</tt></s> en cas de problème (attention,
282   utiliser <tt>===</tt> pour tester le résultat).
283 </p>
284 <code style="margin: 0em 2em">&lt;?php
285     $chaine = "ABCDEFABCDEF";
286     echo preg_match(<em>'/ABC/'</em>, $chaine);       // affiche 1
287     echo preg_match(<em>'/DEF/'</em>, $chaine);       // affiche 1
288     echo preg_match(<em>'/^ABC/'</em>, $chaine);      // affiche 1
289     echo preg_match(<em>'/^DEF/'</em>, $chaine);      // affiche 0
290     echo preg_match(<em>'/ABC$/'</em>, $chaine);      // affiche 0
291     echo preg_match(<em>'/DEF$/'</em>, $chaine);      // affiche 1
292     echo preg_match(<em>'/(ABC...)+/'</em>, $chaine); // affiche 1
293     echo preg_match(<em>'/[^A-Z]+/'</em>);            // affiche 0
294     echo preg_match(<em>'/[^A-Z]*/'</em>);            // affiche 1 !
295     echo preg_match(<em>'/^[^A-Z]*$/'</em>);          // affiche 0
296 ?&gt;</code>
297 </div>
298 <div class="sws-slide">
299   <h1>Expressions régulières : substitution</h1>
300   <code style="text-align:center"> <em>preg_replace</em>($regexp, $motif, $chaine)</code>
301   <p>recherche toutes les sous-chaînes de <tt>$chaine</tt> reconnues
302   par <tt>$regexp</tt> et les remplace par <tt>$motif</tt>. Ce dernier
303   peut contenir <tt>$<em>i</em></tt> pour référencer
304   le <em>i<sup>ème</sup></em> groupe de parenthèses</p>
305   <code style="margin: 0em 2em;background:white;">&lt;?php
306     $chaine = "<em>10</em>-<s>31</s>-<s style='color:blue'>1981</s>";
307     $reg1 = "/<em>(</em>[0-9]+<em>)</em>-<s>(</s>[0-9]+<s>)</s>-<s style='color:blue'>(</s>[0-9]+<s style='color:blue'>)</s>/";
308     echo preg_replace($reg1, "<em>$2</em>/<s>$1</s>/<s style='color:blue'>$3</s>", $chaine);
309     // affiche 31/10/1981
310
311     $reg2 = "/1/";
312     echo preg_replace($reg2, "toto", $chaine);
313     // affiche toto0-3toto-toto98toto
314
315     $reg3 = "/[0-9]([0-9]*)/"
316     echo preg_replace($reg3, "$1", $chaine);
317     // affiche 0-1-981 (* déplie la regexp le plus possible)
318 ?&gt;</code>
319 </div>
320 <div class="sws-slide">
321   <h1>Expressions régulières : séparation</h1>
322   <code style="text-align:center"> <em>preg_split</em>($regexp, $chaine)</code>
323   <p>renvoie un tableau des sous-chaine de <tt>$chaine</tt> séparées
324   par <tt>$motif</tt> (équivalent à <tt>explode</tt> pour
325   des <tt>$regexp</tt> constantes).</p>
326   <code style="margin: 0em 2em;background:white;">&lt;?php
327         $chaine = "Une phrase, c'est plusieurs mots.";
328         print_r (preg_split("/[ ,.']+/", $chaine));
329         //Affiche:
330         //Array ( [0] => Une [1] => phrase [2] => c [3] => est
331         //        [4] => plusieurs [5] => mots [6] => )
332 ?&gt;</code>
333 </div>
334 <div class="sws-slide">
335   <h1>Expressions régulières : recherche exhaustive</h1>
336
337   <code style="text-align:center"> <em>preg_match_all</em>($regexp, $chaine, &amp;$resultat)</code>
338   <p><tt><em>&amp;$resultat</em></tt> est un tableau <em>passé par
339   référence</em>. Après l'appel, <tt>$resultat[0]</tt> contient un
340   tableau avec <em>toutes</em> les sous-chaines reconnues
341   et <tt>$resultat[i]</tt> contient tous les résultats reconnus par le
342   i<sup>ème</sup> groupe de parenthèses. Renvoie le nombre de chaines
343   trouvées (<i>i.e.</i> la longueur de <tt>$resultat[0]</tt>).
344 </p>
345   <code style="margin: 0em 2em;background:white;">&lt;?php
346     $res = array();
347     $chaine = "ABC ACD AEF AB DEF";
348     echo preg_match_all("/A([A-Z]*)/", $chaine, $res);
349     //Affiche 4
350     print_r ($res);
351     /*Affiche
352     Array ( [0] =>
353               Array ( [0] => ABC [1] => ACD [2] => AEF [4] => AB)
354             [1] =>
355               Array ( [0] => BC  [1] => CD  [2] => EF  [4] => B)
356             )
357 */?&gt;</code>
358 </div>
359 <h1>Manipulation de fichiers</h1>
360 <div class="sws-slide">
361   <h1>Envoi d'un fichier au serveur (1/2)</h1>
362   <p>On utilise la méthode <tt><em>post</em></tt> pour les
363   formulaires. Les valeurs sont envoyées dans la requête HTTP (et non
364   pas encodées dans l'URL)</p>
365   <code>
366        &lt;form action="cible.php" <em>method="post"</em>
367              <em>enctype="multipart/form-data"</em>&gt;
368              &lt;input <em>type="file" <s>name="fichier"</s></em> size="20"/&gt;
369              &lt;button type="sumbit"&gt;Uploader le fichier&lt;/button&gt;
370       &lt;/form&gt;
371 </code>
372 <p>Apperçu:</p><form style="margin: 0em 1em" action="" method="post"
373                      enctype="multipart/form-data">
374   <input type="file" name="fichier" size="20"/>
375   <button type="submit">Uploader le fichier</button>
376 </form>
377 <p>Coté serveur, la variable <tt><em>$_FILES</em></tt> est
378   définie.  <tt><em>$_FILES[<s>"fichier"</s>]</em></tt> contient un
379   tableau avec des informations sur le fichier envoyé. Les autres
380   champs (par exemple valeur d'un champ texte) sont stockés dans la
381   variable <tt>$_POST</tt> (au lieu de <tt>$_GET</tt>).
382 </p>
383 </div>
384 <div class="sws-slide">
385   <h1>Envoi d'un fichier au serveur (2/2)</h1>
386   <p>Étant donné un formulaire avec un champ <i>input</i> de
387   type <i>file</i> et de nom <tt>"fichier"</tt> on a accès aux
388   information suivantes:</p>
389   <dl>
390     <dt><tt>$_FILES["fichier"]["error"]</tt></dt> <dd>Code d'erreur
391     (0 si tout c'est bien passé, <tt>></tt> 0 si une erreur s'est produite. Les
392     autres champs ne sont définis que si "error" vaut 0).
393     </dd>
394     <dt><tt>$_FILES["fichier"]["tmp_name"]</tt></dt><dd>Nom du fichier
395     temporaire sur le serveur où a été sauvegardé le contenu du
396     fichier envoyé</dd>
397     <dt><tt>$_FILES["fichier"]["name"]</tt></dt><dd>Nom original du fichier</dd>
398     <dt><tt>$_FILES["fichier"]["size"]</tt></dt><dd>Taille du
399     fichier</dd>
400     <dt><tt>$_FILES["fichier"]["type"]</tt></dt><dd>Le type MIME du fichier</dd>
401   </dl>
402 </div>
403 <div class="sws-slide">
404   <h1>Ouverture d'un fichier</h1>
405 <code style="text-align:center"> <em>fopen</em>($nomfichier, $mode)</code>
406 <p>Ouvre un fichier dont on donne le nom avec un <i>mode</i>
407   particulier. Les modes sont: <em><tt>"r"</tt></em>
408   (lecture), <em><tt>"r+"</tt></em> (lecture/écriture),
409   <em><tt>"w"</tt></em> (écriture),
410   <em><tt>"w+"</tt></em> (lecture/écriture, création si non-existant),
411   <em><tt>"a"</tt></em> (écriture, ajout à la fin si existant),
412   <em><tt>"a+"</tt></em> (lecture/écriture, création si non-existant,
413   ajout à la fin si existant). <em><tt>fopen</tt></em> renvoie un
414   descripteur de fichier que l'on peut utiliser pour manipuler le
415   fichier.
416 </p>.
417 </div>
418 <div class="sws-slide">
419   <h1>Lecture/écriture/fermeture d'un fichier</h1>
420 <code style="text-align:center"> <em>fread</em>($desc, $taille)</code>
421 <p>Lit au maximum <em><tt>$taille</tt></em> caractères dans un fichier
422   dont le descripteur (renvoyé par <tt>fopen</tt>)
423   est <tt>$desc</tt>. La fonction renvoie un chaine d'au
424   plus <tt>$taille</tt> caractères ou <tt>FALSE</tt> en cas d'erreur.
425 </p>
426 <code style="text-align:center"> <em>fwrite</em>($desc, $chaine)</code>
427 <p>Écrit la chaine de caractères à la position courante dans le
428   fichier dont le descripteur est <tt>$desc</tt>. Renvoi le nombre
429   d'octets écrits ou <tt>FALSE</tt> en cas d'erreur.
430 </p>
431 <code style="text-align:center"> <em>fclose</em>($desc)</code>
432 <p>Ferme le fichier dont le descripteur est <tt>$desc</tt>
433 </p>
434 </div>
435 <div class="sws-slide">
436   <h1>Déplacement dans un fichier</h1>
437   <code style="text-align:center"> <em>fseek</em>($desc, $offset, $orig)</code>
438   <p>Déplace le pointeur interne de position du fichier dont le
439   descripteur est <tt>$desc</tt> de <tt>$offset</tt> octets. Le
440   paramètre <tt>$orig</tt> donne l'origine: <tt>SEEK_CUR</tt>
441   (décalage à partir de la position courante), <tt>SEEK_SET</tt>
442   (position absolue dans le fichier), <tt>SEEK_END</tt> (décalage à
443   partir de la fin de fichier).
444 </p>
445 </div>
446 <div class="sws-slide">
447 <h1>Interface simplifiée</h1>
448 <code style="text-align:center"> <em>file_get_contents</em>($nomfichier)</code>
449 <p>Ouvre un fichier dont on donne le nom et renvoie son contenu sous
450   forme d'une chaine de caractères</p>
451 <code style="text-align:center"> <em>file</em>($nomfichier)</code>
452 <p>Renvoie un tableau avec une case par ligne dans le fichier. Chaque
453   entrée contient le "\n" terminal.</p>
454 </div>
455   </body>
456
457 </html>