Quelques trucs marrants en PHP

- Tags: PHP
14 août 2009

Le but de cet article est de regrouper quelques exemples de PHP dont le résultat peut paraitre déconcertant à première vue.

Exemple 1

1
2
3
4
$array = array('a', 'b', 'c');
foreach ($array as &$v) {}
foreach ($array as $v) {}
print_r($array);

Le résultat:

1
2
3
4
5
6
Array
(
    [0] => a
    [1] => b
    [2] => b
)

La première boucle ne fait aucune modification sur le tableau. Cependant $v se voit assigné la référence de chaque élément de $array, donc à la fin de la première boucle $v est en fait une référence vers $array[2]. Aussi quand la deuxième boucle commence $v est déjà une référence vers $array[2] donc chacune des valeur va être copié dans le dernier élément du tableau, ce qui donne a, b, b. On peut résoudre ce problème en faisant un unset() sur $v entre les deux boucles.

Exemple 2

1
2
3
4
5
6
7
8
9
10
11
12
13
$a = array();
$a[1] = 'Kikoo';
$b = $a;
$b[1] = 'Lol!';

var_dump($a, $b);

$a = new ArrayObject;
$a[1] = 'Kikoo';
$b = $a;
$b[1] = 'Lol!';

var_dump($a, $b);

Le résultat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
array(1) {
  [1]=>
  string(5) "Kikoo"
}
array(1) {
  [1]=>
  string(4) "Lol!"
}
object(ArrayObject)(1) {
  [1]=>
  string(4) "Lol!"
}
object(ArrayObject)(1) {
  [1]=>
  string(4) "Lol!"
}

Il fallait simplement savoir que depuis PHP5 une assignation d’objet est une référence par défaut, nous sommes donc censé faire $b = clone $a. Plus d’informations ici.

Exemple 3

1
2
3
$v = 'v_'.file_exists(__FILE__);
$v_1 = '42';
echo $$v;

Le résultat:

1
42

$v va prendre la valeur v_1 car file_exists(__FILE__) retournera forcément true, __FILE__ étant une constante magique, en affichant la variable ayant comme nom v_1 on affichera donc la valeur 42.

Exemple 4

1
2
3
$str = 'Z99';
$str++;
echo $str;

Le résultat:

1
AA00

Ici il est marrant de se rendre compte que nous pouvons itérer sur des caractères, plus simplement si $str vaut ‘a’, $str++ vaut ‘b’ et ainsi dessuite. PHP suit les conventions de Perl pour la gestion des opérateurs arithmétiques, et non pas celle du C. Plus d’informations ici.


Google Buzz :: Quelques trucs marrants en PHP
  1. Mr Xhark dit :

    Merci pour la petite distraction du vendredi :)

  2. Guillaume dit :

    C’est vraiment à mourir de rire !

  3. Florian Gasquez dit :

    @Guillaume oui ça l’est. J’ai eu du mal à garder mon sérieux en écrivant cet article :p

  4. Lilian dit :

    Quelqu’un pourrait m’expliquer pourquoi ce code fonctionne :

    if("test"==0){
        echo "ok";
    }
    

    merci ^^

  5. Florian Gasquez dit :

    Oui, dans la comparaison il cast ‘test’ en integer, tu aurais pu donner l’exemple var_dump(‘test’==0); qui est plus parlant. Regarde avec un var_dump((int)’test’); (int(0)), donc oui 0 est bien égal à 0 :)

    Dans ce cas de figure utilise l’opérateur ‘===’.

    http://fr3.php.net/manual/fr/language.operators.comparison.php

  6. Lilian dit :

    Effectivement. Comportement bizarre.

  7. Florian Gasquez dit :

    Non rien de plus normal, tu devrais vraiment lire cette page http://fr3.php.net/manual/fr/language.operators.comparison.php ;)

  8. BlogOFrais dit :

    Le PHP c’est le bien :D

  9. Korri dit :

    Quand on comprend, ça parait logique ;)

    Il est clair que la gestion dynamique des types peut dérouter ceux qui n’ont pas l’habitude ^^

  10. Tchit dit :

    Tu dois etre pas normal comme mec en fait

  11. LAMBDAY dit :

    Quelqu’un pour me #singsincode-r
    le refrain de  » je t’aime / moi non plus  » ?
    [ " je vais, je vais et je viens .. ]♫

  12. Emmy dit :

    Omagad, ça a l’air super chiant. :/

  13. Tout ce que tu ne comprends pas n’est pas chiant :o
    (Exemple: Moi)

  14. Lambday dit :

    @nvvachardes : moi aussi je t’aime.

doFollow Répondre