Cela fait maintenant plus de 12 ans que je fais du PHP, et j'ai parfois l'impression d'en avoir fait le tour, du moins en ce qui concerne ses fonctionnalités de base.
Pourtant, ce langage me surprend régulièrement, comme par exemple aujourd'hui lorsqu'au détour d'une erreur de frappe, j'ai découvert qu'utiliser l'opérateur []
sur NULL
renvoit NULL
.
Suite à mon erreur, j'ai en effet tenté de récupérer un index de tableau sur une variable indéfinie, et à ma grande surprise, l'exécution n'a provoqué aucune erreur.
<?php $a = null; var_dump($a[uniqid()]); // NULL var_dump($a[rand(- PHP_INT_MAX, PHP_INT_MAX)]); // NULL
Comme quoi, peu importe l'expérience, on en apprend tous les jours, et parfois par des chemins très détournés !
8 réactions
1 De Moosh - 27/09/2012, 18:46
Merci
D'ailleurs ça me rappelle ceci : http://www.blueshoes.org/en/develop...
2 De Renaud - 27/09/2012, 20:40
Peut-être lié à l'écriture $string[$charIndex] ?
N'importe quel caractère de null est null...
J'ai découvert un truc y'a quelques jours aussi, que j'ai posté sur twitter: https://twitter.com/marmotz/status/...
$ php -r '$a = array("404" => 1); var_dump(array_keys($a));'
array(1) {
}
On en apprend tous les jours, même après 13 ans pour ma part... vindiou, ça me rajeunit pas, tout ça...
3 De Guile - 28/09/2012, 00:21
Récemment j'ai réalisé ceci (oui c'est pas nouveau, mais troublant)
var_dump(0 == '0'); // true jusque là OK
var_dump('0' == ''); // false toujours ok pour moi
var_dump(0 == ''); // true hum... là c'est moins logique, surtout vu ci-dessus
4 De Floflo - 28/09/2012, 09:45
@Guile Tu ne testes pas le type. En écrivant var_dump(0===''); j'obtiens false.
0 doit donc correspondre à NULL contrairement à '0' qui est de type string. Peut-être ?!? Bon j'avoue que ce n'est pas logique.
5 De Renaud - 28/09/2012, 09:51
@Guile
pour le 2ème var_dumpt contient 2 strings, pas de cast, test d'égalité de 2 chaines => false
alors que pour le 3ème, 2 types différents. à mon avis la chaine vide doit être casté en int, donc 0.... et 0 == 0 (et la tête à toto...)
6 De Charles - 28/09/2012, 10:48
Pour le coup je ne vois pas la logique de ce comportement, ça vaudrait probablement le coup de proposer cet exemple à php sadness.
7 De bruno - 29/09/2012, 14:23
Pour l'exemple de @guile, @Renaud a raison, "php" va convertir la chaîne vide a 0 en interne et donc la comparaison renverra true
http://php.net/manual/fr/types.comp...
8 De Olivier Pons - 30/09/2012, 13:36
Un peu comme "isset" et "null".
Logiquement, si on assigne une valeur, la variable existe <b>à partir de ce moment en mémoire</b>.
Essayez "$a = null; print_r(isset($a));"
Je trouve que c'est illogique.