View
5.499
Download
1
Category
Preview:
DESCRIPTION
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.
Citation preview
Forum PHP 2008
Nouveautés PHP 5.3 – Pascal MARTIN
« Que nous réserve l'avenir ? »
Forum PHP 2008
Nouveautés PHP 5.3 – Pascal MARTIN
Nouveautés de PHP 5.3
The future is here!– almost
Forum PHP 2008
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
Forum PHP 2008
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
Forum PHP 2008
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
Forum PHP 2008
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
Forum PHP 2008
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
Forum PHP 2008
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; »
Forum PHP 2008
Nouveautés PHP 5.3 – Pascal MARTIN
LSB – Late Static Binding● PHP 5.2 : résolution statique à la compilationclass Vehicule { public static function a() { echo '<pre>' . __CLASS__ . '</pre>';} // Etape 3 : "Vehicule" public static function b() {self::a();} // Etape 2 : PHP 5.2 : "self"}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 : "static"}class Voiture extends Vehicule { public static function a() { echo '<pre>' . __CLASS__ . '</pre>';} // Etape 3 : "Voiture"}Voiture::b(); // Etape 1
● Conservation de « self » et de son comportement
Forum PHP 2008
Nouveautés PHP 5.3 – Pascal MARTIN
Appels statiques dynamiquesclass A { public static function methodeStatique($p1) { echo "<pre>A::methodeStatique($p1)</pre>"; } public function methode($p1) { echo "<pre>A::method($p1)</pre>"; }}
$className = 'A';$methodName = 'methode';$obj = new $className();$obj->$methodName('param1');// A::methode(param1)
$staticMethodName = 'methodeStatique';$className::$staticMethodName('param1');// A::methodeStatique(param1)
● PHP <= 5.2● Parse Error
● PHP 5.3● Appels statiques
dynamiques possibles
● A noter aussi● Ajout méthode magique « __callStatic »● Equivalent statique de « __call »
Forum PHP 2008
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
Forum PHP 2008
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
Forum PHP 2008
Nouveautés PHP 5.3 – Pascal MARTIN
GC – Garbage Collector – 2● Rouge : Sans Garbage Collector● Bleu : Avec Garbage Collector
Forum PHP 2008
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 "<p>Hello, World!</p>";};
● Appel$func();
● Fonction anonyme avec paramètre(s)$func = function ($param) { echo "<p>Hello, $param!</p>";};$func('there');
● Appel possible via call_user_func[_array]● Fonctions « anonymes », mais fonctions quand même !
Forum PHP 2008
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
Forum PHP 2008
Nouveautés PHP 5.3 – Pascal MARTIN
Lambdas et Closures – 3● « use » : Import d'une variable externe$var = 'World';$func1 = function () { echo "<p>Hello, $var!</p>";};$func2 = function () use ($var) { echo "<p>Hello, $var!</p>";};
$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 "<p>Début 2 : $var</p>"; $var = 2; echo "<p>Fin 2 : $var</p>";};
Forum PHP 2008
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() . "\n"; // 11echo 'a2 : ' . $a2() . "\n"; // 51echo 'a1 : ' . $a1() . "\n"; // 11echo 'a2 : ' . $a2() . "\n"; // 51echo 'a1 : ' . $a1() . "\n"; // 11echo 'a2 : ' . $a2() . "\n"; // 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 !
Forum PHP 2008
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() . "\n"; // 11echo 'a2 : ' . $a2() . "\n"; // 51echo 'a1 : ' . $a1() . "\n"; // 12echo 'a2 : ' . $a2() . "\n"; // 52echo 'a1 : ' . $a1() . "\n"; // 13echo 'a2 : ' . $a2() . "\n"; // 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
Forum PHP 2008
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
Forum PHP 2008
Nouveautés PHP 5.3 – Pascal MARTIN
Intl – Internationalisation – 2● Nombres / monnaiesecho NumberFormatter::create('fr_FR', NumberFormatter::CURRENCY)->format(123456789.987654) . "\n";echo NumberFormatter::create('en_US', NumberFormatter::CURRENCY)->format(123456789.987654) . "\n";
123 456 789,99 € $123,456,789.99
● Datesecho IntlDateFormatter::create('fr_FR', IntlDateFormatter::FULL, IntlDateFormatter::FULL)->format(time()) . "\n";echo IntlDateFormatter::create('zh-Hant-TW', IntlDateFormatter::FULL, IntlDateFormatter::FULL)->format(time(time())) . "\n";
jeudi 9 octobre 2008 04:21:10 GMT+00:00 2008年 10月 9 日星期四 上午 04時 21分 10 秒 GMT+00:00
● Messages$format_FR = 'Le {0,date,full} à {1,time,short}, {2,number,integer} pommes coûtent {3,number,currency}';$data = array(time(), time(), 5, 3.1415);echo MessageFormatter::formatMessage('fr_FR', $format_FR, $data) . "\n";
Le jeudi 9 octobre 2008 à 04:31, 5 pommes coûtent 3,14 €
Forum PHP 2008
Nouveautés PHP 5.3 – Pascal MARTIN
Manipulation de datesdate_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 !
Forum PHP 2008
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) "glop"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)
Forum PHP 2008
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
Forum PHP 2008
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 ?
Forum PHP 2008
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, '.', ',') . " octets\n";}
/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
Forum PHP 2008
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 30array 'data' => string 'Mr A' (length=4) 'priority' => int 10array 'data' => string 'Mr D' (length=4) 'priority' => int 5array 'data' => string 'Mr C' (length=4) 'priority' => int -1
Forum PHP 2008
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
Forum PHP 2008
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
<?phpnamespace LIB;function a() { var_dump('LIB\a');}function b() { var_dump('LIB\b');}
● Utilisation (autre fichier)<?phprequire_once(__DIR__ . '/lib.php');LIB\a();LIB\b();
Forum PHP 2008
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 ;-)
<?phpnamespace LIB { function a() { var_dump('LIB\a'); } function b() { var_dump('LIB\b'); }}
Forum PHP 2008
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 Mon\NS\A;
● 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 » : « \ »
Forum PHP 2008
Nouveautés PHP 5.3 – Pascal MARTIN
Espaces de noms – 5● Import d'un espace de noms : « use … as … »
● Défini un aliasuse NAMESPACE_AU_NOM_TRES_LONG as A;
$a = new A\ClassA();
$a = new NAMESPACE_AU_NOM_TRES_LONG\ClassA();
● 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 NS\NOM\COMPOSE\ClassA as MyClass;
● NS en plusieurs parties : use sans asuse NS\NOM\COMPOSE;
● Défini « COMPOSE » comme alias de « NS\NOM\COMPOSE »● Attention : uniquement si nom composé !
Forum PHP 2008
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 !
Forum PHP 2008
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
Forum PHP 2008
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 autresversions 5.x
● PHP 6– Par curiosité
Forum PHP 2008
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...
Forum PHP 2008
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 !
Forum PHP 2008
Nouveautés PHP 5.3 – Pascal MARTIN
Questions ?
Forum PHP 2008
Nouveautés PHP 5.3 – Pascal MARTIN
Merci à tous,
Bon appétit !
Recommended