En route vers PHP 5.5 : Conversion en booléen avec boolval

25 octobre 2012php, php-5.5
 Cet article a été rédigé il y a plusieurs années et peut ne plus être tout à fait à jour…

PHP fournit depuis longtemps des fonctions de conversion de type ; je pense notamment à strval(), floatval(), ou encore intval(), qui existaient toutes déjà en PHP 4.

En parallèle, il existe de nombreux opérateurs de transtypage, dont (string), (float), (int), ou encore (bool).

Fonction de conversion en booléen : boolval()

Cela dit, jusqu’à présent, il n’existait pas de fonction permettant de convertir une donnée en booléen, alors que le cast (bool) existait.

Pour faire disparaitre cette incohérence, la version actuelle de la branche master de PHP (et donc, probablement, PHP 5.5) inclut la fonction boolval(), qui se comporte exactement comme l’opérateur de transtypage correspondant.

Quel intérêt, hormis la cohérence ? Une fonction est de type callable ; et peut donc, en particulier, être utilisée comme fonction de rappel – alors qu’un opérateur de transtypage ne répond pas à ce besoin.

Quelques exemples

Comme exemples, voyons quelques résultats de conversions, et j’enchainerai en utilisant boolval() comme callable.

Résultats de conversion

A titre d’illustration, voici quelques exemples d’utilisation de cette nouvelle fonction boolval(), montrant le résultat qu’elle retourne avec différents types de données en entrée.

Avec des booléens :

var_dump( boolval(false) );     // bool(false)
var_dump( boolval(true) );      // bool(true)

Résultat :

bool(false)
bool(true)

Avec des entiers :

var_dump( boolval(0) );         // bool(false)
var_dump( boolval(1) );         // bool(true)

Résultat :

bool(false)
bool(true)

Avec des flottants :

var_dump( boolval(0.00) );      // bool(false)
var_dump( boolval(3.14) );      // bool(true)

Résultat :

bool(false)
bool(true)

Avec des chaines de caractères :

var_dump( boolval("") );        // bool(false)
var_dump( boolval("0") );       // bool(false)
var_dump( boolval("hello") );   // bool(true)
var_dump( boolval("123546") );  // bool(true)
var_dump( boolval("098765") );  // bool(true)

Résultat :

bool(false)
bool(false)
bool(true)
bool(true)
bool(true)

Avec des tableaux :

var_dump( boolval([]) );        // bool(false)
var_dump( boolval([0]) );       // bool(true)
var_dump( boolval([1, 2, 3]) ); // bool(true)

Résultat :

bool(false)
bool(true)
bool(true)

Et avec des objets :

var_dump( boolval(new stdClass()) );    // bool(true)

Résultat :

bool(true)

Sans surprise, boolval() effectue les même conversions que celles auxquelles nous étions habitués avec l’opérateur de transtypage (bool).

boolval() utilisée comme callable

L’opérateur de transtypage (bool) ne peut pas être utilisé comme callable ; pour cela, il faut une méthode, une fonction.

Typiquement, en PHP <= 5.4, pour convertir tous les éléments d’une liste en booléens, nous devrions utiliser une portion de code de ce type :

$liste = [ 'plop', 456, new stdClass(), 0, false, '1' ];
$result = array_map(function ($item) {
            return (bool)$item;
          }, 
          $liste);
var_dump($result);

Et nous obtiendrons en sortie :

array(6) {
  [0]=>
  bool(true)
  [1]=>
  bool(true)
  [2]=>
  bool(true)
  [3]=>
  bool(false)
  [4]=>
  bool(false)
  [5]=>
  bool(true)
}

Avec la branche master de PHP (et donc, probablement, PHP 5.5), il devient possible d’utiliser la nouvelle fonction boolval(), sans avoir à écrire nous-même une fonction de rappel :

$liste = [ 'plop', 456, new stdClass(), 0, false, '1' ];
$result = array_map('boolval', $liste);
var_dump($result);

J'ai presque l'impression de me répêter, mais, encore une fois, voici une petite amélioration qui rend PHP plus cohérent avec lui-même et nous facilite la vie ;-)

Voir aussi