PHP5.3 : Quelles nouveautés ?
par c2c le 5 juil 2009
Le 30 Juin dernier est sorti PHP5.3, discrètement… Pourtant c’est une évolution majeure, qui ne comprends pas que des corrections de bugs (140 corrections quand même).
Quoi de neuf alors dans cette version ?
Les namespaces
Annoncé comme l’une des évolutions majeures du légendaire PHP6 (sortie en 2087, peut être), les namespaces ou espaces de nommages sont l’une des dernières étapes de la route vers un vrai langage objet.
Alors qu’est ce que c’est « simplement » ? C’est un moyen de faire cohabiter ensemble plusieurs librairies de manière simple et d’organiser simplement son code.
Le but premier est de pouvoir nommer simplement des classes, constantes et fonctions sans risquer le conflit avec du code existant. Jusqu’ici, on utilisait des techniques, comme par exemple nommer ses classes en respectant des règles comme NomDuFramework_NomDeLaLibrairie_NomDeLaClasse. Avec les namespaces, il est simple de compartimenter son code et ne pas se soucier des conflits.
Un exemple, qui j’espère, sera parlant :
/**
* On execute du code dans le deuxièmme espace
*/
namespace Espace2 {
echo "On est dans le deuxièmme espace :\n";
var_dump(CONSTANTE);
fonction();
$objet = new Classe();
$objet->test();
echo "\n\n";
}
/**
* On execute du code dans l'espace global
*/
namespace {
echo "On est dans l'espace global :\n";
echo "Est-ce que la constante CONSTANTE est définie ?\n";
var_dump(defined('CONSTANTE'));
echo "Est-ce que la fonction fonction() est définie ?\n";
var_dump(function_exists('fonction'));
echo "Est-ce que la classe 'Classe' est définie ?\n";
var_dump(class_exists('Classe'));
}
?>
Avec cette évolution, on fait un pas de plus vers les lettres de noblesse de PHP dans le monde des langages objets, à plus d’un point.
Aujourd’hui, beaucoup de gens pensent leur code comme une accumulation de fonctions (souvent un copier-coller de sites). Utiliser des namespaces pousse le développeur à s’imposer une certaine rigueur et à bien séparer son code de manière logique.
J’attends avec impatience la 2.0 de Zend Framework qui utilisera les namespaces
Les fonctions anonymes
Les fonctions anonymes (ou closures) sont des blocs de codes exécutables (donc des fonctions) mais qui ne possèdent pas de noms pour être rappelées plus tard. La première fois cela peut paraitre déroutant et on peut ne pas comprendre l’utilité, mais par exemple, si vous utilisez jQuery, vous saisissez immédiatement l’opportunité !
Prenons par exemple la fonction PHP array_walk() qui permet d’appliquer une fonction sur chaque élément d’un tableau. Avant on définissait une fonction, on la nommait et on passait le nom de la fonction en argument, comme ceci :
function cmp($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
uasort($array, 'cmp');
Maintenant, on peut directement passer une fonction anonyme comme argument sans avoir à créer de fonction au préalable :
uasort($array, function($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
});
"late static binding"
Le late static binding ou la "Résolution statique à la volée" est un concept assez théorique au premier abord mais qui solutionne une importante limitations de PHP.
Dans le cadre de méthodes statiques d'une classe, le mot clé self ou la constante __CLASS__ qui font référence à la classe "courante" sont assignées par PHP lors de l'analyse du code et non au moment de l'exécution, donc en cas d'héritage, elles font référence à la classe parente et non à la classe courante.
Cela peut paraitre compliqué, alors prenons un exemple, le code suivant :
affichera "Je suis la classe Papa".
PHP5.3 étend donc le mot-clé static, pour l'utiliser comme une référence à la classe courante pendant l'exécution et non pendant la compilation. On peut donc écrire le code suivant :
class Papa {
public static function jeSuis() {
return (__CLASS__);
}
public static function annonceToi() {
echo 'Je suis la classe ' . static::jeSuis() . "\n";
}
}
class Filston extends Papa {
public static function jeSuis() {
return (__CLASS__);
}
}
Filston::annonceToi();
qui affichera bien "Je suis la classe Filston".
Le contrôle du garbage collector
Pour ceux qui ne serait pas à l'aise, consultez l'article Garbage Collector sur Wikipedia.
N'ayant eu le temps de tester encore en détail, je vous conseille la lecture de ce très bon billet.
L'opérateur ternaire simplifié
$valeur = ($valeur) ?: $default;
à la place de
$valeur = ($valeur) ? $valeur : $default;
Et puis aussi ...
D'autres petits changements que je vous laisse consulter...
Bonne lecture et bon tests !

5 juillet 2009 à 12:37:14
Dans le 5.3 c’est aussi l’ajout du fameux « GOTO » avec ces « labels »…
Déjà que le dev en php est tellement permissif que le code est très souvent de la merde et la on en ajoute une couche.
Nombre de sites pro sont programmé sans « function » ?????
C’est possible ?? oui on utilise « include »
ou travaille directement en ligne même en groupe… déboguage php(hein pas la peine) poo, svn ou dvcs kesako ?
Avec goto sa va être un plaisir, hummm, miammiam le php.
Et pour les rares compétent en POO, une surclasse peut faire appel à une méthode d’une sous-class, pas classssssssssss.
5 juillet 2009 à 14:26:26
Effectivement, mais le GOTO ça me semble être une hérésie surement due à une biere frelatée ou un moment d’absence.
J’ose espérer qu’on en verra pas …