Dans la documentation, il est indiqué :

bool is_a ( object $object , string $class_name )

Jusque la version php 5.3.6, si le premier argument était une chaine de caractère, le résultat n'était pas vraiment défini  (on aurait pu s'attendre à une erreur sur l'appel), mais ça fonctionnait, et certaines d'applications ont utilisé ce comportement non documenté (très mauvaise idée).

$ php -r '$var="StdClass"; var_dump(is_a($var, "StdClass"));'
bool(false)

En résumé : $var, est une chaine de caractère, donc pas un objet.

Depuis la version php 5.3.7, si le premier argument est une chaine, il est traité comme le nom d'une classe potentielle (déclenchant, si besoin, le mécanisme d'autoload).

$ php -r '$var="StdClass"; var_dump(is_a($var, "StdClass"));'
bool(true)

Ce fonctionnement étant identique à celui de la fonction is_subclass_of :

bool is_subclass_of ( mixed $object , string $class_name )

Ce changement de comportement a provoqué un déchainement de discussions passionnées, en particulier par l'équipe de PEAR qui avait pris l'habitude de tester la valeur retournée par un traitement de la manière :

if (is_a($var,'PEAR_Error')) ...

Finalement l'équipe PHP a décidé de revenir en arrière, et d'ajouter une option supplémentaire pour contrôler ce comportement.

A partir de la prochaine version de PHP (actuellement la 5.3.9-dev), on a une fonction pouvant désormais être décrite comme :

bool is_a ( mixed $object , string $class_name [, bool allow_string ] )

Et avec laquelle on obtient

$ php -r '$var="StdClass"; var_dump(is_a($var, "StdClass"));'
bool(false)
$ php -r '$var="StdClass"; var_dump(is_a($var, "StdClass", false));'
bool(false)
$ php -r '$var="StdClass"; var_dump(is_a($var, "StdClass", true));'
bool(true)

J'ai décidé d'appliquer ce correctif, sans délai, aux RPM disponibles dans mon dépôt, dans la version 5.3.8-5 (en cours de construction). Je l'appliquerai peut être aussi à la version disponible dans les dépôts fedora (voir Bug #741022).