Date: 07/21/00
- Next message: Egon Schmid: "Re: [PHP-DOC] CVS account - Traslation to spanish"
- Previous message: r.m.guerrero <email protected>: "[PHP-DOC] CVS account - Traslation to spanish"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
bibi Fri Jul 21 03:27:52 2000 EDT
Added files:
Index: phpdoc/fr/bookinfo.xml
<bookinfo id="bookinfo">
<author>
<author>
<author>
<author>
<author>
<author>
<author>
</authorgroup>
<pubdate>&php.build-date;</pubdate>
<copyright>
<legalnotice id="legalnotice">
<simpara>
<simpara>
</legalnotice>
</bookinfo>
Index: phpdoc/fr/chapters.ent
<!ENTITY chapter.copyright SYSTEM "chapters/copyright.xml">
<!ENTITY features.http-auth SYSTEM "features/http-auth.xml">
<!ENTITY language.basic-syntax SYSTEM "language/basic-syntax.xml">
<!ENTITY reference.apache SYSTEM "functions/apache.xml">
<!ENTITY appendix.migration SYSTEM "appendices/migration.xml">
Index: phpdoc/fr/preface.xml
<preface id="preface">
<sect1 id="about">
</preface>
<!-- Keep this comment at the end of the file
Index: phpdoc/fr/appendices/debugger.xml
<sect1 id="debugger-using">
<para>
<sect1 id="debugger-protocol">
<literal><replaceable>file</replaceable>:<replaceable>line</replaceable></literal>.
<table>
</appendix>
<!-- Keep this comment at the end of the file
Index: phpdoc/fr/appendices/migration.xml
<sect1 id="migration-about">
<simpara>
<simpara>
<simpara>
<sect1 id="migration-startendtags">
<para>
Comme en version 2.0, PHP/FI accepte aussi cette variante :
<example><title>Migration: premières nouvelles balises start/end </title>
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 surement 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: second new start/end tags</title>
Some people have had problems with editors that don't understand
<example><title>Deuxièmes nouvelles balises start/end</title>
echo "Ceci est du code PHP 3.0!\n";
</script>
<sect1 id="migration-if-endif">
<para>
Notez que les points virgules ont été remplacée par des point dans toutes les commandes, sauf pour la dernière expression (endif).</para></sect1>
<sect1 id="migration-while">
<sect1 id="migration-expr">
<para>
$key = key($a);
<sect1 id="migration-errors">
<sect1 id="migration-booleval">
<sect1 id="migration-truefalse">
<itemizedlist>
<listitem><simpara> <function>echo</function> n'utilise plus de chaîne de formattage. Il faut utiliser <function>printf</function> à la place.</simpara></listitem>
<listitem><simpara>
<listitem><simpara>
<simpara>
<listitem>
<example>
<para>
<programlisting>
<programlisting>
<para>
<programlisting>
</appendix>
<!-- Keep this comment at the end of the file
Index: phpdoc/fr/appendices/phpdevel.xml
<simpara></simpara>
<sect1 id="phpdevel-addfunc">
<sect2 id="phpdevel-addfunc-args">
<para>
<simpara>
if (arg_count < 2 || arg_count > 3 ||
<table>
<para>
<programlisting>
<para>
<simpara>
<simpara>
<simpara>
<sect2 id="phpdevel-addfunc-symtab">
<itemizedlist>
<para>
<example>
<simpara>
<simpara>
/* définit $foo[7] = 5 */
/* définit la prochaine place libre dans $foo[],
<simpara>
<simpara>
<programlisting>
<simpara>
<programlisting>
<simpara>
<para>
<simpara>
<simpara>
<para>
<orderedlist numeration="arabic">
<para>
<para>
<p
/phpdoc/fr bookinfo.xml chapters.ent preface.xml
/phpdoc/fr/appendices debugger.xml migration.xml phpdevel.xml
/phpdoc/fr/chapters config.xml copyright.xml install.xml intro.xml
security.xml
/phpdoc/fr/features connection-handling.xml cookies.xml
error-handling.xml file-upload.xml
http-auth.xml images.xml
persistent-connections.xml remote-files.xml
/phpdoc/fr/functions apache.xml array.xml aspell.xml bc.xml
calendar.xml classobj.xml com.xml cpdf.xml
cybercash.xml datetime.xml dba.xml dbase.xml
dbm.xml dir.xml dl.xml domxml.xml exec.xml
fdf.xml filepro.xml filesystem.xml ftp.xml
gettext.xml http.xml hw.xml ibase.xml icap.xml
ifx.xml image.xml imap.xml info.xml ldap.xml
mail.xml math.xml mcal.xml mcrypt.xml
mhash.xml misc.xml msql.xml mssql.xml
mysql.xml network.xml nis.xml oci8.xml
oracle.xml pcre.xml pdf.xml pgsql.xml
posix.xml recode.xml regex.xml sem.xml
session.xml snmp.xml strings.xml swf.xml
sybase.xml uodbc.xml url.xml var.xml
vmailmgr.xml wddx.xml xml.xml zlib.xml
Log:
French translation of the php documentation.
email protected>?subject=Re:%20[PHP-DOC]%20cvs:%20phpdoc%20/fr%20bookinfo.xml%20chapters.ent%20preface.xml%20%20/fr/appendices%20debugger.xml%20migration.xml%20phpdevel.xml%20%20/fr/chapters%20config.xml%20copyright.xml%20install.xml%20intro.xml%20security.xml%20%20/fr/features%20connection-handling.xml%20cookies.xml%20error-handling.xml%20file-upload.xml%20http-auth.xml%20images.xml%20persistent-connections.xml%20remote-files.xml%20%20/fr/functions%20apache.xml%20array.xml%20aspell.xml%20bc.xml%20calendar.xml%20classobj.xml%20com.xml%20cpdf.xml%20cybercash.xml%20datetime.xml%20dba.xml%20dbase.xml%20dbm.xml%20dir.xml%20dl.xml%20domxml.xml%20exec.xml%20fdf.xml%20filepro.xml%20filesystem.xml%20ftp.xml%20gettext.xml%20http.xml%20hw.xml%20ibase.xml%20icap.xml%20ifx.xml%20image.xml%20imap.xml%20info.xml%20ldap.xml%20mail.xml%20math.xml%20mcal.xml%20mcrypt.xml%20mhash.xml%20misc.xml%20msql.xml%20mssql.xml%20mysql.xml%20network.xml%20nis.xml%20oci8.xml%20oracle.xml%20pcre.xml%20pdf.xml%20pgsql.xml%20po
+++ phpdoc/fr/bookinfo.xml
<authorgroup id="authors">
<firstname>Stig</firstname><surname>Sęther Bakken</surname>
</author>
<firstname>Alexander</firstname><surname>Aulbach</surname>
</author>
<firstname>Egon</firstname><surname>Schmid</surname>
</author>
<firstname>Jim</firstname><surname>Winstead</surname>
</author>
<firstname>Lars Torben</firstname><surname>Wilson</surname>
</author>
<firstname>Rasmus</firstname><surname>Lerdorf</surname>
</author>
<firstname>Zeev</firstname><surname>Suraski</surname>
</author>
<editor>
<firstname>Stig Sęther</firstname>
<surname>Bakken</surname>
<authorblurb><simpara> Email: <ulink url="mailto:&email.stig;"><literal>&email.stig;</literal></ulink>
</simpara></authorblurb>
</editor>
<year>1997</year>
<year>1998</year>
<year>1999</year>
<year>2000</year>
<holder>the PHP Documentation Group</holder>
</copyright>
<title>Copyright</title>
Ce manuel est © Copyright 1997, 1998, 1999, 2000 par PHP Documentation
Group. Les membres de ce groupe sont listés <link linkend="authors">sur la première page de ce manuel</link>.</simpara>
Ce manuel peut être redistribué sous licence GNU General Public License, comme stipulé
par la Free Software Foundation; soit la version 2 de la Licence, soit (à votre
choix), une version ultérieure.</simpara>
<!-- 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:
-->
+++ phpdoc/fr/chapters.ent
<!ENTITY preface SYSTEM "preface.xml">
<!ENTITY bookinfo SYSTEM "bookinfo.xml">
<!ENTITY chapter.introduction SYSTEM "chapters/intro.xml">
<!ENTITY chapter.install SYSTEM "chapters/install.xml">
<!ENTITY chapter.config SYSTEM "chapters/config.xml">
<!ENTITY chapter.security SYSTEM "chapters/security.xml">
<!ENTITY features.cookies SYSTEM "features/cookies.xml">
<!ENTITY features.file-upload SYSTEM "features/file-upload.xml">
<!ENTITY features.remote-files SYSTEM "features/remote-files.xml">
<!ENTITY features.connection-handling SYSTEM "features/connection-handling.xml">
<!ENTITY features.error-handling SYSTEM "features/error-handling.xml">
<!ENTITY features.images SYSTEM "features/images.xml">
<!ENTITY features.persistent-connections SYSTEM "features/persistent-connections.xml">
<!ENTITY language.types SYSTEM "language/types.xml">
<!ENTITY language.variables SYSTEM "language/variables.xml">
<!ENTITY language.constants SYSTEM "language/constants.xml">
<!ENTITY language.expressions SYSTEM "language/expressions.xml">
<!ENTITY language.operators SYSTEM "language/operators.xml">
<!ENTITY language.functions SYSTEM "language/functions.xml">
<!ENTITY language.control-structures SYSTEM "language/control-structures.xml">
<!ENTITY language.oop SYSTEM "language/oop.xml">
<!ENTITY reference.array SYSTEM "functions/array.xml">
<!ENTITY reference.aspell SYSTEM "functions/aspell.xml">
<!ENTITY reference.bc SYSTEM "functions/bc.xml">
<!ENTITY reference.cpdf SYSTEM "functions/cpdf.xml">
<!ENTITY reference.datetime SYSTEM "functions/datetime.xml">
<!ENTITY reference.dbase SYSTEM "functions/dbase.xml">
<!ENTITY reference.dba SYSTEM "functions/dba.xml">
<!ENTITY reference.dbm SYSTEM "functions/dbm.xml">
<!ENTITY reference.calendar SYSTEM "functions/calendar.xml">
<!ENTITY reference.dir SYSTEM "functions/dir.xml">
<!ENTITY reference.dl SYSTEM "functions/dl.xml">
<!ENTITY reference.exec SYSTEM "functions/exec.xml">
<!ENTITY reference.fdf SYSTEM "functions/fdf.xml">
<!ENTITY reference.filepro SYSTEM "functions/filepro.xml">
<!ENTITY reference.filesystem SYSTEM "functions/filesystem.xml">
<!ENTITY reference.ftp SYSTEM "functions/ftp.xml">
<!ENTITY reference.http SYSTEM "functions/http.xml">
<!ENTITY reference.hw SYSTEM "functions/hw.xml">
<!ENTITY reference.ibase SYSTEM "functions/ibase.xml">
<!ENTITY reference.ifx SYSTEM "functions/ifx.xml">
<!ENTITY reference.image SYSTEM "functions/image.xml">
<!ENTITY reference.imap SYSTEM "functions/imap.xml">
<!ENTITY reference.mcal SYSTEM "functions/mcal.xml">
<!ENTITY reference.ldap SYSTEM "functions/ldap.xml">
<!ENTITY reference.mail SYSTEM "functions/mail.xml">
<!ENTITY reference.math SYSTEM "functions/math.xml">
<!ENTITY reference.mcrypt SYSTEM "functions/mcrypt.xml">
<!ENTITY reference.mhash SYSTEM "functions/mhash.xml">
<!ENTITY reference.misc SYSTEM "functions/misc.xml">
<!ENTITY reference.msql SYSTEM "functions/msql.xml">
<!ENTITY reference.mssql SYSTEM "functions/mssql.xml">
<!ENTITY reference.mysql SYSTEM "functions/mysql.xml">
<!ENTITY reference.nis SYSTEM "functions/nis.xml">
<!ENTITY reference.sybase SYSTEM "functions/sybase.xml">
<!ENTITY reference.network SYSTEM "functions/network.xml">
<!ENTITY reference.oci8 SYSTEM "functions/oci8.xml">
<!ENTITY reference.oracle SYSTEM "functions/oracle.xml">
<!ENTITY reference.pcre SYSTEM "functions/pcre.xml">
<!ENTITY reference.pdf SYSTEM "functions/pdf.xml">
<!ENTITY reference.posix SYSTEM "functions/posix.xml">
<!ENTITY reference.recode SYSTEM "functions/recode.xml">
<!ENTITY reference.info SYSTEM "functions/info.xml">
<!ENTITY reference.pgsql SYSTEM "functions/pgsql.xml">
<!ENTITY reference.regex SYSTEM "functions/regex.xml">
<!ENTITY reference.sem SYSTEM "functions/sem.xml">
<!ENTITY reference.session SYSTEM "functions/session.xml">
<!ENTITY reference.snmp SYSTEM "functions/snmp.xml">
<!ENTITY reference.strings SYSTEM "functions/strings.xml">
<!ENTITY reference.uodbc SYSTEM "functions/uodbc.xml">
<!ENTITY reference.url SYSTEM "functions/url.xml">
<!ENTITY reference.var SYSTEM "functions/var.xml">
<!ENTITY reference.vmailmgr SYSTEM "functions/vmailmgr.xml">
<!ENTITY reference.wddx SYSTEM "functions/wddx.xml">
<!ENTITY reference.zlib SYSTEM "functions/zlib.xml">
<!ENTITY reference.xml SYSTEM "functions/xml.xml">
<!ENTITY appendix.development SYSTEM "appendices/phpdevel.xml">
<!ENTITY appendix.debugger SYSTEM "appendices/debugger.xml">
+++ phpdoc/fr/preface.xml
<title>Préface</title>
<abstract>
<simpara>
<acronym>PHP</acronym>, signifie "PHP: Hypertext
Preprocessor" (Preprocesseur HyperTexte) , est un langage de script HTML
La plupart de sa syntaxe est empruntée au langages C, Java et Perl, mais
y ajoute plusieurs fonctionnalités uniques. Le but de ce langage est de
permettre aux developpeurs web de concevoir rapidement des sites, aux pages
dynamiques
</simpara>
</abstract>
<title>A propos de ce manuel</title>
<para>
Ce manuel est écrit en <acronym>SGML</acronym> en utilisant <ulink
url="&url.docbook;">DocBook DTD</ulink>, avec <ulink
url="&url.dsssl;"><acronym>DSSSL</acronym></ulink> (Document
Style and Semantics Specification Language) pour le formattage. Les utilitaires
utilisés pour générer le format <acronym>HTML</acronym>,
<acronym>TeX</acronym> et <acronym>RTF</acronym> sont
<ulink url="&url.jade;">Jade</ulink>, écrit <ulink
url="&url.jclark;">James Clark</ulink> et <ulink
url="&url.dbstyle;">The Modular DocBook Stylesheets</ulink>
écrit par <ulink url="&url.nwalsh;">Norman Walsh</ulink>.
La documentation PHP a ete assemblée par &link.stig;.
</para>
<para>
Ce manuel a été traduit en Français par <ulink url="mailto:http://www.texinfo.com/">texi</ulink>.
</para>
</sect1>
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:
-->
+++ phpdoc/fr/appendices/debugger.xml
<appendix id="debugger">
<title>Débuggeur PHP</title>
<title>Utiliser le débuggeur PHP</title>
Le débuggeur PHP sert à repérer les bugs récalcitrants. Le débuggeur fonctionne en se
connectant à un port <acronym>TCP</acronym> à chaque démarrage de PHP. Tous les
messages d'erreur seront envoyés sur cette connexion. Cette page est faite pour un
"serveur de débuggage", qui peut peut fonctionner avec un <acronym>IDE</acronym> ou un éditeur programmable (tel que Emacs).
</para>
<para>
Comment paramétrer le débuggeur :
<orderedlist>
<listitem>
<simpara>
Réservez un port TCP por le débuggeur dans le fichier
<link linkend="configuration.file">de configuration</link>
(<link linkend="ini.debugger.port">debugger.port</link>) et activez le
(<link linkend="ini.debugger.enabled">debugger.enabled</link>).
</simpara>
</listitem>
<listitem>
<simpara>
Configurer un client TCP sur ce port (par exemple
<command>socket -l -s 1400</command> sous UNIX).
</simpara>
</listitem>
<listitem>
<simpara>
Dans votre code, placez la ligne "debugger_on(<replaceable>host</replaceable>)", oú <replaceable>host</replaceable> est l'IP ou le nom de l'hôte qui supporte le
client <acronym>TCP</acronym>.
</simpara>
</listitem>
</orderedlist>
Desormais, toutes les alertes, notes, ... seront envoyées sur la socket client,
, <emphasis>même si vous avez inactivé le rapport d'erreur avec
<function>error_reporting</function></emphasis>.
</para>
</sect1>
<title>Debugger Protocol</title>
<para>
Le protocole de débugage est ligne par ligne. Chaque ligne a un type <emphasis>type</emphasis>, et plusieurs lignes composent un message
Chaque message commence avec une ligne du type <literal>start</literal> et se termine
avec une ligne de type <literal>end</literal>. PHP peut envoyer des lignes de plusieurs messages simultanément.
</para>
<para>
Voici un exemple de ligne à ce format :
<informalexample>
<literallayout>
<replaceable>date</replaceable> <replaceable>time</replaceable>
<replaceable>host</replaceable>(<replaceable>pid</replaceable>)
<replaceable>type</replaceable>:
<replaceable>message-data</replaceable>
</literallayout>
</informalexample>
<variablelist>
<varlistentry>
<term><replaceable>date</replaceable></term>
<listitem>
<simpara>
Les dates sont au format ISO 8601
(<replaceable>yyyy</replaceable>-<replaceable>mm</replaceable>-<replaceable>dd</replaceable>)
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><replaceable>time</replaceable></term>
<listitem>
<simpara>Les heures inclus les micro secondes:
<replaceable>hh</replaceable>:<replaceable>mm</replaceable>:<replaceable>uuuuuu</replaceable>
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><replaceable>host</replaceable></term>
<listitem>
<simpara>
Le nom DNS ou adresse IP de l'hôte qui a généré l'erreur.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><replaceable>pid</replaceable></term>
<listitem>
<simpara>
PID (process id) sur l'hôte <replaceable>host</replaceable>, qui a généré
l'erreur.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><replaceable>type</replaceable></term>
<listitem>
<para>
Type de la ligne. Indique au programme client comment traiter les données
suivantes :
<table>
<title>Debugger Line Types</title>
<tgroup cols="2">
<thead>
<row>
<entry>Nom</entry>
<entry>Signification</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>start</literal></entry>
<entry>
Indique au programme client que le message du débuggeur commence ici. Le
contenu de <replaceable>data</replaceable> sera un type d'erreur, comme
listé ci dessous.
</entry>
</row>
<row>
<entry><literal>message</literal></entry>
<entry>Le mesage d'erreur PHP.</entry>
</row>
<row>
<entry><literal>location</literal></entry>
<entry>
Nom du fichier, et numéro de ligne, oú l'erreur est survenue.
La première occurence de <literal>location</literal> contiendra toujours
la localisation générale. <replaceable>data</replaceable> contiendra :
Il y a toujours une indication de <literal>location</literal> après un
<literal>message</literal> et après chaque <literal>function</literal>.
</entry>
</row>
<row>
<entry>
<literal>frames</literal></entry>
<entry>Nombre de frames dans le dump de lap il. Si il y a 4 frames, attendez
vous à des information sur 4 niveaux de fonctions. Si la ligne "frame" n'existe
pas, la profondeur doit être 0 (une erreur est survenue au niveau général).
</entry>
</row>
<row>
<entry>
<literal>function</literal></entry>
<entry>
Nom de la fonction qui a généré l'erreur. Elle sera répétée à chaque
niveau de la pile d'appel.
</entry>
</row>
<row>
<entry><literal>end</literal></entry>
<entry>
Indique au client que le message se termine ici.
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><replaceable>data</replaceable></term>
<listitem>
<simpara>Ligne de données.</simpara>
</listitem>
</varlistentry>
</variablelist>
<title>Types d'erreur du débuggeur</title>
<tgroup cols="2">
<thead>
<row>
<entry>Débuggeur</entry>
<entry>Interne PHP</entry>
</row>
</thead>
<tbody>
<row>
<entry><errortype>alerte (warning)</errortype></entry>
<entry><errortype>E_WARNING</errortype></entry>
</row>
<row>
<entry><errortype>erreur</errortype></entry>
<entry><errortype>E_ERROR</errortype></entry>
</row>
<row>
<entry><errortype>analyse (parse)</errortype></entry>
<entry><errortype>E_PARSE</errortype></entry>
</row>
<row>
<entry><errortype>note (notice)</errortype></entry>
<entry><errortype>E_NOTICE</errortype></entry>
</row>
<row>
<entry><errortype>core-error</errortype></entry>
<entry><errortype>E_CORE_ERROR</errortype></entry>
</row>
<row>
<entry><errortype>core-warning</errortype></entry>
<entry><errortype>E_CORE_WARNING</errortype></entry>
</row>
<row>
<entry><errortype>inconnue</errortype></entry>
<entry>(toutes les autres)</entry>
</row>
</tbody>
</tgroup>
</table>
<example>
<title>Exemple de message du Debugger</title>
<literallayout>
1998-04-05 23:27:400966 lucifer.guardian.no(20481) start: notice
1998-04-05 23:27:400966 lucifer.guardian.no(20481) message: Uninitialized variable
1998-04-05 23:27:400966 lucifer.guardian.no(20481) location: (null):7
1998-04-05 23:27:400966 lucifer.guardian.no(20481) frames: 1
1998-04-05 23:27:400966 lucifer.guardian.no(20481) function: display
1998-04-05 23:27:400966 lucifer.guardian.no(20481) location: /home/ssb/public_html/test.php3:10
1998-04-05 23:27:400966 lucifer.guardian.no(20481) end: notice
</literallayout>
</example>
</para>
</sect1>
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:
-->
+++ phpdoc/fr/appendices/migration.xml
<appendix id="migration">
<title>Migration de PHP/FI 2.0 à PHP 3.0</title>
<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>
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>
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>
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>
<title>Start/end tags</title>
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>
<? echo "Ceci est du code PHP/FI 2.0.\n"; >
</programlisting></example>
<programlisting>
<? echo "Ceci est du code PHP 3.0!\n"; ?>
</programlisting></example>
<programlisting>
<?php echo "This is PHP 3.0 code!\n"; ?>
</programlisting></example>
the processing instruction tags at all. Microsoft FrontPage is one
such editor, and as a workaround for these, the following variation
was introduced as well:
<programlisting>
<script language="php">
</programlisting></example></para></sect1>
<title>if..endif syntax</title>
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>
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>
if ($foo):
echo "oui\n";
elseif ($bar):
echo "presque\n";
else:
echo "non\n";
endif;
</programlisting></example>
<title>while syntax</title>
<para>
Tout comme pour if..endif, la syntaxe des boucles while..endwhile a changée
as well:
<example><title>Migration: ancienne syntaxe while..endwhile </title>
<programlisting>
while ($more_to_come);
...
endwhile;
</programlisting></example>
<example><title>Migration: nouvelle syntaxe while..endwhile</title>
<programlisting>
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>
<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 cotés de
l'expression, et cela peut produire des résultats inattendus avec les scripts 2.0.
</simpara>
<simpara></simpara>
Considérez les lignes suivantes:
<informalexample><programlisting>
$a[0]=5;
$a[1]=7;
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é, 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 variablelist 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>
while ((string)$key != "") {
</programlisting></informalexample></para></sect1>
<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>
<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 <function_old>test_me</function_old>
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>
<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'echec, la plus part 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>
$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>
$fp = <email protected>($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>
<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>
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>
Lire un tableau avec $array[] n'est plus valable.</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>
<simpara> <literal>"+"</literal> n'est plus utilisable comme opérateur de
concaténation de chaîne. A la place, il converti les arguments en nombres,
et effectue une addition numérique. Utilisez <literal>"."</literal> à la place.
</simpara></listitem>
</itemizedlist>
<title>Migration depuis 2.0: concaténation de chaînes</title>
<programlisting>
echo "1" + "1";
</programlisting>
En PHP 2.0 cela retournerait 11, en PHP 3.0 cela va retourner 2. A la place, faites :
echo "1"."1";
</programlisting>
$a = 1;
$b = 1;
echo $a + $b;
</programlisting></para>
Cela va afficher 2, tant en PHP 2.0 qu'en 3.0.
$a = 1;
$b = 1;
echo $a.$b;
</programlisting>
Cela va afficher 11 en PHP 3.0.</para>
</example></sect1>
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:
-->
+++ phpdoc/fr/appendices/phpdevel.xml
<appendix id="phpdevel">
<title>Développement PHP</title>
<title>Adding functions to PHP3</title>
<sect2 id="phpdevel-addfunc-prototype">
<title>Prototypes de fonctions</title>
<para>
Toutes les fonctions suivent le schéma suivant :
<programlisting>
void php3_foo(INTERNAL_FUNCTION_PARAMETERS) {
}
</programlisting>
Même si votre fonction ne prend aucun argument, c'est comme cela qu'elle doit être
appelée.
</para>
</sect2>
<title>Arguments de fonctions</title>
<para>
Les arguments sont toujours de type val. Ce type contient un membre de type union,
qui indique le type réél d'argument. De cette façon, si votre fonction prend deux
arguments, elle ressemble à ceci :
</para>
<example>
<title>Argument de fonction de lecture</title>
<programlisting>
pval *arg1, *arg2;
if (ARG_COUNT(ht) != 2 || getParameters(ht,2,&arg1,&arg2)==FAILURE) {
WRONG_PARAM_COUNT;
}
</programlisting>
</example>
NOTE: Les arguments peuvent être passé par valeur ou par référence. Dans les deux cas,
vous devez passer &(pval *) à getParameters. Si vous voulez vérifier que le n-ième
paramètre a été passé par référence ou par valeur, vous devez utiliser la fonction
ParameterPassedByReference(ht,n). Elle retournera 1 ou 0.
</para>
<simpara>
Lorsque vous modifiez l'un des paramètres, qu'ils soient envoyés par référence ou par
valeur, vous pouvez le passer à pval_destructor pour le réinitialiser, ou, s'il s'agit
d'un tableau et que vous voulez ajouter des valeurs, vous pouvez utiliser des fonctions
similaires à celles qui sont dans internal_functions.h, qui manipule
return_value comme tableau.
</simpara>
Par ailleurs, si vous modifiez un paramètre en IS_STRING, assurez vous que
vous avez bien assigné un nouvelle chaîne avec estrdup()'ed et une nouvelle longueur
de chaîne. Seulement après, vous pouvez modifier le type en IS_STRING.
Si vous modifiez une chaîne en IS_STRING ou IS_ARRAY vous devez d'abord appeler le
destructeur pval_destructor.
</simpara>
</sect2>
<sect2 id="phpdevel-addfunc-varargs">
<title>Fonctions à nombre d'arguments variable</title>
<para>
Une function peut prendre un nombre variable d'arguments. Si votre fonction peut prendre
deux ou trois arguments, utiliser la syntaxe suivante :
</para>
<para>
<example>
<title>Fonctions à nombre d'arguments variable</title>
<programlisting>
pval *arg1, *arg2, *arg3;
int arg_count = ARG_COUNT(ht);
getParameters(ht,arg_count,&arg1,&arg2,&arg3)==FAILURE) {
WRONG_PARAM_COUNT;
}
</programlisting>
</example>
</para>
</sect2>
<sect2 id="phpdevel-addfunc-using-args">
<title>Utiliser les arguments d'une fonction</title>
<para>
De type de chaque argument est stocké dans le champs pval. Ce champs peut prendre les
valeurs suivantes :
<title>Types de données interne PHP</title>
<tgroup cols="2">
<tbody>
<row>
<entry>IS_STRING</entry>
<entry>Chaîne de caractères</entry>
</row>
<row>
<entry>IS_DOUBLE</entry>
<entry>Nombre à virgule flottante, en précision double</entry>
</row>
<row>
<entry>IS_LONG</entry>
<entry>Entier long</entry>
</row>
<row>
<entry>IS_ARRAY</entry>
<entry>Tableau</entry>
</row>
<row>
<entry>IS_EMPTY</entry>
<entry>Aucune</entry>
</row>
<row>
<entry>IS_USER_FUNCTION</entry>
<entry>??</entry>
</row>
<row>
<entry>IS_INTERNAL_FUNCTION</entry>
<entry>?? (Si ce type ne peut pas être passé à une fonction, effacez le)</entry>
</row>
<row>
<entry>IS_CLASS</entry>
<entry>??</entry>
</row>
<row>
<entry>IS_OBJECT</entry>
<entry>??</entry>
</row>
</tbody>
</tgroup>
</table></para>
Si vous recevez un argument d'un type, te que vous voulez l'utiliser avec un autre
type, ou si vous voulez simplement forcer le type, vous pouvez utiliser l'une des
fonctions de conversion suivante :
convert_to_long(arg1);
convert_to_double(arg1);
convert_to_string(arg1);
convert_to_boolean_long(arg1); /* Si la chaîne est "" ou "0" elle devient 0, 1 sinon */
convert_string_to_number(arg1); /* Converti une chaîne en LONG ou DOUBLE suivant la chaîne */
</programlisting></para>
<simpara>
Ces fonctions convertissent sur place : elles ne retourne aucune valeur.
</simpara>
La valeur de l'argument est enregistrées dans une union. Les membres sont :
<itemizedlist>
<listitem><simpara>IS_STRING: arg1->value.str.val</simpara></listitem>
<listitem><simpara>IS_LONG: arg1->value.lval</simpara></listitem>
<listitem><simpara>IS_DOUBLE: arg1->value.dval</simpara></listitem>
</itemizedlist></para></sect2>
<sect2 id="phpdevel-addfunc-memmgmt">
<title>Gestion de la mémoire dans une fonction</title>
<simpara>
Toute la mémoire nécessaire à une fonctoin doit être allouée avec emalloc() ou
estrdup(). Ces fonctions ont le gout et l'odeur des classiques malloc() et
strdup(). La mémoire doit êtrel libérée avec efree().
</simpara>
Il y a deux types de mémoire dans ce programme : la mémoire qui est retournée à l'
analyseur, et la mémoire qui nécessaire pour le stockage temporaire dans la fonction.
Lorsque vous assignes une chaîne dans une variable qui est retournée à l'analyseur,
assurez vous de bien allouer la mémoire avec emalloc() ou estrdup(). Cette mémoire
ne doit JAMAIS être libérée, sauf si vous réécrivez votre original plus loin, dans
la même fonction (mais ce n'est pas de la programmation propre).
</simpara>
Pour tous vos besoins en mémoire temporaire/permanante dont vous avez besoin dans
vos fonctions/librairies, vous devez utiliser les fonctions emalloc(), estrdup(),
et efree(). Elles se comportent EXACTEMENT comme leur homologues. Tout ce qui
est créé avec emalloc() ou estrdup() doit être libéré avec efree()
à un moment ou un autre, à moins que ce ne soit utile ailleurs dans le programme;
sinon, il va y avoir une fuite de mémoire. La signification de "Elles se comportent
EXACTEMENT comme leur homologues" est que si vous libérez une variable qui n'a pas
été créée avec emalloc() ou estrdup(), vous courez droit à la "segmentation fault".
Soyez alors extrêmement prudent, et libérez toute votre mémoire inutilisée.
</simpara>
Si vous compilez avec "-DDEBUG", PHP3 affichera la liste de tous les appels à
emalloc() et estrdup() mais jamais à efree() lorsque ce intervient dans un script
spécifié.
</simpara>
</sect2>
<title>Affecter une variable dans la table des Symboles</title>
<para>
Un grand nombre de macros sont disponibles pour rendre plus facile l'insertion de
variables dans la table des symboles :
<listitem><simpara>SET_VAR_STRING(name,value) <footnoteref linkend="symtab-1"/></footnoteref></simpara></listitem>
<listitem><simpara>SET_VAR_DOUBLE(name,value)</simpara></listitem>
<listitem><simpara>SET_VAR_LONG(name,value)</simpara></listitem>
</itemizedlist></para>
<footnote id="symtab-1">
<simpara>
Soyez prudent. La valeur doit être placée dans une portion de mémoire créée avec
malloc(), sinon le gestionnaire de mémoire essayera de libérer le pointeur plus
tard. Ne passez aucune mémoire allouée statiquement à SET_VAR_STRING.
</simpara>
</footnote></para>
<simpara>
Les tables des symboles de PHP 3.0 est une table de hash. A n'importe quel moment,
&symbol_table est un pointeur sur la table principale, et
active_symbol_table pointe sur la table actuellement utilisée.
(ces deux tables peuvent être identiques au démarrage, ou différent, suivant que
vous etes dans une fonction ou non).
</simpara>
<para>
Les exemples suivants utilisent 'active_symbol_table'. Vous devriez la remplacer par
&symbol_table si vous voulez travailler sur la table principale.
De plus, les mêmes fonctions peuvent être appliquées à des tableaux, comme expliqué
ci dessous.
</para>
<para>
<example>
<title>Vérification de l'existance de $foo dans la table des sympboles</title>
<programlisting>
if (hash_exists(active_symbol_table,"foo",sizeof("foo"))) { existe... }
else { n'existe pas }
</programlisting>
</example>
<title>Rechercher la taille d'une variable dans la table des symboles</title>
<programlisting>
hash_find(active_symbol_table,"foo",sizeof("foo"),&pvalue);
check(pvalue.type);
</programlisting>
</example>
En PHP 3.0, les tableaux sont implémentés en utilisant les mêmes tables de hash que
les variables. Cela signifie que les deux fonctions ci dessus peuvent être appelées
pour vérifier la présence de variables dans un tableau.
</para>
<simpara>
Si vous voulez définir un nouveau tableau dans la table des symboles, utiliser le code
suivant.
</simpara>
D'abord, vous devez vérifier qu'il n'existe pas, avec hash_exists() ou
hash_find().
</simpara>
Puis, initialisez le tableau :</simpara>
<para>
<example>
<title>Initialisation d'un tableau</title>
<programlisting>
pval arr;
if (array_init(&arr) == FAILURE) { failed... };
hash_update(active_symbol_table,"foo",sizeof("foo"),&arr,sizeof(pval),NULL);
</programlisting>
</example>
Ce code déclare un nouveau tableau, appelé $foo, dans la table de symbole Ce tableau est vide.
</para>
<simpara>
Voici comment ajouter deux nouvelles entrées dans ce tableau :
</simpara>
<para>
<example>
<title>Ajout d'entrées dans un tableau.</title>
<programlisting>
pval entry;
entry.type = IS_LONG;
entry.value.lval = 5;
/* définit $foo["bar"] = 5 */
hash_update(arr.value.ht,"bar",sizeof("bar"),&entry,sizeof(pval),NULL);
hash_index_update(arr.value.ht,7,&entry,sizeof(pval),NULL);
* $foo[8], qui sera 5 (comme en php2)
*/
hash_next_index_insert(arr.value.ht,&entry,sizeof(pval),NULL);
</programlisting>
</example>
Si vous voulez modifier une valeur que vous avez inséré dans une table de hash,
vous devez d'abord la lire dans la table. Pour éviter cette recherche, vous pouvez
fournir une pval ** à la fonction d'ajout dans la table de hash, et elle modifiera
la valeur à l'adresse pval *, avec la valeur donnée. Si cette valeur est NULL,
(comme dans tous les exemples ci dessus), ce paramètre sera ignoré.
</para>
hash_next_index_insert() utiliser plus ou moins la même logique que
"$foo[] = bar;" in PHP 2.0.</simpara>
Si vous construisez un tableau, pour le retourner, vous pouvez l'initialiser comme ceci
:
</simpara>
if (array_init(return_value) == FAILURE) { échec...; }
</programlisting>
...puis ajouter les valeurs grāces aux macros:</simpara>
add_next_index_long(return_value,long_value);
add_next_index_double(return_value,double_value);
add_next_index_string(return_value,estrdup(string_value));
</programlisting>
<para>
Bien sur, si l'ajout n'est pas fait juste après l'initialisation, vous devrez
d'abord rechercher le tableau :
<programlisting>
pval *arr;
if (hash_find(active_symbol_table,"foo",sizeof("foo"),(void **)&arr)==FAILURE) { introuvable... }
else { utilisez arr->value.ht... }
</programlisting></para>
Notez que hash_find recoit un pointeur sur un pointeur sur pval, et pas un
pointeur sur pval.</simpara>
<simpara>
Toutes les fonctions d'accès aux hash retourne SUCCES (SUCCES) ou ECHEC (FAILURE), excepté hash_exists(), qui retourne un booléen.
</simpara>
</sect2>
<sect2 id="phpdevel-addfunc-retsimple">
<title>Retourne une valeur simple</title>
<simpara>
Un grand nombre de macros sont disponible pour simplifier le retour des valeurs.
</simpara>
La macro RETURN_* fixe la valeur de retour, et termine la fonction :
<itemizedlist>
<listitem><simpara>RETURN</simpara></listitem>
<listitem><simpara>RETURN_FALSE</simpara></listitem>
<listitem><simpara>RETURN_TRUE</simpara></listitem>
<listitem><simpara>RETURN_LONG(l)</simpara></listitem>
<listitem><simpara>RETURN_STRING(s,dup) Si dup est TRUE, duplique la chaîne.</simpara></listitem>
<listitem><simpara>RETURN_STRINGL(s,l,dup) Retourne la chaîne (s) en spécifiant la longueur (l).</simpara></listitem>
<listitem><simpara>RETURN_DOUBLE(d)</simpara></listitem>
</itemizedlist></para>
<para>
La macro RETVAL_* macros fixe la valeur de retour, mais ne termine pas la fonction.
<itemizedlist>
<listitem><simpara>RETVAL_FALSE</simpara></listitem>
<listitem><simpara>RETVAL_TRUE</simpara></listitem>
<listitem><simpara>RETVAL_LONG(l)</simpara></listitem>
<listitem><simpara>RETVAL_STRING(s,dup) Si dup est TRUE, duplique la chaîne</simpara></listitem>
<listitem><simpara>RETVAL_STRINGL(s,l,dup) Retourne la chaîne (s) en spécifiant la longueur (l).</simpara></listitem>
<listitem><simpara>RETVAL_DOUBLE(d)</simpara></listitem>
</itemizedlist></para>
Les macros ci dessus vont utiliser estrdup() sur les arguments passés. Cela vous
permet de libérer tranquillement les arguments après avoir appelé cette fonction,
ou bien, utiliser de la mémoire allouée statiquement.
</simpara>
Si votre fonction retourne un booléen de succès/erreur, utilisez toujours
RETURN_TRUE et RETURN_FALSE respectivement.</simpara></sect2>
<sect2 id="phpdevel-addfunc-retcomplex">
<title>Retourner des valeurs complexes</title>
<simpara>
Votre fonction peut aussi retourner des valeurs complexes, tels que des objets ou
tableaux.</simpara>
Retourner un objet:
<listitem><simpara>Appeler object_init(return_value).</simpara></listitem>
<listitem><para>Remplissez les valeurs. Les fonctions utilisables sont listées ci
dessous.</para></listitem>
<listitem><para> Eventuellement, enregistrez les fonctions pour cet objet.
Afin de lire des valeurs de cet objet, la fonction doit lire dans "this",
dans la table de symbole active active_symbol_table. Son type doit être
IS_OBJECT, et c'est une table de hash basique. (i.e., vous pouvez utiliser les
fonctions habituelles de .value.ht). L'enregistrement réél peut être fait comme suit :
<programlisting>
add_method( return_value, function_name, function_ptr );
</programlisting></para></listitem>
</orderedlist></para>
Les fonctions d'accès aux objets sont :
<itemizedlist>
<listitem><simpara>add_property_long( return_value,
property_name, l ) - Ajoute un membre nommé 'property_name', de type long, égal à
'l'</simpara></listitem>
<listitem><simpara>add_property_double( return_value,
property_name, d ) - Idem, ajoute un double</simpara></listitem>
<listitem><simpara>add_property_string( return_value,
property_name, str ) - Idem, ajoute une chaîne</simpara></listitem>
<listitem><simpara>add_property_stringl( return_value,
property_name, str, l ) - Idem, ajoute une chaîne de longueur 'l'.</simpara></listitem>
</itemizedlist></para>
Retournez un tableau :
<orderedlist numeration="arabic">
<listitem><simpara>Appelez array_init(return_value).</simpara></listitem>
<listitem><simpara>Remplisez les valeurs. Les fonctions disponibles sont listées
ci dessous.</simpara></listitem>
</orderedlist></para>

