Bonjour tout le monde,

petite question de fond qui me chagrine :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
class Test implements Countable {
    public function count() {
        return 0;
    }
}
$o = new Test;
var_dump(sizeof($o));
var_dump(empty($o));
//int 0
// boolean false

Ce code fait l'objet de nombreux débats avec mes collègues.

Avis 1 :

Countable n'est qu'une interface qui permet d'utiliser sizeof/count. Il est normal que empty, dans la mesure où l'objet est un tableau, retourne false. Après tout, un objet est un objet, empty n'a pas la vocation à tester des objets complexe

Avis2 :
Countable fait partie des interfaces qui permettent de manipuler des objets comme des tableaux (pour arriver par exemple à la classe ArrayIterator). C'est donc qu'il y a une réelle volonté du language de pouvoir s'affranchir de la différence tableau/objet, facilement. Or dans ce cas, on est obligés de faire un test de type:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$empty = (is_object($o) && ($o instanceof Countable)) ? sizeof($o) > 0: empty($o);
Ce qui perd de son sens si on veut s'affranchir de la différence tableau/objet qui hérite de ArrayIterator
Dans ce cas, le code source d'empty devrait être revu pour gérer les objets qui implémentent Countable.

A votre avis:
Bref, si oui empty() est un peu une fonction "bâtarde" (peu fiable, par exemple si on teste une chaine "0"), est-ce qu'il faut revoir la fonction empty() à votre avis, ou bien est normal, conceptuellement, de ne pas utiliser un objet comme un tableau ?