File: migration.xml

package info (click to toggle)
phpdoc 20020310-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 35,272 kB
  • ctags: 354
  • sloc: xml: 799,767; php: 1,395; cpp: 500; makefile: 200; sh: 140; awk: 51
file content (358 lines) | stat: -rw-r--r-- 12,563 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.11 $ -->
<appendix id="migration">
 <title>Migration de PHP/FI 2.0 &agrave; PHP 3.0</title>
 <sect1 id="migration.about">
  <title>A propos des incompatibilit&eacute;s en 3.0</title>
  <simpara>
   PHP 3.0 a &eacute;t&eacute; enti&egrave;rement r&eacute;&eacute;crit. Le nouvel
   analyseur syntaxique est beaucoup plus robuste et coh&eacute;rent qu'en version
   2.0. Il est aussi nettement plus rapide et utilise encore moins de
   m&eacute;moire. Cependant, ces am&eacute;liorations n'ont pu &ecirc;tre
   possible qu'au prix de modifications parfois importantes, tant au niveau des
   syntaxes, qu'au niveau des fonctionnalit&eacute;s.
  </simpara>
  <simpara>
   De plus, l'&eacute;quipe de d&eacute;veloppement PHP a essay&eacute; de nettoyer
   la syntaxe et les s&eacute;mantiques, ce qui a aussi caus&eacute; quelques
   incompatibilit&eacute;s. A long terme, nous pensons que ces modifications
   seront pour le bien de tous.
  </simpara>
  <simpara>
   Ce chapitre va tenter de vous montrer les incompatibilit&eacute;s que vous
   pourriez rencontrer lors de votre migration de PHP/FI 2.0 &agrave; PHP 3.0
   et de vous aider &agrave; les r&eacute;soudre. Les nouvelles
   fonctionnalit&eacute;s ne sont pas signal&eacute;es, &agrave; moins que
   cela ne soit n&eacute;cessaire.
  </simpara>
  <simpara>
   Un programme de conversion automatique de vos vieux script PHP/FI 2.0 existe.
   Il est disponible dans le dossier de convertisseur de la distribution PHP 3.0.
   Ce programme ne fait que rep&eacute;rer les modifications de syntaxe et ne
   vous &eacute;pargnera pas une relecture attentive du script.
  </simpara>
 </sect1>
 <sect1 id="migration.startendtags">
  <title>Balises PHP</title>
  <para>
   La premi&egrave;re chose que vous remarquerez probablement est que les balises
   de PHP start et end ont chang&eacute;. L'ancienne forme
   <literal>&lt;? ?&gt;</literal> a &eacute;t&eacute; remplac&eacute;e par trois
   nouvelles balises possibles :
   <example>
    <title>Migration: Migration: balises start/end </title>
    <programlisting role="php">
&lt;?php
  echo "Ceci est du code PHP/FI 2.0.\n";?
?&gt;
    </programlisting>
   </example>
   Comme en version 2.0, PHP/FI accepte aussi cette variante :
   <example>
    <title>Migration: premi&egrave;res nouvelles balises PHP</title>
    <programlisting role="php">
&lt;?php
  echo "Ceci est du code PHP 3.0!\n";
?&gt;
    </programlisting>
   </example>
   Notez bien que la balise de fin contient d&eacute;sormais un point
   d'interrogation et un signe sup&eacute;rieur ">". Cependant,
   si vous souhaitez utiliser XML sur votre serveur, vous aurez s&ucirc;rement
   des probl&egrave;mes avec cette variante, car PHP risque d'essayer
   d'ex&eacute;cuter des balises XML. A cause de ceci, la notation
   suivante a &eacute;t&eacute; ajout&eacute;e :
   <example>
    <title>Migration: Nouvelles balises PHP</title>
    <programlisting role="php">
&lt;?php
  echo "Ceci est du code PHP 3.0!\n";
?&gt;
    </programlisting>
   </example>
   Certains d'entre vous rencontrent des probl&egrave;mes avec les &eacute;diteurs qui
   ne comprennent pas ce type de balises d'instruction : Microsoft FrontPage
   est l'un de ces &eacute;diteurs, et, pour contourner le probl&egrave;me, la
   variation suivante a &eacute;t&eacute; introduite :
   <example><title>Nouvelles balises PHP</title>
    <programlisting role="php">
&lt;script language="php"&gt;
  echo "Ceci est du code PHP 3.0!\n";
&lt;/script&gt;
    </programlisting>
   </example>
  </para>
 </sect1>
 <sect1 id="migration.if-endif">
  <title>Syntaxe if..endif</title>
  <para>
   La syntaxe alternative pour &eacute;crire des instructions if/elseif/else, avec if();
   elseif(); else; endif; ne pouvait pas &ecirc;tre conserv&eacute;e sans ajouter beaucoup
   de complexit&eacute; &agrave; l'analyseur syntaxique. De ce fait, cette syntaxe
   &agrave; chang&eacute;e :
   <example>
    <title>Migration: ancienne syntaxe if..endif </title>
    <programlisting role="php">
&lt;?php
  if ($foo);
    echo "oui\n";
  elseif ($bar);
    echo "presque\n";
  else;
    echo "non\n";
  endif;
?&gt;
    </programlisting>
   </example>
   <example>
    <title>Migration: nouvelle syntaxe if..endif</title>
    <programlisting role="php">
&lt;?php
  if ($foo):
    echo "oui\n";
  elseif ($bar):
    echo "presque\n";
  else:
    echo "non\n";
  endif;
?&gt;
    </programlisting>
   </example>
   Notez que les points virgules ont &eacute;t&eacute; remplac&eacute;e par des points dans
   toutes les commandes, sauf pour la derni&egrave;re expression (endif).
  </para>
 </sect1>
 <sect1 id="migration.while">
  <title>Syntaxe while</title>
  <para>
   Tout comme pour if..endif, la syntaxe des boucles while..endwhile a chang&eacute;e :
   <example>
    <title>Migration: ancienne syntaxe while..endwhile </title>
    <programlisting role="php">
&lt;?php
  while ($more_to_come);
    ...
  endwhile;
?&gt;
    </programlisting>
   </example>
   <example><title>Migration: nouvelle syntaxe while..endwhile</title>
   <programlisting role="php">
&lt;?php
  while ($more_to_come):
    ...
  endwhile;
?&gt;
    </programlisting>
   </example>
  </para>
  <warning>
   <simpara>
    Attention : si vous utilisez la vieille syntaxe while..endwhile en PHP 3.0, vous
    obtiendrez une boucle sans fin !
   </simpara>
  </warning>
 </sect1>
 <sect1 id="migration.expr">
  <title>Types d'expression</title>
  <simpara>
   PHP/FI 2.0 utilisait le membre &agrave; gauche dans les expressions, pour d&eacute;terminer
   le type de r&eacute;sultat attendu. PHP 3.0 prend en compte les deux c&ocirc;t&eacute;s de
   l'expression et cela peut produire des r&eacute;sultats inattendus avec les scripts 2.0.
  </simpara>
  <para>
   Consid&eacute;rez les lignes suivantes:
   <informalexample>
    <programlisting role="php">
&lt;?php
  $a[0]=5;
  $a[1]=7;
  $key = key($a);
  while ("" != $key) {
    echo "$keyn";
    next($a);
  }
?&gt;
    </programlisting>
   </informalexample>
    En PHP/FI 2.0, cet exemple va afficher les indices des $a.
    En PHP 3.0, l'exemple ne va rien afficher du tout. La raison est qu'en PHP 2.0, puisque
    l'argument de gauche est de type cha&icirc;ne, une comparaison de cha&icirc;ne &eacute;tait
    effectu&eacute;e et, effectivement, <literal>""</literal> n'est pas <literal>""</literal>,
    ce qui conduit la boucle &agrave; continuer. En PHP 3, lorsqu'une cha&icirc;ne est
    compar&eacute;e avec un entier, la comparaison est de type cha&icirc;ne (la cha&icirc;ne
    est convertie en entier). Ce qui revient &agrave; faire la comparaison entre
    (<literal>atoi("")</literal>) qui vaut <literal>0</literal> et la variable
    qui vaut aussi 0 et comme 0==0, la boucle ne commence m&ecirc;me pas.
  </para>
  <para>
   La correction de ceci est simple : il suffit de remplacer les commandes while par:
   <informalexample>
    <programlisting role="php">
&lt;?php
  while ((string)$key != "") {
?&gt;
    </programlisting>
   </informalexample>
  </para>
 </sect1>
 <sect1 id="migration.errors">
  <title>Les messages d'erreur ont chang&eacute;</title>
  <simpara>
   Les messages d'erreur en PHP 3.0 sont g&eacute;n&eacute;ralement plus pr&eacute;cis que
   ceux de la version 2.0., mais vous ne verrez plus la portion de code qui a caus&eacute;
   l'erreur. A la place, un num&eacute;ro de ligne et un nom de fichier sera retourn&eacute;.
  </simpara>
 </sect1>
 <sect1 id="migration.booleval">
  <title>Evaluation rapide des bool&eacute;ens </title>
  <simpara>
   En PHP 3., l'&eacute;valuation des est court-circuit&eacute;. Cela signifie dans une
   expression telle que (<literal>(1 || test_me())</literal>), la fonction test_me()
   ne sera pas ex&eacute;cut&eacute;e, car cela ne changera pas le r&eacute;sultat.
  </simpara>
  <simpara>
   C'est une am&eacute;lioration mineure, mais qui peut avoir des effets secondaires importants.
  </simpara>
 </sect1>
 <sect1 id="migration.truefalse">
  <title>La valeur &true;/&false; comme retour de fonctions</title>
  <simpara>
   La plupart des fonctions internes de PHP ont &eacute;t&eacute;
   r&eacute;&eacute;crite pour qu'elle retourne &true; en cas de succ&egrave;s,
   et &false; en cas d'erreur, au contraire des fonctions qui retournaient 0 et -1
   en PHP/FI 2.0. Le nouveau comportement est beaucoup plus logique, comme par
   exemple $fp = fopen("/your/file") or fail("fichier non trouv&eacute;!");.
   Etant donn&eacute; que PHP/FI 2.0 n'a pas de r&egrave;gle claire &agrave;
   propos de ce que les fonctions doivent retourner en cas d'&eacute;chec, la
   plupart des scripts devront probablement &ecirc;tre v&eacute;rifi&eacute;
   manuellement, apr&egrave;s avoir utilis&eacute; le convertisseur 2.0 &agrave;
   3.0.
  </simpara>
  <para>
   <example>
    <title>
      Migration depuis 2.0: valeur retourn&eacute;es, ancienne fa&ccedil;on
    </title>
    <programlisting role="php">
&lt;?php
  $fp = fopen($file, "r");
  if ($fp == -1);
    echo("Impossible d'ouvrir le fichier $file en lecture &lt;br&gt;\n");
  endif;
?&gt;
    </programlisting>
   </example>
   <example>
    <title>Migration depuis 2.0: valeur retourn&eacute;es, nouvelle fa&ccedil;on</title>
    <programlisting role="php">
&lt;?php
  $fp = @fopen($file, "r") or
     print("Impossible d'ouvrir le fichier $file en lecture&lt;br&gt;\n");
?&gt;
    </programlisting>
   </example>
  </para>
 </sect1>
 <sect1 id="migration.other">
  <title>Diverses incompatibilit&eacute;s</title>
   <itemizedlist>
    <listitem>
     <simpara>
      Le module PHP 3.0 pour Apache n'accepte plus les versions d'Apache ant&eacute;rieure
      &agrave; la version 1.2. Apache 1.2 ou plus r&eacute;cent est n&eacute;cessaire.
    </simpara>
   </listitem>
   <listitem>
    <simpara>
     <function>echo</function> n'utilise plus de cha&icirc;ne de formatage. Il faut
     utiliser <function>printf</function> &agrave; la place.
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      En PHP/FI 2.0, un effet secondaire de l'impl&eacute;mentation faisait que
      <literal>$foo[0]</literal> &eacute;tait la m&ecirc;me chose que
      <literal>$foo</literal>. Ce n'est plus vrai en PHP 3.0.
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      Lire un tableau avec $array[] n'est plus valable.
     </simpara>
     <simpara>
      Ainsi, il n'est plus possible de passer en revue un tableau avec des
      boucles telles que  <literal>$data = $array[]</literal>. Utilisez
      <function>current</function> et <function>next</function> &agrave; la place.
     </simpara>
     <simpara>
      Ainsi, <literal>$array1[] = $array2</literal> n'ajoute pas les valeurs
      de <literal>$array2</literal> &agrave; <literal>$array1</literal>,
      mais cr&eacute;e un nouvel &eacute;l&eacute;ment dans <literal>$array1</literal>
      et y affecte <literal>$array2</literal> comme dernier &eacute;l&eacute;ment.
      Voir aussi les tableaux multidimensionnels.
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <literal>"+"</literal> n'est plus utilisable comme op&eacute;rateur de
      concat&eacute;nation de cha&icirc;ne. A la place, il convertit les
      arguments en nombres et effectue une addition num&eacute;rique.
      Utilisez <literal>"."</literal>  &agrave; la place.
     </simpara>
    </listitem>
   </itemizedlist>
   <example>
    <title>Migration depuis 2.0: concat&eacute;nation de cha&icirc;nes</title>
     <programlisting role="php">
&lt;?php
  echo "1" + "1";
?&gt;
     </programlisting>
     <para>
      En PHP 2.0 cela retournerait 11, en PHP 3.0 cela va retourner 2. A la place,
      faites :
      <programlisting role="php">
&lt;?php
  echo "1"."1";
?&gt;
      </programlisting>
      <programlisting role="php">
&lt;?php
  $a = 1;
  $b = 1;
  echo $a + $b;
?&gt;
      </programlisting>
      </para>
      <para>
       Cela va afficher 2, tant en PHP 2.0 qu'en 3.0.
       <programlisting role="php">
&lt;?php
  $a = 1;
  $b = 1;
  echo $a.$b;
?&gt;
        </programlisting>
        Cela va afficher 11 en PHP 3.0.
    </para>
   </example>
  </sect1>
 </appendix>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->