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.