PHP 5.3 vient de sortir en version alpha3 ; les fonctionnalités sont maintenant figées.
La version stable devrait arriver aux environs du printemps 2009 ; que nous apportera-t-elle ?
Closures, namespaces, goto, optimisations, internationalisations... Finalement, une mise à jour "mineure" apportant un lot extrêmement important de nouveautés !
Ces slides sont ceux que j'ai présenté au forum PHP Paris 2008 organisé par l'AFUP.
2. Nouveautés PHP 5.3 – Pascal MARTIN
Nouveautés de PHP 5.3
The future is here!
– almost
3. Nouveautés PHP 5.3 – Pascal MARTIN
Qui suis-je ?
●
Pascal MARTIN
●
Expert technique PHP chez SQLI
●
Membre de la Cellule Architecture PHP
– Capitalisation
– Veille technologique
●
Blog perso
●
http://blog.pascal-martin.fr/
– Articles techniques PHP & Javascript
– Dont une série de 30 articles sur les Nouveautés de PHP 5.3
4. Nouveautés PHP 5.3 – Pascal MARTIN
Introduction
●
Versions de PHP
●
4.4.9 : Août 2008 – plus maintenu !
●
5.0.0 : juillet 2004
●
5.1.0 : Novembre 2005
●
5.2.0 : Novembre 2006
– 5.2.6 : Mai 2008 ; 5.2.7 : Décembre 2008 – bientôt 5.2.8 ?
●
Grand nombre de nouveautés attendues !
●
Pas au point de changer de version majeure ?
●
PHP 6 est encore loin !
●
PHP 5.3
●
Versions « testables » : printemps 2008
●
1ère version alpha : 1er août 2008
5. Nouveautés PHP 5.3 – Pascal MARTIN
« Pack » d'exemples / tests
●
Série d'exemples et de tests
●
Couvrant la quasi-totalité des nouveautés de PHP 5.3
– Plus en détails que ce que je présenterai ici
●
Téléchargeable depuis mon blog
– http://blog.pascal-martin.fr/public/php-5.3/php-5.3-exemples.tar.bz2
– Mis à jour quand j'effectue de nouveaux test
6. Nouveautés PHP 5.3 – Pascal MARTIN
E_DEPRECATED
●
Nouveau niveau de rapport d'erreurs
●
« E_DEPRECATED »
●
Objectif
– Identifier les fonctionnalités dépréciées
– Qui seront probablement supprimées pour une prochaine
version
●
Pour PHP 6, typiquement
7. Nouveautés PHP 5.3 – Pascal MARTIN
Constante magique __DIR__
●
Travail par rapport au répertoire où se trouve un
fichier
●
Inclusion d'un fichier .php
require_once(dirname(__FILE__) . '/../mon-fichier.php');
●
Long à écrire, risque de fautes de frappe
●
Évalué à l'exécution
●
PHP 5.3 : nouvelle constante magique
● __DIR__
require_once(__DIR__ . '/../mon-fichier.php');
●
Évalué à la compilation
– Plus rapide à exécuter
●
Et plus court à écrire
8. Nouveautés PHP 5.3 – Pascal MARTIN
Saut inconditionnel : « goto »
●
Ajout de l'instruction « goto »
●
Et de la notion de « label » (étiquette)
echo '<p>a</p>';
goto c;
echo '<p>b</p>';
c:
echo '<p>c</p>';
●
A noter
●
Pas de saut à l'intérieur d'une boucle / d'un switch
●
Autorisé à l'intérieur d'un if / else (utilité ?)
●
Pas de « goto $label; »
●
Instructions « break » et « continue » non modifiées
– Sortie de boucles imbriquées : « break 2; »
– Pas de « break label; »
9. Nouveautés PHP 5.3 – Pascal MARTIN
LSB – Late Static Binding
●
PHP 5.2 : résolution statique à la compilation
class Vehicule {
public static function a() {
echo '<pre>' . __CLASS__ . '</pre>';} // Etape 3 : quot;Vehiculequot;
public static function b() {self::a();} // Etape 2 : PHP 5.2 : quot;selfquot;
}
class Voiture extends Vehicule {
public static function a() {echo '<pre>' . __CLASS__ . '</pre>';}
}
Voiture::b(); // Etape 1
●
PHP 5.3 : résolution statique « tardive »
class Vehicule {
public static function a() {echo '<pre>' . __CLASS__ . '</pre>';}
public static function b() {static::a();} // Etape 2 : PHP 5.3 : LSB :
quot;staticquot;
}
class Voiture extends Vehicule {
public static function a() {
echo '<pre>' . __CLASS__ . '</pre>';} // Etape 3 : quot;Voiturequot;
}
Voiture::b(); // Etape 1
●
Conservation de « self » et de son comportement
10. Nouveautés PHP 5.3 – Pascal MARTIN
Appels statiques dynamiques
class A {
public static function
methodeStatique($p1) {
●
PHP <= 5.2
echo
quot;<pre>A::methodeStatique($p1)</pre>quot;;
●
Parse Error
}
public function methode($p1) {
echo quot;<pre>A::method($p1)</pre>quot;;
}
}
$className = 'A';
●
PHP 5.3
$methodName = 'methode';
$obj = new $className();
●
Appels statiques
$obj->$methodName('param1'); dynamiques possibles
// A::methode(param1)
$staticMethodName = 'methodeStatique';
$className::
$staticMethodName('param1');
// A::methodeStatique(param1)
●
A noter aussi
●
Ajout méthode magique « __callStatic »
●
Equivalent statique de « __call »
11. Nouveautés PHP 5.3 – Pascal MARTIN
Syntaxe NOWDOC
●
Depuis PHP 4, syntaxe Heredoc
$str = <<<END_OF_STRING
<h1>Hello, world!</h1>
<div>
Démonstration syntaxe
<strong>$syntaxe</strong>
</div>
END_OF_STRING;
●
PHP 5.3 ajoute la syntaxe Nowdoc
●
Simple-quotes : pas d'interpolation de variables
$str = <<<'END_OF_STRING'
<h1>Hello, world!</h1>
<div>
Démonstration syntaxe
<strong>$syntaxe</strong>
</div>
END_OF_STRING;
●
Doubles-quotes : Identique à Heredoc
– Plus consistant avec Nowdoc simple-quotes
– Mais : deux façons de faire la même chose
12. Nouveautés PHP 5.3 – Pascal MARTIN
GC – Garbage Collector – 1
●
PHP <= 5.2
●
Références cycliques
●
=> non libération de la mémoire
●
PHP 5.3 : Ajout Garbage Collector
●
Fonctions « gc_* »
●
Activé par défaut
– Mais désactivable
●
Intérêt
●
Faciliter le développement de grosses applications
– Batchs
– Applications basées sur des frameworks
– PHP-GTK ?
●
PHP ne sert plus que pour du Web / des scripts légers
13. Nouveautés PHP 5.3 – Pascal MARTIN
GC – Garbage Collector – 2
●
Rouge : Sans Garbage Collector
●
Bleu : Avec Garbage Collector
14. Nouveautés PHP 5.3 – Pascal MARTIN
Lambdas et Closures – 1
●
Ceux qui ont fait du Javascript connaitront !
●
PHP 5.3 introduit les « Lambdas » et « Closures »
●
Fonction anonyme
●
Création
$func = function () {
echo quot;<p>Hello, World!</p>quot;;
};
●
Appel
$func();
●
Fonction anonyme avec paramètre(s)
$func = function ($param) {
echo quot;<p>Hello, $param!</p>quot;;
};
$func('there');
●
Appel possible via call_user_func[_array]
●
Fonctions « anonymes », mais fonctions quand même !
15. Nouveautés PHP 5.3 – Pascal MARTIN
Lambdas et Closures – 2
●
Exemple évident
●
Utilisation d'une fonction anonyme comme fonction de
callback
$data = array('sacré coeur', 'champs elysée', 'tour eiffel');
$output = array_map(function ($item) {
return ucwords($item);
}, $data);
var_dump($output);
array
0 => string 'Sacré Coeur' (length=12)
1 => string 'Champs Elysée' (length=14)
2 => string 'Tour Eiffel' (length=11)
●
Plus pratique que create_function !
– Plus rapide à l'exécution
– Plus lisible – coloration syntaxique !
●
Évite la création de fonctions nommées, à usage
unique
16. Nouveautés PHP 5.3 – Pascal MARTIN
Lambdas et Closures – 3
●
« use » : Import d'une variable externe
$var = 'World';
$func1 = function () {
echo quot;<p>Hello, $var!</p>quot;;
};
$func2 = function () use ($var) {
echo quot;<p>Hello, $var!</p>quot;;
};
$func1(); // Notice: Undefined variable: var … => Hello, !
$func2(); // Hello, World!
●
Import en lecture-seule
●
Ou par référence : ré-utilisation de « & »
– Import en lecture-écriture
$func2 = function () use (& $var) {
echo quot;<p>Début 2 : $var</p>quot;;
$var = 2;
echo quot;<p>Fin 2 : $var</p>quot;;
};
17. Nouveautés PHP 5.3 – Pascal MARTIN
Lambdas et Closures – 4
●
Création d'une closure
$func = function ($arg) {
$compteur = $arg; // Copie privée, en lecture seule
return function () use ($compteur) {
return ++$compteur;
};
};
$a1 = $func(10);
$a2 = $func(50);
echo 'a1 : ' . $a1() . quot;nquot;; // 11
echo 'a2 : ' . $a2() . quot;nquot;; // 51
echo 'a1 : ' . $a1() . quot;nquot;; // 11
echo 'a2 : ' . $a2() . quot;nquot;; // 51
echo 'a1 : ' . $a1() . quot;nquot;; // 11
echo 'a2 : ' . $a2() . quot;nquot;; // 51
●
Fonction interne force la conservation de la valeur
de $compteur
●
C'est le principe même d'une closure !
– Après Javascript, c'est maintenant possible en PHP !
18. Nouveautés PHP 5.3 – Pascal MARTIN
Lambdas et Closures – 5
●
Même chose, en lecture-écriture
$func = function ($arg) {
$compteur = $arg; // Copie privée, en lecture / écriture
return function () use (& $compteur) {
return ++$compteur;
};
};
$a1 = $func(10);
$a2 = $func(50);
echo 'a1 : ' . $a1() . quot;nquot;; // 11
echo 'a2 : ' . $a2() . quot;nquot;; // 51
echo 'a1 : ' . $a1() . quot;nquot;; // 12
echo 'a2 : ' . $a2() . quot;nquot;; // 52
echo 'a1 : ' . $a1() . quot;nquot;; // 13
echo 'a2 : ' . $a2() . quot;nquot;; // 53
●
$compteur conservée par la fonction interne
●
$compteur importée par référence
●
Accessible en lecture-écriture, donc
– Comme les closures de Javascript
19. Nouveautés PHP 5.3 – Pascal MARTIN
intl – Internationalisation – 1
●
Extension « intl » incluse en standard
●
Option –enable-intl
●
Objectif : faciliter l'internationalisation (« i18n ») et la
localisation (« l10n ») d'applications
– Afficher une date sur un site multi-lingue :
« 31/12/2008 » ? « 2008-31-12 » ? « 12/31/2008 » ?
– Et pour une monnaie : « 1,024.12 € » ? « $ 1.024,12 » ?
●
Plusieurs nouvelles classes
● IntlDateFormatter
● NumberFormatter
● Locale
● Collator
21. Nouveautés PHP 5.3 – Pascal MARTIN
Manipulation de dates
date_default_timezone_set('Europe/Paris');
●
PHP >= 4.x
$ts1 = strtotime('25/04/2008 13:30:00');
var_dump(date('Y-m-d', $ts1));
string '1970-01-01' (length=10)
●
PHP >= 5.1.0
$date = date_create('25/04/2008 13:30:00');
var_dump($date);
boolean false
●
PHP >= 5.3
$date = date_create_from_format('d/m/Y H:i:s', '25/04/2008 13:30:00');
var_dump($date->format('Y-m-d'));
string '2008-04-25' (length=10)
●
Nous sommes français / francophones
●
Non, nos utilisateurs ne connaissent pas le format de
dates américain !
22. Nouveautés PHP 5.3 – Pascal MARTIN
Opérateur ? : revu
●
Opérateur ternaire ; syntaxe parfois redondante
$blah = ($identifiant ? $identifiant : 'Erreur');
●
PHP 5.3 : nouvelle possibilité d'écriture
● condition ? : valeur si faux
●
Si « condition » est vraie, retour du résultat de son
évaluation
– Sans dupliquer son écriture
●
Sinon, retour de la valeur de droite
var_dump(true ?: false); // bool(true)
var_dump(true ? : false); // bool(true) (fonctionne avec des ' ' entre ?
et :)
var_dump(false ?: true); // bool(true)
var_dump('glop' ?: ''); // string(4) quot;glopquot;
var_dump(strlen('glop') ?: strlen('')); // int(4)
var_dump(isset($a) ?: 10); // int(10) ($a non défini)
$b = 'Hello, World!'; var_dump(isset($b) ?: 10); unset($b); // bool(true)
var_dump('' ?: isset($a)); // bool(false) ($a non défini ; 2 valeurs fausses)
23. Nouveautés PHP 5.3 – Pascal MARTIN
mysqlnd
●
Bibliothèque spécialisée d'interface PHP ↔ MySQL
●
Conçue spécialement pour PHP ; intégrée à PHP
– Perspectives d'évolution
– MAJ / correctifs en même temps que PHP
●
Principaux avantages
●
Plus rapide (20 à 30% plus rapide que libmysql)
●
Amélioration de l'utilisation mémoire
●
Fonctionnalités supplémentaires (statistiques)
●
Driver intégré : pas de dépendance externe
●
Pour le développeur
●
Aucune modification : choix effectué à la compilation
de PHP
●
Brique « en-dessous » de mysql, mysqli, PDO
24. Nouveautés PHP 5.3 – Pascal MARTIN
Phar : PHP Archive
●
« PHP Archive »
●
Équivalent des .jar du monde JAVA
●
Regroupement de plusieurs fichiers en un seul
●
Intégré à PHP 5.3 : indépendant de PEAR / PECL
●
Manipulation de fichiers Phar
●
Ajout d'un stream « phar »
●
Inclusion de fichiers packagés au sein d'une Phar
– Y compris d'un fichier vers l'autre
●
Exemples de possibilités
●
Distribution d'une application entière en un seul fichier
– Pour les application CLI, et pour les applications Web !
– Comme installeur ?
●
Framework packagé en un seul fichier ?
25. Nouveautés PHP 5.3 – Pascal MARTIN
Ajouts à la SPL – 1
●
Itérateurs au niveau du système de fichiers
●
FileSystemIterator, GlobIterator
$motif = __DIR__ . '/*.php';
$fichiers = new GlobIterator($motif);
foreach ($fichiers as $fichier) {
// $fichier est une instance de SplFileInfo
echo $fichier->getPathname() . ' : '
. number_format($fichier->getSize(), 0, '.', ',')
. quot; octetsnquot;;
}
/home/php/php53/spl/FilesystemIterator-5.3-1.php : 1,540 octets
/home/php/php53/spl/GlobIterator-5.3-1.php : 296 octets
/home/php/php53/spl/SplDoublyLinkedList-5.3-1.php : 138 octets
/home/php/php53/spl/SplMaxHeap-5.3-1.php : 179 octets
/home/php/php53/spl/SplMinHeap-5.3-1.php : 179 octets
/home/php/php53/spl/SplMinHeap-5.3-2.php : 494 octets
/home/php/php53/spl/SplMinHeap-5.3-3.php : 883 octets
/home/php/php53/spl/SplPriorityQueue-5.3-1.php : 301 octets
/home/php/php53/spl/SplQueue-5.3-1.php : 755 octets
/home/php/php53/spl/SplStack-5.3-1.php : 718 octets
26. Nouveautés PHP 5.3 – Pascal MARTIN
Ajouts à la SPL – 2
●
Nouvelles structures de données
●
SplStack, SplQueue, SplPriorityQueue,
SplDoublyLinkedList, SplMinHeap, SplMaxHeap, …
●
Attention : deux modes de fonctionnement différents
– Classes héritant de SplDoublyLinkedList ne se vident pas
lors du parcours
– Classes héritant de SplHeap se vident lors du parcours
$q = new SplPriorityQueue();
$q->setExtractFlags(SplPriorityQueue::EXTR_BOTH);
$q->insert('Mr A', 10);
$q->insert('Mr B', 30);
$q->insert('Mr C', -1);
$q->insert('Mr D', 5);
foreach ($q as $element) {
var_dump($element); // /! le parcours enlève les éléments de la queue !
}
array 'data' => string 'Mr B' (length=4) 'priority' => int 30
array 'data' => string 'Mr A' (length=4) 'priority' => int 10
array 'data' => string 'Mr D' (length=4) 'priority' => int 5
array 'data' => string 'Mr C' (length=4) 'priority' => int -1
27. Nouveautés PHP 5.3 – Pascal MARTIN
Espaces de noms – 1
●
Espaces de noms, « namespace »
●
Fonctionnalité très attendue
●
Grand sujet de débats / discussions enflammées
●
Raison de l'alpha3 et des reports de sa sortie
●
Pourquoi des namespaces ?
●
Noms de classes trop longs
●
Conflits
– Redéfinition de classes, de fonctions
– Dans les bibliothèques
●
Séparateur de namespace : « »
●
ET PAS « :: » !
●
Contrairement à ce qui existait en versions <= alpha2
28. Nouveautés PHP 5.3 – Pascal MARTIN
Espaces de noms – 2
●
Déclaration d'un namespace
●
Instruction « namespace » + nom de l'espace
●
Tout ce qui suit, dans le fichier, est dans l'espace de
noms
– Fonctions, constantes, classes
<?php
namespace LIB;
function a() {
var_dump('LIBa');
}
function b() {
var_dump('LIBb');
}
●
Utilisation (autre fichier)
<?php
require_once(__DIR__ . '/lib.php');
LIBa();
LIBb();
29. Nouveautés PHP 5.3 – Pascal MARTIN
Espaces de noms – 3
●
Attention
●
« namespace » : 1ère instruction d'un fichier !
– Sinon => Fatal Error
●
« » est aussi le caractère d'échappement
– Dans les chaînes de caractères
●
Entre double-quotes, surtout
●
Pour les instanciations dynamiques de classes
●
Espaces de noms : contenu entre accolades
●
C'est possible ;-)
<?php
namespace LIB {
function a() {
var_dump('LIBa');
}
function b() {
var_dump('LIBb');
}
}
30. Nouveautés PHP 5.3 – Pascal MARTIN
Espaces de noms – 4
●
Organisation des fichiers
●
Espace de noms sur plusieurs fichiers
– Frameworks, bibliothèques : plusieurs classes
●
Plusieurs espaces de noms dans un même fichier
– Fusion de plusieurs fichiers PHP en un seul
●
Noms composés
●
« » peut être inclus dans un nom de namespace
namespace MonNSA;
●
Nouvelle constante magique
● __NAMESPACE__
– Nom de l'espace de noms où elle est utilisée
– Chaîne vide en dehors de tout namespace
●
Espace de noms « global » : « »
31. Nouveautés PHP 5.3 – Pascal MARTIN
Espaces de noms – 5
●
Import d'un espace de noms : « use … as … »
●
Défini un alias
use NAMESPACE_AU_NOM_TRES_LONG as A;
$a = new AClassA();
$a = new NAMESPACE_AU_NOM_TRES_LONGClassA();
●
Les deux écriture reviennent au même, en interne
●
Même chose avec un NS au nom composé
●
use peut aussi permettre de déclarer un alias de classe
use NSNOMCOMPOSEClassA as MyClass;
●
NS en plusieurs parties : use sans as
use NSNOMCOMPOSE;
●
Défini « COMPOSE » comme alias de « NSNOMCOMPOSE »
●
Attention : uniquement si nom composé !
32. Nouveautés PHP 5.3 – Pascal MARTIN
Espaces de noms – 6
●
Autoloading
●
Nom de l'espace de noms est compris dans le nom
interne de la classe
– Si fichiers bien organisés => pas de problème
●
Type-hinting
●
Résolution
●
En premier, chargement depuis le NS courant
●
Puis
– Pour les classes : autoload
– Pour les fonctions / constantes : chargement depuis
l'espace de noms global
●
Pas de chargement depuis l'espace de noms global
pour les classes !
33. Nouveautés PHP 5.3 – Pascal MARTIN
Divers
● getopt
●
Support natif des options longues, sous tous OS
● fileinfo
●
Déterminer le type d'un fichier
●
Configuration par répertoire, par fichier .ini
●
En mode CGI uniquement
●
Profiling XLST
●
Nouvelles fonctions SSL
●
Objectif : implémentation d'openId en PHP
●
MAJ SQLite
●
Plus de tests unitaires automatisés
●
Corrections de bugs
34. Nouveautés PHP 5.3 – Pascal MARTIN
Performances
●
Nombreuses améliorations orientées performances
●
Malgré les nouveautés
●
Gain de 10 à 20% pour des applications
« répandues »
●
Drupal, TYPO3, Wordpress, ...
●
Récapitulatif
●
PHP 4
– Le plus lent
●
PHP 5.3
– Plus rapide que
toutes les autres
versions 5.x
●
PHP 6
– Par curiosité
35. Nouveautés PHP 5.3 – Pascal MARTIN
Conclusion : Le futur est là...
●
Nouveautés et améliorations
●
Plein
●
Potentiellement intéressantes !
●
Pas de révolution
●
Pas / peu de cassage de fonctionnalités existantes
●
Théoriquement, passage de 5.2.x à 5.3 peu risqué
– Testez, Expérimentez !
– Bonnes habitudes : à prendre !
– Mauvaises habitudes : pas encore là !
– Faites des retours : une des forces de PHP = communauté !
●
Support par les IDE / outils
●
Pas encore :-(
●
Ou pas suffisamment...
36. Nouveautés PHP 5.3 – Pascal MARTIN
… ou presque !
●
Version alpha3 tout juste sortie
●
Fonctionnalités figées
●
Date pour la version finale ?
●
Printemps 2009 ? Plus tard ?
●
« Demandez à Lukas Smith » (conf. de 16h30)
●
PHP 5.3 et projets « réels » ?
●
Zend Framework 2.0 ? Doctrine 2.0 ?
●
Et pour nos projets ?
●
Et pour nos clients / pour vous ?
●
PHP 5.et-demie ?
●
PHP 6 n'est toujours pas pour demain...
●
… Nombreuses améliorations rapportées en PHP 5.3 !