Utilisation de __invoke dans le Zend Framework 2

__invoke est une nouvelle méthode magique introduite par PHP 5.3. En bref, elle permet d'appeler un objet comme si c'était une fonction. Cette fonctionnalité est utilisée dans plusieurs classes du ZF2 comme les filtres. Voici un petit exemple avec Zend\Filter\Boolean :

<?php
use Zend\Debug,
    
Zend\Filter\Boolean;

$boolFilter = new Boolean();

$boolFilter->setLocale('fr_FR');
$boolFilter->setType(Boolean::YES);

// Affiche : oui bool(true)
Debug::dump($boolFilter('oui'), 'oui');

// Affiche : non bool(false)
Debug::dump($boolFilter('non'), 'non');
?>

Tous les filtres peuvent à présent être appelés de cette façon car ils dérivent tous de Zend\Filter. Ça ne présente pas un avantage déterminant dans ce cas, puisque ça évite simplement d'avoir à taper ->filter, mais c'est plus intéressant si on veut utiliser notre objet comme fonction de rappel :

<?php
$data 
= array('oui''non''oui');
$newData array_map($boolFilter$data);
// Affiche :
// newData array(3) {
//   [0] => bool(true)
//   [1] => bool(false)
//   [2] => bool(true)
// }
Debug::dump($newData'newData');
?>

Avant il aurait fallu utiliser ce code particulièrement moche :

<?php
$newData 
array_map(array($boolFilter'filter'), $data);
?>

Les validateurs bénéficient également de cette nouveauté :

<?php
use Zend\Validator\Alnum;

$alnum = new Alnum();
// Affiche : bool(true)
Debug::dump($alnum('foo'));
?>

Pour être complet sur la méthode __invoke, il faut signaler qu'elle souffre de certaines limitations. Je vous invite à lire l'article de Frédéric HARDY sur le sujet. Si vous voulez choper une migraine, vous pouvez également consulter cette RFC sur les closures ;-).

Etiquettes:

Ajouter un commentaire