isset() et l’erreur fatale
<?php
$a = [];
$a['b']['c']['d'] = 1;
$a['b']['c']['d2'] = new stdclass();
$a['b']['c']['d3'] = [];
var_dump(isset($a['b']['c']['d'])); // as expected, and within type
var_dump(isset($a['b']['c']['f'])); // as expected, and within type
var_dump(isset($a['b']['c']['d']['g'])); // as expected, because 'd' is 1
var_dump(isset($a['b']['c']['d']->g)); // as expected, because 'd' is 1
var_dump(isset($a['b']['c']['d3']->f)); // as expected, because 'd' is an array
var_dump(isset($a['b']['c']['d3']['f'])); // as expected, because 'd' is an array
var_dump(isset($a['b']['c']['d2']->f)); // as expected, because 'd' is an object
var_dump(isset($a['b']['c']['d2']['f'])); // fatal error!!
var_dump(isset($a['b']['c']['D']['g']->f)); // as expected, because 'D' is actually null
var_dump(isset($a['b']['c']['D']['g']['f'])); // as expected, because 'D' is actually null
// isset($a['b']['c']['d']) is set so following are true and within type
var_dump(isset($a['b']['c']));
var_dump(isset($a['b']));
$i = 1;
echo $i[3]; // error,
isset() vérifie si une variable existe. Par extension, il vérifie également les éléments de tableaux, les propriétés d’objets, etc. Lors de cette vérification, toute tentative d’accès à une partie non définie de l’expression est silencieuse : c’est tout à fait logique.
Par exemple, si l’une des expressions intermédiaires est un entier, il n’est pas possible d’y accéder avec une syntaxe de tableau, contrairement à un tableau ou une chaîne. Un tel accès est un avertissement lorsqu’il est utilisé en dehors de isset(), mais est silencieux à l’intérieur de isset().
Cela conduit à une belle optimisation, où vérifier isset($a[1][2][3][4]) suffit à vérifier isset($a), puis isset($a[1]), isset($a[1][2]), isset($a[1][2][3]), et isset($a[1][2][3][4]). Pratique.
Le problème survient quand l’un des éléments à l’intérieur du tableau réel est un objet. PHP signale une erreur fatale lorsqu’on utilise un objet avec une syntaxe de tableau (sauf peut-être pour les objets ArrayAccess). Dans ce cas, isset() s’arrête.
L’inverse n’est pas vrai : accéder à un tableau avec une syntaxe d’objet renvoie null et aucun avertissement. Comme il se doit.
Tout cela s’applique également à empty().
Un changement de comportement a été proposé pour PHP 8.5, mais a été rejeté. Peut-être pour PHP 8.6 ?
See Also
- empty (manuel PHP)
- isset (manuel PHP)
- PHP RFC: Warnings for PHP 8.5
- Don’t use array syntax on objects in isset() [Try me]
PHP Error Messages
PHP Features
Last updated: 22 October 2026