cvs: phpdoc /fr/language types.xml
| From: | Damien Seguy | Date: | Wed, 08 Aug 2001 09:47:03 +0000 |
| Subject: | cvs: phpdoc /fr/language types.xml | ||
| Groups: | php.doc | ||
| Request: | Send a blank email to phpdoc+get-969336912@lists.php.net to get a copy of this message | ||
dams Wed Aug 8 05:47:03 2001 EDT
Modified files:
/phpdoc/fr/language types.xml
Log:
turned double -> float
Index: phpdoc/fr/language/types.xml diff -u phpdoc/fr/language/types.xml:1.10 phpdoc/fr/language/types.xml:1.11 --- phpdoc/fr/language/types.xml:1.10 Tue Mar 6 13:31:37 2001 +++ phpdoc/fr/language/types.xml Wed Aug 8 05:47:03 2001 @@ -1,7 +1,38 @@ +<!-- $Revision: 1.11 $ --> <chapter id="language.types"> - <title>Types</title> + <title>Les types</title> + <sect1 id="language.types.intro"> + <title>Introduction</title> + <simpara> + PHP supporte les 8 types basiques suivants : + </simpara> <para> - PHP supporte les types suivants : + PHP supporte quatres types scalaires : + <itemizedlist> + <listitem> + <simpara> + <link linkend="language.types.boolean">booléen</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.integer">entier</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.double">nombre à virgule flottante</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.string">chaîne de caractères</link> + </simpara> + </listitem> + </itemizedlist> + </para> + <para> + PHP supporte deux types composés : <itemizedlist> <listitem> <simpara> @@ -10,26 +41,42 @@ </listitem> <listitem> <simpara> - <link linkend="language.types.double">nombre à virgule flottante</link> - </simpara> - </listitem> - <listitem> - <simpara> - <link linkend="language.types.integer">entier</link> + <link linkend="language.types.object">objet</link> </simpara> </listitem> + </itemizedlist> + </para> + <para> + PHP supporte deux types spéciaux : + <itemizedlist> <listitem> <simpara> - <link linkend="language.types.object">objet</link> + <link linkend="language.types.resource">ressource</link> </simpara> </listitem> <listitem> <simpara> - <link linkend="language.types.string">chaîne</link> + <link linkend="language.types.null">null</link> </simpara> </listitem> </itemizedlist> </para> + <note> + <simpara> + Dans ce manuel, vous rencontrerez souvant le type <literal>mixed</literal>. + C'est un pseudo-type, qui indique que le paramètre peut + indifféremment prendre plusieurs types. + </simpara> + <!-- + Just an idea, maybe useful for some func-defs? + (at least it is for the operator-defs) + <simpara> + In parameter definitions you can also encouter the 'number' pseudo-type, + that indicates a parameter that is either <type>integer</type> or + <type>float</type>. + </simpara> + --> + </note> <simpara> Habituellement, le type d'une variable n'est pas déclaré par le programmeur. Il est décidé au moment de @@ -49,38 +96,305 @@ Pour plus d'informations, voir le paragraphe <link linkend="language.types.type-juggling">transtypage</link>. </simpara> + </sect1> + <sect1 id="language.types.boolean"> + <title>Booléens</title> + <simpara> + C'est le type le plus simple. Un booléen exprime les valeurs + de vrai <literal>TRUE</literal> ou <literal>FALSE</literal>. + </simpara> + <para> + Vous pouvez utiliser les constantes '<literal>TRUE</literal>' et + '<literal>FALSE</literal>' pour spécifier une valeur de type + <type>boolean</type>. Généralement, vous les créerez avec un + des <link linkend="language.operators">operateurs</link> + qui retourne une valeur <type>boolean</type>, pour le passer + à une <link linkend="control-structures">structure de contrôle</link>. + <informalexample> + <programlisting role="php"> +<?php + if ($action == "show_version"){ +// == is an <link linkend="language.operators">operator</link> +// qui retourne un booléen + echo "La version est 1.23"; + } +// ceci n'est pas nécessaire + if ($show_separators == true){ + echo "<hr>\n"; + } +// ceci est plus pratique + if ($show_separators){ + echo "<hr>\n"; + } +?> + </programlisting> + </informalexample> + </para> + <!-- TODO: example of this --> + <!-- TODO: example to show that if ( expr == TRUE ) is not really + necessary... (i've seen this construct numerous times) + --> + <!-- TODO: how others vars are converted to boolean --> + <note> + <simpara> + Le type booéen a été introduit en PHP 4. + </simpara> + </note> + <sect2 id="language.types.boolean.casting"> + <title>Conversion en booléen</title> + <simpara> + Reportez-vous au chapitre + "<link linkend="language.types.type-juggling">Définition du type</link>" + pour plus d'informations sur les conversions. + </simpara> + <para> + Lors des conversions de valeurs de type <type>boolean</type>, les valeurs + suivantes sont considérées comme fausse (<literal>FALSE</literal>) : + <itemizedlist> + <listitem> + <simpara> + Le <link linkend="language.types.boolean">booléen</link> FALSE </simpara> + </listitem> + <listitem> + <simpara> + L'<link linkend="language.types.integer">entier</link> 0 (zéro) + </simpara> + </listitem> + <listitem> + <simpara> + Le <link linkend="language.types.double">nombre à virgule flottante</link> 0.0 (zéro) + </simpara> + </listitem> + <listitem> + <simpara> + La <link linkend="language.types.string">chaîne</link> vide, + et la <link linkend="language.types.string">chaîne</link> "0" + </simpara> + </listitem> + <listitem> + <simpara> + Le <link linkend="language.types.array">tableau</link> vide + (aucun élément) + </simpara> + </listitem> + <listitem> + <simpara> + L'<link linkend="language.types.object">objet</link> vide + (aucun élément) + </simpara> + </listitem> + <listitem> + <simpara> + La constante spéciale <link linkend="language.types.null">NULL</link> + </simpara> + </listitem> + </itemizedlist> + Toutes les autres valeurs sont considérées comme + vraies (<literal>TRUE</literal> (y compris les + <link linkend="language.types.resource">ressources</link>). + <warning> + <simpara> + -1 est considéré comme vrai! + </simpara> + </warning> + <!-- and/or a few examples, for the people only looking at + the examples... </XXX> --> + </para> + </sect2> + </sect1> <sect1 id="language.types.integer"> <title>Entiers</title> <para> - Il est possible de spécifier les nombres entiers (integers) de - la manière suivante : + Un entier est un nombre de l'ensemble des entiers naturels Z : + Z = {...., -2, -1, 0, 1, 2, ...}. Il est possible de spécifier + les nombres entiers (integers) de toutes les manières suivantes : + décimale (base 10), hexadécimale (base 16), octale (base 8) éventuellement + précédé du signe moins (-). + </para> + <para> + Pour utiliser la notation octale, vous devez préfixer le nombre avec + un zéro; pour utiliser la notation hexadécimale, vous devez préfixer + le nombre avec <literal>0x</literal>. <informalexample> <programlisting role="php"> <?php -$a = 1234; # nombre entier en base 10 -$a = -123; # nombre entier négatif -$a = 0123; # nombre entier en base 8, octale (équivalent à 83 en base 10) -$a = 0x12; # nombre entier en base 16, hexadécimale (équivalent à 18 en base 10) + $a = 1234; # nombre entier en base 10 + $a = -123; # nombre entier négatif + $a = 0123; # nombre entier en base 8, octale (équivalent à 83 en base 10) + $a = 0x12; # nombre entier en base 16, hexadécimale + # (équivalent à 18 en base 10) ?> </programlisting> </informalexample> + La taille des entiers dépend de la plate-forme de support, mais + la valeur maximale est généralement de 2 milliards et des + poussières (c'est un entier signé de 32 bits). PHP ne supporte + pas les entiers non signés. </para> + <note> + <simpara> + En PHP, il n'existe pas de type fraction. + <literal>1/2</literal> se transforme en nombre à virgule + flottante <literal>0.5</literal>. + </simpara> + </note> + <sect2 id="language.types.integer.overflow"> + <title>Dépassement de capacité des entiers</title> + <para> + Si un nombre est hors de l'intervalle de validité + des entiers, il sera interprété comme un <type>float</type>. + <informalexample> + <programlisting role="php"> +<?php + $large_number = 2147483647; + var_dump($large_number); +// affiche : int(2147483647) + $large_number = 2147483648; + var_dump($large_number); +// affiche : float(2147483648) +?> + </programlisting> + </informalexample> + De même, si une fonction ou un opérateur retourne un entier qui + est hors des limites de validité des entiers, il sera aussi + automatiquement converti en <type>float</type>. + <informalexample> + <programlisting role="php"> +<?php + $million = 1000000; + $large_number = 50000 * $million; + var_dump($large_number); +// affiche : float(50000000000) +?> + </programlisting> + </informalexample> + <warning> + <simpara> + Malheureusement, il y a un bug dans le moteur (toujours présent en + 4.0.6 et probablement résolu en 4.0.7) ce qui fait que PHP que fonctionne + pas toujours bien lorsque des nombres négatifs sont utilisés. Lorsque les + deux opérandes sont positifs, il n'y a pas de problèmes. Par exemple : + <literal>-50000 * $million</literal>, conduit à <literal>-429496728</literal>. + </simpara> + </warning> + </para> + </sect2> + <sect2 id="language.types.integer.casting"> + <title>Conversion en entiers</title> + <simpara> + Pour explicitement convertir une valeur en <type>integer</type>, + utilisez les opérateurs de transtypage <literal>(int)</literal> + ou <literal>(integer)</literal>. Cependant, dans la plupart des + situations, vous n'en aurez pas besoin, car une valeur sera automatiquement + convertie si un opérateur, un fonction ou tout autre élément du + langage requiert un <type>entier</type>. + </simpara> + <simpara> + Reportez-vous à la section + <link linkend="language.types.type-juggling">définition de type</link> + pour plus d'informations sur les conversions. + </simpara> + <sect3 id="language.types.integer.casting.from-boolean"> + <title>Depuis un <link linkend="language.types.boolean">booléen</link></title> + <simpara> + <link linkend="language.types.boolean">FALSE</link> devient 0 + (zéro), et <link linkend="language.types.boolean">TRUE</link> + devient 1 (un). + </simpara> + </sect3> + <sect3 id="language.types.integer.casting.from-float"> + <title> + Depuis un <link linkend="language.types.double">nombre à virgule flottante</link> + </title> + <simpara> + Lors de conversion entre nombre à virgule flottante et + un entier, le nombre sera arrondi à la valeur inférieure + s'il est positif, et supérieure s'il est négatif + (conversion dite 'vers zéro'). + </simpara> + <para> + Si le nombre est hors de l'intervalle de validité + des entiers, (généralement <literal>+/- 2.15e+9 = 2^31</literal>), + le résultat est indéfinit, car les nombres à virgules + flottante n'ont pas assez de précision pour fournir une + valeur exacte pour un entier. + <warning> + <simpara> + Aucune alerte, même pas le plus petit message ne + sera affiché dans ce cas. + </simpara> + </warning> + </para> + <warning> + <para> + Ne transformez jamais une fraction inconnue en entier, car cela + peut conduire à des résultats irrationnels. + <informalexample> + <programlisting role="php"> +<?php + echo (int) ( (0.1+0.7) * 10 ); +// affiche 7! +?> + </programlisting> + </informalexample> + Pour plus d'informations, reportez-vous aux + <link linkend="language.types.double">alertes</link> liées + aux nombres à virgule flottante. + </para> + </warning> + </sect3> + <sect3 id="language.types.integer.casting.from-string"> + <title>From strings</title> + <simpara> + Reportez-vous à la section des + <link linkend="language.types.string.conversion">conversions de chaînes</link>. + </simpara> + </sect3> + <sect3 id="language.types.integer.casting.from-other"> + <title>Conversion d'autres types</title> + <para> + La conversion d'autres types en entier est indéfinie. + Actuellement, PHP convertit d'abord la valeur en + <link linkend="language.types.boolean.casting">booléen</link>. + <caution> + <simpara> + Mais, ne vous fiez pas à ce comportement, car il + est susceptible de changer sans préavis! + </simpara> + </caution> + </para> + <para> + Voir aussi : + <link linkend="ref.gmp">Nombres de grande taille</link> et + <link linkend="language.types.double">Nombres à virgules flottantes</link>. + </para> + <!-- + IMO, it would more sense as (int) $arr returned the + number of elements in $arr. This won't break anything, + since this behaviour was never defined before, and + (bool)(int) $arr will still behave the same. + --> + </sect3> + </sect2> </sect1> <sect1 id="language.types.double"> <title>Les nombres à virgule flottante</title> <para> - Les nombres à virgule flottante ("double") peuvent êtres + Les nombres à virgule flottante (connus aussi sous le + vocable de "<literal>double</literal>" ou "<literal>float</literal>" + "<literal>nombre rééls</literal>") peuvent être spécifiés en utilisant la syntaxe suivante: <informalexample> <programlisting role="php"> <?php -$a = 1.234; -$a = 1.2e3; + $a = 1.234; + $a = 1.2e3; ?> </programlisting> </informalexample> </para> - <warning id="warn.float-precision"> + <warning> + <title>Précision des nombres à virgule flottante</title> <para> Il est fréquent que de simples fractions décimales telles que <literal>0.1</literal> ou <literal>0.7</literal> ne puissent @@ -98,11 +412,11 @@ en mode décimal. </para> <para> - Ne faîtes donc jamais confiance aux nombres à virgule - jusqu'à leur dernière décimale, et ne comparer + Ne faites donc jamais confiance aux nombres à virgule + jusqu'à leur dernière décimale, et ne comparez jamais ces nombres avec l'opérateur d'égalité. Si vous avez besoin d'une précision particulière, - reportez vous au traitement des nombres de grande taille avec les + reportez-vous au traitement des nombres de grande taille avec les librairies <link linkend="ref.bc">BC</link> ou <link linkend="ref.gmp">GMP</link>. </para> </warning> @@ -110,37 +424,115 @@ <sect1 id="language.types.string"> <title>Les chaînes de caractères</title> <para> - Les chaînes de caractères peuvent être définies - en utilisant deux types de délimiteurs. + Les chaînes de caractères sont des séquences de caractères. + En PHP, un caractère est un octet, et il y en 256 de possibles. + PHP n'a pas (encore?) de support natif d'Unicode. + <!-- how about unicode? will we support that eventually? Are + there current any ways to work with unicode? + --> </para> - <para> - Si la chaîne de caractères est délimitée - par des guillemets doubles ("), les variables à - l'intérieur de la chaîne seront évaluées, - et remplacées par leur valeur. Comme en C ou en Perl, le - caractère antislash (\) est utilisé pour - protéger (échapper) un caractère spécial. + <note> + <simpara> + La taille n'est pas un problème majeur pour une chaîne. + Elle peut devenir très grande sans problème. Il n'y a + a pas à s'en faire pour cela. + </simpara> + </note> + <sect2 id="language.types.string.syntax"> + <title>Syntax</title> + <para> + Une chaîne peut être spécifiée de trois manières + différentes : + <itemizedlist> + <listitem> + <simpara> + <link linkend="language.types.string.syntax.single">guillemets simples</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.string.syntax.double">guillemets doubles</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.string.syntax.heredoc">syntaxe HereDoc</link> + </simpara> + </listitem> + </itemizedlist> + </para> + <sect3 id="language.types.string.syntax.single"> + <title>guillemets simples</title> + <para> + Le moyen le plus simple de spécifier une chaîne de caractères + est d'utiliser les guillemets simples : <literal>'</literal>. + </para> + <para> + Pour spécifier un guillemet simple littéral, vous devez + l'échapper avec un anti-slash (<literal>\</literal>), comme dans de nombreux + langages. Si un anti-slash doit apparaître dans votre chaîne ou bien + en fin de chaîne, il faudra le doubler. Notez que si vous essayez d'échapper n'importe + quel autre caractère, l'anti-slash sera conservé! Il n'y a pas + besoin d'échapper d'autres caractères que le guillemets lui-même. + <note> + <simpara> + En PHP 3, une alerte sera affichée si cela arrive avec un + niveau de rapport d'erreur de <literal>E_NOTICE</literal>. + </simpara> + </note> + <note> + <simpara> + Contrairement aux autres syntaxes, les variables présentes dans la + chaîne ne seront <emphasis>PAS</emphasis> remplacées par leurs + valeurs. + </simpara> + </note> + <informalexample> + <programlisting role="php"> +<?php + echo 'Ceci est une chaîne simple'; + echo 'Vous pouvez inclure des nouvelles lignes dans une chaîne, + comme ceci.'; + echo 'Arnold a coutume de dire : "I\'ll be back"'; +// affiche : ... "I'll be back" + echo 'Etes vous sûr de vouloir effacer le dossier C:\\*.*?'; +// affiche : Etes vous sûr de vouloir effacer le dossier C:\*.*? + echo 'Etes vous sûr de vouloir effacer le dossier C:\*.*?'; +// affiche : Etes vous sûr de vouloir effacer le dossier C:\*.*? + echo 'Je suis en train de mettre une nouvelle ligne comme ceci : \n'; +// affiche : Je suis en train de mettre une nouvelle ligne comme ceci : \n +?> + </programlisting> + </informalexample> + </para> + </sect3> + <sect3 id="language.types.string.syntax.double"> + <title>Guillemets doubles</title> + <para> + Si la chaîne est entourés de guillemets doubles, PHP + va comprendre certaines séquences de caractères : + </para> <table> <title>Les caractères spéciaux</title> <tgroup cols="2"> <thead> <row> - <entry>séquence</entry> - <entry>valeur</entry> + <entry>Séquence</entry> + <entry>Valeur</entry> </row> </thead> <tbody> <row> <entry><literal>\n</literal></entry> - <entry>Nouvelle ligne (linefeed, LF ou 0x0A en ASCII)</entry> + <entry>Nouvelle ligne (linefeed, LF ou 0x0A (10) en ASCII)</entry> </row> <row> <entry><literal>\r</literal></entry> - <entry>Retour à la ligne(carriage return, CR ou 0x0D en ASCII)</entry> + <entry>Retour à la ligne(carriage return, CR ou 0x0D (13) en ASCII)</entry> </row> <row> <entry><literal>\t</literal></entry> - <entry>Tabulation horizontale (HT ou 0x09 en ASCII)</entry> + <entry>Tabulation horizontale (HT ou 0x09 (9) en ASCII)</entry> </row> <row> <entry><literal>\\</literal></entry> @@ -152,48 +544,42 @@ </row> <row> <entry><literal>\"</literal></entry> - <entry>Guillemet double</entry> + <entry>Guillemets doubles</entry> </row> <row> <entry><literal>\[0-7]{1,3}</literal></entry> <entry> - Une séquence de caractère qui permet de + Une séquence de caractères qui permet de rechercher un nombre en notation octale. </entry> </row> <row> <entry><literal>\x[0-9A-Fa-f]{1,2}</literal></entry> <entry> - Une séquence de caractère qui permet de + Une séquence de caractères qui permet de rechercher un nombre en notation hexadécimale. </entry> </row> </tbody> </tgroup> </table> - </para> <para> - Vous pouvez utiliser le caractère d'échappement - antislash sur n'importe quel autre caractère, mais cela - produira une alerte (si le niveau d'alerte maximal a - été fixé). En PHP 3.0, une alerte sera - affichée, si le niveau de rapport d'erreur est à - <literal>E_NOTICE</literal>. En PHP 4.0, aucune alerte ne sera - générée. - </para> - <para> - Le deuxième moyen de délimiter une chaîne de - caractère est d'utiliser les guillemets simples ("'"). Dans - une telle chaîne de caractères, les variables - <emphasis>ne seront pas</emphasis> évaluées, - et le caractère antislash n'aura aucun effet (à - deux exceptions près, pour "\\" et "\'", afin de pouvoir - utiliser les caractères guillemets simples, et antislash - dans la chaîne de caractères). + Si vous essayez d'utiliser l'anti-slash sur n'importe quelle + autre séquence, l'anti-slash sera affiché dans votre chaîne. </para> + <para> + Le plus important des chaînes à guillemets doubles est le fait + que les variables qui s'y trouvent seront remplacées par leurs + valeurs. Voir la section sur le + <link linkend="language.types.string.parsing">traitement des + variables dans les chaînes</link> pour plus de détails. + </para> + </sect3> + <sect3 id="language.types.string.syntax.heredoc"> + <title>Syntaxe Heredoc</title> <para> Un autre moyen de délimiter les chaînes est d'utiliser - la syntaxe de "Here doc" (en français, doc ici): <<<, + la syntaxe de "Here doc" (en français, documentation ici): <<<, suivi d'un identifiant arbitraire, puis de la chaîne. Cette séquence se termine par l'identifiant initial, placé en premier sur une nouvelle ligne. @@ -205,38 +591,64 @@ et des soulignés ("_"), et enfin, commencer par un caractère alphabétique ou un souligné. </para> + <warning> + <simpara> + Il est très important de noter que la ligne qui contient + l'identifiant de fermeture ne doit contenir aucun autre + caractère, hormis, éventuellement, un point-virgule <literal>;</literal>. + Cela signifie notamment que l'identifiant ne doit + pas être indenté, et qu'il n'y a aucun caractère + blanc entre le retour à la ligne et l'identifiant, + ou bien entre l'identifiant et le <literal>;</literal>. + </simpara> + <simpara> + Le plus dur est peut être qu'il ne faut pas qu'il y ait + un retour à la ligne ((<literal>\r</literal>) à la fin de cette + ligne, mais seulement un form-feed (<literal>\n</literal>). + Puisque Microsoft Windows utilise la séquence + <literal>\r\n</literal> comme terminaison de ligne, + la syntaxe heredoc risque de ne pas fonctionner là. Cependant, + la plupart des éditeurs PHP fournissent une sauvegarde + au format UNIX. + <!-- + FTP will sometimes automatically convert \r\n to \n while + transferring your files to your webserver (which + is *nix, of course) + --> + </simpara> + </warning> <para> La syntaxe Here doc se comporte exactement comme une chaîne à guillemets doubles, sans les guillemets doubles. Cela signifie que vous n'avez pas à échapper les guillemets (simples ou doubles) dans cette syntaxe. Les variables sont remplacées par leur valeur, et - le même soin doit leur être aporté que dans les chaînes + le même soin doit leur être apporté que dans les chaînes à guillemets doubles. <example> - <title>Exemple de chaîne Here Doc</title> + <title>Exemple de chaîne HereDoc</title> <programlisting role="php"> <?php -$str = <<<EOD -Exemple de chaîne -s'étalant sur -plusieurs lignes -avec la syntaxe heredoc + $str = <<<EOD + Exemple de chaîne + s'étalant sur + plusieurs lignes + avec la syntaxe heredoc EOD; /* Exemple plus complexe, avec des variables. */ -class foo { + class foo { var $foo; var $bar; function foo() { - $this->foo = 'Foo'; - $this->bar = array('Bar1', 'Bar2', 'Bar3'); + $this->foo = 'Foo'; + $this->bar = array('Bar1', 'Bar2', 'Bar3'); } -} -$foo = new foo(); -$name = 'MonNom'; -echo <<<EOT -Mon nom est "$name". J'affiche des $foo->foo. -Maintenant, j'affiche un {$foo->bar[1]}. -Ceci se traduit par un 'A' majuscule: \x41 + } + $foo = new foo(); + $name = 'MonNom'; + echo <<<EOT + Mon nom est "$name". J'affiche des $foo->foo. + Maintenant, j'affiche un {$foo->bar[1]}. + Ceci se traduit par un 'A' majuscule: \x41 EOT; ?> </programlisting> @@ -247,40 +659,208 @@ Le support Here doc a été ajouté en PHP 4. </para> </note> - <para> - Les chaînes peuvent être concaténées avec - l'opérateur '.' (point). Notez que l'opérateur '+' - (addition) ne fonctionera pas. Reportez vous à - <link linkend="language.operators.string">Opérateurs de chaînes</link> - pour plus d'informations. - </para> - <para> - <example> - <title>Quelques exemples de chaînes</title> - <programlisting role="php"> + </sect3> + <sect3 id="language.types.string.parsing"> + <title>Traitement des variables dans les chaînes</title> + <!-- Section originale par jeroen@a-es2.uu.nl --> + <simpara> + Lorsqu'une chaîne est spécifiée avec des guillemets doubles, + ou en utilisant la syntaxe heredoc, + les variables qu'elle contient sont remplacées par leur valeur. + </simpara> + <simpara> + Il y a deux types de syntaxe, une + <link linkend="language.types.string.parsing.simple">simple</link> + et une + <link linkend="language.types.string.parsing.complex">complexe</link>. + La syntaxe simple est la plus courante, et la plus pratique : elle fournit + un moyen d'utiliser les variables, que ce soit des chaînes, des tableaux + ou des membres d'objets. + </simpara> + <simpara> + La syntaxe complexe a été introduite en PHP 4 + <!-- XXX was it? and starting with what version exactly? --> + et peut être reconnue grâce aux accolades entourant les expressions. + </simpara> + <sect4 id="language.types.string.parsing.simple"> + <title>Syntaxe simple</title> + <simpara> + Dès qu'un signe dollar <literal>$</literal> est rencontré, l'analyseur + PHP va lire autant de caractère qu'il peut pour former un nom de + variable valide. Entourez le nom de la variable avec des accolades + pour indiquer explicitement son nom. + </simpara> + <informalexample> + <programlisting role="php"> +<?php + $boisson = 'vin'; + echo "Du $boisson, du pain et du fromage!'; + // OK, car "," n'est pas autorisé dans les noms de variables + echo "Il a goûté plusieurs $vins"; + // Pas OK, car 's' peut entrer dans un nom de variable, et PHP recherche $boissons + echo "Il a goûté plusieurs ${vin}s"; + // OK +?> + </programlisting> + </informalexample> + <simpara> + Similairement, vous pouvez aussi utiliser un élément + de tableau, ou un membre d'objet. Pour les éléments + de tableau, le crochet fermant '<literal>]</literal>' + marquera la fin du nom de la variable. Pour les + membres d'objets, les mêmes règles que ci-dessus + s'appliquent. Cependant, il n'existe pas de truc comme + pour les variables simples. + <!-- XXX isn't TRUE :(, this would be the trick + Also, + the same trick with curly-braces works if you + want to limit the greediness of parsers (aren't they + paying them enough or something?). + --> + </simpara> + <informalexample> + <programlisting role="php"> + $fruits = array( 'fraise' => 'rouge' , 'banane' => 'jaune' ); + echo "Une banane est $fruits[banane]."; + // OK + echo "Ce carré est large de $carre->largeur mètres."; + // OK + echo "Ce carré est large de $carre->largeur00 mètres.."; + // pas OK + // pour résoudre ce problème, voyez <link linkend="language.types.string.parsing.complex">syntaxe complexe</link>. + <!-- XXX this won't work: + echo "This square is $square->{width}00 centimeters broad."; + // XXX: php developers: it would be consequent to make this work. + // XXX: like the $obj->{expr} syntax outside a string works, + // XXX: analogously to the ${expr} syntax for variable var's. + --> + </programlisting> + </informalexample> + <simpara> + Pour tout ce qui sera plus compliqué, voyez la syntaxe complexe. + </simpara> + </sect4> + <sect4 id="language.types.string.parsing.complex"> + <title>Syntaxe complexe</title> + <simpara> + La syntaxe est dite "complexe" car elle permet l'utilisation d' + expressions complexes, et non pas parcequ'elle serait obscure. + Nuance. + </simpara> + <simpara> + En fait, vous pouvez inclure n'importe quelle valeur qui est + dans l'espace de nom avec cette syntaxe. Il suffit d'écrire une + expression exactement comme si elle était hors de la chaîne, + puis de l'entourer d'accolades <literal>{}</literal>. Puisque + vous ne pouvez pas échapper les accolades, cette syntaxe ne commence + qu'à partir du signe dollar, qui suit immédiatement l'accolade + ouvrante. Par exemple, vous pouvez utiliser <literal>"{\$"</literal> + pour obtenir un <literal>"{$"</literal> littéral. Voici quelques + exemples : + </simpara> + <informalexample> + <programlisting role="php"> <?php -/* Assignation d'une chaîne */ -$str = "Ceci est une chaîne "; -/* Concaténation d'une chaîne */ -$str = $str . " avec une extension"; -/* Une autre méthode de concaténation, y compris une nouvelle ligne */ -$str .= " et terminée par une nouvelle ligne.\n"; -/* Cette chaî se terminera par '<B>Nombre: 9</B>' */ -$nombre = 9; -$str = "<B>Nombre: $nombre</B>"; -/* Cette ci sera '<B>Nombre: $num</B>' */ -$num = 9; -$str = '<B>Nombre: $num</B>'; -/* Lire le premier caractère d'une chaîne */ -$str = 'Ceci est un test.'; -$first = $str[0]; -/* Lire le dernier caractère d'une chaîne */ -$str = 'Ceci est un autre test.'; -$last = $str[strlen($str)-1]; + $super = 'fantastique'; + echo "C'est { $super}"; +// ne fonctionne pas, +// affiche "C'est { fantastique}" + echo "C'est {$super}"; +// fonctionne, +// affiche "C'est fantastique" + echo "Ce carré a {$square->width}00 centimètres de large."; + echo "Ceci fonctionne : {$tableau[4][3]}"; + echo "Ceci échoue : {$tableau[foo][3]}"; +// pour la même raison que $tableau[bar] ne fonctionne pas hors d'une chaîne + <!-- XXX see the still-to-write explaination in the arrays-section. --> + echo "Essayez plutôt comme ceci : {$tableau['foo'][3]}"; + echo "Vous pouvez même écrire {$objet->valeurs[3]->nom}"; + echo "Voici la valeur de la variable nommée $name: {${$name}}"; + <!-- <xxx> maybe it's better to leave this out?? --> +// cela fonctionne, mais c'est vivement déconseillé. +// Et pour finir, on peut combiner avec des fonctions + $inv = 'Bordeaux'; + echo "Je reprendrai bien un verre de cet excellent {${ strrev('niv') }}, hips"; + <!-- </xxx> --> +?> + </programlisting> + </informalexample> + </sect4> + </sect3> + <sect3 id="language.types.string.substr"> + <title>Accès aux caractères d'une chaîne</title> + <para> + Les caractères d'une chaîne sont accessibles en spécifiant + leur offset (le premier caractère est d'offset 0) entre + accolade, après le nom de la variable. + </para> + <note> + <simpara> + Pour assurer la compatibilité ascendante, vous pouvez + toujours accéder aux caractères avec des crochets. + Mais cette syntaxe est obsolète en PHP 4. + </simpara> + </note> + <para> + <example> + <title>Exemples de chaînes</title> + <programlisting role="php"> +<!-- TODO: either move these examples to a example section, +as with arrays, or distribute them under the applicable +sections. --> +<?php +/* Affectation d'une chaîne. */ + $str = "Ceci est une chaîne"; +/* Concaténation. */ + $str = $str . " avec un peu plus de texte"; +/* Une autre méthode de concaténation. */ + $str .= " et une nouvelle ligne à la fin.\n"; +/* Cette chaîne finira comme : '<p>Nombre: 9</p>' */ + $num = 9; + $str = "<p>Nombre: $num</p>"; +/* Celle-ci sera '<p>Nombre: $num</p>' */ + $num = 9; + $str = '<p>Nombre: $num</p>'; +/* Premier caractère d'une chaîne */ + $str = 'Ceci est un test.'; + $first = $str{0}; +/* Dernier caractère d'une chaîne. */ + $str = 'This is still a test.'; + $last = $str{strlen($str)-1}; ?> - </programlisting> - </example> - </para> + </programlisting> + </example> + </para> + </sect3> + </sect2><!-- end syntax --> + <sect2 id="language.types.string.useful-funcs"> + <title>Fonctions et opérateurs pratiques</title><!-- and operators --> + <para> + Les chaînes peuvent être concaténées avec l'opérateur '.' (point). + Notez que l'opérateur d'addition '+' (plus) ne fonctionnera pas. + Reportez-vous à la section + <link linkend="language.operators.string">opérateurs de chaînes</link>. + </para> + <para> + Il y a une grande quantité de fonctions pratiques pour modifier + les chaînes. + </para> + <simpara> + Reportez-vous à la section <link linkend="ref.strings">chaînes de caractères</link> + pour les fonctions les plus générales, à <link linkend="ref.pcre">Expressions + régulières Perl</link> et <link linkend="ref.regex">Expressions régulières + POSIX extendues</link> pour les recherches et remplacements. + </simpara> + <simpara> + Il y a aussi les fonctions sur les <link linkend="ref.url">URL</link>, + ainsi que des fonctions de chiffrage (<link linkend="ref.mcrypt">mcrypt</link> et + <link linkend="ref.mhash">mhash</link>). + </simpara> + <simpara> + Finalement, si vous ne trouvez toujours pas votre bonheure, il y a les + fonctions de <link linkend="ref.ctype">types de caractères</link>. + </simpara> + </sect2> <sect2 id="language.types.string.conversion"> <title>Conversion de type</title> <simpara> @@ -309,14 +889,14 @@ <informalexample> <programlisting role="php"> <?php -$foo = 1 + "10.5"; // $foo est du type double (11.5) -$foo = 1 + "-1.3e3"; // $foo est du type double (-1299) -$foo = 1 + "bob-1.3e3"; // $foo est du type integer (1) -$foo = 1 + "bob3"; // $foo est du type integer (1) -$foo = 1 + "10 Small Pigs"; // $foo est du type integer (11) -$foo = 1 + "10 Little Piggies"; // $foo est du type integer (11) -$foo = "10.0 pigs " + 1; // $foo est du type integer (11) -$foo = "10.0 pigs " + 1.0; // $foo est du type double (11) + $foo = 1 + "10.5"; // $foo est du type float (11.5) + $foo = 1 + "-1.3e3"; // $foo est du type float (-1299) + $foo = 1 + "bob-1.3e3"; // $foo est du type integer (1) + $foo = 1 + "bob3"; // $foo est du type integer (1) + $foo = 1 + "10 Small Pigs"; // $foo est du type integer (11) + $foo = 1 + "10 Little Piggies"; // $foo est du type integer (11) + $foo = "10.0 pigs " + 1; // $foo est du type integer (11) + $foo = "10.0 pigs " + 1.0; // $foo est du type float (11) ?> </programlisting> </informalexample> @@ -331,7 +911,7 @@ <informalexample> <programlisting role="php"> <?php -echo "\$foo==$foo; type is " . gettype( $foo ) . "<br>\n"; + echo "\$foo==$foo; type is " . gettype( $foo ) . "<br>\n"; ?> </programlisting> </informalexample> @@ -341,7 +921,445 @@ <sect1 id="language.types.array"> <title>Les tableaux</title> <para> - Les tableaux ressemblent aux tables de hashage (tableaux associatifs) et + Un tableau PHP est en fait une association ordonnée (map). Une + association est un type qui fait correspondre des valeurs + à des <emphasis>clés</emphasis>. Ce type est optimisé + de diverses façons, qui font que vous pouvez le manipuler comme + un tableau à indices réels, une liste (vecteur), ou un table + de hachage (qui est une implémentation d'association), + dictionnaire, collection, pile, queue et encore d'autres. + Comme une valeur peut elle-même être un tableau, vous pouvez + simuler facilement un arbre. + </para> + <para> + Les détails d'implémentation de ces structures sont hors du + champs de ce manuel, mais vous trouverez ici un exemple + de toutes ces structures. + </para> + <sect2 id="language.types.array.syntax"> + <title>Syntaxe</title> + <sect3 id="language.types.array.syntax.array-func"> + <title>Créer un tableau <function>array</function></title> + <para> + Un tableau <type>array</type> peut être créé avec la fonction + <function>array</function>. Cette fonction prend en argument + des structures <literal><replaceable>key</replaceable> => + <replaceable>value</replaceable></literal>, séparées par des virgules. + </para> + <para> + Une clé <varname>key</varname> est soit un entier positif + ou bien une chaîne. + <!-- + Negative integers are also allowed, however, IMO it's best to not + document that, or even disencourage it. + Why? + First, because it is very tricky. But the real reason is that the key + '-1' will be interpreted as a string, and not as a integer. Therefore, + the usage + "the -1'st value of \$arr is $arr[-1]" is ambigious. By the way, + it results in a parse-error anyway, which is another argument for + not documenting it. + -Jeroen + --> + Si une clé est la représentation standard d'un entier positif, + elle sera interprété comme tel. (i.e. <literal>'8'</literal> sera + interprété comme <literal>8</literal>, tandis que <literal>'08'</literal> + sera interprété comme <literal>'08'</literal>). + </para> + <para> + Une valeur peut être n'importe quoi. + </para> + <sect4 id="language.types.array.omit-key"> + <title>Omettre des clés</title> + <para> + Si vous omettez une clé lors de la spécification d'un tableau, + l'indice maximum + 1 sera utilisé comme clé par défaut. Si aucun + indice numérique n'a été généré, ce sera 0. Si vous spécifiez une + qui a déjà été assigné, + la nouvelle valeur écrasera la précédente. + </para> + <para> + <synopsis> +array( <optional><replaceable>key</replaceable> => </optional> +<replaceable>value</replaceable> + , ... + ) +// <replaceable>key</replaceable> is either <type>string</type> +ou entier <type>integer</type> positif +// <replaceable>value</replaceable> peut être n'importe quoi + </synopsis> + </para> + </sect4> + </sect3> + <sect3 id="language.types.array.syntax.modifying"> + <title>La syntaxe à crochets</title> + <para> + Vous pouvez aussi modifier un tableau existant en lui assignant + simplement des valeurs. + </para> + <para> + L'assignement de valeurs de tableau se fait en spécifiant la clé + entre crochets. Si vous omettez la clé ("<literal>$tableau[]</literal>"), + la valeur sera ajoutée à la fin du tableau. + <synopsis> +$arr[<replaceable>key</replaceable>] = <replaceable>value</replaceable>; +$arr[] = <replaceable>value</replaceable>; +// <replaceable>key</replaceable> est soit une chaîne, soit un entier +// <replaceable>value</replaceable> peut être n'importe quoi + </synopsis> + Si <varname>$arr</varname> n'existe pas, il sera créé. Cela + en fait une alternative pour créer un tableau. Pour modifier une + valeur, assignez lui une nouvelle valeur. Pour supprimer une + valeur, utilisez la fonction <function>unset</function>. + </para> + </sect3> + </sect2><!-- end syntax --> + <sect2 id="language.types.array.useful-funcs"> + <title>Fonctions pratiques</title> + <para> + Il y a toute une panoplie de fonctions pratiques pour travailler + avec les tableau : <link linkend="ref.array">array-functions</link>. + </para> + <para> + L'élément de langage <link linkend="control-structures.foreach">foreach</link> + est spécifiquement dédiée aux tableau : elle permet de passer en + revue simplement les valeurs d'un tableau. + </para> + </sect2> + <sect2 id="language.types.array.examples"> + <title>Exemples</title> + <para> + Le type tableau de PHP est très souple. Voici quelques exemples d'utilisation : + </para> + <para> + <informalexample> + <programlisting role="php"> +<?php +// ceci + $a = array( 'couleur' => 'rouge' + , 'gout' => 'sucre' + , 'forme' => 'rond' + , 'nom' => 'pomme' + , 4 // cette clé sera 0 + ); +// est complétement équivalent à + $a['couleur'] = 'rouge'; + $a['gout'] = 'sucre'; + $a['forme'] = 'rond'; + $a['nom'] = 'pomme'; + $a[] = 4; // cette clé sera 0 + $b[] = 'a'; + $b[] = 'b'; + $b[] = 'c'; +// va créer le tableau array( 0 => 'a' , 1 => 'b' , 2 => 'c' ) +// ou plus simplement array('a' , 'b' , 'c' ) +?< + </programlisting> + </informalexample> + </para> + <example> + <title>Utilisation de <function>array</function></title> + <programlisting role="php"> +<?php +// Array comme correspondance + $map = array( 'version' => 4 + , 'OS' => 'Linux' + , 'langue' => 'français' + , 'short_tags' => TRUE ); +// valeur strictement numériques + $array = array( 7 + , 8 + , 0 + , 156 + , -10 + ); +// ceci est la même chose que array( 0 => 7, 1 => 8, ...) + $switching = array( 10 // clé = 0 + , 5 => 6 + , 3 => 7 + , 'a' => 4 + , 11 // clé = 6 (index maximum : 5) + , '8' => 2 // clé = 8 (entier!) + , '02' => 77 // clé = '02' + , 0 => 12 // la valeur de la clé 10 sera remplacée par 12 + ); +<!-- TODO example of +- mixed keys +- overwriting keys +- integer keys as string +- using vars/functions as key/values +- mixed skipping +--> +// empty array +$empty = array(); +?< + </programlisting> + </example> + <example id="language.types.array.examples.loop"> + <title>Collection</title> + <programlisting role="php"> +<?php + $couleurs = array('rouge','bleu','vert','jaune'); + foreach ( $couleurs as $couleur ){ + echo "Aimez-vous la couleur $couleur?\n"; + } +/* Affiche : +Aimez-vous la couleur rouge? +Aimez-vous la couleur bleu? +Aimez-vous la couleur vert? +Aimez-vous la couleur jaune? +*/ +?> + </programlisting> + </example> + <para> + Notez qu'il n'est pas possible actuellement de modifier les + valeurs d'un tableau avec une telle boucle. + <!-- + Should be made possible, if you write: + foreach ( $colors as &$color ) + See bug#3074 + --> + Une solution pour cela est : + <example id="language.types.array.examples.changeloop"> + <title>Collection</title> + <programlisting role="php"> +<?php + foreach( $couleurs as $cle => $couleur ){ +// ne marche pas +//$couleur = strtoupper($couleur); +//marche : + $couleurs[$cle] = strtoupper($couleur); + } + print_r($couleur); +/* Affiche : +Array +( + [0] => ROUGE + [1] => BLEU + [2] => VERT + [3] => JAUNE +) +*/ +?> + </programlisting> + </example> + </para> + <para> + Cet exemple crée un tableau d'index minimal 1. + <example> + <title>Tableau en 1</title> + <programlisting role="php"> +<?php + $firstquarter = array(1 => 'Janvier', 'Février', 'Mars'); + print_r($firstquarter); +/* Affiche: +Array +( + [1] => 'Janvier' + [2] => 'Février' + [3] => 'Mars' +) +*/ +?> + </programlisting> + </example> + </para> + <example> + <title>Remplissage d'un tableau</title> + <programlisting role="php"> +<?php +// remplis un tableau avec les noms de fichiers d'un dossier + $handle = opendir('.'); + while ( $file = readdir($handle) ){ + $files[] = $file; + } + closedir($handle); +?> + </programlisting> + </example> + <para> + Les tableaux sont ordonnés. Vous pouvez modifier l'ordre des + valeurs avec de nombreuses fonctions de classement. Voyez les + fonctions de <link linkend="ref.array">tableaux</link>. + </para> + <example> + <title>Tri de tableaux</title> + <programlisting role="php"> +<?php + sort($files); + print_r($files); +?> + </programlisting> + </example> + <para> + Comme une valeur de tableau peut être n'importe quoi, elle + peut aussi être un autre tableau. Comme cela, vous pouvez + avoir des tableaux multi-dimensionnels, ou récursifs. + </para> + <example> + <title>Tableaux multi-dimensionnels, et récursifs</title> + <programlisting role="php"> +<?php + $fruits = array ( "fruits" => array ( "a" => "orange" + , "b" => "banane" + , "c" => "pomme" + ) + , "nombres" => array ( 1 + , 2 + , 3 + , 4 + , 5 + , 6 + ) + , "trous" => array ( "premier" + , 5 => "second" + , "troisième" + ) + ); +<!-- quite duplicate... +$a = array( + "apple" => array( + "color" => "red", + "taste" => "sweet", + "shape" => "round" + ), + "orange" => array( + "color" => "orange", + "taste" => "tart", + "shape" => "round" + ), + "banana" => array( + "color" => "yellow", + "taste" => "paste-y", + "shape" => "banana-shaped" + ) +); +--> +?> + </programlisting> + </example> + </sect2> + <sect2 id="language.types.array.donts"> + <title>Attention aux tableaux</title> + <sect3 id="language.types.array.foo-bar"> + <title>Pourquoi est ce que <literal>$foo[bar]</literal> est invalide?</title> + <para> + Dans vos vieux scripts, vous pouvez avoir utilisé la syntaxe suivante : + <informalexample> + <programlisting role="php"> +<?php + $foo[bar] = 'ennemi'; + echo $foo[bar]; +?> + </programlisting> + </informalexample> + Cela est mauvais, mais ca marche. Pourquoi est-ce mauvais? La raison + est que PHP réclame une expression entre les crochets (comme + indiqué dans la section sur la + <link linkend="language.types.array.syntax">syntaxe</link> des tableaux). + Cela signifie que vous pouvez écrire quelque chose comme : + <informalexample> + <programlisting role="php"> +<?php + echo $arr[ foo(true) ]; +?> + </programlisting> + </informalexample> + Ceci est un exemple d'utilisation de retour de fonction dans un + index de tableau. PHP reconnait aussi les constantes, et vous + pouvez avoir déjà rencontré <literal>E_*</literal>. + <informalexample> + <programlisting role="php"> +<?php + $error_descriptions[E_ERROR] = "Une erreur fatale est survenue"; + $error_descriptions[E_WARNING] = "PHP a généré une alerte"; + $error_descriptions[E_NOTICE] = "Ceci est juste une note grâcieuse"; +?> + </programlisting> + </informalexample> + Notez que <literal>E_ERROR</literal> est aussi un identifiant + vlaide, tout comme <literal>bar</literal> dans le premier exemple. + Mais le dernier exemple revient à écrire : + <informalexample> + <programlisting role="php"> +<?php + $error_descriptions[1] = "Une erreur fatale est survenue"; + $error_descriptions[2] = "PHP a généré une alerte"; + $error_descriptions[8] = "Ceci est juste une note grâcieuse"; +?> + </programlisting> + </informalexample> + car <literal>E_ERROR</literal> égale <literal>1</literal>, etc. + </para> + <para> + Alors, comment se fait-tile que <literal>$foo[bar]</literal> fonctionne? + C'est parce que <literal>bar</literal> est attendu comme une + constante. Cependant, dans ce cas, aucune constante n'a pour nom + <literal>bar</literal>. PHP suppose alors que vous voulez dire + <literal>bar</literal> littéralement, c'est-à-dire la + chaîne <literal>"bar"</literal>, mais que vous avez oublié les + guillements. + </para> + <sect4 id="language.types.array.foo-bar.why"> + <title>Alors, pourquoi est-ce mal?</title> + <para> + Dans le futur, l'équipe de développement peut vouloir ajouter une + nouvelle constante et vous vous retrouverez dans la panade. Par + exemple, vous ne pouvez déjà pas utiliser les constantes + <literal>empty</literal> et <literal>default</literal>, car ce + sont des mots reservés. + <!-- <jeroen>hmm... i'm doubting this myself. Finish it if you like</jeroen> + But probably + the most threatening + thing is yourself, or whoever will maintain the script. You'll + maybe get very strange behaviour, and + --> + </para> + <para> + Et, pour en mettre une autre couche, cette syntaxe est tout simplement + obsolète, et risque de ne plus fonctionner du tout un jour ou l'autre. + </para> + <note> + <simpara> + Lorsque vous activez le rapport d'erreur avec <function>error_reporting</function> + avec <literal>E_ALL</literal>, PHP générera des notes à chaque fois que cette + syntaxe est utilisée. Essayez donc <literal>error_reporting(E_ALL);</literal> + dans vos scripts, pour voir). + </simpara> + </note> + <note> + <simpara> + Dans une chaîne à guillements doubles, une autre syntaxe est + valide. Voyez la section sur + <link linkend="language.types.string.parsing">Traitement des variables + dans les chaînes</link> pour plus de détails. + </simpara> + </note> + </sect4> + </sect3> + </sect2> + <!-- TODO + - example multi-dim with $arr[bla][bla] syntax + - converting to array + - warning about references + - note that assigning is copy (usually...) + --> +<!-- there is no such thing as multi/singel dim arrays (at least in PHP4) + <sect2 id="language.types.array.single-dim"> + <title>Single Dimension Arrays</title> + <para> + PHP supports both scalar and associative arrays. In fact, there + is no difference between the two. You can create an array using +- the <function>list</function> or <function>array</function> + the + <function>list</function> + Nope + or <function>array</function> + functions, or you can explicitly set each array element value. + ++++++++++++++++++++++++++++++++++++++++++++ + <para> + Les tableaux ressemblent aux tableaux associatifs et aux tableaux indexés (vecteurs).</para> <sect2 id="language.types.array.single-dim"> <title>Tableaux à une dimension</title> @@ -386,7 +1404,7 @@ a dans un tableau en utilisant la fonction <function>count</function>. </para> <para> - Vous pouvez vous déplacer à l'intérieur d'un + Vous pouvez-vous déplacer à l'intérieur d'un tableau en utilisant les fonctions <function>next</function> et <function>prev</function>. Un autre moyen de se déplacer dans un tableau est d'utiliser la fonction <function>each</function>. @@ -423,7 +1441,7 @@ ?> </programlisting> </informalexample> - En PHP 3, l'exemple ci dessu va afficher : + En PHP 3, l'exemple ci-dessus va afficher : <computeroutput>Cela ne marche pas : Array[bar]</computeroutput>. L'opérateur de concaténation, peut être utilisé pour corriger cela : @@ -503,8 +1521,9 @@ ?> </programlisting> </informalexample> - </para> + </para>+ </sect2> + --> </sect1> <sect1 id="language.types.object"> <title>Les objets</title> @@ -516,19 +1535,80 @@ <informalexample> <programlisting role="php"> <?php -class foo { + class foo { function faire_foo () { echo "Faisant foo."; } -} -$bar = new foo; -$bar->do_foo(); + } + $bar = new foo; + $bar->faire_foo(); ?> </programlisting> </informalexample> </para> </sect2> </sect1> + <sect1 id="language.types.resource"> + <title>Ressources</title> + <para> + Une ressource (resource en anglais), est un type spécial, + qui représente une référence sur une ressource externe. Les + ressources sont créées par des fonctions dédiées. Reportez + vous à l'annexe <link linkend="resources">ressource</link> + pour une liste exhaustive des fonctions créant et utilisant + ces ressources. + </para> + <note> + <simpara> + Le type ressource a été introduit en PHP 4. + </simpara> + </note> + <sect2 id="language.types.resource.self-destruct"> + <title>Libérer des ressources</title> + <para> + Grâce au système de comptabilisation des références + introduit en PHP 4 (avec le moteur Zend), PHP détecte automatiquement + qu'une ressource n'est plus utilisée (comme Java). Dans ce cas, + toutes les ressources systèmes utilisées par cette + ressource sont libérées automatiquement. + <note> + <simpara> + Les connexions persistantes représentent un cas + particulier, elles ne seront <emphasis>PAS</emphasis> + détruites. Voyez + <link linkend="features.persistent-connections">connexions persistantes</link>. + </simpara> + </note> + </para> + </sect2> + </sect1> + <sect1 id="language.types.null"> + <title>La valeur NULL</title> + <para> + La valeur spéciale <literal>NULL</literal> représente + l'absence de valeur. Une variable avec la valeur NULL n'a + pas de valeur. + </para> + <sect2 id="language.types.null.syntax"> + <title>Syntaxe</title> + <para> + Il y a seulement une valeur de type NULL, et c'est la constante + <literal>NULL</literal>, insensible à la casse. + <informalexample> + <programlisting role="php"> +<?php + $var = Null; +?> + </programlisting> + </informalexample> + </para> + <note> + <simpara> + La valeur NULL a été introduite en PHP 4. + </simpara> + </note> + </sect2> + </sect1> <sect1 id="language.types.type-juggling"> <title>Définition du type</title> <simpara> @@ -553,22 +1633,35 @@ <informalexample> <programlisting role="php"> <?php -$foo = "0"; // $foo est une chaîne de caractères (ASCII 48) -$foo++; // $foo est la chaîne de caractères "1" (ASCII 49) -$foo += 1; // $foo est maintenant du type entier (2) -$foo = $foo + 1.3; // $foo est maintenant du type double (3.3) -$foo = 5 + "10 Petits cochons"; // $foo est du type entier (15) -$foo = 5 + "10 cochonnets"; // $foo est du type entier (15) -?> + $foo = "0"; // $foo est une chaîne de caractères (ASCII 48) + $foo += 2; // $foo est maintenant du type entier (2) + $foo = $foo + 1.3; // $foo est maintenant du type double (3.3) + $foo = 5 + "10 Petits cochons"; // $foo est du type entier (15) + $foo = 5 + "10 cochonnets"; // $foo est du type entier (15) +?> +<!-- +TODO: explain ++/- - behaviour with strings +examples: + ++'001' = '002' + ++'abc' = 'abd' + ++'xyz' = 'xza' + ++'9.9' = '9.0' + ++'-3' = '-4' + - -'9' = 8 (integer!) + - -'5.5' = '5.5' + - -'-9' = -10 (integer) + - -'09' = 8 (integer) + - -'abc' = 'abc' +--> </programlisting> </informalexample> </para> <simpara> Si les deux derniers exemples vous semblent obscurs ou si vous voulez forcer une variable a être évaluée - avec un certain type, reportez vous au paragraphe Conversion de + avec un certain type, reportez-vous au paragraphe Conversion de type ci-dessous. Si vous voulez changer le type d'une variable, - intéressez vous à aux fonctions de + intéressez-vous à aux fonctions de <link linkend="language.types.string.conversion">conversion de chaînes</link>. </simpara> <simpara> @@ -580,11 +1673,11 @@ </simpara> <para> Pour tester les exemples de cette section, il suffit d'en faire - un copier/coller, et d'insèrer les lignes dans un script PHP. + un copier/coller, et d'insérer les lignes dans un script PHP. <informalexample> <programlisting role="php"> <?php -echo "\$foo==$foo; le type est " . gettype( $foo ) . "<br>\n"; + echo "\$foo==$foo; le type est " . gettype( $foo ) . "<br>\n"; ?> </programlisting> </informalexample> @@ -596,28 +1689,28 @@ <informalexample> <programlisting role="php"> <?php -$a = 1; // $a est un entier -$a[0] = "f"; // $a devient un tableau, et $a[0] contient "f" + $a = 1; // $a est un entier + $a[0] = "f"; // $a devient un tableau, et $a[0] contient "f" ?> </programlisting> </informalexample> </para> <para> - Bien que dans l'exemple ci dessus, il semble évident que + Bien que dans l'exemple ci-dessus, il semble évident que $a va devenir un tableau, dont le premier élément est 'f', considérez l'exemple suivant : <informalexample> <programlisting role="php"> <?php -$a = "1"; // $a est une chaîne -$a[0] = "f"; // Qu'est ce qu'une position dans une chaîne ? que se passe t il? + $a = "1"; // $a est une chaîne + $a[0] = "f"; // Qu'est ce qu'une position dans une chaîne ? que se passe t il? ?> </programlisting> </informalexample> </para> <para> Etant donné que PHP supporte l'indexation de chaîne avec des - offsets identiques à celles des tableaux, l'exemple ci dessus + offsets identiques à celles des tableaux, l'exemple ci-dessus conduit à un problème : est ce que $a est un tableau, dont le premier élément est "f", ou bien est ce que "f" est le premier élément de la chaîne de @@ -640,8 +1733,8 @@ <informalexample> <programlisting role="php"> <?php -$foo = 10; // $foo est un entier -$bar = (double) $foo; // $bar est un double + $foo = 10; // $foo est un entier + $bar = (double) $foo; // $bar est un double ?> </programlisting> </informalexample> @@ -653,6 +1746,9 @@ <simpara>(int), (integer) - type entier</simpara> </listitem> <listitem> + <simpara>(bool), (boolean) - booléen</simpara> + </listitem> + <listitem> <simpara>(real), (double), (float) - type double</simpara> </listitem> <listitem> @@ -673,14 +1769,74 @@ <informalexample> <programlisting role="php"> <?php -$foo = (int) $bar; -$foo = ( int ) $bar; + $foo = (int) $bar; + $foo = ( int ) $bar; ?> </programlisting> </informalexample> </para> <para> - Le transtypage n'a pas toujours le résultat attendu. Par exemple : + Le transtypage n'a pas toujours de résultat prévisible. + Pour plus d'informations, voyez : + </para> + <itemizedlist> + <listitem> + <simpara> + <link linkend="language.types.boolean.casting">Conversion en booléen</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.integer.casting">Conversion en entier</link> + </simpara> + </listitem> + <!-- don't exist yet + <listitem> + <simpara> + <link linkend="language.types.double.casting">Conversion en nombre à + virgule flottante</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.string.casting">Conversion en + chaîne de caractères</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.array.casting">Conversion en tableau</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.object.casting">Conversion en objet</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.resource.casting">Conversion en ressource</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.null.casting">Conversion en NULL</link> + </simpara> + </listitem> + --> + </itemizedlist> + <warning> + <simpara> + Pour transformer facilement une variable en chaîne, + entourez la simplement de guillements doubles. + </simpara> + </warning> + <para> + Lors de la conversion d'un tableau en chaîne, le résultat sera + le mot <literal>Array</literal> (tableau, en anglais). Lors de la + conversion d'un objet en chaîne, le résultat sera le mot + <literal>Object</literal> (objet, en anglais). Dans les deux cas, + une alerte sera affichée. </para> <para> Lorsque vous transtypez un scalaire ou une chaîne en tableau, @@ -689,9 +1845,9 @@ <informalexample> <programlisting role="php"> <?php -$var = 'ciao'; -$arr = (array) $var; -echo $arr[0]; // affiche 'ciao' + $var = 'ciao'; + $arr = (array) $var; + echo $arr[0]; // affiche 'ciao' ?> </programlisting> </informalexample> @@ -703,9 +1859,9 @@ <informalexample> <programlisting role="php"> <?php -$var = 'ciao'; -$obj = (object) $var; -echo $obj->scalar; // affiche 'ciao' + $var = 'ciao'; + $obj = (object) $var; + echo $obj->scalar; // affiche 'ciao' ?> </programlisting> </informalexample>
Index: phpdoc/fr/language/types.xml diff -u phpdoc/fr/language/types.xml:1.10 phpdoc/fr/language/types.xml:1.11 --- phpdoc/fr/language/types.xml:1.10 Tue Mar 6 13:31:37 2001 +++ phpdoc/fr/language/types.xml Wed Aug 8 05:47:03 2001 @@ -1,7 +1,38 @@ +<!-- $Revision: 1.11 $ --> <chapter id="language.types"> - <title>Types</title> + <title>Les types</title> + <sect1 id="language.types.intro"> + <title>Introduction</title> + <simpara> + PHP supporte les 8 types basiques suivants : + </simpara> <para> - PHP supporte les types suivants : + PHP supporte quatres types scalaires : + <itemizedlist> + <listitem> + <simpara> + <link linkend="language.types.boolean">booléen</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.integer">entier</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.double">nombre à virgule flottante</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.string">chaîne de caractères</link> + </simpara> + </listitem> + </itemizedlist> + </para> + <para> + PHP supporte deux types composés : <itemizedlist> <listitem> <simpara> @@ -10,26 +41,42 @@ </listitem> <listitem> <simpara> - <link linkend="language.types.double">nombre à virgule flottante</link> - </simpara> - </listitem> - <listitem> - <simpara> - <link linkend="language.types.integer">entier</link> + <link linkend="language.types.object">objet</link> </simpara> </listitem> + </itemizedlist> + </para> + <para> + PHP supporte deux types spéciaux : + <itemizedlist> <listitem> <simpara> - <link linkend="language.types.object">objet</link> + <link linkend="language.types.resource">ressource</link> </simpara> </listitem> <listitem> <simpara> - <link linkend="language.types.string">chaîne</link> + <link linkend="language.types.null">null</link> </simpara> </listitem> </itemizedlist> </para> + <note> + <simpara> + Dans ce manuel, vous rencontrerez souvant le type <literal>mixed</literal>. + C'est un pseudo-type, qui indique que le paramètre peut + indifféremment prendre plusieurs types. + </simpara> + <!-- + Just an idea, maybe useful for some func-defs? + (at least it is for the operator-defs) + <simpara> + In parameter definitions you can also encouter the 'number' pseudo-type, + that indicates a parameter that is either <type>integer</type> or + <type>float</type>. + </simpara> + --> + </note> <simpara> Habituellement, le type d'une variable n'est pas déclaré par le programmeur. Il est décidé au moment de @@ -49,38 +96,305 @@ Pour plus d'informations, voir le paragraphe <link linkend="language.types.type-juggling">transtypage</link>. </simpara> + </sect1> + <sect1 id="language.types.boolean"> + <title>Booléens</title> + <simpara> + C'est le type le plus simple. Un booléen exprime les valeurs + de vrai <literal>TRUE</literal> ou <literal>FALSE</literal>. + </simpara> + <para> + Vous pouvez utiliser les constantes '<literal>TRUE</literal>' et + '<literal>FALSE</literal>' pour spécifier une valeur de type + <type>boolean</type>. Généralement, vous les créerez avec un + des <link linkend="language.operators">operateurs</link> + qui retourne une valeur <type>boolean</type>, pour le passer + à une <link linkend="control-structures">structure de contrôle</link>. + <informalexample> + <programlisting role="php"> +<?php + if ($action == "show_version"){ +// == is an <link linkend="language.operators">operator</link> +// qui retourne un booléen + echo "La version est 1.23"; + } +// ceci n'est pas nécessaire + if ($show_separators == true){ + echo "<hr>\n"; + } +// ceci est plus pratique + if ($show_separators){ + echo "<hr>\n"; + } +?> + </programlisting> + </informalexample> + </para> + <!-- TODO: example of this --> + <!-- TODO: example to show that if ( expr == TRUE ) is not really + necessary... (i've seen this construct numerous times) + --> + <!-- TODO: how others vars are converted to boolean --> + <note> + <simpara> + Le type booéen a été introduit en PHP 4. + </simpara> + </note> + <sect2 id="language.types.boolean.casting"> + <title>Conversion en booléen</title> + <simpara> + Reportez-vous au chapitre + "<link linkend="language.types.type-juggling">Définition du type</link>" + pour plus d'informations sur les conversions. + </simpara> + <para> + Lors des conversions de valeurs de type <type>boolean</type>, les valeurs + suivantes sont considérées comme fausse (<literal>FALSE</literal>) : + <itemizedlist> + <listitem> + <simpara> + Le <link linkend="language.types.boolean">booléen</link> FALSE </simpara> + </listitem> + <listitem> + <simpara> + L'<link linkend="language.types.integer">entier</link> 0 (zéro) + </simpara> + </listitem> + <listitem> + <simpara> + Le <link linkend="language.types.double">nombre à virgule flottante</link> 0.0 (zéro) + </simpara> + </listitem> + <listitem> + <simpara> + La <link linkend="language.types.string">chaîne</link> vide, + et la <link linkend="language.types.string">chaîne</link> "0" + </simpara> + </listitem> + <listitem> + <simpara> + Le <link linkend="language.types.array">tableau</link> vide + (aucun élément) + </simpara> + </listitem> + <listitem> + <simpara> + L'<link linkend="language.types.object">objet</link> vide + (aucun élément) + </simpara> + </listitem> + <listitem> + <simpara> + La constante spéciale <link linkend="language.types.null">NULL</link> + </simpara> + </listitem> + </itemizedlist> + Toutes les autres valeurs sont considérées comme + vraies (<literal>TRUE</literal> (y compris les + <link linkend="language.types.resource">ressources</link>). + <warning> + <simpara> + -1 est considéré comme vrai! + </simpara> + </warning> + <!-- and/or a few examples, for the people only looking at + the examples... </XXX> --> + </para> + </sect2> + </sect1> <sect1 id="language.types.integer"> <title>Entiers</title> <para> - Il est possible de spécifier les nombres entiers (integers) de - la manière suivante : + Un entier est un nombre de l'ensemble des entiers naturels Z : + Z = {...., -2, -1, 0, 1, 2, ...}. Il est possible de spécifier + les nombres entiers (integers) de toutes les manières suivantes : + décimale (base 10), hexadécimale (base 16), octale (base 8) éventuellement + précédé du signe moins (-). + </para> + <para> + Pour utiliser la notation octale, vous devez préfixer le nombre avec + un zéro; pour utiliser la notation hexadécimale, vous devez préfixer + le nombre avec <literal>0x</literal>. <informalexample> <programlisting role="php"> <?php -$a = 1234; # nombre entier en base 10 -$a = -123; # nombre entier négatif -$a = 0123; # nombre entier en base 8, octale (équivalent à 83 en base 10) -$a = 0x12; # nombre entier en base 16, hexadécimale (équivalent à 18 en base 10) + $a = 1234; # nombre entier en base 10 + $a = -123; # nombre entier négatif + $a = 0123; # nombre entier en base 8, octale (équivalent à 83 en base 10) + $a = 0x12; # nombre entier en base 16, hexadécimale + # (équivalent à 18 en base 10) ?> </programlisting> </informalexample> + La taille des entiers dépend de la plate-forme de support, mais + la valeur maximale est généralement de 2 milliards et des + poussières (c'est un entier signé de 32 bits). PHP ne supporte + pas les entiers non signés. </para> + <note> + <simpara> + En PHP, il n'existe pas de type fraction. + <literal>1/2</literal> se transforme en nombre à virgule + flottante <literal>0.5</literal>. + </simpara> + </note> + <sect2 id="language.types.integer.overflow"> + <title>Dépassement de capacité des entiers</title> + <para> + Si un nombre est hors de l'intervalle de validité + des entiers, il sera interprété comme un <type>float</type>. + <informalexample> + <programlisting role="php"> +<?php + $large_number = 2147483647; + var_dump($large_number); +// affiche : int(2147483647) + $large_number = 2147483648; + var_dump($large_number); +// affiche : float(2147483648) +?> + </programlisting> + </informalexample> + De même, si une fonction ou un opérateur retourne un entier qui + est hors des limites de validité des entiers, il sera aussi + automatiquement converti en <type>float</type>. + <informalexample> + <programlisting role="php"> +<?php + $million = 1000000; + $large_number = 50000 * $million; + var_dump($large_number); +// affiche : float(50000000000) +?> + </programlisting> + </informalexample> + <warning> + <simpara> + Malheureusement, il y a un bug dans le moteur (toujours présent en + 4.0.6 et probablement résolu en 4.0.7) ce qui fait que PHP que fonctionne + pas toujours bien lorsque des nombres négatifs sont utilisés. Lorsque les + deux opérandes sont positifs, il n'y a pas de problèmes. Par exemple : + <literal>-50000 * $million</literal>, conduit à <literal>-429496728</literal>. + </simpara> + </warning> + </para> + </sect2> + <sect2 id="language.types.integer.casting"> + <title>Conversion en entiers</title> + <simpara> + Pour explicitement convertir une valeur en <type>integer</type>, + utilisez les opérateurs de transtypage <literal>(int)</literal> + ou <literal>(integer)</literal>. Cependant, dans la plupart des + situations, vous n'en aurez pas besoin, car une valeur sera automatiquement + convertie si un opérateur, un fonction ou tout autre élément du + langage requiert un <type>entier</type>. + </simpara> + <simpara> + Reportez-vous à la section + <link linkend="language.types.type-juggling">définition de type</link> + pour plus d'informations sur les conversions. + </simpara> + <sect3 id="language.types.integer.casting.from-boolean"> + <title>Depuis un <link linkend="language.types.boolean">booléen</link></title> + <simpara> + <link linkend="language.types.boolean">FALSE</link> devient 0 + (zéro), et <link linkend="language.types.boolean">TRUE</link> + devient 1 (un). + </simpara> + </sect3> + <sect3 id="language.types.integer.casting.from-float"> + <title> + Depuis un <link linkend="language.types.double">nombre à virgule flottante</link> + </title> + <simpara> + Lors de conversion entre nombre à virgule flottante et + un entier, le nombre sera arrondi à la valeur inférieure + s'il est positif, et supérieure s'il est négatif + (conversion dite 'vers zéro'). + </simpara> + <para> + Si le nombre est hors de l'intervalle de validité + des entiers, (généralement <literal>+/- 2.15e+9 = 2^31</literal>), + le résultat est indéfinit, car les nombres à virgules + flottante n'ont pas assez de précision pour fournir une + valeur exacte pour un entier. + <warning> + <simpara> + Aucune alerte, même pas le plus petit message ne + sera affiché dans ce cas. + </simpara> + </warning> + </para> + <warning> + <para> + Ne transformez jamais une fraction inconnue en entier, car cela + peut conduire à des résultats irrationnels. + <informalexample> + <programlisting role="php"> +<?php + echo (int) ( (0.1+0.7) * 10 ); +// affiche 7! +?> + </programlisting> + </informalexample> + Pour plus d'informations, reportez-vous aux + <link linkend="language.types.double">alertes</link> liées + aux nombres à virgule flottante. + </para> + </warning> + </sect3> + <sect3 id="language.types.integer.casting.from-string"> + <title>From strings</title> + <simpara> + Reportez-vous à la section des + <link linkend="language.types.string.conversion">conversions de chaînes</link>. + </simpara> + </sect3> + <sect3 id="language.types.integer.casting.from-other"> + <title>Conversion d'autres types</title> + <para> + La conversion d'autres types en entier est indéfinie. + Actuellement, PHP convertit d'abord la valeur en + <link linkend="language.types.boolean.casting">booléen</link>. + <caution> + <simpara> + Mais, ne vous fiez pas à ce comportement, car il + est susceptible de changer sans préavis! + </simpara> + </caution> + </para> + <para> + Voir aussi : + <link linkend="ref.gmp">Nombres de grande taille</link> et + <link linkend="language.types.double">Nombres à virgules flottantes</link>. + </para> + <!-- + IMO, it would more sense as (int) $arr returned the + number of elements in $arr. This won't break anything, + since this behaviour was never defined before, and + (bool)(int) $arr will still behave the same. + --> + </sect3> + </sect2> </sect1> <sect1 id="language.types.double"> <title>Les nombres à virgule flottante</title> <para> - Les nombres à virgule flottante ("double") peuvent êtres + Les nombres à virgule flottante (connus aussi sous le + vocable de "<literal>double</literal>" ou "<literal>float</literal>" + "<literal>nombre rééls</literal>") peuvent être spécifiés en utilisant la syntaxe suivante: <informalexample> <programlisting role="php"> <?php -$a = 1.234; -$a = 1.2e3; + $a = 1.234; + $a = 1.2e3; ?> </programlisting> </informalexample> </para> - <warning id="warn.float-precision"> + <warning> + <title>Précision des nombres à virgule flottante</title> <para> Il est fréquent que de simples fractions décimales telles que <literal>0.1</literal> ou <literal>0.7</literal> ne puissent @@ -98,11 +412,11 @@ en mode décimal. </para> <para> - Ne faîtes donc jamais confiance aux nombres à virgule - jusqu'à leur dernière décimale, et ne comparer + Ne faites donc jamais confiance aux nombres à virgule + jusqu'à leur dernière décimale, et ne comparez jamais ces nombres avec l'opérateur d'égalité. Si vous avez besoin d'une précision particulière, - reportez vous au traitement des nombres de grande taille avec les + reportez-vous au traitement des nombres de grande taille avec les librairies <link linkend="ref.bc">BC</link> ou <link linkend="ref.gmp">GMP</link>. </para> </warning> @@ -110,37 +424,115 @@ <sect1 id="language.types.string"> <title>Les chaînes de caractères</title> <para> - Les chaînes de caractères peuvent être définies - en utilisant deux types de délimiteurs. + Les chaînes de caractères sont des séquences de caractères. + En PHP, un caractère est un octet, et il y en 256 de possibles. + PHP n'a pas (encore?) de support natif d'Unicode. + <!-- how about unicode? will we support that eventually? Are + there current any ways to work with unicode? + --> </para> - <para> - Si la chaîne de caractères est délimitée - par des guillemets doubles ("), les variables à - l'intérieur de la chaîne seront évaluées, - et remplacées par leur valeur. Comme en C ou en Perl, le - caractère antislash (\) est utilisé pour - protéger (échapper) un caractère spécial. + <note> + <simpara> + La taille n'est pas un problème majeur pour une chaîne. + Elle peut devenir très grande sans problème. Il n'y a + a pas à s'en faire pour cela. + </simpara> + </note> + <sect2 id="language.types.string.syntax"> + <title>Syntax</title> + <para> + Une chaîne peut être spécifiée de trois manières + différentes : + <itemizedlist> + <listitem> + <simpara> + <link linkend="language.types.string.syntax.single">guillemets simples</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.string.syntax.double">guillemets doubles</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.string.syntax.heredoc">syntaxe HereDoc</link> + </simpara> + </listitem> + </itemizedlist> + </para> + <sect3 id="language.types.string.syntax.single"> + <title>guillemets simples</title> + <para> + Le moyen le plus simple de spécifier une chaîne de caractères + est d'utiliser les guillemets simples : <literal>'</literal>. + </para> + <para> + Pour spécifier un guillemet simple littéral, vous devez + l'échapper avec un anti-slash (<literal>\</literal>), comme dans de nombreux + langages. Si un anti-slash doit apparaître dans votre chaîne ou bien + en fin de chaîne, il faudra le doubler. Notez que si vous essayez d'échapper n'importe + quel autre caractère, l'anti-slash sera conservé! Il n'y a pas + besoin d'échapper d'autres caractères que le guillemets lui-même. + <note> + <simpara> + En PHP 3, une alerte sera affichée si cela arrive avec un + niveau de rapport d'erreur de <literal>E_NOTICE</literal>. + </simpara> + </note> + <note> + <simpara> + Contrairement aux autres syntaxes, les variables présentes dans la + chaîne ne seront <emphasis>PAS</emphasis> remplacées par leurs + valeurs. + </simpara> + </note> + <informalexample> + <programlisting role="php"> +<?php + echo 'Ceci est une chaîne simple'; + echo 'Vous pouvez inclure des nouvelles lignes dans une chaîne, + comme ceci.'; + echo 'Arnold a coutume de dire : "I\'ll be back"'; +// affiche : ... "I'll be back" + echo 'Etes vous sûr de vouloir effacer le dossier C:\\*.*?'; +// affiche : Etes vous sûr de vouloir effacer le dossier C:\*.*? + echo 'Etes vous sûr de vouloir effacer le dossier C:\*.*?'; +// affiche : Etes vous sûr de vouloir effacer le dossier C:\*.*? + echo 'Je suis en train de mettre une nouvelle ligne comme ceci : \n'; +// affiche : Je suis en train de mettre une nouvelle ligne comme ceci : \n +?> + </programlisting> + </informalexample> + </para> + </sect3> + <sect3 id="language.types.string.syntax.double"> + <title>Guillemets doubles</title> + <para> + Si la chaîne est entourés de guillemets doubles, PHP + va comprendre certaines séquences de caractères : + </para> <table> <title>Les caractères spéciaux</title> <tgroup cols="2"> <thead> <row> - <entry>séquence</entry> - <entry>valeur</entry> + <entry>Séquence</entry> + <entry>Valeur</entry> </row> </thead> <tbody> <row> <entry><literal>\n</literal></entry> - <entry>Nouvelle ligne (linefeed, LF ou 0x0A en ASCII)</entry> + <entry>Nouvelle ligne (linefeed, LF ou 0x0A (10) en ASCII)</entry> </row> <row> <entry><literal>\r</literal></entry> - <entry>Retour à la ligne(carriage return, CR ou 0x0D en ASCII)</entry> + <entry>Retour à la ligne(carriage return, CR ou 0x0D (13) en ASCII)</entry> </row> <row> <entry><literal>\t</literal></entry> - <entry>Tabulation horizontale (HT ou 0x09 en ASCII)</entry> + <entry>Tabulation horizontale (HT ou 0x09 (9) en ASCII)</entry> </row> <row> <entry><literal>\\</literal></entry> @@ -152,48 +544,42 @@ </row> <row> <entry><literal>\"</literal></entry> - <entry>Guillemet double</entry> + <entry>Guillemets doubles</entry> </row> <row> <entry><literal>\[0-7]{1,3}</literal></entry> <entry> - Une séquence de caractère qui permet de + Une séquence de caractères qui permet de rechercher un nombre en notation octale. </entry> </row> <row> <entry><literal>\x[0-9A-Fa-f]{1,2}</literal></entry> <entry> - Une séquence de caractère qui permet de + Une séquence de caractères qui permet de rechercher un nombre en notation hexadécimale. </entry> </row> </tbody> </tgroup> </table> - </para> <para> - Vous pouvez utiliser le caractère d'échappement - antislash sur n'importe quel autre caractère, mais cela - produira une alerte (si le niveau d'alerte maximal a - été fixé). En PHP 3.0, une alerte sera - affichée, si le niveau de rapport d'erreur est à - <literal>E_NOTICE</literal>. En PHP 4.0, aucune alerte ne sera - générée. - </para> - <para> - Le deuxième moyen de délimiter une chaîne de - caractère est d'utiliser les guillemets simples ("'"). Dans - une telle chaîne de caractères, les variables - <emphasis>ne seront pas</emphasis> évaluées, - et le caractère antislash n'aura aucun effet (à - deux exceptions près, pour "\\" et "\'", afin de pouvoir - utiliser les caractères guillemets simples, et antislash - dans la chaîne de caractères). + Si vous essayez d'utiliser l'anti-slash sur n'importe quelle + autre séquence, l'anti-slash sera affiché dans votre chaîne. </para> + <para> + Le plus important des chaînes à guillemets doubles est le fait + que les variables qui s'y trouvent seront remplacées par leurs + valeurs. Voir la section sur le + <link linkend="language.types.string.parsing">traitement des + variables dans les chaînes</link> pour plus de détails. + </para> + </sect3> + <sect3 id="language.types.string.syntax.heredoc"> + <title>Syntaxe Heredoc</title> <para> Un autre moyen de délimiter les chaînes est d'utiliser - la syntaxe de "Here doc" (en français, doc ici): <<<, + la syntaxe de "Here doc" (en français, documentation ici): <<<, suivi d'un identifiant arbitraire, puis de la chaîne. Cette séquence se termine par l'identifiant initial, placé en premier sur une nouvelle ligne. @@ -205,38 +591,64 @@ et des soulignés ("_"), et enfin, commencer par un caractère alphabétique ou un souligné. </para> + <warning> + <simpara> + Il est très important de noter que la ligne qui contient + l'identifiant de fermeture ne doit contenir aucun autre + caractère, hormis, éventuellement, un point-virgule <literal>;</literal>. + Cela signifie notamment que l'identifiant ne doit + pas être indenté, et qu'il n'y a aucun caractère + blanc entre le retour à la ligne et l'identifiant, + ou bien entre l'identifiant et le <literal>;</literal>. + </simpara> + <simpara> + Le plus dur est peut être qu'il ne faut pas qu'il y ait + un retour à la ligne ((<literal>\r</literal>) à la fin de cette + ligne, mais seulement un form-feed (<literal>\n</literal>). + Puisque Microsoft Windows utilise la séquence + <literal>\r\n</literal> comme terminaison de ligne, + la syntaxe heredoc risque de ne pas fonctionner là. Cependant, + la plupart des éditeurs PHP fournissent une sauvegarde + au format UNIX. + <!-- + FTP will sometimes automatically convert \r\n to \n while + transferring your files to your webserver (which + is *nix, of course) + --> + </simpara> + </warning> <para> La syntaxe Here doc se comporte exactement comme une chaîne à guillemets doubles, sans les guillemets doubles. Cela signifie que vous n'avez pas à échapper les guillemets (simples ou doubles) dans cette syntaxe. Les variables sont remplacées par leur valeur, et - le même soin doit leur être aporté que dans les chaînes + le même soin doit leur être apporté que dans les chaînes à guillemets doubles. <example> - <title>Exemple de chaîne Here Doc</title> + <title>Exemple de chaîne HereDoc</title> <programlisting role="php"> <?php -$str = <<<EOD -Exemple de chaîne -s'étalant sur -plusieurs lignes -avec la syntaxe heredoc + $str = <<<EOD + Exemple de chaîne + s'étalant sur + plusieurs lignes + avec la syntaxe heredoc EOD; /* Exemple plus complexe, avec des variables. */ -class foo { + class foo { var $foo; var $bar; function foo() { - $this->foo = 'Foo'; - $this->bar = array('Bar1', 'Bar2', 'Bar3'); + $this->foo = 'Foo'; + $this->bar = array('Bar1', 'Bar2', 'Bar3'); } -} -$foo = new foo(); -$name = 'MonNom'; -echo <<<EOT -Mon nom est "$name". J'affiche des $foo->foo. -Maintenant, j'affiche un {$foo->bar[1]}. -Ceci se traduit par un 'A' majuscule: \x41 + } + $foo = new foo(); + $name = 'MonNom'; + echo <<<EOT + Mon nom est "$name". J'affiche des $foo->foo. + Maintenant, j'affiche un {$foo->bar[1]}. + Ceci se traduit par un 'A' majuscule: \x41 EOT; ?> </programlisting> @@ -247,40 +659,208 @@ Le support Here doc a été ajouté en PHP 4. </para> </note> - <para> - Les chaînes peuvent être concaténées avec - l'opérateur '.' (point). Notez que l'opérateur '+' - (addition) ne fonctionera pas. Reportez vous à - <link linkend="language.operators.string">Opérateurs de chaînes</link> - pour plus d'informations. - </para> - <para> - <example> - <title>Quelques exemples de chaînes</title> - <programlisting role="php"> + </sect3> + <sect3 id="language.types.string.parsing"> + <title>Traitement des variables dans les chaînes</title> + <!-- Section originale par jeroen@a-es2.uu.nl --> + <simpara> + Lorsqu'une chaîne est spécifiée avec des guillemets doubles, + ou en utilisant la syntaxe heredoc, + les variables qu'elle contient sont remplacées par leur valeur. + </simpara> + <simpara> + Il y a deux types de syntaxe, une + <link linkend="language.types.string.parsing.simple">simple</link> + et une + <link linkend="language.types.string.parsing.complex">complexe</link>. + La syntaxe simple est la plus courante, et la plus pratique : elle fournit + un moyen d'utiliser les variables, que ce soit des chaînes, des tableaux + ou des membres d'objets. + </simpara> + <simpara> + La syntaxe complexe a été introduite en PHP 4 + <!-- XXX was it? and starting with what version exactly? --> + et peut être reconnue grâce aux accolades entourant les expressions. + </simpara> + <sect4 id="language.types.string.parsing.simple"> + <title>Syntaxe simple</title> + <simpara> + Dès qu'un signe dollar <literal>$</literal> est rencontré, l'analyseur + PHP va lire autant de caractère qu'il peut pour former un nom de + variable valide. Entourez le nom de la variable avec des accolades + pour indiquer explicitement son nom. + </simpara> + <informalexample> + <programlisting role="php"> +<?php + $boisson = 'vin'; + echo "Du $boisson, du pain et du fromage!'; + // OK, car "," n'est pas autorisé dans les noms de variables + echo "Il a goûté plusieurs $vins"; + // Pas OK, car 's' peut entrer dans un nom de variable, et PHP recherche $boissons + echo "Il a goûté plusieurs ${vin}s"; + // OK +?> + </programlisting> + </informalexample> + <simpara> + Similairement, vous pouvez aussi utiliser un élément + de tableau, ou un membre d'objet. Pour les éléments + de tableau, le crochet fermant '<literal>]</literal>' + marquera la fin du nom de la variable. Pour les + membres d'objets, les mêmes règles que ci-dessus + s'appliquent. Cependant, il n'existe pas de truc comme + pour les variables simples. + <!-- XXX isn't TRUE :(, this would be the trick + Also, + the same trick with curly-braces works if you + want to limit the greediness of parsers (aren't they + paying them enough or something?). + --> + </simpara> + <informalexample> + <programlisting role="php"> + $fruits = array( 'fraise' => 'rouge' , 'banane' => 'jaune' ); + echo "Une banane est $fruits[banane]."; + // OK + echo "Ce carré est large de $carre->largeur mètres."; + // OK + echo "Ce carré est large de $carre->largeur00 mètres.."; + // pas OK + // pour résoudre ce problème, voyez <link linkend="language.types.string.parsing.complex">syntaxe complexe</link>. + <!-- XXX this won't work: + echo "This square is $square->{width}00 centimeters broad."; + // XXX: php developers: it would be consequent to make this work. + // XXX: like the $obj->{expr} syntax outside a string works, + // XXX: analogously to the ${expr} syntax for variable var's. + --> + </programlisting> + </informalexample> + <simpara> + Pour tout ce qui sera plus compliqué, voyez la syntaxe complexe. + </simpara> + </sect4> + <sect4 id="language.types.string.parsing.complex"> + <title>Syntaxe complexe</title> + <simpara> + La syntaxe est dite "complexe" car elle permet l'utilisation d' + expressions complexes, et non pas parcequ'elle serait obscure. + Nuance. + </simpara> + <simpara> + En fait, vous pouvez inclure n'importe quelle valeur qui est + dans l'espace de nom avec cette syntaxe. Il suffit d'écrire une + expression exactement comme si elle était hors de la chaîne, + puis de l'entourer d'accolades <literal>{}</literal>. Puisque + vous ne pouvez pas échapper les accolades, cette syntaxe ne commence + qu'à partir du signe dollar, qui suit immédiatement l'accolade + ouvrante. Par exemple, vous pouvez utiliser <literal>"{\$"</literal> + pour obtenir un <literal>"{$"</literal> littéral. Voici quelques + exemples : + </simpara> + <informalexample> + <programlisting role="php"> <?php -/* Assignation d'une chaîne */ -$str = "Ceci est une chaîne "; -/* Concaténation d'une chaîne */ -$str = $str . " avec une extension"; -/* Une autre méthode de concaténation, y compris une nouvelle ligne */ -$str .= " et terminée par une nouvelle ligne.\n"; -/* Cette chaî se terminera par '<B>Nombre: 9</B>' */ -$nombre = 9; -$str = "<B>Nombre: $nombre</B>"; -/* Cette ci sera '<B>Nombre: $num</B>' */ -$num = 9; -$str = '<B>Nombre: $num</B>'; -/* Lire le premier caractère d'une chaîne */ -$str = 'Ceci est un test.'; -$first = $str[0]; -/* Lire le dernier caractère d'une chaîne */ -$str = 'Ceci est un autre test.'; -$last = $str[strlen($str)-1]; + $super = 'fantastique'; + echo "C'est { $super}"; +// ne fonctionne pas, +// affiche "C'est { fantastique}" + echo "C'est {$super}"; +// fonctionne, +// affiche "C'est fantastique" + echo "Ce carré a {$square->width}00 centimètres de large."; + echo "Ceci fonctionne : {$tableau[4][3]}"; + echo "Ceci échoue : {$tableau[foo][3]}"; +// pour la même raison que $tableau[bar] ne fonctionne pas hors d'une chaîne + <!-- XXX see the still-to-write explaination in the arrays-section. --> + echo "Essayez plutôt comme ceci : {$tableau['foo'][3]}"; + echo "Vous pouvez même écrire {$objet->valeurs[3]->nom}"; + echo "Voici la valeur de la variable nommée $name: {${$name}}"; + <!-- <xxx> maybe it's better to leave this out?? --> +// cela fonctionne, mais c'est vivement déconseillé. +// Et pour finir, on peut combiner avec des fonctions + $inv = 'Bordeaux'; + echo "Je reprendrai bien un verre de cet excellent {${ strrev('niv') }}, hips"; + <!-- </xxx> --> +?> + </programlisting> + </informalexample> + </sect4> + </sect3> + <sect3 id="language.types.string.substr"> + <title>Accès aux caractères d'une chaîne</title> + <para> + Les caractères d'une chaîne sont accessibles en spécifiant + leur offset (le premier caractère est d'offset 0) entre + accolade, après le nom de la variable. + </para> + <note> + <simpara> + Pour assurer la compatibilité ascendante, vous pouvez + toujours accéder aux caractères avec des crochets. + Mais cette syntaxe est obsolète en PHP 4. + </simpara> + </note> + <para> + <example> + <title>Exemples de chaînes</title> + <programlisting role="php"> +<!-- TODO: either move these examples to a example section, +as with arrays, or distribute them under the applicable +sections. --> +<?php +/* Affectation d'une chaîne. */ + $str = "Ceci est une chaîne"; +/* Concaténation. */ + $str = $str . " avec un peu plus de texte"; +/* Une autre méthode de concaténation. */ + $str .= " et une nouvelle ligne à la fin.\n"; +/* Cette chaîne finira comme : '<p>Nombre: 9</p>' */ + $num = 9; + $str = "<p>Nombre: $num</p>"; +/* Celle-ci sera '<p>Nombre: $num</p>' */ + $num = 9; + $str = '<p>Nombre: $num</p>'; +/* Premier caractère d'une chaîne */ + $str = 'Ceci est un test.'; + $first = $str{0}; +/* Dernier caractère d'une chaîne. */ + $str = 'This is still a test.'; + $last = $str{strlen($str)-1}; ?> - </programlisting> - </example> - </para> + </programlisting> + </example> + </para> + </sect3> + </sect2><!-- end syntax --> + <sect2 id="language.types.string.useful-funcs"> + <title>Fonctions et opérateurs pratiques</title><!-- and operators --> + <para> + Les chaînes peuvent être concaténées avec l'opérateur '.' (point). + Notez que l'opérateur d'addition '+' (plus) ne fonctionnera pas. + Reportez-vous à la section + <link linkend="language.operators.string">opérateurs de chaînes</link>. + </para> + <para> + Il y a une grande quantité de fonctions pratiques pour modifier + les chaînes. + </para> + <simpara> + Reportez-vous à la section <link linkend="ref.strings">chaînes de caractères</link> + pour les fonctions les plus générales, à <link linkend="ref.pcre">Expressions + régulières Perl</link> et <link linkend="ref.regex">Expressions régulières + POSIX extendues</link> pour les recherches et remplacements. + </simpara> + <simpara> + Il y a aussi les fonctions sur les <link linkend="ref.url">URL</link>, + ainsi que des fonctions de chiffrage (<link linkend="ref.mcrypt">mcrypt</link> et + <link linkend="ref.mhash">mhash</link>). + </simpara> + <simpara> + Finalement, si vous ne trouvez toujours pas votre bonheure, il y a les + fonctions de <link linkend="ref.ctype">types de caractères</link>. + </simpara> + </sect2> <sect2 id="language.types.string.conversion"> <title>Conversion de type</title> <simpara> @@ -309,14 +889,14 @@ <informalexample> <programlisting role="php"> <?php -$foo = 1 + "10.5"; // $foo est du type double (11.5) -$foo = 1 + "-1.3e3"; // $foo est du type double (-1299) -$foo = 1 + "bob-1.3e3"; // $foo est du type integer (1) -$foo = 1 + "bob3"; // $foo est du type integer (1) -$foo = 1 + "10 Small Pigs"; // $foo est du type integer (11) -$foo = 1 + "10 Little Piggies"; // $foo est du type integer (11) -$foo = "10.0 pigs " + 1; // $foo est du type integer (11) -$foo = "10.0 pigs " + 1.0; // $foo est du type double (11) + $foo = 1 + "10.5"; // $foo est du type float (11.5) + $foo = 1 + "-1.3e3"; // $foo est du type float (-1299) + $foo = 1 + "bob-1.3e3"; // $foo est du type integer (1) + $foo = 1 + "bob3"; // $foo est du type integer (1) + $foo = 1 + "10 Small Pigs"; // $foo est du type integer (11) + $foo = 1 + "10 Little Piggies"; // $foo est du type integer (11) + $foo = "10.0 pigs " + 1; // $foo est du type integer (11) + $foo = "10.0 pigs " + 1.0; // $foo est du type float (11) ?> </programlisting> </informalexample> @@ -331,7 +911,7 @@ <informalexample> <programlisting role="php"> <?php -echo "\$foo==$foo; type is " . gettype( $foo ) . "<br>\n"; + echo "\$foo==$foo; type is " . gettype( $foo ) . "<br>\n"; ?> </programlisting> </informalexample> @@ -341,7 +921,445 @@ <sect1 id="language.types.array"> <title>Les tableaux</title> <para> - Les tableaux ressemblent aux tables de hashage (tableaux associatifs) et + Un tableau PHP est en fait une association ordonnée (map). Une + association est un type qui fait correspondre des valeurs + à des <emphasis>clés</emphasis>. Ce type est optimisé + de diverses façons, qui font que vous pouvez le manipuler comme + un tableau à indices réels, une liste (vecteur), ou un table + de hachage (qui est une implémentation d'association), + dictionnaire, collection, pile, queue et encore d'autres. + Comme une valeur peut elle-même être un tableau, vous pouvez + simuler facilement un arbre. + </para> + <para> + Les détails d'implémentation de ces structures sont hors du + champs de ce manuel, mais vous trouverez ici un exemple + de toutes ces structures. + </para> + <sect2 id="language.types.array.syntax"> + <title>Syntaxe</title> + <sect3 id="language.types.array.syntax.array-func"> + <title>Créer un tableau <function>array</function></title> + <para> + Un tableau <type>array</type> peut être créé avec la fonction + <function>array</function>. Cette fonction prend en argument + des structures <literal><replaceable>key</replaceable> => + <replaceable>value</replaceable></literal>, séparées par des virgules. + </para> + <para> + Une clé <varname>key</varname> est soit un entier positif + ou bien une chaîne. + <!-- + Negative integers are also allowed, however, IMO it's best to not + document that, or even disencourage it. + Why? + First, because it is very tricky. But the real reason is that the key + '-1' will be interpreted as a string, and not as a integer. Therefore, + the usage + "the -1'st value of \$arr is $arr[-1]" is ambigious. By the way, + it results in a parse-error anyway, which is another argument for + not documenting it. + -Jeroen + --> + Si une clé est la représentation standard d'un entier positif, + elle sera interprété comme tel. (i.e. <literal>'8'</literal> sera + interprété comme <literal>8</literal>, tandis que <literal>'08'</literal> + sera interprété comme <literal>'08'</literal>). + </para> + <para> + Une valeur peut être n'importe quoi. + </para> + <sect4 id="language.types.array.omit-key"> + <title>Omettre des clés</title> + <para> + Si vous omettez une clé lors de la spécification d'un tableau, + l'indice maximum + 1 sera utilisé comme clé par défaut. Si aucun + indice numérique n'a été généré, ce sera 0. Si vous spécifiez une + qui a déjà été assigné, + la nouvelle valeur écrasera la précédente. + </para> + <para> + <synopsis> +array( <optional><replaceable>key</replaceable> => </optional> +<replaceable>value</replaceable> + , ... + ) +// <replaceable>key</replaceable> is either <type>string</type> +ou entier <type>integer</type> positif +// <replaceable>value</replaceable> peut être n'importe quoi + </synopsis> + </para> + </sect4> + </sect3> + <sect3 id="language.types.array.syntax.modifying"> + <title>La syntaxe à crochets</title> + <para> + Vous pouvez aussi modifier un tableau existant en lui assignant + simplement des valeurs. + </para> + <para> + L'assignement de valeurs de tableau se fait en spécifiant la clé + entre crochets. Si vous omettez la clé ("<literal>$tableau[]</literal>"), + la valeur sera ajoutée à la fin du tableau. + <synopsis> +$arr[<replaceable>key</replaceable>] = <replaceable>value</replaceable>; +$arr[] = <replaceable>value</replaceable>; +// <replaceable>key</replaceable> est soit une chaîne, soit un entier +// <replaceable>value</replaceable> peut être n'importe quoi + </synopsis> + Si <varname>$arr</varname> n'existe pas, il sera créé. Cela + en fait une alternative pour créer un tableau. Pour modifier une + valeur, assignez lui une nouvelle valeur. Pour supprimer une + valeur, utilisez la fonction <function>unset</function>. + </para> + </sect3> + </sect2><!-- end syntax --> + <sect2 id="language.types.array.useful-funcs"> + <title>Fonctions pratiques</title> + <para> + Il y a toute une panoplie de fonctions pratiques pour travailler + avec les tableau : <link linkend="ref.array">array-functions</link>. + </para> + <para> + L'élément de langage <link linkend="control-structures.foreach">foreach</link> + est spécifiquement dédiée aux tableau : elle permet de passer en + revue simplement les valeurs d'un tableau. + </para> + </sect2> + <sect2 id="language.types.array.examples"> + <title>Exemples</title> + <para> + Le type tableau de PHP est très souple. Voici quelques exemples d'utilisation : + </para> + <para> + <informalexample> + <programlisting role="php"> +<?php +// ceci + $a = array( 'couleur' => 'rouge' + , 'gout' => 'sucre' + , 'forme' => 'rond' + , 'nom' => 'pomme' + , 4 // cette clé sera 0 + ); +// est complétement équivalent à + $a['couleur'] = 'rouge'; + $a['gout'] = 'sucre'; + $a['forme'] = 'rond'; + $a['nom'] = 'pomme'; + $a[] = 4; // cette clé sera 0 + $b[] = 'a'; + $b[] = 'b'; + $b[] = 'c'; +// va créer le tableau array( 0 => 'a' , 1 => 'b' , 2 => 'c' ) +// ou plus simplement array('a' , 'b' , 'c' ) +?< + </programlisting> + </informalexample> + </para> + <example> + <title>Utilisation de <function>array</function></title> + <programlisting role="php"> +<?php +// Array comme correspondance + $map = array( 'version' => 4 + , 'OS' => 'Linux' + , 'langue' => 'français' + , 'short_tags' => TRUE ); +// valeur strictement numériques + $array = array( 7 + , 8 + , 0 + , 156 + , -10 + ); +// ceci est la même chose que array( 0 => 7, 1 => 8, ...) + $switching = array( 10 // clé = 0 + , 5 => 6 + , 3 => 7 + , 'a' => 4 + , 11 // clé = 6 (index maximum : 5) + , '8' => 2 // clé = 8 (entier!) + , '02' => 77 // clé = '02' + , 0 => 12 // la valeur de la clé 10 sera remplacée par 12 + ); +<!-- TODO example of +- mixed keys +- overwriting keys +- integer keys as string +- using vars/functions as key/values +- mixed skipping +--> +// empty array +$empty = array(); +?< + </programlisting> + </example> + <example id="language.types.array.examples.loop"> + <title>Collection</title> + <programlisting role="php"> +<?php + $couleurs = array('rouge','bleu','vert','jaune'); + foreach ( $couleurs as $couleur ){ + echo "Aimez-vous la couleur $couleur?\n"; + } +/* Affiche : +Aimez-vous la couleur rouge? +Aimez-vous la couleur bleu? +Aimez-vous la couleur vert? +Aimez-vous la couleur jaune? +*/ +?> + </programlisting> + </example> + <para> + Notez qu'il n'est pas possible actuellement de modifier les + valeurs d'un tableau avec une telle boucle. + <!-- + Should be made possible, if you write: + foreach ( $colors as &$color ) + See bug#3074 + --> + Une solution pour cela est : + <example id="language.types.array.examples.changeloop"> + <title>Collection</title> + <programlisting role="php"> +<?php + foreach( $couleurs as $cle => $couleur ){ +// ne marche pas +//$couleur = strtoupper($couleur); +//marche : + $couleurs[$cle] = strtoupper($couleur); + } + print_r($couleur); +/* Affiche : +Array +( + [0] => ROUGE + [1] => BLEU + [2] => VERT + [3] => JAUNE +) +*/ +?> + </programlisting> + </example> + </para> + <para> + Cet exemple crée un tableau d'index minimal 1. + <example> + <title>Tableau en 1</title> + <programlisting role="php"> +<?php + $firstquarter = array(1 => 'Janvier', 'Février', 'Mars'); + print_r($firstquarter); +/* Affiche: +Array +( + [1] => 'Janvier' + [2] => 'Février' + [3] => 'Mars' +) +*/ +?> + </programlisting> + </example> + </para> + <example> + <title>Remplissage d'un tableau</title> + <programlisting role="php"> +<?php +// remplis un tableau avec les noms de fichiers d'un dossier + $handle = opendir('.'); + while ( $file = readdir($handle) ){ + $files[] = $file; + } + closedir($handle); +?> + </programlisting> + </example> + <para> + Les tableaux sont ordonnés. Vous pouvez modifier l'ordre des + valeurs avec de nombreuses fonctions de classement. Voyez les + fonctions de <link linkend="ref.array">tableaux</link>. + </para> + <example> + <title>Tri de tableaux</title> + <programlisting role="php"> +<?php + sort($files); + print_r($files); +?> + </programlisting> + </example> + <para> + Comme une valeur de tableau peut être n'importe quoi, elle + peut aussi être un autre tableau. Comme cela, vous pouvez + avoir des tableaux multi-dimensionnels, ou récursifs. + </para> + <example> + <title>Tableaux multi-dimensionnels, et récursifs</title> + <programlisting role="php"> +<?php + $fruits = array ( "fruits" => array ( "a" => "orange" + , "b" => "banane" + , "c" => "pomme" + ) + , "nombres" => array ( 1 + , 2 + , 3 + , 4 + , 5 + , 6 + ) + , "trous" => array ( "premier" + , 5 => "second" + , "troisième" + ) + ); +<!-- quite duplicate... +$a = array( + "apple" => array( + "color" => "red", + "taste" => "sweet", + "shape" => "round" + ), + "orange" => array( + "color" => "orange", + "taste" => "tart", + "shape" => "round" + ), + "banana" => array( + "color" => "yellow", + "taste" => "paste-y", + "shape" => "banana-shaped" + ) +); +--> +?> + </programlisting> + </example> + </sect2> + <sect2 id="language.types.array.donts"> + <title>Attention aux tableaux</title> + <sect3 id="language.types.array.foo-bar"> + <title>Pourquoi est ce que <literal>$foo[bar]</literal> est invalide?</title> + <para> + Dans vos vieux scripts, vous pouvez avoir utilisé la syntaxe suivante : + <informalexample> + <programlisting role="php"> +<?php + $foo[bar] = 'ennemi'; + echo $foo[bar]; +?> + </programlisting> + </informalexample> + Cela est mauvais, mais ca marche. Pourquoi est-ce mauvais? La raison + est que PHP réclame une expression entre les crochets (comme + indiqué dans la section sur la + <link linkend="language.types.array.syntax">syntaxe</link> des tableaux). + Cela signifie que vous pouvez écrire quelque chose comme : + <informalexample> + <programlisting role="php"> +<?php + echo $arr[ foo(true) ]; +?> + </programlisting> + </informalexample> + Ceci est un exemple d'utilisation de retour de fonction dans un + index de tableau. PHP reconnait aussi les constantes, et vous + pouvez avoir déjà rencontré <literal>E_*</literal>. + <informalexample> + <programlisting role="php"> +<?php + $error_descriptions[E_ERROR] = "Une erreur fatale est survenue"; + $error_descriptions[E_WARNING] = "PHP a généré une alerte"; + $error_descriptions[E_NOTICE] = "Ceci est juste une note grâcieuse"; +?> + </programlisting> + </informalexample> + Notez que <literal>E_ERROR</literal> est aussi un identifiant + vlaide, tout comme <literal>bar</literal> dans le premier exemple. + Mais le dernier exemple revient à écrire : + <informalexample> + <programlisting role="php"> +<?php + $error_descriptions[1] = "Une erreur fatale est survenue"; + $error_descriptions[2] = "PHP a généré une alerte"; + $error_descriptions[8] = "Ceci est juste une note grâcieuse"; +?> + </programlisting> + </informalexample> + car <literal>E_ERROR</literal> égale <literal>1</literal>, etc. + </para> + <para> + Alors, comment se fait-tile que <literal>$foo[bar]</literal> fonctionne? + C'est parce que <literal>bar</literal> est attendu comme une + constante. Cependant, dans ce cas, aucune constante n'a pour nom + <literal>bar</literal>. PHP suppose alors que vous voulez dire + <literal>bar</literal> littéralement, c'est-à-dire la + chaîne <literal>"bar"</literal>, mais que vous avez oublié les + guillements. + </para> + <sect4 id="language.types.array.foo-bar.why"> + <title>Alors, pourquoi est-ce mal?</title> + <para> + Dans le futur, l'équipe de développement peut vouloir ajouter une + nouvelle constante et vous vous retrouverez dans la panade. Par + exemple, vous ne pouvez déjà pas utiliser les constantes + <literal>empty</literal> et <literal>default</literal>, car ce + sont des mots reservés. + <!-- <jeroen>hmm... i'm doubting this myself. Finish it if you like</jeroen> + But probably + the most threatening + thing is yourself, or whoever will maintain the script. You'll + maybe get very strange behaviour, and + --> + </para> + <para> + Et, pour en mettre une autre couche, cette syntaxe est tout simplement + obsolète, et risque de ne plus fonctionner du tout un jour ou l'autre. + </para> + <note> + <simpara> + Lorsque vous activez le rapport d'erreur avec <function>error_reporting</function> + avec <literal>E_ALL</literal>, PHP générera des notes à chaque fois que cette + syntaxe est utilisée. Essayez donc <literal>error_reporting(E_ALL);</literal> + dans vos scripts, pour voir). + </simpara> + </note> + <note> + <simpara> + Dans une chaîne à guillements doubles, une autre syntaxe est + valide. Voyez la section sur + <link linkend="language.types.string.parsing">Traitement des variables + dans les chaînes</link> pour plus de détails. + </simpara> + </note> + </sect4> + </sect3> + </sect2> + <!-- TODO + - example multi-dim with $arr[bla][bla] syntax + - converting to array + - warning about references + - note that assigning is copy (usually...) + --> +<!-- there is no such thing as multi/singel dim arrays (at least in PHP4) + <sect2 id="language.types.array.single-dim"> + <title>Single Dimension Arrays</title> + <para> + PHP supports both scalar and associative arrays. In fact, there + is no difference between the two. You can create an array using +- the <function>list</function> or <function>array</function> + the + <function>list</function> + Nope + or <function>array</function> + functions, or you can explicitly set each array element value. + ++++++++++++++++++++++++++++++++++++++++++++ + <para> + Les tableaux ressemblent aux tableaux associatifs et aux tableaux indexés (vecteurs).</para> <sect2 id="language.types.array.single-dim"> <title>Tableaux à une dimension</title> @@ -386,7 +1404,7 @@ a dans un tableau en utilisant la fonction <function>count</function>. </para> <para> - Vous pouvez vous déplacer à l'intérieur d'un + Vous pouvez-vous déplacer à l'intérieur d'un tableau en utilisant les fonctions <function>next</function> et <function>prev</function>. Un autre moyen de se déplacer dans un tableau est d'utiliser la fonction <function>each</function>. @@ -423,7 +1441,7 @@ ?> </programlisting> </informalexample> - En PHP 3, l'exemple ci dessu va afficher : + En PHP 3, l'exemple ci-dessus va afficher : <computeroutput>Cela ne marche pas : Array[bar]</computeroutput>. L'opérateur de concaténation, peut être utilisé pour corriger cela : @@ -503,8 +1521,9 @@ ?> </programlisting> </informalexample> - </para> + </para>+ </sect2> + --> </sect1> <sect1 id="language.types.object"> <title>Les objets</title> @@ -516,19 +1535,80 @@ <informalexample> <programlisting role="php"> <?php -class foo { + class foo { function faire_foo () { echo "Faisant foo."; } -} -$bar = new foo; -$bar->do_foo(); + } + $bar = new foo; + $bar->faire_foo(); ?> </programlisting> </informalexample> </para> </sect2> </sect1> + <sect1 id="language.types.resource"> + <title>Ressources</title> + <para> + Une ressource (resource en anglais), est un type spécial, + qui représente une référence sur une ressource externe. Les + ressources sont créées par des fonctions dédiées. Reportez + vous à l'annexe <link linkend="resources">ressource</link> + pour une liste exhaustive des fonctions créant et utilisant + ces ressources. + </para> + <note> + <simpara> + Le type ressource a été introduit en PHP 4. + </simpara> + </note> + <sect2 id="language.types.resource.self-destruct"> + <title>Libérer des ressources</title> + <para> + Grâce au système de comptabilisation des références + introduit en PHP 4 (avec le moteur Zend), PHP détecte automatiquement + qu'une ressource n'est plus utilisée (comme Java). Dans ce cas, + toutes les ressources systèmes utilisées par cette + ressource sont libérées automatiquement. + <note> + <simpara> + Les connexions persistantes représentent un cas + particulier, elles ne seront <emphasis>PAS</emphasis> + détruites. Voyez + <link linkend="features.persistent-connections">connexions persistantes</link>. + </simpara> + </note> + </para> + </sect2> + </sect1> + <sect1 id="language.types.null"> + <title>La valeur NULL</title> + <para> + La valeur spéciale <literal>NULL</literal> représente + l'absence de valeur. Une variable avec la valeur NULL n'a + pas de valeur. + </para> + <sect2 id="language.types.null.syntax"> + <title>Syntaxe</title> + <para> + Il y a seulement une valeur de type NULL, et c'est la constante + <literal>NULL</literal>, insensible à la casse. + <informalexample> + <programlisting role="php"> +<?php + $var = Null; +?> + </programlisting> + </informalexample> + </para> + <note> + <simpara> + La valeur NULL a été introduite en PHP 4. + </simpara> + </note> + </sect2> + </sect1> <sect1 id="language.types.type-juggling"> <title>Définition du type</title> <simpara> @@ -553,22 +1633,35 @@ <informalexample> <programlisting role="php"> <?php -$foo = "0"; // $foo est une chaîne de caractères (ASCII 48) -$foo++; // $foo est la chaîne de caractères "1" (ASCII 49) -$foo += 1; // $foo est maintenant du type entier (2) -$foo = $foo + 1.3; // $foo est maintenant du type double (3.3) -$foo = 5 + "10 Petits cochons"; // $foo est du type entier (15) -$foo = 5 + "10 cochonnets"; // $foo est du type entier (15) -?> + $foo = "0"; // $foo est une chaîne de caractères (ASCII 48) + $foo += 2; // $foo est maintenant du type entier (2) + $foo = $foo + 1.3; // $foo est maintenant du type double (3.3) + $foo = 5 + "10 Petits cochons"; // $foo est du type entier (15) + $foo = 5 + "10 cochonnets"; // $foo est du type entier (15) +?> +<!-- +TODO: explain ++/- - behaviour with strings +examples: + ++'001' = '002' + ++'abc' = 'abd' + ++'xyz' = 'xza' + ++'9.9' = '9.0' + ++'-3' = '-4' + - -'9' = 8 (integer!) + - -'5.5' = '5.5' + - -'-9' = -10 (integer) + - -'09' = 8 (integer) + - -'abc' = 'abc' +--> </programlisting> </informalexample> </para> <simpara> Si les deux derniers exemples vous semblent obscurs ou si vous voulez forcer une variable a être évaluée - avec un certain type, reportez vous au paragraphe Conversion de + avec un certain type, reportez-vous au paragraphe Conversion de type ci-dessous. Si vous voulez changer le type d'une variable, - intéressez vous à aux fonctions de + intéressez-vous à aux fonctions de <link linkend="language.types.string.conversion">conversion de chaînes</link>. </simpara> <simpara> @@ -580,11 +1673,11 @@ </simpara> <para> Pour tester les exemples de cette section, il suffit d'en faire - un copier/coller, et d'insèrer les lignes dans un script PHP. + un copier/coller, et d'insérer les lignes dans un script PHP. <informalexample> <programlisting role="php"> <?php -echo "\$foo==$foo; le type est " . gettype( $foo ) . "<br>\n"; + echo "\$foo==$foo; le type est " . gettype( $foo ) . "<br>\n"; ?> </programlisting> </informalexample> @@ -596,28 +1689,28 @@ <informalexample> <programlisting role="php"> <?php -$a = 1; // $a est un entier -$a[0] = "f"; // $a devient un tableau, et $a[0] contient "f" + $a = 1; // $a est un entier + $a[0] = "f"; // $a devient un tableau, et $a[0] contient "f" ?> </programlisting> </informalexample> </para> <para> - Bien que dans l'exemple ci dessus, il semble évident que + Bien que dans l'exemple ci-dessus, il semble évident que $a va devenir un tableau, dont le premier élément est 'f', considérez l'exemple suivant : <informalexample> <programlisting role="php"> <?php -$a = "1"; // $a est une chaîne -$a[0] = "f"; // Qu'est ce qu'une position dans une chaîne ? que se passe t il? + $a = "1"; // $a est une chaîne + $a[0] = "f"; // Qu'est ce qu'une position dans une chaîne ? que se passe t il? ?> </programlisting> </informalexample> </para> <para> Etant donné que PHP supporte l'indexation de chaîne avec des - offsets identiques à celles des tableaux, l'exemple ci dessus + offsets identiques à celles des tableaux, l'exemple ci-dessus conduit à un problème : est ce que $a est un tableau, dont le premier élément est "f", ou bien est ce que "f" est le premier élément de la chaîne de @@ -640,8 +1733,8 @@ <informalexample> <programlisting role="php"> <?php -$foo = 10; // $foo est un entier -$bar = (double) $foo; // $bar est un double + $foo = 10; // $foo est un entier + $bar = (double) $foo; // $bar est un double ?> </programlisting> </informalexample> @@ -653,6 +1746,9 @@ <simpara>(int), (integer) - type entier</simpara> </listitem> <listitem> + <simpara>(bool), (boolean) - booléen</simpara> + </listitem> + <listitem> <simpara>(real), (double), (float) - type double</simpara> </listitem> <listitem> @@ -673,14 +1769,74 @@ <informalexample> <programlisting role="php"> <?php -$foo = (int) $bar; -$foo = ( int ) $bar; + $foo = (int) $bar; + $foo = ( int ) $bar; ?> </programlisting> </informalexample> </para> <para> - Le transtypage n'a pas toujours le résultat attendu. Par exemple : + Le transtypage n'a pas toujours de résultat prévisible. + Pour plus d'informations, voyez : + </para> + <itemizedlist> + <listitem> + <simpara> + <link linkend="language.types.boolean.casting">Conversion en booléen</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.integer.casting">Conversion en entier</link> + </simpara> + </listitem> + <!-- don't exist yet + <listitem> + <simpara> + <link linkend="language.types.double.casting">Conversion en nombre à + virgule flottante</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.string.casting">Conversion en + chaîne de caractères</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.array.casting">Conversion en tableau</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.object.casting">Conversion en objet</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.resource.casting">Conversion en ressource</link> + </simpara> + </listitem> + <listitem> + <simpara> + <link linkend="language.types.null.casting">Conversion en NULL</link> + </simpara> + </listitem> + --> + </itemizedlist> + <warning> + <simpara> + Pour transformer facilement une variable en chaîne, + entourez la simplement de guillements doubles. + </simpara> + </warning> + <para> + Lors de la conversion d'un tableau en chaîne, le résultat sera + le mot <literal>Array</literal> (tableau, en anglais). Lors de la + conversion d'un objet en chaîne, le résultat sera le mot + <literal>Object</literal> (objet, en anglais). Dans les deux cas, + une alerte sera affichée. </para> <para> Lorsque vous transtypez un scalaire ou une chaîne en tableau, @@ -689,9 +1845,9 @@ <informalexample> <programlisting role="php"> <?php -$var = 'ciao'; -$arr = (array) $var; -echo $arr[0]; // affiche 'ciao' + $var = 'ciao'; + $arr = (array) $var; + echo $arr[0]; // affiche 'ciao' ?> </programlisting> </informalexample> @@ -703,9 +1859,9 @@ <informalexample> <programlisting role="php"> <?php -$var = 'ciao'; -$obj = (object) $var; -echo $obj->scalar; // affiche 'ciao' + $var = 'ciao'; + $obj = (object) $var; + echo $obj->scalar; // affiche 'ciao' ?> </programlisting> </informalexample>