Suite à une mise à jour de PHP, le fichier d’erreurs de mon site a commencé à afficher le message suivant :
PHP Warning: Creating default object from empty value in /wp-content/themes/skyminds/functions.php on line 1213
La ligne en question ressemblait à ceci :
$posts[0]->comment_status = 'closed';Code language: PHP (php)
À première vue, cette ligne semble anodine. Pourtant, elle suppose plusieurs choses : que $posts existe, que $posts est un tableau, que l’index 0 existe, et que $posts[0] est bien un objet.
Si l’une de ces conditions n’est pas vraie, PHP tente parfois de créer un objet par défaut à partir d’une valeur vide. C’est ce qui déclenche l’avertissement Creating default object from empty value.
Pourquoi cette erreur apparaît
Le problème vient généralement d’une assignation de propriété sur une variable qui n’est pas un objet valide.
Exemple simple :
$post = null;
$post->comment_status = 'closed';Code language: PHP (php)
Ou encore :
$posts = array();
$posts[0]->comment_status = 'closed';Code language: PHP (php)
Dans le second cas, $posts existe bien, mais $posts[0] n’existe pas. PHP ne peut donc pas modifier la propriété comment_status d’un objet absent.
La bonne correction dépend donc du type de donnée que vous manipulez : tableau, objet générique stdClass, instance de classe, ou objet WordPress comme WP_Post.
Correction rapide : vérifier que l’objet existe
La correction la plus prudente consiste à tester l’existence du premier élément avant de modifier sa propriété :
if ( isset( $posts[0] ) && is_object( $posts[0] ) ) {
$posts[0]->comment_status = 'closed';
}Code language: PHP (php)
Cette version évite l’avertissement, car elle ne modifie comment_status que si $posts[0] existe et contient bien un objet.
Dans un thème WordPress, si l’on s’attend à recevoir un objet WP_Post, on peut être plus strict :
if ( isset( $posts[0] ) && $posts[0] instanceof WP_Post ) {
$posts[0]->comment_status = 'closed';
}Code language: PHP (php)
C’est généralement préférable, car on vérifie le type exact attendu. WordPress documente WP_Post comme la classe utilisée pour représenter les objets d’articles retournés par des fonctions comme get_post().