cvs: phpdoc /fr/appendices migration.xml migration4.xml

From: Date: Thu, 18 Oct 2001 22:42:08 +0000
Subject: cvs: phpdoc /fr/appendices migration.xml migration4.xml
Groups: php.doc 
Request: Send a blank email to phpdoc+get-969338085@lists.php.net to get a copy of this message
dams Thu Oct 18 18:42:08 2001 EDT Modified files: /phpdoc/fr/appendices migration4.xml migration.xml Log: Added september update. synch with tree

Index: phpdoc/fr/appendices/migration4.xml diff -u phpdoc/fr/appendices/migration4.xml:1.6 phpdoc/fr/appendices/migration4.xml:1.7 --- phpdoc/fr/appendices/migration4.xml:1.6 Fri Aug 10 09:20:50 2001 +++ phpdoc/fr/appendices/migration4.xml Thu Oct 18 18:42:07 2001 @@ -1,308 +1 @@ -<!-- $Revision: 1.6 $ --> - <appendix id="migration4"> - <title>Migration de PHP 3.0 &agrave; PHP 4.0</title> - <sect1 id="migration4.changes"> - <title>Ce qui a chang&eacute; en PHP 4.0</title> - <para> - PHP 4.0 et le moteur Zend ont significativement am&eacute;lior&eacute; les - performances et les possibilit&eacute;s de PHP, tout en assurant une - compatibilit&eacute; ascendante maximale. Le maximum de codes existants - sous PHP 3.0 fonctionneront sous PHP 4.0. La migration de votre - code de PHP 3.0 vers PHP 4.0 sera beaucoup plus facile que - celle de PHP/FI 2.0 vers 3.0. Un grand nombre de scripts seront - pr&ecirc;ts sans modifications, mais il est bon que vous connaissiez - les quelques diff&eacute;rences, et que vous testiez vos applications - avant d'effecteur le changement de cadre de production. Les - indications suivantes vous mettront sur la voie. - </para> - </sect1> - <sect1 id="migration4.parser"> - <title>Comportement de l'analyseur</title> - <para> - L'analyse et l'&eacute;xecution sont d&eacute;sormais deux &eacute;tapes - compl&egrave;tement dissoci&eacute;es, et l'&eacute;x&eacute;cution - intervient lorsque le code, ainsi que tous ses inclusions et - pr&eacute;-requis, ont &eacute;t&eacute; compl&egrave;tement - analys&eacute;s et valid&eacute;s. - </para> - <para> - Une des nouvelles conditions introduites est que les fichiers - inclus et requis (<function>include</function> et - <function>require</function>) doivent &ecirc;tre syntaxiquement - complets. Vous ne pouvez plus r&eacute;partir diff&eacute;rents cas de votre - code dans plusieurs fichiers. Vous ne pouvez plus commencer une - boucle <literal>for</literal> ou <literal>while</literal>, - une condition <literal>if</literal> ou un cas <literal>switch</literal> - dans un fichier, et finir la boucle ou placer les cas - <literal>else</literal>, <literal>endif</literal>, - <literal>case</literal> ou <literal>break</literal> - dans un autre fichier. - </para> - <para> - Il est toujours valable d'inclure du code suppl&eacute;mentaire depuis - une boucle ou dans une condition, mais les accolades de - bloc <literal>{...}</literal>, et les &eacute;l&eacute;ments de la boucle - doivent &ecirc;tre dans le m&ecirc;me fichier ou cha&icirc;ne &eacute;valu&eacute;e avec - <function>eval</function>. - </para> - <para> - Cela ne devrait pas perturber trop de monde, car &eacute;taler son - code de cette fa&ccedil;on est plut&ocirc;t un style &agrave; &eacute;viter. - </para> - <para> - Une autre nouveaut&eacute; est qu'il est plus possible de faire - retourner une valeur avec un fichier requis (<function>require</function>) - (mais c'est plut&ocirc;t rare en PHP 3.0). Retourner une valeur - avec un fichier inclus (<function>include</function>) est toujours - possible. - </para> - </sect1> - <sect1 id="migration4.errors"> - <title>Rapport d'erreur</title> - <sect2 id="migration4.error_reporting"> - <title>Changement de configuration</title> - <para> - Avec PHP 3.0, le niveau de rapport d'erreur &eacute;tait obtenu en - ajoutant les constantes num&eacute;riques de chaque niveau de - rapport. G&eacute;n&eacute;ralement, on utilisait 15 pour afficher toutes - les erreurs, et 7 pour afficher toutes les erreurs hormis - les alertes simples. - </para> - <para> - PHP 4.0 dispose d'un nombre significativement plus grand de niveaux - de rapport d'erreur, et l'analyseur comprend d&eacute;sormais les - constantes, lors des modifications. - </para> - <para> - Le niveau de rapport d'erreur doit d&eacute;sormais &ecirc;tre explicitement - configur&eacute; en supprimant les niveaux dont vous ne voulez pas - du niveau maximal, gr&acirc;ce &agrave; la fonction de OU exclusif. &Ccedil;a a - l'air compliqu&eacute;? Supposons que vous souhaitiez afficher toutes les - erreurs, hormis les alertes de style, qui sont rep&eacute;r&eacute;es par - la constante : E_NOTICE. Il suffit d'ajouter la valeur - suivante dans le fichier <filename>php.ini</filename>: - <literal>error_reporting = E_ALL & ~ ( E_NOTICE )</literal>. - Si vous voulez supprimer en plus les alertes, vous pouvez - ajouter la constante appropri&eacute;e, en la combinant avec l'op&eacute;rateur - OU logique '|': - <literal>error_reporting= E_ALL & ~ ( E_NOTICE | E_WARNING )</literal>. - </para> - <warning> - <para> - L'utilisation des vieilles valeurs de 7 et 15 est une tr&egrave;s - mauvaise id&eacute;e, car elles ne prennent pas en compte les - nouvelles classes d'erreurs, y compris certaines erreurs - d'analyse. Cela peut conduire &agrave; de tr&egrave;s &eacute;tranges r&eacute;sultats, - o&ugrave; le script n'affiche plus rien, malgr&eacute; une erreur d'analyse. - </para> - <para> - Cela a conduit &agrave; un grand nombre de rapport d'erreur dans - le pass&eacute;, alors que les programmeurs n'&eacute;taient tout simplement - pas capables de rep&eacute;rer l'accolade manquante, car l'analyseur - avait la consigne de cacher ces erreurs. - </para> - <para> - V&eacute;rifier votre niveau d'erreur doit &ecirc;tre le premier r&eacute;flexe - lorsque vos scripts meurent silencieusement. Le moteur - Zend est consid&eacute;r&eacute; actuellement comme suffisamment mature pour - ne plus causer ce genre de probl&egrave;me aujourd'hui. - </para> - </warning> - </sect2> - <sect2 id="migration4.messages"> - <title>Nouveaux messages d'erreurs</title> - <para> - Un grand nombre de scripts PHP PHP 3.0 utilisent des structures qui - doivent &ecirc;tre consid&eacute;r&eacute;es comme un tr&egrave;s mauvais style, - m&ecirc;me s'il effectue bien la t&acirc;che qui lui est affect&eacute;e, car - ils ne sont pas robustes. PHP 4.0 affichera de nombreux messages d'erreurs dans - des situations o&ugrave; PHP 3.0 restera coi. La solution de facilit&eacute; - consiste &agrave; supprimer les messages de niveau E_NOTICE, mais c'est une - meilleure id&eacute;e de corriger le code &agrave; la place. - </para> - <para> - Le cas le plus courant qui g&eacute;n&egrave;rera des messages d'alertes - est l'utilisation de constantes sans guillemets comme - index de tableaux. PHP 3.0, comme PHP 4.0, finiront par les - interpr&eacute;ter litt&eacute;ralement comme des cha&icirc;nes, si aucune constante - n'est d&eacute;finie &agrave; la place. Mais si jamais une telle constante - est d&eacute;finie dans une autre partie du code, cela risque de - produire des r&eacute;sultats &eacute;tonnants. Cela peut devenir un trou - de s&eacute;curit&eacute; si un pirate arrive &agrave; red&eacute;finir les constantes - de telle mani&egrave;re que le script lui donne acc&egrave;s &agrave; un niveau - de droits sup&eacute;rieur. PHP 4.0 vous signalera tout oubli de - guillemets comme par exemple dans : - <literal>$HTTP_SERVER_VARS[REQUEST_METHOD]</literal>. Modifier - ce code en <literal>$HTTP_SERVER_VARS['REQUEST_METHOD']</literal> - rendra l'analyseur heureux, et am&eacute;liorera grandement votre - style et la s&eacute;curit&eacute; du code. - </para> - <para> - PHP 4.0 vous signalera les variables ou les - &eacute;l&eacute;ments de tableaux non initialis&eacute;s. - </para> - </sect2> - </sect1> - <sect1 id="migration4.initializers"> - <title>Initialiseur</title> - <para> - Les variables statiques et les membres de classes n'acceptent - plus que des initialiseurs scalaires, tandis que PHP 3.0 acceptait - aussi les expressions. Cela est d&ucirc;, encore une fois, &agrave; la - s&eacute;paration de l'analyse et de l'ex&eacute;cution : aucun code - ne peut &ecirc;tre ex&eacute;cut&eacute; tant que l'analyse - n'est pas termin&eacute;e. - </para> - <para> - Pour les classes, il vaut mieux initialiser les membres dans - le constructeur. Pour les variables statiques, une valeur fixe - et simple est la seule chose qui viennent &agrave; l'esprit. - </para> - </sect1> - <sect1 id="migration4.empty"> - <title><literal>empty("0")</literal></title> - <para> - L'&eacute;volution la plus pol&eacute;mique est celle de <function>empty</function>. - Une cha&icirc;ne contenant seulement le caract&egrave;re - <literal>'0'</literal> (z&eacute;ro) est maintenant consid&eacute;r&eacute;e comme - vide, alors qu'elle ne l'&eacute;tait pas en PHP 3.0. - </para> - <para> - Ce nouveau comportement prend tout son sens dans les applications - web, puisque tous les r&eacute;sultats de champs de type input sont de type - cha&icirc;ne de caract&egrave;res, m&ecirc;me si un nombre est demand&eacute;, - et ce, gr&acirc;ce aux capacit&eacute;s de conversion automatique de PHP. - D'un autre c&ocirc;t&eacute;, cela peut - casser votre code d'une mani&egrave;re tr&egrave;s subtile, menant droit au - comportement erratique, difficilement rep&eacute;rable si vous ne - savez pas ce qui vous attend. - </para> - </sect1> - <sect1 id="migration4.missing"> - <title>Fonctions manquantes</title> - <para> - Bien que PHP 4.0 dispose de nombreuses nouvelles fonctionnalit&eacute;s - fonctions et extensions, vous vous rencontrer des fonctions PHP - 3.0 qui manquent. Un petit nombre de fonctions de base n'ont pu - &ecirc;tre port&eacute;es en PHP 4.0, maintenant que l'analyse et l'&eacute;x&eacute;cution - ont &eacute;t&eacute; s&eacute;par&eacute;es. D'autres fonctions, et m&ecirc;mes des extensions - enti&egrave;res sont maintenant obsol&egrave;tes, remplac&eacute;es par de nouvelles - fonctions plus puissantes ou plus efficaces. Certaines fonctions - n'ont tout simplement pas &eacute;t&eacute; port&eacute;es pour le moment ou pour - des raisons de licences. - </para> - <sect2 id="migration4.impossible"> - <title>Fonctions manquantes pour des raisons de structure</title> - <para> - Comme PHP 4.0 s&eacute;pare l'analyse et l'&eacute;x&eacute;cution, il n'est plus - possible de modifier le comportement de l'analyseur (int&eacute;gr&eacute; - dans le moteur Zend) durant l'&eacute;x&eacute;cution, puisque toute - l'analyse a eu lieu, et est termin&eacute;e. La fonction - short_tags() a cess&eacute; d'exister. Vous pouvez - toujours modifier le comportement de l'analyseur avec - le fichier <filename>php.ini</filename>. - </para> - <para> - Une autre fonctionnalit&eacute; qui a disparu est le d&eacute;buggeur - de PHP 3.0, comme d&eacute;crit dans un autre appendice. Un nouveau - d&eacute;buggeur est promis par Zend, mais il n'a pas encore montr&eacute; - le bout de son nez. - </para> - </sect2> - <sect2 id="migration4.deprecated"> - <title>Fonctions et extensions obsol&egrave;tes</title> - <para> - Les extensions Adabas et Solid n'existent plus. Elles sont int&eacute;gr&eacute;es - dans les fonctions <link linkend="ref.odbc">ODBC Unifi&eacute;</link>. - </para> - </sect2> - <sect2 id="migration4.unset"> - <title>Nouveau statut pour <function>unset</function></title> - <para> - <function>unset</function>, bient que toujours disponible, a - &eacute;t&eacute; impl&eacute;ment&eacute; l&eacute;g&egrave;rement - diff&eacute;remment en PHP 4.0, et elle n'est plus vraiment une 'fonction'. - </para> - <para> - Cela n'a pas de cons&eacute;quence directe sur le comportement de - <function>unset</function>, mais utiliser cette fonction - pour faire un test avec <function>function_exists</function> - retournera <literal>FALSE</literal> comme il se doit avec - les fonction bas niveau comme <function>echo</function>. - </para> - <para> - Une autre application pratique disparue est qu'il n'est plus possible - d'appeler <function>unset</function> indirectement, c'est-&agrave;-dire que - <literal>$func="unset"; $func($somevar)</literal> ne fonctionne plus. - </para> - </sect2> - </sect1> - <sect1 id="migration4.extension"> - <title>Extensions PHP 3.0</title> - <para> - Les extensions &eacute;crites pour PHP 3.0 ne fonctionnent plus avec PHP 4.0, - ni les ex&eacute;cutables, ni les codes sources. Il n'est pas difficile de - porter les extensions de PHP 3.0 &agrave; 4.0 si vous avez acc&egrave;s aux - sources originales. Une description d&eacute;taill&eacute;e du processus - de portage ne fait pas partie de cet appendice (pour le moment). - </para> - </sect1> - <sect1 id="migration4.substitution"> - <title>Substitution de variables dans les cha&icirc;nes</title> - <para> - PHP 4.0 dispose d'un nouveau m&eacute;canisme de substitution des - variables dans les cha&icirc;nes. Vous pouvez d&eacute;sormais acc&eacute;der aux - membres d'objets et aux tableaux multidimensionnels dans une - cha&icirc;ne. - </para> - <para> - Pour cela, il suffit de placer la variable entre accolades, le signe - $ suivant imm&eacute;diatement la premi&egrave;re accolade : - <literal>{$variable['a']}</literal> - </para> - <para> - Pour utiliser la valeur d'un membre d'objet dans une cha&icirc;ne, - il suffit d'&eacute;crire : <literal>"text {$obj->member} text"</literal>; - alors qu'en PHP 3.0, il fallait faire comme ceci : - <literal>"texte".$objet->membre." texte"</literal>. - </para> - <para> - Cette technique rend le code beaucoup plus lisible, mais risque de - poser des probl&egrave;mes dans certains scripts PHP 3.0. Vous pouvez - facilement traquer ce probl&egrave;me en recherche les s&eacute;quences - <literal>{$</literal> dans votre code, et en les rempla&ccedil;ant par - <literal>\{$</literal> avec votre outil de remplacement habituel. - </para> - </sect1> - <sect1 id="migration4.cookies"> - <title>Cookies</title> - <para> - PHP 3.0 avait la mauvaise habitude d'envoyer les cookies dans l'ordre - inverse de celui du code (l'ordre des appels &agrave; - <function>setcookie</function>). PHP 4.0 r&eacute;tablit l'ordre naturel - en les envoyant dans le m&ecirc;me ordre que vous m&ecirc;me. - </para> - <para> - Cela peut aussi prendre &agrave; contre-pied certains programmes, mais - ce comportement &eacute;tait tellement &eacute;trange qu'il m&eacute;ritait un tel - traitement un jour ou l'autre, pour &eacute;viter d'autres - probl&egrave;mes ult&eacute;rieurs. - </para> - </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 -sgml-parent-document:nil -sgml-default-dtd-file:"../../manual.ced" -sgml-exposed-tags:nil -sgml-local-catalogs:nil -sgml-local-ecat-files:nil -End: ---> +<?xml encoding="iso-8859-1"?><!-- $Revision: 1.7 $ --> <appendix id="migration4"> <title>Migration de PHP 3.0 &agrave; PHP 4.0</title> <sect1 id="migration4.changes"> <title>Ce qui a chang&eacute; en PHP 4.0</title> <para> PHP 4.0 et le moteur Zend ont significativement am&eacute;lior&eacute; les performances et les possibilit&eacute;s de PHP, tout en assurant une compatibilit&eacute; ascendante maximale. Le maximum de codes existants sous PHP 3.0 fonctionneront sous PHP 4.0. La migration de votre code de PHP 3.0 vers PHP 4.0 sera beaucoup plus facile que celle de PHP/FI 2.0 vers 3.0. Un grand nombre de scripts seront pr&ecirc;ts sans modifications, mais il est bon que vous connaissiez les quelques diff&eacute;rences, et que vous testiez vos applications avant d'effecteur le changement de cadre de production. Les indications suivantes vous mettront sur la voie. </para> </sect1> <sect1 id="migration4.php4.with.php3"> <title>Utiliser PHP 3 et PHP 4 simultan&eacute;ment</title> <simpara> Les syst&egrave;mes d'exploitation r&eacute;cents disposent de capacit&eacute;s de versioning et de scoping. Ces fonctionnalit&eacute;s rendent possible l'installation de PHP 3 et PHP 4 comme modules Apache, simultan&eacute;ment. </simpara> <simpara> Ceci a &eacute;t&eacute; fait sur les plate-formes suivantes : </simpara> <itemizedlist> <listitem> <simpara> Linux avec les binutils r&eacute;cents (test&eacute; avec binutils 2.9.1.0.25) </simpara> </listitem> <listitem> <simpara> Solaris 2.5 ou plus r&eacute;cent </simpara> </listitem> <listitem> <simpara> FreeBSD (test&eacute; avec 3.2, 4.0) </simpara> </listitem> </itemizedlist> <para> Pour l'activer, configurez PHP 3 et PHP 4 pour qu'ils utilisent APXS (<link linkend="install.configure.with-apxs"><option role="configure">--with-apxs</option></link>) et les extensions n&eacute;cessaires (<link linkend="install.configure.enable-versioning"><option role="configure">--enable-versioning</option></link>). En dehors de cela, toutes les instructions d'installation habituelles s'appliquent. Par exemple : <informalexample> <programlisting>$ ./configure \ --with-apxs=/apache/bin/apxs \ --enable-versioning \ --with-mysql \ --enable-track-vars </programlisting> </informalexample> </para> </sect1> <sect1 id="migration4.configuration"> <title>Migration des fichiers de configuration</title> <para> Le fichier de configuration global, <filename>php3.ini</filename>, a &eacute;t&eacute; renomm&eacute; en <filename>php.ini</filename>. </para> <para> Pour les fichiers de configuration Apache, il y a eu des modifications plus importantes. Les types MIME reconnus par le module PHP ont &eacute;t&eacute; modifi&eacute;s. <informalexample> <programlisting>application/x-httpd-php3 --&gt; application/x-httpd-phpapplication/x-httpd-php3-source --&gt; application/x-httpd-php-source </programlisting> </informalexample> </para> <para> Vous pouvez faire fonctionner vos deux versions de PHP avec le m&ecirc;me fichier de configuration Apache (suivant la version qui est d&eacute;j&agrave; compil&eacute;e sur le serveur), en utilisant la syntaxe suivante : <informalexample> <programlisting>AddType application/x-httpd-php3 .php3AddType application/x-httpd-php3-source .php3sAddType application/x-httpd-php .phpAddType application/x-httpd-php-source .phps </programlisting> </informalexample> </para> <simpara> De plus, les directives de nom de PHP pour Apache ont aussi &eacute;t&eacute; modifi&eacute;es. </simpara> <para> Depuis PHP 4.0, il n'y a que 4 directives Apache qui se rapportent &agrave; PHP : <informalexample> <programlisting>php_value [PHP directive name] [value]php_flag [PHP directive name] [On|Off]php_admin_value [PHP directive name] [value]php_admin_flag [PHP directive name] [On|Off] </programlisting> </informalexample> </para> <simpara> Il y a deux diff&eacute;rences entre les options Admin et les autres valeurs : </simpara> <itemizedlist> <listitem> <simpara> Les options Admin ne peuvent &ecirc;tre plac&eacute;es que des le fichier de configuration g&eacute;n&eacute;ral (i.e., httpd.conf). </simpara> </listitem> <listitem> <simpara> Les valeurs Standard ne peuvent pas contr&ocirc;ler certaines directives PHP. Par exemple, le safe mode (si vous pouviez modifier les configurations dans le fichier <filename>.htaccess</filename>, cela annulerait toute la s&eacute;curit&eacute; du safe mode. A l'inverse, les valeurs Admin peuvent modifier n'importe quelle directive PHP. </simpara> </listitem> </itemizedlist> <simpara> Pour rendre le processus de transition plus agr&eacute;able, PHP 4.0 est distribu&eacute; avec des scripts qui convertissent automatiquement vos configuration Apache et vos fichiers <filename>.htaccess</filename> pour qu'ils puissent fonctionner aussi bien avec PHP 3 que PHP 4. Ces scripts ne convertissent PAS les lignes concernant les types MIME. Vous devez le faire vous-m&ecirc;me. </simpara> <para> Pour convertir votre fichier de configuration Apache, ex&eacute;cutez le script <filename>apconf-conv.sh</filename> (disponible dans le dossier <filename>scripts/apache/</filename>). Par exemple : <informalexample> <programlisting>~/php4/scripts/apache:# ./apconf-conv.sh /usr/local/apache/conf/httpd.conf </programlisting> </informalexample> </para> <simpara> Votre configuration originale sera sauv&eacute;e dans le fichier <filename>httpd.conf.orig</filename>. </simpara> <para> Pour convertir vos fichiers <filename>.htaccess</filename>, ex&eacute;cutez le script <filename>aphtaccess-conv.sh</filename> (disponible dans le dossier <filename>scripts/apache/</filename>). Par exemple : <informalexample> <programlisting>~/php4/scripts/apache:# find / -name .htaccess -exec ./aphtaccess-conv.sh {} \; </programlisting> </informalexample> </para> <simpara> De la m&ecirc;me fa&ccedil;on, votre vieux fichier <filename>.htaccess</filename> sera sauv&eacute; sous le nom <filename>.htaccess.orig</filename>. </simpara> <simpara> Les scripts de conversion requi&egrave;rent l'installation pr&eacute;alable de awk. </simpara> </sect1> <sect1 id="migration4.parser"> <title>Comportement de l'analyseur</title> <para> L'analyse et l'&eacute;xecution sont d&eacute;sormais deux &eacute;tapes compl&egrave;tement dissoci&eacute;es, et l'&eacute;x&eacute;cution intervient lorsque le code, ainsi que tous ses inclusions et pr&eacute;-requis, ont &eacute;t&eacute; compl&egrave;tement analys&eacute;s et valid&eacute;s. </para> <para> Une des nouvelles conditions introduites est que les fichiers inclus et requis (<function>include</function> et <function>require</function>) doivent &ecirc;tre syntaxiquement complets. Vous ne pouvez plus r&eacute;partir diff&eacute;rents cas de votre code dans plusieurs fichiers. Vous ne pouvez plus commencer une boucle <literal>for</literal> ou <literal>while</literal>, une condition <literal>if</literal> ou un cas <literal>switch</literal> dans un fichier, et finir la boucle ou placer les cas <literal>else</literal>, <literal>endif</literal>, <literal>case</literal> ou <literal>break</literal> dans un autre fichier. </para> <para> Il est toujours valable d'inclure du code suppl&eacute;mentaire depuis une boucle ou dans une condition, mais les accolades de bloc <literal>{...}</literal>, et les &eacute;l&eacute;ments de la boucle doivent &ecirc;tre dans le m&ecirc;me fichier ou cha&icirc;ne &eacute;valu&eacute;e avec <function>eval</function>. </para> <para> Cela ne devrait pas perturber trop de monde, car &eacute;taler son code de cette fa&ccedil;on est plut&ocirc;t un style &agrave; &eacute;viter. </para> <para> Une autre nouveaut&eacute; est qu'il est plus possible de faire retourner une valeur avec un fichier requis (<function>require</function>) (mais c'est plut&ocirc;t rare en PHP 3.0). Retourner une valeur avec un fichier inclus (<function>include</function>) est toujours possible. </para> </sect1> <sect1 id="migration4.error-reporting"> <title>Rapport d'erreur</title> <sect2 id="migration4.error-reporting.config"> <title>Changement de configuration</title> <para> Avec PHP 3.0, le niveau de rapport d'erreur &eacute;tait obtenu en ajoutant les constantes num&eacute;riques de chaque niveau de rapport. G&eacute;n&eacute;ralement, on utilisait 15 pour afficher toutes les erreurs, et 7 pour afficher toutes les erreurs hormis les alertes simples. </para> <para> PHP 4.0 dispose d'un nombre significativement plus grand de niveaux de rapport d'erreur, et l'analyseur comprend d&eacute;sormais les constantes, lors des modifications. </para> <para> Le niveau de rapport d'erreur doit d&eacute;sormais &ecirc;tre explicitement configur&eacute; en supprimant les niveaux dont vous ne voulez pas du niveau maximal, gr&acirc;ce &agrave; la fonction de OU exclusif. &Ccedil;a a l'air compliqu&eacute;? Supposons que vous souhaitiez afficher toutes les erreurs, hormis les alertes de style, qui sont rep&eacute;r&eacute;es par la constante : E_NOTICE. Il suffit d'ajouter la valeur suivante dans le fichier <filename>php.ini</filename>: <literal>error_reporting = E_ALL & ~ ( E_NOTICE )</literal>. Si vous voulez supprimer en plus les alertes, vous pouvez ajouter la constante appropri&eacute;e, en la combinant avec l'op&eacute;rateur OU logique '|': <literal>error_reporting= E_ALL & ~ ( E_NOTICE | E_WARNING )</literal>. </para> <warning> <para> L'utilisation des vieilles valeurs de 7 et 15 est une tr&egrave;s mauvaise id&eacute;e, car elles ne prennent pas en compte les nouvelles classes d'erreurs, y compris certaines erreurs d'analyse. Cela peut conduire &agrave; de tr&egrave;s &eacute;tranges r&eacute;sultats, o&ugrave; le script n'affiche plus rien, malgr&eacute; une erreur d'analyse. </para> <para> Cela a conduit &agrave; un grand nombre de rapport d'erreur dans le pass&eacute;, alors que les programmeurs n'&eacute;taient tout simplement pas capables de rep&eacute;rer l'accolade manquante, car l'analyseur avait la consigne de cacher ces erreurs. </para> <para> V&eacute;rifier votre niveau d'erreur doit &ecirc;tre le premier r&eacute;flexe lorsque vos scripts meurent silencieusement. Le moteur Zend est consid&eacute;r&eacute; actuellement comme suffisamment mature pour ne plus causer ce genre de probl&egrave;me aujourd'hui. </para> </warning> </sect2> <sect2 id="migration4.error-reporting.additions"> <title>Nouveaux messages d'erreurs</title> <para> Un grand nombre de scripts PHP PHP 3.0 utilisent des structures qui doivent &ecirc;tre consid&eacute;r&eacute;es comme un tr&egrave;s mauvais style, m&ecirc;me s'il effectue bien la t&acirc;che qui lui est affect&eacute;e, car ils ne sont pas robustes. PHP 4.0 affichera de nombreux messages d'erreurs dans des situations o&ugrave; PHP 3.0 restera coi. La solution de facilit&eacute; consiste &agrave; supprimer les messages de niveau E_NOTICE, mais c'est une meilleure id&eacute;e de corriger le code &agrave; la place. </para> <para> Le cas le plus courant qui g&eacute;n&egrave;rera des messages d'alertes est l'utilisation de constantes sans guillemets comme index de tableaux. PHP 3.0, comme PHP 4.0, finiront par les interpr&eacute;ter litt&eacute;ralement comme des cha&icirc;nes, si aucune constante n'est d&eacute;finie &agrave; la place. Mais si jamais une telle constante est d&eacute;finie dans une autre partie du code, cela risque de produire des r&eacute;sultats &eacute;tonnants. Cela peut devenir un trou de s&eacute;curit&eacute; si un pirate arrive &agrave; red&eacute;finir les constantes de telle mani&egrave;re que le script lui donne acc&egrave;s &agrave; un niveau de droits sup&eacute;rieur. PHP 4.0 vous signalera tout oubli de guillemets comme par exemple dans : <literal>$HTTP_SERVER_VARS[REQUEST_METHOD]</literal>. Modifier ce code en <literal>$HTTP_SERVER_VARS['REQUEST_METHOD']</literal> rendra l'analyseur heureux, et am&eacute;liorera grandement votre style et la s&eacute;curit&eacute; du code. </para> <para> PHP 4.0 vous signalera les variables ou les &eacute;l&eacute;ments de tableaux non initialis&eacute;s. </para> </sect2> </sect1> <sect1 id="migration4.initializers"> <title>Initialiseur</title> <para> Les variables statiques et les membres de classes n'acceptent plus que des initialiseurs scalaires, tandis que PHP 3.0 acceptait aussi les expressions. Cela est d&ucirc;, encore une fois, &agrave; la s&eacute;paration de l'analyse et de l'ex&eacute;cution : aucun code ne peut &ecirc;tre ex&eacute;cut&eacute; tant que l'analyse n'est pas termin&eacute;e. </para> <para> Pour les classes, il vaut mieux initialiser les membres dans le constructeur. Pour les variables statiques, une valeur fixe et simple est la seule chose qui viennent &agrave; l'esprit. </para> </sect1> <sect1 id="migration4.empty"> <title><literal>empty("0")</literal></title> <para> L'&eacute;volution la plus pol&eacute;mique est celle de <function>empty</function>. Une cha&icirc;ne contenant seulement le caract&egrave;re <literal>'0'</literal> (z&eacute;ro) est maintenant consid&eacute;r&eacute;e comme vide, alors qu'elle ne l'&eacute;tait pas en PHP 3.0. </para> <para> Ce nouveau comportement prend tout son sens dans les applications web, puisque tous les r&eacute;sultats de champs de type input sont de type cha&icirc;ne de caract&egrave;res, m&ecirc;me si un nombre est demand&eacute;, et ce, gr&acirc;ce aux capacit&eacute;s de conversion automatique de PHP. D'un autre c&ocirc;t&eacute;, cela peut casser votre code d'une mani&egrave;re tr&egrave;s subtile, menant droit au comportement erratique, difficilement rep&eacute;rable si vous ne savez pas ce qui vous attend. </para> </sect1> <sect1 id="migration4.missing"> <title>Fonctions manquantes</title> <para> Bien que PHP 4.0 dispose de nombreuses nouvelles fonctionnalit&eacute;s fonctions et extensions, vous vous rencontrer des fonctions PHP 3.0 qui manquent. Un petit nombre de fonctions de base n'ont pu &ecirc;tre port&eacute;es en PHP 4.0, maintenant que l'analyse et l'&eacute;x&eacute;cution ont &eacute;t&eacute; s&eacute;par&eacute;es. D'autres fonctions, et m&ecirc;mes des extensions enti&egrave;res sont maintenant obsol&egrave;tes, remplac&eacute;es par de nouvelles fonctions plus puissantes ou plus efficaces. Certaines fonctions n'ont tout simplement pas &eacute;t&eacute; port&eacute;es pour le moment ou pour des raisons de licences. </para> <sect2 id="migration4.missing.concept"> <title>Fonctions manquantes pour des raisons de structure</title> <para> Comme PHP 4.0 s&eacute;pare l'analyse et l'&eacute;x&eacute;cution, il n'est plus possible de modifier le comportement de l'analyseur (int&eacute;gr&eacute; dans le moteur Zend) durant l'&eacute;x&eacute;cution, puisque toute l'analyse a eu lieu, et est termin&eacute;e. La fonction short_tags() a cess&eacute; d'exister. Vous pouvez toujours modifier le comportement de l'analyseur avec le fichier <filename>php.ini</filename>. </para> <para> Une autre fonctionnalit&eacute; qui a disparu est le d&eacute;buggeur de PHP 3.0, comme d&eacute;crit dans un autre appendice. Un nouveau d&eacute;buggeur est promis par Zend, mais il n'a pas encore montr&eacute; le bout de son nez. </para> </sect2> <sect2 id="migration4.deprecate"> <title>Fonctions et extensions obsol&egrave;tes</title> <para> Les extensions Adabas et Solid n'existent plus. Elles sont int&eacute;gr&eacute;es dans les fonctions <link linkend="ref.odbc">ODBC Unifi&eacute;</link>. </para> </sect2> <sect2 id="migration4.unset"> <title>Nouveau statut pour <function>unset</function></title> <para> <function>unset</function>, bient que toujours disponible, a &eacute;t&eacute; impl&eacute;ment&eacute; l&eacute;g&egrave;rement diff&eacute;remment en PHP 4.0, et elle n'est plus vraiment une 'fonction'. </para> <para> Cela n'a pas de cons&eacute;quence directe sur le comportement de <function>unset</function>, mais utiliser cette fonction pour faire un test avec <function>function_exists</function> retournera <literal>FALSE</literal> comme il se doit avec les fonction bas niveau comme <function>echo</function>. </para> <para> Une autre application pratique disparue est qu'il n'est plus possible d'appeler <function>unset</function> indirectement, c'est-&agrave;-dire que <literal>$func="unset"; $func($somevar)</literal> ne fonctionne plus. </para> </sect2> </sect1> <sect1 id="migration4.extensions"> <title>Extensions PHP 3.0</title> <para> Les extensions &eacute;crites pour PHP 3.0 ne fonctionnent plus avec PHP 4.0, ni les ex&eacute;cutables, ni les codes sources. Il n'est pas difficile de porter les extensions de PHP 3.0 &agrave; 4.0 si vous avez acc&egrave;s aux sources originales. Une description d&eacute;taill&eacute;e du processus de portage ne fait pas partie de cet appendice (pour le moment). </para> </sect1> <sect1 id="migration4.string"> <title>Substitution de variables dans les cha&icirc;nes</title> <para> PHP 4.0 dispose d'un nouveau m&eacute;canisme de substitution des variables dans les cha&icirc;nes. Vous pouvez d&eacute;sormais acc&eacute;der aux membres d'objets et aux tableaux multidimensionnels dans une cha&icirc;ne. </para> <para> Pour cela, il suffit de placer la variable entre accolades, le signe $ suivant imm&eacute;diatement la premi&egrave;re accolade : <literal>{$variable['a']}</literal> </para> <para> Pour utiliser la valeur d'un membre d'objet dans une cha&icirc;ne, il suffit d'&eacute;crire : <literal>"text {$obj->member} text"</literal>; alors qu'en PHP 3.0, il fallait faire comme ceci : <literal>"texte".$objet->membre." texte"</literal>. </para> <para> Cette technique rend le code beaucoup plus lisible, mais risque de poser des probl&egrave;mes dans certains scripts PHP 3.0. Vous pouvez facilement traquer ce probl&egrave;me en recherche les s&eacute;quences <literal>{$</literal> dans votre code, et en les rempla&ccedil;ant par <literal>\{$</literal> avec votre outil de remplacement habituel. </para> </sect1> <sect1 id="migration4.cookies"> <title>Cookies</title> <para> PHP 3.0 avait la mauvaise habitude d'envoyer les cookies dans l'ordre inverse de celui du code (l'ordre des appels &agrave; <function>setcookie</function>). PHP 4.0 r&eacute;tablit l'ordre naturel en les envoyant dans le m&ecirc;me ordre que vous m&ecirc;me. </para> <para> Cela peut aussi prendre &agrave; contre-pied certains programmes, mais ce comportement &eacute;tait tellement &eacute;trange qu'il m&eacute;ritait un tel traitement un jour ou l'autre, pour &eacute;viter d'autres probl&egrave;mes ult&eacute;rieurs. </para> </sect1> </appendix><!-- Keep this comment at the end of the fileLocal variables:mode: sgmlsgml-omittag:tsgml-shorttag:tsgml-minimize-attributes:nilsgml-always-quote-attributes:tsgml-indent-step:1sgml-indent-data:tsgml-parent-document:nilsgml-default-dtd-file:"../../manual.ced"sgml-exposed-tags:nilsgml-local-catalogs:nilsgml-local-ecat-files:nilEnd:--> \ No newline at end of file Index: phpdoc/fr/appendices/migration.xml diff -u phpdoc/fr/appendices/migration.xml:1.7 phpdoc/fr/appendices/migration.xml:1.8 --- phpdoc/fr/appendices/migration.xml:1.7 Fri Aug 10 09:20:18 2001 +++ phpdoc/fr/appendices/migration.xml Thu Oct 18 18:42:07 2001 @@ -1,356 +1 @@ -<!-- $Revision: 1.7 $ --> -<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 -sgml-parent-document:nil -sgml-default-dtd-file:"../manual.ced" -sgml-exposed-tags:nil -sgml-local-catalogs:nil -sgml-local-ecat-files:nil -End: ---> +<?xml encoding="iso-8859-1"?><!-- $Revision: 1.8 $ --><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 fileLocal variables:mode: sgmlsgml-omittag:tsgml-shorttag:tsgml-minimize-attributes:nilsgml-always-quote-attributes:tsgml-indent-step:1sgml-indent-data:tsgml-parent-document:nilsgml-default-dtd-file:"../manual.ced"sgml-exposed-tags:nilsgml-local-catalogs:nilsgml-local-ecat-files:nilEnd:--> \ No newline at end of file
« previous php.doc (#969338085) next »