Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

PHP Error Messages

PHP Features

Last updated: 22 October 2026