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 à PHP 3.0</title>
<sect1 id="migration.about">
<title>A propos des incompatibilités en 3.0</title>
<simpara>
PHP 3.0 a été entièrement réécrit. Le nouvel
analyseur syntaxique est beaucoup plus robuste et cohérent qu'en version
2.0. Il est aussi nettement plus rapide et utilise encore moins de
mémoire. Cependant, ces améliorations n'ont pu être
possible qu'au prix de modifications parfois importantes, tant au niveau des
syntaxes, qu'au niveau des fonctionnalités.
</simpara>
<simpara>
De plus, l'équipe de développement PHP a essayé de nettoyer
la syntaxe et les sémantiques, ce qui a aussi causé quelques
incompatibilité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és que vous
pourriez rencontrer lors de votre migration de PHP/FI 2.0 à PHP 3.0
et de vous aider à les résoudre. Les nouvelles
fonctionnalités ne sont pas signalées, à moins que
cela ne soit né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érer les modifications de syntaxe et ne
vous épargnera pas une relecture attentive du script.
</simpara>
</sect1>
<sect1 id="migration.startendtags">
<title>Balises PHP</title>
<para>
La première chose que vous remarquerez probablement est que les balises
de PHP start et end ont changé. L'ancienne forme
<literal><? ?></literal> a été remplacée par trois
nouvelles balises possibles :
<example>
<title>Migration: Migration: balises start/end </title>
<programlisting role="php">
<?php
echo "Ceci est du code PHP/FI 2.0.\n";?
?>
</programlisting>
</example>
Comme en version 2.0, PHP/FI accepte aussi cette variante :
<example>
<title>Migration: premières nouvelles balises PHP</title>
<programlisting role="php">
<?php
echo "Ceci est du code PHP 3.0!\n";
?>
</programlisting>
</example>
Notez bien que la balise de fin contient désormais un point
d'interrogation et un signe supérieur ">". Cependant,
si vous souhaitez utiliser XML sur votre serveur, vous aurez sûrement
des problèmes avec cette variante, car PHP risque d'essayer
d'exécuter des balises XML. A cause de ceci, la notation
suivante a été ajoutée :
<example>
<title>Migration: Nouvelles balises PHP</title>
<programlisting role="php">
<?php
echo "Ceci est du code PHP 3.0!\n";
?>
</programlisting>
</example>
Certains d'entre vous rencontrent des problèmes avec les éditeurs qui
ne comprennent pas ce type de balises d'instruction : Microsoft FrontPage
est l'un de ces éditeurs, et, pour contourner le problème, la
variation suivante a été introduite :
<example><title>Nouvelles balises PHP</title>
<programlisting role="php">
<script language="php">
echo "Ceci est du code PHP 3.0!\n";
</script>
</programlisting>
</example>
</para>
</sect1>
<sect1 id="migration.if-endif">
<title>Syntaxe if..endif</title>
<para>
La syntaxe alternative pour écrire des instructions if/elseif/else, avec if();
elseif(); else; endif; ne pouvait pas être conservée sans ajouter beaucoup
de complexité à l'analyseur syntaxique. De ce fait, cette syntaxe
à changée :
<example>
<title>Migration: ancienne syntaxe if..endif </title>
<programlisting role="php">
<?php
if ($foo);
echo "oui\n";
elseif ($bar);
echo "presque\n";
else;
echo "non\n";
endif;
?>
</programlisting>
</example>
<example>
<title>Migration: nouvelle syntaxe if..endif</title>
<programlisting role="php">
<?php
if ($foo):
echo "oui\n";
elseif ($bar):
echo "presque\n";
else:
echo "non\n";
endif;
?>
</programlisting>
</example>
Notez que les points virgules ont été remplacée par des points dans
toutes les commandes, sauf pour la derniè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ée :
<example>
<title>Migration: ancienne syntaxe while..endwhile </title>
<programlisting role="php">
<?php
while ($more_to_come);
...
endwhile;
?>
</programlisting>
</example>
<example><title>Migration: nouvelle syntaxe while..endwhile</title>
<programlisting role="php">
<?php
while ($more_to_come):
...
endwhile;
?>
</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 à gauche dans les expressions, pour déterminer
le type de résultat attendu. PHP 3.0 prend en compte les deux côtés de
l'expression et cela peut produire des résultats inattendus avec les scripts 2.0.
</simpara>
<para>
Considérez les lignes suivantes:
<informalexample>
<programlisting role="php">
<?php
$a[0]=5;
$a[1]=7;
$key = key($a);
while ("" != $key) {
echo "$keyn";
next($a);
}
?>
</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îne, une comparaison de chaîne était
effectuée et, effectivement, <literal>""</literal> n'est pas <literal>""</literal>,
ce qui conduit la boucle à continuer. En PHP 3, lorsqu'une chaîne est
comparée avec un entier, la comparaison est de type chaîne (la chaîne
est convertie en entier). Ce qui revient à 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ême pas.
</para>
<para>
La correction de ceci est simple : il suffit de remplacer les commandes while par:
<informalexample>
<programlisting role="php">
<?php
while ((string)$key != "") {
?>
</programlisting>
</informalexample>
</para>
</sect1>
<sect1 id="migration.errors">
<title>Les messages d'erreur ont changé</title>
<simpara>
Les messages d'erreur en PHP 3.0 sont généralement plus précis que
ceux de la version 2.0., mais vous ne verrez plus la portion de code qui a causé
l'erreur. A la place, un numéro de ligne et un nom de fichier sera retourné.
</simpara>
</sect1>
<sect1 id="migration.booleval">
<title>Evaluation rapide des booléens </title>
<simpara>
En PHP 3., l'évaluation des est court-circuité. Cela signifie dans une
expression telle que (<literal>(1 || test_me())</literal>), la fonction test_me()
ne sera pas exécutée, car cela ne changera pas le résultat.
</simpara>
<simpara>
C'est une amé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 été
réécrite pour qu'elle retourne &true; en cas de succè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é!");.
Etant donné que PHP/FI 2.0 n'a pas de règle claire à
propos de ce que les fonctions doivent retourner en cas d'échec, la
plupart des scripts devront probablement être vérifié
manuellement, après avoir utilisé le convertisseur 2.0 à
3.0.
</simpara>
<para>
<example>
<title>
Migration depuis 2.0: valeur retournées, ancienne façon
</title>
<programlisting role="php">
<?php
$fp = fopen($file, "r");
if ($fp == -1);
echo("Impossible d'ouvrir le fichier $file en lecture <br>\n");
endif;
?>
</programlisting>
</example>
<example>
<title>Migration depuis 2.0: valeur retournées, nouvelle façon</title>
<programlisting role="php">
<?php
$fp = @fopen($file, "r") or
print("Impossible d'ouvrir le fichier $file en lecture<br>\n");
?>
</programlisting>
</example>
</para>
</sect1>
<sect1 id="migration.other">
<title>Diverses incompatibilités</title>
<itemizedlist>
<listitem>
<simpara>
Le module PHP 3.0 pour Apache n'accepte plus les versions d'Apache antérieure
à la version 1.2. Apache 1.2 ou plus récent est nécessaire.
</simpara>
</listitem>
<listitem>
<simpara>
<function>echo</function> n'utilise plus de chaîne de formatage. Il faut
utiliser <function>printf</function> à la place.
</simpara>
</listitem>
<listitem>
<simpara>
En PHP/FI 2.0, un effet secondaire de l'implémentation faisait que
<literal>$foo[0]</literal> était la mê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> à la place.
</simpara>
<simpara>
Ainsi, <literal>$array1[] = $array2</literal> n'ajoute pas les valeurs
de <literal>$array2</literal> à <literal>$array1</literal>,
mais crée un nouvel élément dans <literal>$array1</literal>
et y affecte <literal>$array2</literal> comme dernier élément.
Voir aussi les tableaux multidimensionnels.
</simpara>
</listitem>
<listitem>
<simpara>
<literal>"+"</literal> n'est plus utilisable comme opérateur de
concaténation de chaîne. A la place, il convertit les
arguments en nombres et effectue une addition numérique.
Utilisez <literal>"."</literal> à la place.
</simpara>
</listitem>
</itemizedlist>
<example>
<title>Migration depuis 2.0: concaténation de chaînes</title>
<programlisting role="php">
<?php
echo "1" + "1";
?>
</programlisting>
<para>
En PHP 2.0 cela retournerait 11, en PHP 3.0 cela va retourner 2. A la place,
faites :
<programlisting role="php">
<?php
echo "1"."1";
?>
</programlisting>
<programlisting role="php">
<?php
$a = 1;
$b = 1;
echo $a + $b;
?>
</programlisting>
</para>
<para>
Cela va afficher 2, tant en PHP 2.0 qu'en 3.0.
<programlisting role="php">
<?php
$a = 1;
$b = 1;
echo $a.$b;
?>
</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:
-->
|