[PHP-DOC] cvs: phpdoc /fr bookinfo.xml chapters.ent preface.xml /fr/appendices debugger.xml migration.xml phpdevel.xml /fr/chapters config.xml copyright.xml install.xml intro.xml security.xml /fr/features connection-handling.xml cookies.xml error-handling.xml file-upload.xml http-auth.xml images.xml persistent-connections.xml remote-files.xml /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 From: Ghislain Seguy (bibi <email protected>)
Date: 07/21/00

bibi Fri Jul 21 03:27:52 2000 EDT

  Added files:
    /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
  
  
  

Index: phpdoc/fr/bookinfo.xml
+++ phpdoc/fr/bookinfo.xml

 <bookinfo id="bookinfo">
  <authorgroup id="authors">

   <author>
    <firstname>Stig</firstname><surname>Sęther Bakken</surname>
   </author>

   <author>
    <firstname>Alexander</firstname><surname>Aulbach</surname>
   </author>

   <author>
    <firstname>Egon</firstname><surname>Schmid</surname>
   </author>

   <author>
    <firstname>Jim</firstname><surname>Winstead</surname>
   </author>

   <author>
    <firstname>Lars Torben</firstname><surname>Wilson</surname>
   </author>

   <author>
    <firstname>Rasmus</firstname><surname>Lerdorf</surname>
   </author>

   <author>
    <firstname>Zeev</firstname><surname>Suraski</surname>
   </author>

  </authorgroup>

  <pubdate>&php.build-date;</pubdate>
 
  <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>

  <copyright>
   <year>1997</year>
   <year>1998</year>
   <year>1999</year>
   <year>2000</year>
   <holder>the PHP Documentation Group</holder>
  </copyright>

  <legalnotice id="legalnotice">
   <title>Copyright</title>

   <simpara>
    Ce manuel est &copy; Copyright 1997, 1998, 1999, 2000 par PHP Documentation
    Group. Les membres de ce groupe sont list&eacute;s <link linkend="authors">sur la premi&egrave;re page de ce manuel</link>.</simpara>

   <simpara>
    Ce manuel peut &ecirc;tre redistribu&eacute; sous licence GNU General Public License, comme stipul&eacute;
    par la Free Software Foundation; soit la version 2 de la Licence, soit (&agrave; votre
    choix), une version ult&eacute;rieure.</simpara>

  </legalnotice>

 </bookinfo>
 
<!-- 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:
-->

Index: phpdoc/fr/chapters.ent
+++ phpdoc/fr/chapters.ent
<!ENTITY preface SYSTEM "preface.xml">
<!ENTITY bookinfo SYSTEM "bookinfo.xml">

<!ENTITY chapter.copyright SYSTEM "chapters/copyright.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.http-auth SYSTEM "features/http-auth.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.basic-syntax SYSTEM "language/basic-syntax.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.apache SYSTEM "functions/apache.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.migration SYSTEM "appendices/migration.xml">
<!ENTITY appendix.development SYSTEM "appendices/phpdevel.xml">
<!ENTITY appendix.debugger SYSTEM "appendices/debugger.xml">

Index: phpdoc/fr/preface.xml
+++ phpdoc/fr/preface.xml

 <preface id="preface">
  <title>Pr&eacute;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&eacute;e au langages C, Java et Perl, mais
    y ajoute plusieurs fonctionnalit&eacute;s uniques. Le but de ce langage est de
    permettre aux developpeurs web de concevoir rapidement des sites, aux pages
    dynamiques
   </simpara>
  </abstract>

  <sect1 id="about">
   <title>A propos de ce manuel</title>
   <para>
    Ce manuel est &eacute;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&eacute;s pour g&eacute;n&eacute;rer le format <acronym>HTML</acronym>,
     <acronym>TeX</acronym> et <acronym>RTF</acronym> sont
     <ulink url="&url.jade;">Jade</ulink>, &eacute;crit <ulink
     url="&url.jclark;">James Clark</ulink> et <ulink
     url="&url.dbstyle;">The Modular DocBook Stylesheets</ulink>
     &eacute;crit par <ulink url="&url.nwalsh;">Norman Walsh</ulink>.
     La documentation PHP a ete assembl&eacute;e par &link.stig;.
   </para>
   <para>
     Ce manuel a &eacute;t&eacute; traduit en Fran&ccedil;ais par <ulink url="mailto:
http://www.texinfo.com/">texi</ulink>.
   </para>
  </sect1>

 </preface>

<!-- 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:
-->

Index: phpdoc/fr/appendices/debugger.xml
+++ phpdoc/fr/appendices/debugger.xml
 <appendix id="debugger">
  <title>D&eacute;buggeur PHP</title>

  <sect1 id="debugger-using">
   <title>Utiliser le d&eacute;buggeur PHP</title>

   <para>
    Le d&eacute;buggeur PHP sert &agrave; rep&eacute;rer les bugs r&eacute;calcitrants. Le d&eacute;buggeur fonctionne en se
    connectant &agrave; un port <acronym>TCP</acronym> &agrave; chaque d&eacute;marrage de PHP. Tous les
    messages d'erreur seront envoy&eacute;s sur cette connexion. Cette page est faite pour un
    "serveur de d&eacute;buggage", qui peut peut fonctionner avec un <acronym>IDE</acronym> ou un &eacute;diteur programmable (tel que Emacs).
   </para>
   <para>
    Comment param&eacute;trer le d&eacute;buggeur :
    <orderedlist>
     <listitem>
      <simpara>
       R&eacute;servez un port TCP por le d&eacute;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&uacute; <replaceable>host</replaceable> est l'IP ou le nom de l'h&ocirc;te qui supporte le
       client <acronym>TCP</acronym>.
      </simpara>
     </listitem>
    </orderedlist>
    Desormais, toutes les alertes, notes, ... seront envoy&eacute;es sur la socket client,
    , <emphasis>m&ecirc;me si vous avez inactiv&eacute; le rapport d'erreur avec
    <function>error_reporting</function></emphasis>.
   </para>
  </sect1>

  <sect1 id="debugger-protocol">
   <title>Debugger Protocol</title>
   <para>
    Le protocole de d&eacute;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&eacute;ment.
   </para>
   <para>
    Voici un exemple de ligne &agrave; 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&ocirc;te qui a g&eacute;n&eacute;r&eacute; l'erreur.
       </simpara>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable>pid</replaceable></term>
      <listitem>
       <simpara>
        PID (process id) sur l'h&ocirc;te <replaceable>host</replaceable>, qui a g&eacute;n&eacute;r&eacute;
        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&eacute;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&eacute;buggeur commence ici. Le
             contenu de <replaceable>data</replaceable> sera un type d'erreur, comme
             list&eacute; 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&eacute;ro de ligne, o&uacute; l'erreur est survenue.
             La premi&egrave;re occurence de <literal>location</literal> contiendra toujours
             la localisation g&eacute;n&eacute;rale. <replaceable>data</replaceable> contiendra :

<literal><replaceable>file</replaceable>:<replaceable>line</replaceable></literal>.
             Il y a toujours une indication de <literal>location</literal> apr&egrave;s un
             <literal>message</literal> et apr&egrave;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 &agrave; des information sur 4 niveaux de fonctions. Si la ligne "frame" n'existe
             pas, la profondeur doit &ecirc;tre 0 (une erreur est survenue au niveau g&eacute;n&eacute;ral).
            </entry>
           </row>
           <row>
            <entry>
             <literal>function</literal></entry>
            <entry>
             Nom de la fonction qui a g&eacute;n&eacute;r&eacute; l'erreur. Elle sera r&eacute;p&eacute;t&eacute;e &agrave; 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&eacute;es.</simpara>
      </listitem>
     </varlistentry>
    </variablelist>

    <table>
     <title>Types d'erreur du d&eacute;buggeur</title>
     <tgroup cols="2">
      <thead>
       <row>
        <entry>D&eacute;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>

 </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:
-->

Index: phpdoc/fr/appendices/migration.xml
+++ phpdoc/fr/appendices/migration.xml
<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>Start/end tags</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>
&lt;? 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 start/end </title>
    <programlisting>
&lt;? 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 &agrave; " >. Cependant, si vous souhaitez utiliser XML sur votre serveur, vous aurez surement 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: second new start/end tags</title>
    <programlisting>
&lt;?php echo "This is PHP 3.0 code!\n"; ?&gt;
</programlisting></example>

   Some people have had problems with editors that don't understand
   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:

   <example><title>Deuxi&egrave;mes nouvelles balises start/end</title>
    <programlisting>
&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>if..endif syntax</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>
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>

Notez que les points virgules ont &eacute;t&eacute; remplac&eacute;e par des point dans toutes les commandes, sauf pour la derni&egrave;re expression (endif).</para></sect1>

 <sect1 id="migration-while">
  <title>while syntax</title>
  <para>
   Tout comme pour if..endif, la syntaxe des boucles while..endwhile a chang&eacute;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>

 <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 cot&eacute;s de
l'expression, et cela peut produire des r&eacute;sultats inattendus avec les scripts 2.0.
</simpara>
  <simpara></simpara>

  <para>
Consid&eacute;rez les lignes suivantes:
   <informalexample><programlisting>
$a[0]=5;
$a[1]=7;

$key = key($a);
while ("" != $key) {
    echo "$keyn";
    next($a);
}
</programlisting></informalexample>
En PHP/FI 2.0, cet exemple va afficher les indices des $a.
En PHP 3.0, l'exemple ne va rien afficher du tout. La raison est
qu'en PHP 2.0, puisque l'argument de gauche est de type cha&icirc;ne,
une comparaison de cha&icirc;ne &eacute;tait effectu&eacute;, 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 variablelist 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>
while ((string)$key != "") {
</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 <function_old>test_me</function_old>
 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'echec, la plus part 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>
$fp = fopen($file, "r");
if ($fp == -1);
    echo("Impossible d'ouvrir le fichier $file en lecture &lt;br&gt;\n");
endif;
</programlisting>
   </example>
   <example>
    <title>Migration depuis 2.0: valeur retourn&eacute;es, nouvelle fa&ccedil;on</title>
    <programlisting>
$fp =  <email protected>($file, "r") or print("Impossible d'ouvrir le fichier $file en lecture&lt;br&gt;\n");
</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 formattage. 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 converti 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>
echo "1" + "1";
</programlisting>

         <para>
          En PHP 2.0 cela retournerait 11, en PHP 3.0 cela va retourner 2. A la place, faites :

          <programlisting>
echo "1"."1";
</programlisting>

          <programlisting>
$a = 1;
$b = 1;
echo $a + $b;
</programlisting></para>

         <para>
          Cela va afficher 2, tant en PHP 2.0 qu'en 3.0.

          <programlisting>
$a = 1;
$b = 1;
echo $a.$b;
</programlisting>
          Cela va afficher 11 en PHP 3.0.</para>
        </example></sect1>

 </appendix>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->

Index: phpdoc/fr/appendices/phpdevel.xml
+++ phpdoc/fr/appendices/phpdevel.xml
<appendix id="phpdevel">
 <title>D&eacute;veloppement PHP</title>

 <simpara></simpara>

 <sect1 id="phpdevel-addfunc">
  <title>Adding functions to PHP3</title>
  <sect2 id="phpdevel-addfunc-prototype">
   <title>Prototypes de fonctions</title>
   <para>
    Toutes les fonctions suivent le sch&eacute;ma suivant :
    <programlisting>
void php3_foo(INTERNAL_FUNCTION_PARAMETERS) {
     
}
    </programlisting>
    M&ecirc;me si votre fonction ne prend aucun argument, c'est comme cela qu'elle doit &ecirc;tre
    appel&eacute;e.
   </para>
  </sect2>

  <sect2 id="phpdevel-addfunc-args">
   <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&eacute;&eacute;l d'argument. De cette fa&ccedil;on, si votre fonction prend deux
    arguments, elle ressemble &agrave; ceci :
  </para>

   <para>
    <example>
     <title>Argument de fonction de lecture</title>
     <programlisting>
pval *arg1, *arg2;
if (ARG_COUNT(ht) != 2 || getParameters(ht,2,&amp;arg1,&amp;arg2)==FAILURE) {
   WRONG_PARAM_COUNT;
}
     </programlisting>
    </example>
    
    NOTE: Les arguments peuvent &ecirc;tre pass&eacute; par valeur ou par r&eacute;f&eacute;rence. Dans les deux cas,
    vous devez passer &(pval *) &agrave; getParameters. Si vous voulez v&eacute;rifier que le n-i&egrave;me
    param&egrave;tre a &eacute;t&eacute; pass&eacute; par r&eacute;f&eacute;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&egrave;tres, qu'ils soient envoy&eacute;s par r&eacute;f&eacute;rence ou par
    valeur, vous pouvez le passer &agrave; pval_destructor pour le r&eacute;initialiser, ou, s'il s'agit
    d'un tableau et que vous voulez ajouter des valeurs, vous pouvez utiliser des fonctions
    similaires &agrave; celles qui sont dans internal_functions.h, qui manipule
    return_value comme tableau.
   </simpara>

   <simpara>
    Par ailleurs, si vous modifiez un param&egrave;tre en IS_STRING, assurez vous que
    vous avez bien assign&eacute; un nouvelle cha&icirc;ne avec estrdup()'ed et une nouvelle longueur
    de cha&icirc;ne. Seulement apr&egrave;s, vous pouvez modifier le type en IS_STRING.
    Si vous modifiez une cha&icirc;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 &agrave; 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 &agrave; nombre d'arguments variable</title>
     <programlisting>
pval *arg1, *arg2, *arg3;
int arg_count = ARG_COUNT(ht);

if (arg_count &lt; 2 || arg_count &gt; 3 ||
    getParameters(ht,arg_count,&amp;arg1,&amp;arg2,&amp;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&eacute; dans le champs pval. Ce champs peut prendre les
    valeurs suivantes :

    <table>
     <title>Types de donn&eacute;es interne PHP</title>
     <tgroup cols="2">
      <tbody>
       <row>
        <entry>IS_STRING</entry>
        <entry>Cha&icirc;ne de caract&egrave;res</entry>
       </row>
       <row>
        <entry>IS_DOUBLE</entry>
        <entry>Nombre &agrave; virgule flottante, en pr&eacute;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 &ecirc;tre pass&eacute; &agrave; 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>

   <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 :

    <programlisting>
convert_to_long(arg1);
convert_to_double(arg1);
convert_to_string(arg1);
convert_to_boolean_long(arg1); /* Si la cha&icirc;ne est "" ou "0" elle devient 0, 1 sinon */
convert_string_to_number(arg1); /* Converti une cha&icirc;ne en LONG ou DOUBLE suivant la cha&icirc;ne */
     </programlisting></para>
    
   <simpara>
    Ces fonctions convertissent sur place : elles ne retourne aucune valeur.
   </simpara>

   <para>
    La valeur de l'argument est enregistr&eacute;es dans une union. Les membres sont :
    <itemizedlist>
     <listitem><simpara>IS_STRING: arg1-&gt;value.str.val</simpara></listitem>
     <listitem><simpara>IS_LONG: arg1-&gt;value.lval</simpara></listitem>
     <listitem><simpara>IS_DOUBLE: arg1-&gt;value.dval</simpara></listitem>
    </itemizedlist></para></sect2>
    
  <sect2 id="phpdevel-addfunc-memmgmt">
   <title>Gestion de la m&eacute;moire dans une fonction</title>
   <simpara>
    Toute la m&eacute;moire n&eacute;cessaire &agrave; une fonctoin doit &ecirc;tre allou&eacute;e avec emalloc() ou
    estrdup(). Ces fonctions ont le gout et l'odeur des classiques malloc() et
    strdup(). La m&eacute;moire doit &ecirc;trel lib&eacute;r&eacute;e avec efree().
   </simpara>

   <simpara>
    Il y a deux types de m&eacute;moire dans ce programme : la m&eacute;moire qui est retourn&eacute;e &agrave; l'
    analyseur, et la m&eacute;moire qui n&eacute;cessaire pour le stockage temporaire dans la fonction.
    Lorsque vous assignes une cha&icirc;ne dans une variable qui est retourn&eacute;e &agrave; l'analyseur,
    assurez vous de bien allouer la m&eacute;moire avec emalloc() ou estrdup(). Cette m&eacute;moire
    ne doit JAMAIS &ecirc;tre lib&eacute;r&eacute;e, sauf si vous r&eacute;&eacute;crivez votre original plus loin, dans
    la m&ecirc;me fonction (mais ce n'est pas de la programmation propre).
   </simpara>

   <simpara>
    Pour tous vos besoins en m&eacute;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&eacute;&eacute; avec emalloc() ou estrdup() doit &ecirc;tre lib&eacute;r&eacute; avec efree()
    &agrave; un moment ou un autre, &agrave; moins que ce ne soit utile ailleurs dans le programme;
    sinon, il va y avoir une fuite de m&eacute;moire. La signification de "Elles se comportent
    EXACTEMENT comme leur homologues" est que si vous lib&eacute;rez une variable qui n'a pas
    &eacute;t&eacute; cr&eacute;&eacute;e avec emalloc() ou estrdup(), vous courez droit &agrave; la "segmentation fault".
    Soyez alors extr&ecirc;mement prudent, et lib&eacute;rez toute votre m&eacute;moire inutilis&eacute;e.
   </simpara>

   <simpara>
    Si vous compilez avec "-DDEBUG", PHP3 affichera la liste de tous les appels &agrave;
    emalloc() et estrdup() mais jamais &agrave; efree() lorsque ce intervient dans un script
    sp&eacute;cifi&eacute;.
   </simpara>
  </sect2>

  <sect2 id="phpdevel-addfunc-symtab">
   <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 :

    <itemizedlist>
     <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>

   <para>
    <footnote id="symtab-1">
     <simpara>
      Soyez prudent. La valeur doit &ecirc;tre plac&eacute;e dans une portion de m&eacute;moire cr&eacute;&eacute;e avec
      malloc(), sinon le gestionnaire de m&eacute;moire essayera de lib&eacute;rer le pointeur plus
      tard. Ne passez aucune m&eacute;moire allou&eacute;e statiquement &agrave; 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,
    &amp;symbol_table est un pointeur sur la table principale, et
    active_symbol_table pointe sur la table actuellement utilis&eacute;e.
    (ces deux tables peuvent &ecirc;tre identiques au d&eacute;marrage, ou diff&eacute;rent, suivant que
    vous etes dans une fonction ou non).
   </simpara>
  
   <para>
    Les exemples suivants utilisent 'active_symbol_table'. Vous devriez la remplacer par
    &amp;symbol_table si vous voulez travailler sur la table principale.
    De plus, les m&ecirc;mes fonctions peuvent &ecirc;tre appliqu&eacute;es &agrave; des tableaux, comme expliqu&eacute;
    ci dessous.
   </para>
  
   <para>
    <example>
     <title>V&eacute;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>

    <example>
     <title>Rechercher la taille d'une variable dans la table des symboles</title>
     <programlisting>
hash_find(active_symbol_table,"foo",sizeof("foo"),&amp;pvalue);
check(pvalue.type);
     </programlisting>
    </example>
    
    En PHP 3.0, les tableaux sont impl&eacute;ment&eacute;s en utilisant les m&ecirc;mes tables de hash que
    les variables. Cela signifie que les deux fonctions ci dessus peuvent &ecirc;tre appel&eacute;es
    pour v&eacute;rifier la pr&eacute;sence de variables dans un tableau.
   </para>
    
   <simpara>
    Si vous voulez d&eacute;finir un nouveau tableau dans la table des symboles, utiliser le code
    suivant.
   </simpara>

   <simpara>
    D'abord, vous devez v&eacute;rifier qu'il n'existe pas, avec hash_exists() ou
    hash_find().
   </simpara>

   <simpara>
    Puis, initialisez le tableau :</simpara>
    
   <para>
    <example>
     <title>Initialisation d'un tableau</title>
     <programlisting>
pval arr;
  
if (array_init(&amp;arr) == FAILURE) { failed... };
hash_update(active_symbol_table,"foo",sizeof("foo"),&amp;arr,sizeof(pval),NULL);
     </programlisting>
    </example>
    
    Ce code d&eacute;clare un nouveau tableau, appel&eacute; $foo, dans la table de symbole Ce tableau est vide.
   </para>
    
   <simpara>
     Voici comment ajouter deux nouvelles entr&eacute;es dans ce tableau :
   </simpara>
  
   <para>
    <example>
     <title>Ajout d'entr&eacute;es dans un tableau.</title>
     <programlisting>
pval entry;
  
entry.type = IS_LONG;
entry.value.lval = 5;
  
/* d&eacute;finit $foo["bar"] = 5 */
hash_update(arr.value.ht,"bar",sizeof("bar"),&amp;entry,sizeof(pval),NULL);

/* d&eacute;finit $foo[7] = 5 */
hash_index_update(arr.value.ht,7,&amp;entry,sizeof(pval),NULL);

/* d&eacute;finit la prochaine place libre dans $foo[],
 * $foo[8], qui sera 5 (comme en php2)
 */
hash_next_index_insert(arr.value.ht,&amp;entry,sizeof(pval),NULL);
     </programlisting>
    </example>
     
    Si vous voulez modifier une valeur que vous avez ins&eacute;r&eacute; dans une table de hash,
    vous devez d'abord la lire dans la table. Pour &eacute;viter cette recherche, vous pouvez
    fournir une pval ** &agrave; la fonction d'ajout dans la table de hash, et elle modifiera
    la valeur &agrave; l'adresse pval *, avec la valeur donn&eacute;e. Si cette valeur est NULL,
    (comme dans tous les exemples ci dessus), ce param&egrave;tre sera ignor&eacute;.
   </para>

   <simpara>
    hash_next_index_insert() utiliser plus ou moins la m&ecirc;me logique que
    "$foo[] = bar;" in PHP 2.0.</simpara>

   <simpara>
    Si vous construisez un tableau, pour le retourner, vous pouvez l'initialiser comme ceci
    :
   </simpara>

   <programlisting>
if (array_init(return_value) == FAILURE) { &eacute;chec...; }
   </programlisting>

   <simpara>
    ...puis ajouter les valeurs grāces aux macros:</simpara>

   <programlisting>
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&egrave;s l'initialisation, vous devrez
    d'abord rechercher le tableau :
      
    <programlisting>
pval *arr;
  
if (hash_find(active_symbol_table,"foo",sizeof("foo"),(void **)&amp;arr)==FAILURE) { introuvable... }
else { utilisez arr-&gt;value.ht... }
    </programlisting></para>

   <simpara>
    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&egrave;s aux hash retourne SUCCES (SUCCES) ou ECHEC (FAILURE), except&eacute; hash_exists(), qui retourne un bool&eacute;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>

   <para>
    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&icirc;ne.</simpara></listitem>
     <listitem><simpara>RETURN_STRINGL(s,l,dup) Retourne la cha&icirc;ne (s) en sp&eacute;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&icirc;ne</simpara></listitem>
     <listitem><simpara>RETVAL_STRINGL(s,l,dup) Retourne la cha&icirc;ne (s) en sp&eacute;cifiant la longueur (l).</simpara></listitem>
     <listitem><simpara>RETVAL_DOUBLE(d)</simpara></listitem>
    </itemizedlist></para>

   <simpara>
    Les macros ci dessus vont utiliser estrdup() sur les arguments pass&eacute;s. Cela vous
    permet de lib&eacute;rer tranquillement les arguments apr&egrave;s avoir appel&eacute; cette fonction,
    ou bien, utiliser de la m&eacute;moire allou&eacute;e statiquement.
   </simpara>

   <simpara>
    Si votre fonction retourne un bool&eacute;en de succ&egrave;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>

   <para>
    Retourner un objet:

    <orderedlist numeration="arabic">
     <listitem><simpara>Appeler object_init(return_value).</simpara></listitem>
     <listitem><para>Remplissez les valeurs. Les fonctions utilisables sont list&eacute;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 &ecirc;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&eacute;&eacute;l peut &ecirc;tre fait comme suit :
       <programlisting>
add_method( return_value, function_name, function_ptr );
       </programlisting></para></listitem>
    </orderedlist></para>

   <para>
    Les fonctions d'acc&egrave;s aux objets sont :
    <itemizedlist>
     <listitem><simpara>add_property_long( return_value,
       property_name, l ) - Ajoute un membre nomm&eacute; 'property_name', de type long, &eacute;gal &agrave;
       '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&icirc;ne</simpara></listitem>
     <listitem><simpara>add_property_stringl( return_value,
       property_name, str, l ) - Idem, ajoute une cha&icirc;ne de longueur 'l'.</simpara></listitem>
    </itemizedlist></para>

   <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&eacute;es
     ci dessous.</simpara></listitem>
    </orderedlist></para>

   <p