Les petites choses marrantes en PHP: les entrées non-définies

Continuons notre série Les petites choses marrantes en PHP, consacrées aux petites choses marrantes en PHP, avec quelques exemples de petites choses marrantes en matière d’entrées non-définies.

Mais attention, que les choses soient bien claires: il ne s’agit pas de troll! Juste de faire gaffe…

Lire une entrée

Depuis un array vide

Tout le monde sait qu’essayer d’accéder à une clé non-définie est mal. Cela provoque d’ailleurs une notice.

1
2
3
$var = array();
$var['blurp']; //Notice:  Undefined index: blurp
var_dump($var); //array(0) {}

Depuis une variable null

Pourtant, si la variable vaut null, plus de notice…

1
2
3
$var = null;
$var['blurp']; //pas de notice
var_dump($var); //null

Marrant, non?

Et avec un object

Par contre, si on essaie d’accéder à un attribut de null, ce coup-ci, on a bien une notice. Les traitements de l’objet et de l’array diffèrent.

1
2
3
$var = null;
$var->blurp; //Notice: Trying to get property of non-object
var_dump($var); //null

Marrant, non?

Depuis une string

Pour les string, là c’est bien plus grave. Nous avons droit à un warning à la place d’une notice…

1
2
3
$var = '';
$var['blurp']; //Warning: Illegal string offset 'blurp'
var_dump($var); //string(0) ""

Marrant, non?

Assigner une entrée

Tel un array

Si on assigne une entrée à une variable null, on initialise un array, et ce sans notice.

1
2
3
$var = null;
$var['blurp'] = 'lol'; //pas de notice
var_dump($var); //array(1) { ["blurp"] => string(3) "lol" }

Tel un object

A l’inverse, si on prend la variable pour un objet, c’est un warning qui hurle. (A noter qu’avant 5.4, on aurait eu droit à « Strict Standards: Creating default object from empty value ».) A nouveau, les traitements de l’objet et de l’array diffèrent.

1
2
3
$var = null;
$var->blurp = 'lol'; //Warning: Creating default object from empty value
var_dump($var); //object(stdClass)#1 (1) { ["blurp"] => string(3) "lol"}

Marrant, non?

Modifier une string

Les string sont manipulables comme des tableaux? Presque… On peut effectivement boucler sur une string et récupérer chaque caractère. Mais l’assignation est un peu plus complexe…

Avec une string vide

Malheureusement, comme dans les exemples précédents, on caste la variable en array.

1
2
3
$var = '';
$var[0] = 'l'; //pas de notice
var_dump($var); //var_dump($var); //array(1) { [0] => string(1) "l" }

Avec une string non-vide

Pourtant, si la string n’est pas vide, ça marche!

1
2
3
$var = 'e';
$var[0] = 'l'; //pas de notice
var_dump($var); //string(1) "l"

Marrant, non?

Conclusion

Euh… le conseil de l’année: Initialisez bien… ^^

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>