Advertisement
Advertisement

More Related Content

Advertisement

PHP 5.3 : les nouveautés du futur si proche

  1. Nouveautés PHP 5.3 – Pascal MARTIN « Que nous  réserve  l'avenir ? »
  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
  20. Nouveautés PHP 5.3 – Pascal MARTIN Intl – Internationalisation – 2 ● Nombres / monnaies echo NumberFormatter::create('fr_FR', NumberFormatter::CURRENCY)- >format(123456789.987654) . quot;nquot;; echo NumberFormatter::create('en_US', NumberFormatter::CURRENCY)- >format(123456789.987654) . quot;nquot;; 123 456 789,99 € $123,456,789.99 ● Dates echo IntlDateFormatter::create('fr_FR', IntlDateFormatter::FULL, IntlDateFormatter::FULL)->format(time()) . quot;nquot;; echo IntlDateFormatter::create('zh-Hant-TW', IntlDateFormatter::FULL, IntlDateFormatter::FULL)->format(time(time())) . quot;nquot;; 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) . quot;nquot;; Le jeudi 9 octobre 2008 à 04:31, 5 pommes coûtent 3,14 €
  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 !
  37. Nouveautés PHP 5.3 – Pascal MARTIN Questions ?
  38. Nouveautés PHP 5.3 – Pascal MARTIN Merci à tous, Bon appétit !
Advertisement