The Tech Guy FR

PHP5.3 : Quelles nouveautés ?

par c2c le 5 juil 2009

PHP5.3 est sorti le 30 Juin

Les nouveautés de PHP5.3

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 !

:, , ,

2 commentaires

  • Laurent

    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.

  • c2c

    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 …

Commentez, insultez, réagissez !

XHTML: Vous pouvez utiliser ces balises: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Une recherche ?

Utilisez le formulaire pour rechercher un article :

Si vous ne trouvez toujours pas ce que vous cherchez, n'hésitez pas à me contacter : contact.blog@juliencrouzet.fr