Il est en effet maintenant possible d'imposer en argument d'une méthode ou une fonction une fonction de rappel, grâce au mot-clef callable
, qui devient du même coup réservé.
Si vous avez parmi votre code une ou plusieurs fonction, classe ou méthode portant ce nom, il vous faudra donc les renommer pour qu'elles ne posent pas de problèmes si elles sont utilisées avec PHP 5.4.
<?php class invoker { protected $callable = null; public function setCallable(callable $callable) { $this->callable = $callable; return $this; } public function invoke() { return $this->callable === null ? null : call_user_func_array($this->callable, func_get_args()); } } $invoker = new invoker(); echo $invoker ->setCallable(function($arg) { echo 'Arg is ' . $arg . PHP_EOL; }) ->invoke(uniqid()) ; function foo() { echo uniqid(); } function bar(callable $callable) { call_user_func($callable); } bar('foo'); ?>
Autre chose pouvant poser problème, PHP 5.4 ne permettra plus de définir le fuseau horaire via l'instruction putenv("TZ=Europe/Paris")
, car cette façon de faire peut poser des problèmes de concurrence en fonction de la façon dont le langage est intégré au serveur HTTP.
Par ailleurs, PHP n'essayera plus de deviner le fuseau horaire à utiliser lorsque la directive de configuration date.timezone
n'est pas définie et que la fonction date_default_timezone_set()
n'a pas été utilisée.
Dans ce cas, le langage utilisera alors le fuseau horaire UTC.
Autre modification mais qui n'a cette fois aucune influence sur le code existant, le pilote mysqlnd
est dorénavant utilisé par défaut à la place de libmysql
, puisqu'il offre de meilleurs performances.
Chose que je n'avais pas encore remarqué auparavant, il est maintenant possible d'utiliser $this
au sein d'une fonction anonyme définie dans une méthode de classe, de la manière suivante, comme décrit dans la RFC correspondante :
<?php
class foo {
private $value;
public function __construct($start = 1) {
$this->value = $start;
}
public function getValue() {
return $this->value;
}
public function getIncrementor() {
return function() { return ++$this->value; };
}
}
$foo = new foo(1);
$incrementor = $foo->getIncrementor();
var_dump($foo->getValue()); // int(1)
var_dump($incrementor()); // int(2)
var_dump($foo->getValue()); // int(2)
var_dump($incrementor()); // int(3)
var_dump($foo->getValue()); // int(3)
?>
Pour autant, il n'est pas encore possible d'appeler une fonction anonyme si elle est une propriété d'un objet autrement que via __invoke()
ou les fonctions call_user_func()
ou call_user_func_array()
, et ce n'est pas prévu pour PHP 5.4.
Dans un autre registre, les constantes SORT_NATURAL
et SORT_FLAG_CASE
, qui permettent d'effectuer un tri naturel et non informatique, sont maintenant supportées par les fonctions de tri de tableau sort()
, rsort()
, ksort()
, krsort
, asort()
, arsrot
et array_multisort()
, ce qui devrait ravir au moins une personne.
Enfin, Au chapitre des choses que j'aurais préféré ne jamais voir ajouter à
cette version, l'interface d'introspection a été enrichie d'une nouvelle
méthode nommée \reflectionClass::newInstanceWithoutConstructor()
qui permet d'instancier une classe sans faire appel au constructeur, ou comment nettoyer le langage d'un côté et le pourrir d'un autre.
La décision d'ajouter cette méthode est d'autant plus paradoxale que PHP 5.4 ß rend obligatoire l'appel au constructeur parent dans les classes dérivant par exemple de la SPL.
Pour terminer, comme d'habitude, une version spécifique à Windows est également disponible, et vu qu'il ne s'agit que d'une version ß, il est très fortement déconseillé de l'utiliser en production.
7 réactions
1 De MathRobin - 16/09/2011, 19:52
Hello! Merci pour ce point sur la beta de 5.4. J'ai raté un épisode ou les traits ne sont pas de la partie ?
2 De jubianchi - 16/09/2011, 20:26
En effet, rien de super passionnant dans cette version. Les quelques ajout mentionnés dans l'article sont tout de même interessants : plus besoin d'utiliser une variable temporaire qui stocke une référence sur $this pour les fonctions anonymes! Le mot clé callable qui va nous épargner l'écriture de test lorsque nous attendons une fonction de rappel en paramètre.
Ce n'est effectivement pas une révolution mais, encore une fois, cela nous permettra de coder plus confortablement dans certains cas.
Même avis que toi au sujet de
\ReflectionClass::newInstanceWithoutConstructor()
, espérons que cette méthode ne soit pas utilisée n'importe où et n'importe comment!Encore merci pour cette article!
Bonne continuation
3 De oxman - 16/09/2011, 21:18
Bonjour,
Tu peux donner un exemple pour callable stp ?
Merci par avance
4 De mageekguy - 17/09/2011, 08:57
@MathRobin : Les traits font partis de PHP 5.4 depuls la alpha 1.
5 De mageekguy - 17/09/2011, 14:56
@oxman : J'ai mis à jour le billet.
6 De Amaury - 18/09/2011, 09:48
C'est bien, ça avance.
Pour le mot-clé "callable", on avait déjà le type d'objet "Closure" qui servait à la même chose non ?
Concernant mysqlnd, c'est une bonne nouvelle, mais il était temps : ça fait quand même 4 ans qu'on en parle, de ce driver...
7 De mageekguy - 18/09/2011, 10:20
@Amaury : Ça marche avec tous les types de callback, pas uniquement les fonctions anonymes.
J'ai mis à jour le billet (encore une fois) pour l'expliciter.
Et il n'est pas recommandé de se reposer sur
\Closure
, même si tout le monde le fait, car c'est un détail d'implémentation.