Bonjour tout le monde,
petite question de fond qui me chagrine :
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:
$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 ?
Partager