Groupe PhP

Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Groupe PhP

Forum du groupe d'apprentissage mutuel en PHP

-55%
Le deal à ne pas rater :
Coffret d’outils – STANLEY – STMT0-74101 – 38 pièces – ...
21.99 € 49.04 €
Voir le deal

4 participants

    Pratiques méconnus du PHP

    Berdes1
    Berdes1
    Soutien PhP
    Soutien PhP


    Messages : 167
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Pratiques méconnus du PHP

    Message par Berdes1 Mar 15 Sep - 19:28

    Bonjour,
    Je vais créer le tutoriel au fur et à mesure du temps que j'aurais donc les différentes parties n'arriverons pas toutes en même temps. A priori, les parties seront dissociés, donc vous pourrez les lires dans l'ordre que vous voudrez.

    Nombre de parties : 4

    Voici les parties :
    Les arrays et les doubles quotes

    Voici un problème récurent sur le forum PHP. Un zéro créer un script quelconque :
    Code:
    <?php
    echo "La page demandé est : $_GET['page']";
    ?>
    Et il se plain d'avoir l'erreur suivante, a priori incompréhensible :
    Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /var/www/tests/8.php on line 2

    On leur dit alors qu'il faut utiliser la concaténation :
    Code:
    <?php
    echo 'La page demandé est : '.$_GET['page'];
    ?>

    Et là, le zéro tout content dit : ça marche Very Happy
    Mais tout le monde est maintenant persuadé que on ne peut pas utiliser les arrays dans une chaine délimité par des doubles quotes, alors qu'il n'est pas beaucoup plus difficile de le faire qu'avec des variables simples.
    Par exemple, testez ça :
    Code:
    <?php
    $array('Bonjour', 'Au revoir');
    echo "$array[1] monsieur";
    ?>
    Question : C'est quoi ce miracle? Ça marche o_O !
    Ce n'est pas un miracle, c'est tout à fait normal. Regardez bien la différence entre les deux arrays insérés : $_GET['page'] et $array[1].

    Question : Euh, tu utilise une variable super-globale?
    Non, c'est pas ça! Bon, je vais être gentils, je vous donne un autre exemple (qui marche, bien sûr) :
    Code:
    <?php
    echo "La page demandé est : $_GET[page]";
    ?>

    Comme vous pouvez le voir, c'était les apostrophes qui envoyaient l'erreur Wink

    Question : Et si je veut utiliser cet array?
    Code:
    <?php
    $array = array('\'chaine\''=>'truc')
    ?>
    . Ça marchera pas :'(


    Arf, si vous vous mettez à me poser des colles questions très intéressantes, on va vraiment avancer. En effet, ça ne marchera pas, mais il ne faut pas croire que l'on a atteint les limites du php. ^^ En fait, il existe une syntaxe particulière pour pouvoir écrire n'importe quel array, voire même retour de fonction dans une chaine délimité par des doubles quotes.
    En fait, ça consiste juste à entouré la variable ou l'array par des crochets : {$variable} ou {$array['clé']}.
    Comme vous pouvez le voir, il faut, cette fois-ci, mettre des apostrophes pour délimiter la clé de l'array.
    Un petit exemple pour la route :
    Code:
    <?php
    $var = 'truc';
    echo "la variable \$var a pour valeur : {$var}";

    $array = array('machin', 'bidule');
    echo "les deux valeurs de \$array sont : {$array[0]} et {$array[1]}";
    ?>

    C'était pas trop compliqué? Smile

    Question : Et pour écrire le résultat d'une fonction, on fait comment?
    C'est un peu plus compliqué étant donné que {ta_fonction()} ne marche pas. Mais en lisant la suite du tutoriel, vous saurez bientôt le faire Wink .

    #############################################################################

    Accéder à un caractère particulier dans une chaine
    Vous ne vous êtes jamais demander comment récupérer le 5° caractère d'une chaine? C'est pas très dur. Il suffit de manipuler la chaine comme un array. Le premier caractère sera à l'index 0, le deuxième à l'index 1, etc :
    Code:
    <?php
    $chaine = 'une chaine de caractère quelconque';
    echo $chaine[0]; // affiche : u
    echo $chaine[5]; // affiche : h
    ?>
    Attention : Malgré les apparences, une chaine de caractère N'EST PAS un array! Utiliser foreach (et tout ce qui est spécifique aux arrays) sur une chaine créera une erreur!

    De la même façon, on peut aussi modifier un caractère particulier d'une chaine :
    Code:
    <?php
    $chaine = 'Il a un tic';
    $chaine[9] = 'o';
    echo $chaine; // affiche : Il a un toc
    ?>
    Attention, cela ne marche que pour modifier un seul caractère à la fois. Si vous faites $chaine[8] = 'rat';, cela ne modifiera que le 8° caractère (un chaine commence par le caractère 0), la chaine deviendra donc 'Il a un ric' et pas 'Il a un rat'.

    J'en profite pour vous faire remarquer ceci :
    Code:
    <?php
    $chaine = 'truc';
    $chaine[9] = 'o';
    echo $chaine; // affiche : truc    o
    ?>

    Comme vous pouvez le voir, la chaine est agrandie et des espaces sont rajoutés entre le caractère et la fin de l'ancienne chaine si vous essayez de modifier un caractère qui n'est pas dans la chaine.
    Information : Bien que cela semble fonctionner, il vaut mieux l'éviter. PHP nous le dit en nous envoyant la notice suivante : Notice: Uninitialized string offset: 5 in /chemin/vers/le/fichier on line 3
    Et, bien évidement, si vous modifier un caractère dont l'emplacement est négatif (par exemple $chaine[-1]), vous aurez droit à l'erreur suivante :
    Warning: Illegal string offset: -1 in /chemin/vers/le/fichier on line 32

    Erreur : Attention, vous ne pouvez pas supprimer un caractère en utilisant unset, cela provoque une erreur fatale.
    Par exemple :
    Code:
    <?php
    $chaine = 'truc';
    unset($chaine[3]);
    ?>

    Vous affichera l'erreur suivante : Fatal error: Cannot unset string offsets in /chemin/vers/le/fichier on line 2

    #############################################################################

    Print_r()

    Vous ne vous êtes jamais dit que écrire :
    Code:
    <?php
    echo '<pre>';
    print_r($array);
    echo '</pre>';
    ?>
    était un peut long et fastidieux pour afficher le contenu d'un array? Si c'est le cas, j'ai la solution, pour les autres, ça pourra quand même vous servir plus tard.

    M@téo vous a dit qu'il fallait utiliser print_r() pour afficher le contenu d'un array. Il a raison, mais il ne vous a pas dévoilé tous les secrets de cette fonction. En effet, en regardant de plus près dans la documentation, on peut voir que cette fonction possède un paramètre facultatif qui permet d'indiquer à la fonction que l'on veut (ou que l'on ne veut pas) qu'elle revoie la chaine de caractère au lieux de l'afficher directement.
    Il faut donc faire comme ceci pour lui indiquer : print_r($array, true);
    Et par extension, si on veut afficher le contenu d'un array en une seule ligne :
    Code:
    <?php
    echo '<pre>'.print_r($array, true).'</pre>';
    ?>
    Ce code ferra exactement la même chose que le code présenté au début de ce paragraphe.

    ##############################################################################

    List()
    Allons-y pour une "fonction" (plutôt un élément du langage, comme while ou echo) qui va permettre de stocker le contenu d'un array dans plusieurs variables.
    Comme un exemple vaut mieux d'un paragraphe d'explication :
    Code:
    <?php
    $array = array('foo', 'bar');
    list($var1, $var2) = $array;
    echo '$var1 = '.$var1; // affiche $var1 = foo
    echo '$var2 = '.$var2; // affiche $var2 = bar
    ?>
    Vous voyez donc que le premier élément de $array est affecté au premier argument de list(), le deuxième élément de $array est affecté au deuxième argument de list(), etc...
    Information : Si $array n'est pas un array, rien ne sera affecté, les variables resterons vides et cela ne génèrera pas d'erreurs. Si il y a trop d'arguments dans list() les variables en trop seront créé, mais resterons vides, cela ne créé pas non plus d'erreur.
    Exemples :
    Code:
    <?php
    list($a, $b, $c) = 'truc'; // $a, $b et $c seront vides
    list($a, $b, $c) = array(1, 2); // $a=1, $b=2 et $c est vide
    list($a, $b) = array(1, 2, 3, 4); // $a=1, $b=2 et les autres valeurs de l'array ne servent à rien
    ?>
    Question : C'est bien beau tout ça, mais ça va nous servir à quoi concrètement?
    J'y viens! En fait, il y a deux moments où ça peut être pratique :
    Premier cas où list() est utile : pour affecter $a à $b et $b à $a, sans list, vous êtes obligé d'utiliser une variable temporaire :
    Code:
    <?php
    $a = 'foo';
    $b = 'bar';

    // sans list() :
    $tmp = $a;
    $a = $b;
    $b = $tmp;

    // avec list() :
    list($a, $b) = array($b, $a);
    ?>
    D'un coup, ça réduit le code, non?

    Deuxième cas où list() est utile : si on veut renvoyer plusieurs élément avec une fonction. Assez souvent, on vois des codes comme ceci :
    Code:
    <?php
    function infoNombre($nombre)
    {
      $carre = $nombre*$nombre;
      $racine = sqrt($nombre);
      $valeurAbsolue = abs($nombre);
      return array('carre'=>$carre, 'racine'=>$racine, 'valeurAbsolue'=>$valeurAbsolue);
    }
    $array = infoNombre($_POST['nombre']);
    $carre = $array['carre'];
    $racine = $array['racine'];
    $valeurAbsolue = $array['valeurAbsolue'];
    ?>

    Alors que l'on peut le réduire comme ceci :
    Code:
    <?php
    function infoNombre($nombre)
    {
      $carre = $nombre*$nombre;
      $racine = sqrt($nombre);
      $valeurAbsolue = abs($nombre);
      return array($carre, $racine, $valeurAbsolue);
    }
    list($carre, $racine, $valeurAbsolue) = infoNombre($_POST['nombre']);
    ?>


    Dernière édition par Berdes1 le Jeu 17 Sep - 22:35, édité 7 fois
    ptitpunk
    ptitpunk
    Admin
    Admin


    Messages : 111
    Date d'inscription : 05/09/2009
    Age : 30

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par ptitpunk Mar 15 Sep - 19:33

    Très bon tutoriel continue comme ça ! Wink
    Berdes1
    Berdes1
    Soutien PhP
    Soutien PhP


    Messages : 167
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Berdes1 Mar 15 Sep - 19:35

    Je met le nombre de parties pour que vous puissiez savoir si il y en a de nouvelles.
    Berdes1
    Berdes1
    Soutien PhP
    Soutien PhP


    Messages : 167
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Berdes1 Mar 15 Sep - 19:46

    Deuxième partie mise en ligne.
    avatar
    kolosta
    Développeur PHP
    Développeur PHP


    Messages : 105
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par kolosta Mar 15 Sep - 19:48

    Merci pour les différents tuto, j'apprends quelque ptits trucs Very Happy
    Berdes1
    Berdes1
    Soutien PhP
    Soutien PhP


    Messages : 167
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Berdes1 Mar 15 Sep - 19:52

    De rien.

    Je vais vraiment devoir créer une regex zCode=>BBCode
    avatar
    Talus
    Novice PHP
    Novice PHP


    Messages : 16
    Date d'inscription : 15/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Talus Mar 15 Sep - 19:53

    ça vas c'ets pas comme si c'était complexe
    j'aime les regex (oui je suis pas normal xD )
    avatar
    kolosta
    Développeur PHP
    Développeur PHP


    Messages : 105
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par kolosta Mar 15 Sep - 19:55

    Nan c'est pas complexe, mais ya toujours des détails qui peuvent nous échaper Wink
    avatar
    Talus
    Novice PHP
    Novice PHP


    Messages : 16
    Date d'inscription : 15/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Talus Mar 15 Sep - 19:56

    Ma fonction de BBcode libre a vous de modifier

    Code:
    public function convert($text){
            $text = nl2br($text);

            // On fait passer notre texte à la moulinette des Regex
            $text = preg_replace('#\[B\](.+)\[/B\]#isU', '<strong>$1</strong>', $text);
            $text = preg_replace('#\[I\](.+)\[/I\]#isU', '<em>$1</em>', $text);
            $text = preg_replace('#\[U\](.+)\[/U\]#isU', '<span style="text-decoration: underline">$1</span>', $text);
            $text = preg_replace('#\[STRIKE\](.+)\[/STRIKE\]#isU', '<strike>$1</strike>', $text);
                   
            $text = preg_replace('#\[COLOR=(black|darkred|red|orange|brown|yellow|green|olive|cyan|blue|darkblue|indigo|violet|white|)\](.+)\[/COLOR\]#isU', '<span style="color:$1">$2</span>', $text);
            $text = preg_replace('#\[SIZE=(.+)\](.+)\[/SIZE\]#isU', '<span style="font-size: $1px; line-height: normal">$2</span>', $text);
            $text = preg_replace('#\[FONT=(.+)\](.+)\[/FONT\]#isU', '<font face=$1>$2</font>', $text);
               
            $text = preg_replace('#\[QUOTE\](.+)\[/QUOTE\]#isU', '<table width="100%" cellspacing="1" cellpadding="3" border="0" align="center"><tr> <td><span class="genmed"><b>Citation:</b></span></td></tr><tr><td class="quote">$1</span></td></tr></table>', $text);
            $text = preg_replace('#\[SPOILER\](.+)\[/SPOILER\]#isU', '<table style="CURSOR: pointer" onclick="if(this.getElementsByTagName(\'td\')[1].style.display == \'none\'){ this.getElementsByTagName(\'td\')[1].style.display = \'\';this.getElementsByTagName(\'td\')[2].style.display = \'none\'; }else{ this.getElementsByTagName(\'td\')[1].style.display = \'none\';this.getElementsByTagName(\'td\')[2].style.display = \'\';}" cellSpacing=1 cellPadding=3 width="90%" align=center border=0><tbody><tr><td><span class=genmed><b>Spoiler:</b></span></td></tr><tr><td class=quote>&nbsp;</td><td class=quote style="DISPLAY: none">$1</td></tr></tbody></table>', $text);
            $text = preg_replace('#\[LISTE\](.+)\[/LISTE\]#isU', '<ul>$1</ul>', $text);
            $text = preg_replace('#\[*\](.+)\[/*\]#isU', '<li>$1</li>', $text);
                   
            $text = preg_replace('#\[IMG\](.+)\[/IMG\]#isU', '<img src="$1" border="0" />', $text);
            $text = preg_replace('#\[URL=(.+)\](.+)\[/URL\]#isU', '<a href="$1" target=\"_blank\" class=\"postlink\">$2</a>', $text);
            $text = preg_replace('#\[URL\](.+)\[/URL\]#isU', '<a href="$1" target=\"_blank\" class=\"postlink\">$1</a>', $text);
               
            $text = preg_replace('#\[MOVE\](.+)\[/MOVE\]#isU', '<marquee>$1</marquee>', $text);
            $text = preg_replace('#\[BLUR\](.+)\[/BLUR\]#isU', '<span style="FILTER: blur(add=1,direction=270,strength=10); HEIGHT: 20px">$1</span>', $text);

            return $text;
    Berdes1
    Berdes1
    Soutien PhP
    Soutien PhP


    Messages : 167
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Berdes1 Mar 15 Sep - 19:58

    Oui, et on pert moins son temps...

    D'ailleurs, j'aime aussi les regex.

    EDIT : mais c'est dans l'autre sens que je la veut! Rolling Eyes
    Berdes1
    Berdes1
    Soutien PhP
    Soutien PhP


    Messages : 167
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Berdes1 Mar 15 Sep - 21:04

    3° partie posté!

    Pour convertir le zcode vers le bbcode :
    Code:
    function zcodetobbcode($zcode)
    {
    $zcode = preg_replace('#<italique>(.+)</italique>#isU', '[i]$1[/i]', $zcode);
    $zcode = preg_replace('#<gras>(.+)</gras>#isU', '[b]$1[/b]', $zcode);
    $zcode = preg_replace('#<souligne>(.+)</souligne>#isU', '[u]$1[/u]', $zcode);
    $zcode = preg_replace('#<barre>(.+)</barre>#isU', '[strike]$1[/strike]', $zcode);
    $zcode = preg_replace('#<citation>(.+)</citation>#isU', '[quote]$1[/quote]', $zcode);
    $zcode = preg_replace('#<erreur>(.+)</erreur>#isU', '[color=red]Erreur : $1[/color]', $zcode);
    $zcode = preg_replace('#<attention>(.+)</attention>#isU', '[color=brown]Attention : $1[/color]', $zcode);
    $zcode = preg_replace('#<information>(.+)</information>#isU', '[color=green]Information : $1[/color]', $zcode);
    $zcode = preg_replace('#<question>(.+)</question>#isU', '[color=blue]Question : $1[/color]', $zcode);
    $zcode = preg_replace('#<code[^>]*>(?:\r\n)?(.+?)</code>#is', '[code]$1[/code]', $zcode);
    $zcode = preg_replace('#<titre1>(.+)</titre1>#isU', '[b][size=16]$1[/size][/b]', $zcode);
    $zcode = preg_replace('#<minicode[^>]*>(?:<\?php )?(.+?)</minicode>#is', '[b]$1[/b]', $zcode);
    return htmlspecialchars($zcode);
    }

    Ça fait pas tout, mais une bonne partie Wink
    Berdes1
    Berdes1
    Soutien PhP
    Soutien PhP


    Messages : 167
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Berdes1 Jeu 17 Sep - 22:35

    4° partie en ligne.
    Berdes1
    Berdes1
    Soutien PhP
    Soutien PhP


    Messages : 167
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Berdes1 Lun 21 Sep - 23:04

    Bon, j'ai commencer à le publier sur le Glob de Bargeo :
    Meilleur pratique du PHP - Épisode 1
    Meilleur pratique du PHP - Épisode 2

    La prochaine partie est prévue pour demain ou après-demain!
    Berdes1
    Berdes1
    Soutien PhP
    Soutien PhP


    Messages : 167
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Berdes1 Mer 23 Sep - 15:59

    Troisième épisode publié :
    Meilleur pratique du PHP - Épisode 1
    Berdes1
    Berdes1
    Soutien PhP
    Soutien PhP


    Messages : 167
    Date d'inscription : 06/09/2009

    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Berdes1 Jeu 8 Oct - 18:08

    Et le quatrième, sur la sécurité :
    Meilleur pratique du PHP - Épisode 4

    Contenu sponsorisé


    Pratiques méconnus du PHP Empty Re: Pratiques méconnus du PHP

    Message par Contenu sponsorisé


      La date/heure actuelle est Dim 19 Mai - 6:59