Il y a en ce moment une discussion animée sur la mailing list PHP-DEV à propos du type hinting. Plus précisément, s'il est aujourd'hui possible en PHP5 de forcer un paramètre d'une fonction ou méthode à être une instance d'une classe particulière, le seul type scalaire accepté pour le type hinting est le type tableau :
class Foo {
public function bar(MyObject $param) { // OK
...
}
public function bas(array $param) { // OK
...
}
public function bat(float $param) { // PAS OK
...
}
}
Certains voudraient étendre le type hinting à tous les types scalaires de PHP (integer, float, string, etc...), mais bien sûr d'autres ne sont pas d'accord, souvent parce qu'ils n'en voient pas l'intérêt ou parce qu'ils trouvent cela contraire à la philosophie de PHP (qui se veut un langage dynamique). Pour ma part, je vois au moins un intérêt au type hinting : la génération automatique d'un fichier WSDL à partir du code PHP d'un service web. En effet, l'API de Réflexion de PHP vous permet d'ores et déjà de récupérer le type des arguments d'une méthode, comme l'illustre l'exemple suivant :
class MyObject {}
class Foo {
public function bar(MyObject $param) {}
}
$ref = new ReflectionClass('Foo');
$params = $ref->getMethod('bar')->getParameters();
foreach ($params as $param) {
echo "parameter $".$param->getName()." (".$param->getClass()->getName().")
";
}
Mais sans support des types scalaires dans le type hinting, cette technique n'est pas idéale. Si une méthode prend comme argument un entier, cela vous oblige à créer une classe Integer, qui mapperait vers le type XML Schema xs:integer. Le framework de WSO2, qui permet la génération automatique de fichiers WSDL, utilise le principe des annotations de Java pour résoudre le problème. L'idée est de décrire le type des arguments dans un commentaire, qui sera parsé par le framework :
/**
* The purchaseOrder function
* @param int $itemNo ID of the item to be purchased
* (maps to the xs:int XML schema type )
* @param string $date Date that the purchase order was done
* (maps to the xs:gDate XML schema type)
* @return int $price tolal price
* (maps to the xs:nonNegativeInteger schema type )
*/
function purchaseOrder ($itemNo, $date)
{
// some logic
return $Price;
}
L'idée est bonne, mais une solution en PHP pur me satisferait plus. Pour cette raison, un support des types scalaires dans le type hinting me parait intéressant, d'autant plus que le type hinting reste optionnel en PHP, alors pourquoi ne pas l'implémenter jusqu'au bout. En attendant que cela se fasse, une autre solution pourrait bientôt être possible. En effet, Marcus Börger et David Coallier travaillent actuellement sur une extension de SPL nommée SPLTypes. Pas de manuel pour l'instant, juste une petite description par l'un des auteurs. Plutôt que de créer vos propres classes Integer, Float, etc... pour le type hinting, il vous suffirait alors d'utiliser les types SPL : SPLInt, SPLFloat, etc... A suivre de près !