Access to undeclared static property, PHP + APC

Un bref article qui pourra faire gagner quelques heures de recherches à ceux et celles qui rencontreraient un jour le problème.

Exposé de la situation : Vous avez une application en parfait état de fonctionnement, jusqu’au jour ou vous installez APC (magnifique extension, indispensable il va sans dire).

Résultat : D’un coup, un message d’erreur « Access to undeclared static property xxx in xxx »

Pourtant, tout dans votre code semble correct (et fonctionne sans APC).

Simplification du problème

Votre code, simplifié à l’extrême, ressemble à

<?php
class MaClasse {
  private static $foo = 'foo';
  public function __sleep () {
    if (self::$foo) {
        //Ou n'importe quel code qui utilise une variable statique
    }
  }
}

session_start();
$_SESSION['foo'] = new MaClasse();
//c'est tout

La correction

Aussi fou que cela puisse paraître, la solution consiste à ajouter en fin de votre fichier l’appel à session_write_close();

<?php
class MaClasse {
  private static $foo = 'foo';
  public function __sleep () {
    if (self::$foo) {
        //Ou n'importe quel code qui utilise une variable statique
    }
  }
}

session_start();
$_SESSION['foo'] = new MaClasse();
session_write_close();//Et maintenant tout fonctionne !

Mais pourquoi ?

Lorsque l’extension APC « quitte », elle simplifie les classes qu’elle connait et en nettoie les données spécifiques (les données statiques).

Si APC est quitté avant la fermeture de la session (qui rappelons le sérialise par défaut ses données dans un fichier texte coté serveur), alors lorsque la fonction magique __sleep est invoquée, la variable statique $foo n’existe en effet plus (détruite par APC).

Oui, on pourrait considérer ceci comme un bug de l’extension, mais comme le dit l’adage : won’t fix.

Laisser un commentaire

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