Un exemple comparatif en PHP :
isset($var) va vérifier si $var est défini. Tu peux demander si isset($var['index']['sous_index']) et il te renverra false si $var, $var['index'] ou $var['index']['sous_index'] n'existe pas.
empty($var) vérifie si une valeur est "vide" (non définie, false, 0, 0.0, chaîne vide, array vide). Mais si tu demandes empty($var['index']['sous_index']), si un niveau intermédiaire est indéfini ($var ou $var['index']), il te génère un warning.
Godzil (./167) :
Sa ne serait pas du tout si tu ne pouvais pas faire un
Je ne suis pas d'accord là dessus, car il s'agit d'une attribution. Si tu dis que $var['index'] = "toto", il va s'il le faut créer l'array et pousser les données dans l'index demandé. Si en ligne suivante tu demandes $var = "toto", il va requalifier la variable en tant que chaîne de caractère.
Le typage dynamique est à mon sens une force et une faiblesse de PHP. Cette façon d'accepter tout et n'importe quoi dans les variables ne doit fonctionner qu'avec les attributions (encore que... == et ===...). Ce warning est un moyen de te rappeler que, si tu as le contrôle sur ce que tu veux faire de tes variables, à ce niveau ton code n'est plus cohérent (une comparaison sur une valeur inexistante).