Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PHP 5.3, PHP Next

4,386 views

Published on

Lors de cette présentation vous trouverez la liste complète des nouveautés de PHP 5.3 avec des exemples d'implémentation.

Elle comprend aussi une partie introspective sur le futur de PHP au 30 juin 2010

Published in: Technology
  • Be the first to comment

  • Be the first to like this

PHP 5.3, PHP Next

  1. 1. Nouveautés PHP 5.3 <ul><li>Cellule PHP R2SC </li></ul># « he who doesn't do anything, doesn't go wrong » Zeev Suraski
  2. 2. <ul><li>Introduction </li></ul><ul><li>Installation </li></ul><ul><li>Nouveautés de PHP 5.3 </li></ul><ul><li>PHP.next </li></ul>Sommaire #
  3. 3. <ul><li>Objectifs de la présentation d'aujourd'hui </li></ul><ul><ul><li>Nouveautés PHP 5.3 </li></ul></ul><ul><ul><ul><li>Par rapport à PHP 5.2 </li></ul></ul></ul><ul><ul><li>Spéculations sur l’avenir de PHP </li></ul></ul><ul><ul><ul><li>Qu’est devenu PHP 6? </li></ul></ul></ul><ul><ul><ul><li>De quoi sera faite la prochaine version de PHP? </li></ul></ul></ul><ul><ul><li>Questions? </li></ul></ul>Introduction #
  4. 4. <ul><li>Versions de PHP </li></ul><ul><ul><li>4.4.9 : Août 2008 – plus maintenu ! </li></ul></ul><ul><ul><li>5.0.0 : juillet 2004 </li></ul></ul><ul><ul><li>5.1.0 : Novembre 2005 </li></ul></ul><ul><ul><li>5.2.0 : Novembre 2006 </li></ul></ul><ul><ul><ul><li>5.2.13 : Février 2010 </li></ul></ul></ul><ul><li>PHP 5.3 </li></ul><ul><ul><li>Versions « testables » : printemps 2008 </li></ul></ul><ul><ul><li>1ère version alpha : 1er août 2008 </li></ul></ul><ul><ul><li>Version 5.3.0 : 30 juin 2009 </li></ul></ul><ul><ul><ul><li>Dernière version : 5.3.2, 4 mars 2010 </li></ul></ul></ul><ul><li>PHP.next ? </li></ul><ul><ul><li>Disparition de PHP 6 en mars 2010 </li></ul></ul><ul><ul><li>On en reparle à la fin de la présentation </li></ul></ul>Rappel : Historique de PHP #
  5. 5. <ul><li>Introduction </li></ul><ul><li>Installation </li></ul><ul><li>Nouveautés de PHP 5.3 </li></ul><ul><li>PHP.next </li></ul>Sommaire #
  6. 6. <ul><li>Récupération des sources </li></ul><ul><ul><li>http://www.php.net/downloads.php </li></ul></ul><ul><li>Pour Linux </li></ul><ul><ul><li>PHP 5.3 intégré dans les dernières versions d’Ubuntu et Fedora. </li></ul></ul><ul><li>Pour windows : </li></ul><ul><ul><li>http://windows.php.net/download/ </li></ul></ul><ul><ul><li>Plusieurs versions : </li></ul></ul><ul><ul><ul><li>Zip contenant les sources compilées </li></ul></ul></ul><ul><ul><ul><li>Installeur windows </li></ul></ul></ul><ul><ul><ul><li>Debug Pack </li></ul></ul></ul><ul><ul><li>Plusieurs compilations </li></ul></ul><ul><ul><ul><li>VC9 Thread Safe et VC9 Non Thread Safe pour IIS </li></ul></ul></ul><ul><ul><ul><li>VC6 Thread Safe pour Apache 2 et Apache 2.2 </li></ul></ul></ul><ul><ul><ul><li>VC6 Non thread Safe pour Apache 1.3 </li></ul></ul></ul><ul><ul><li>Par contre plus de pecl4win y compris APC, mais on peut trouver quelques extensions : </li></ul></ul><ul><ul><ul><li>http://downloads.php.net/pierre/ </li></ul></ul></ul>Installation PHP 5.3 #
  7. 7. <ul><li>En hébergement </li></ul><ul><ul><li>Mise à jour en cours </li></ul></ul><ul><ul><li>Chez OVH, possibilité de switcher entre PHP 5.2 et PHP 5.3 </li></ul></ul><ul><ul><ul><li>Pour cela éditer un fichier .htaccess et ajouter : SetEnv PHP_VER 5_TEST </li></ul></ul></ul><ul><li>En Local </li></ul><ul><ul><li>Package tout en un : </li></ul></ul><ul><ul><ul><li>WampServer </li></ul></ul></ul><ul><ul><ul><li>EasyPHP </li></ul></ul></ul><ul><ul><ul><li>XAMPP </li></ul></ul></ul><ul><ul><li>Sur une VM </li></ul></ul><ul><ul><li>Avec les outils cités précédemment </li></ul></ul>Tester PHP 5.3 #
  8. 8. <ul><li>Exemples et de tests : </li></ul><ul><ul><li>Couvrant la quasi-totalité des nouveautés de PHP 5.3 </li></ul></ul><ul><ul><li>Téléchargement </li></ul></ul><ul><ul><ul><li>http://blog.pascal-martin.fr/public/php-5.3/php-5.3-exemples.tar.bz2 </li></ul></ul></ul><ul><li>Et les applications ? </li></ul><ul><ul><li>Normalement compatible (attention au fonctions dépréciées) </li></ul></ul><ul><ul><li>En pratique peu de Framework ou applications optimisées pour PHP 5.3 </li></ul></ul><ul><ul><li>A venir : </li></ul></ul><ul><ul><ul><li>Symfony 2 (PHP 5.3 only) </li></ul></ul></ul><ul><ul><ul><li>Zend Framework 2.0 (PHP 5.3 only, fin d’année) </li></ul></ul></ul><ul><ul><ul><li>Doctrine 2 (déjà disponible en bata) </li></ul></ul></ul>Tester PHP 5.3 #
  9. 9. Sommaire <ul><li>Introduction </li></ul><ul><li>Installation </li></ul><ul><li>Nouveautés de PHP 5.3 </li></ul><ul><li>PHP.next </li></ul>#
  10. 10. <ul><li>Plus « grosse » nouveauté de PHP 5.3 </li></ul><ul><li>Objectif : </li></ul><ul><ul><li>Résoudre le problème des noms de classes très longs en PHP </li></ul></ul><ul><ul><ul><li>class PHPUnit_Extensions_Database_DB_MetaData_MySQL extends PHPUnit_Extensions_Database_DB_MetaData_InformationSchema </li></ul></ul></ul><ul><li>Quelques notes </li></ul><ul><ul><li>«  namespace  » doit être la première instruction d'un fichier </li></ul></ul><ul><ul><li>Plusieurs fichiers pour le même namespace </li></ul></ul><ul><ul><li>Plusieurs namespaces dans un fichier </li></ul></ul><ul><li>Mots-clefs </li></ul><ul><ul><li>«  namespace  » pour déclarer un namespace </li></ul></ul><ul><ul><li>«  use  » pour utiliser un espace de noms, en spécifiant éventuellement un alias </li></ul></ul><ul><ul><li>«    » comme opérateur de résolution de namespace </li></ul></ul>PHP 5.3 : Namespaces #
  11. 11. <ul><li>Déclarations de fonctions : </li></ul><ul><li>namespace FWK; </li></ul><ul><li>// Ce qui est déclaré maintenant l'est dans le namespace &quot;FWK&quot; </li></ul><ul><li>function a() { echo 'FWKa'.&quot; &quot; ;} </li></ul><ul><li>function b() { echo 'FWK'.&quot; &quot; ;} </li></ul><ul><li>namespace APP; </li></ul><ul><li>// Ce qui est déclaré maintenant l'est dans le namespace &quot;APP&quot; </li></ul><ul><li>function a() { echo 'APPa'.&quot; &quot; ;} </li></ul><ul><li>Et à l'utilisation : </li></ul><ul><li>use APP as APP; </li></ul><ul><li>a(); // APPa </li></ul><ul><li>APPa(); // APPa </li></ul><ul><li>FWKa(); // FwKa </li></ul><ul><li>FWK(); // FWK </li></ul><ul><li>b(); // Fatal error: Call to undefined function APP()‏ </li></ul><ul><li>Intérêt / Idées (Même si ce n’est pas l’objectif de départ !)‏ </li></ul><ul><ul><li>Séparation des paquets logiciels </li></ul></ul><ul><ul><li>Framework dans un namespace, application dans un autre, un namespace par bibliothèque, ... </li></ul></ul>Namespaces : fonctions #
  12. 12. <ul><li>Même chose avec des classes </li></ul><ul><li>namespace FWK; </li></ul><ul><li>class A { </li></ul><ul><li>public function a() { echo 'FWKAa'.&quot; &quot; ;} </li></ul><ul><li>} </li></ul><ul><li>namespace APP; </li></ul><ul><li>class A { </li></ul><ul><li>public function a() { echo 'FWKAa'.&quot; &quot; ;} </li></ul><ul><li>} </li></ul><ul><li>Et à l'utilisation </li></ul><ul><li>use APP as APP; </li></ul><ul><li>$obj = new A(); </li></ul><ul><li>var_dump( $obj ); // object(APPA)#1 (0) {} </li></ul><ul><li>var_dump(get_class( $obj )); // string(6) &quot;APPA&quot; </li></ul><ul><li>$obj ->a(); // APPAa </li></ul><ul><li>$obj = new FWKA(); </li></ul><ul><li>var_dump( $obj ); // object(FWKA)#2 (0) {} </li></ul><ul><li>var_dump(get_class( $obj )); // string(6) &quot;FWKA&quot; </li></ul><ul><li>$obj ->a(); // FWKAa </li></ul>Namespaces : classes #
  13. 13. <ul><li>namespace NS7; // ns7-1.php </li></ul><ul><li>class A { public static function a() { echo '[' . __NAMESPACE__ . ']{' . __CLASS__ . '}(' . __METHOD__ . &quot;) &quot; ;}} </li></ul><ul><li>namespace NS7; // ns7-2.php </li></ul><ul><li>class B { public static function b() { echo '[' . __NAMESPACE__ . ']{' . __CLASS__ . '}(' . __METHOD__ . &quot;) &quot; ;}} </li></ul><ul><li>namespace NS7TESTGLOP; // ns7-3.php </li></ul><ul><li>class C { public static function c() { echo '[' . __NAMESPACE__ . ']{' . __CLASS__ . '}(' . __METHOD__ . &quot;) &quot; ;}} </li></ul><ul><li>// ns7.php </li></ul><ul><li>require_once ( 'ns7-1.php' ); require_once ( 'ns7-2.php' ); require_once ( 'ns7-3.php' ); </li></ul><ul><li>echo NS7Aa(); // [NS7]{NS7A}(NS7Aa)‏ </li></ul><ul><li>use NS7 as X; </li></ul><ul><li>//echo B(); // Fatal error: Class 'B' not found </li></ul><ul><li>echo XB(); // [NS7]{NS7B}(NS7B)‏ </li></ul><ul><li>use NS7TESTGLOP; </li></ul><ul><li>echo GLOPCc(); // [NS7TESTGLOP]{NS7TESTGLOPC}(NS7TESTGLOPCc)‏ </li></ul><ul><li>« use » n'importe pas le contenu d'un namespace </li></ul><ul><ul><li>Définit un alias, c'est tout ! </li></ul></ul>Namespaces : « use » et alias #
  14. 14. <ul><li>Ordre de résolution </li></ul><ul><li>namespace NS; </li></ul><ul><li>function strlen( $str ) { return &quot;MECHANT&quot; ;} </li></ul><ul><li>// même sans &quot;use&quot;, on est dans le namespace NS ! </li></ul><ul><li>echo strlen( 'glop' ) . &quot; &quot; ; // MECHANT </li></ul><ul><li>echo NSstrlen( 'glop' ) . &quot; &quot; ; // MECHANT </li></ul><ul><ul><li>Dans un namespace, la résolution des fonctions, classes, et constantes se fait dans le namespace en premier </li></ul></ul><ul><ul><li>Et on remonte à l'espace de nom global si la résolution a échoué dans l'espace de noms courant </li></ul></ul><ul><li>Accès direct à l'espace de noms global </li></ul><ul><ul><li>Utilisation de l'utilisateur de résolution de portée «    » </li></ul></ul><ul><ul><li>sans préciser de namespace </li></ul></ul><ul><li>echo strlen( 'glop' ) . &quot; &quot; ; // 4 </li></ul>Namespaces : ordre de résolution #
  15. 15. <ul><li>Fonction __autoload reçoit en paramètre </li></ul><ul><ul><li>« NamespaceclassName » </li></ul></ul><ul><ul><li>Ou « className » si pas d'espace de nom précisé </li></ul></ul><ul><li>function __autoload( $className ) { </li></ul><ul><li>echo &quot;__autoload : $className &quot; ; </li></ul><ul><li>$tab = explode( '' , $className ); </li></ul><ul><li>require_once (dirname(__FILE__) . DIRECTORY_SEPARATOR . 'ns-4-' . strtolower( $tab [ 0 ]) . '.php' ); </li></ul><ul><li>} </li></ul><ul><li>$obj = new CC(); // Pas d'appel à  __autoload </li></ul><ul><li>$obj = new AAA(); // __autoload : AAA (ok)‏ </li></ul><ul><li>$obj = new BB(); // __autoload : BB (échec)‏ </li></ul><ul><li>class CC { </li></ul><ul><li>function a() {} </li></ul><ul><li>} </li></ul><ul><li>Explication </li></ul><ul><ul><li>Le nom « interne » de la classe inclut le nom du namespace ! </li></ul></ul><ul><li>Attention </li></ul><ul><ul><li>quid du cas où plusieurs fichiers définissent le même espace de noms ? </li></ul></ul>Namespaces : __autoload #
  16. 16. <ul><li>Espacesde oms </li></ul><ul><ul><li>Possibilité d'utiliser des noms contenant des «    » </li></ul></ul><ul><ul><li>Permet de dresser une hiérarchie d'espaces de noms </li></ul></ul><ul><li>Nouvelle constante magique : __NAMESPACE__ </li></ul><ul><li>namespace AB; </li></ul><ul><li>class A { </li></ul><ul><li>function a() { echo __NAMESPACE__ . &quot; &quot; ;} </li></ul><ul><li>} </li></ul><ul><li>$obj = new A(); </li></ul><ul><li>$obj ->a(); // AB </li></ul><ul><li>Comparaison avec la notation PEAR / Zend </li></ul><ul><ul><li>Zend_View_Helper_Placeholder_Registry_Exception </li></ul></ul><ul><ul><li>Notation qui change : </li></ul></ul><ul><ul><ul><li>Possibilités d' __autoload restent les mêmes, finalement </li></ul></ul></ul>Namespaces : sucre syntaxique #
  17. 17. <ul><li>Gain de performance global </li></ul><ul><ul><li>Constaté en benchmarkant plusieurs logiciels PHP connus et répandus </li></ul></ul><ul><ul><li>Gain général entre 5 et 15% </li></ul></ul><ul><ul><ul><li>Drupal +20%, Typo3 +30%, Wordpress +15%, xoops +10%, Qdig +2% </li></ul></ul></ul><ul><ul><ul><li>http://news.php.net/php.internals/36484 </li></ul></ul></ul><ul><li>D étails </li></ul><ul><ul><li>md5 : 10 à 15% plus rapide </li></ul></ul><ul><ul><li>Déplacement des constantes vers mémoire en lecture-seule </li></ul></ul><ul><ul><li>Amélioration gestionnaire d'exceptions (plus simple, moins de code)‏ </li></ul></ul><ul><ul><li>Suppression appel à « open » pour require/include_once </li></ul></ul><ul><ul><li>Utilisation de gcc4 pour la compilation </li></ul></ul>Amélioration perfs / mémoire #
  18. 18. <ul><li>Gain jusqu'à 25% sur des applications réelles </li></ul>Performances #
  19. 19. <ul><li>PHP <= 5.2 </li></ul><ul><ul><li>Références cycliques </li></ul></ul><ul><ul><li>=> non libération de la mémoire </li></ul></ul><ul><li>PHP 5.3 : Ajout Garbage Collector </li></ul><ul><ul><li>Fonctions «  gc_*  » </li></ul></ul><ul><ul><li>Activé par défaut </li></ul></ul><ul><ul><ul><li>Mais désactivable </li></ul></ul></ul><ul><li>Intérêt </li></ul><ul><ul><li>Faciliter le développement de grosses applications </li></ul></ul><ul><ul><ul><li>Batchs </li></ul></ul></ul><ul><ul><ul><li>Applications basées sur des frameworks </li></ul></ul></ul><ul><ul><ul><li>PHP-GTK ? </li></ul></ul></ul><ul><ul><li>PHP ne sert plus que pour du Web / des scripts légers </li></ul></ul>GC – Garbage Collector #
  20. 20. <ul><li>Rouge : Sans Garbage Collector </li></ul><ul><li>Bleu : Avec Garbage Collector </li></ul><ul><li>Attention, ce graphe est un cas d’école : utilisation de références cycliques </li></ul>GC – Garbage Collector #
  21. 21. <ul><li>Bibliothèque spécialisée d'interfaçage PHP <-> mySQL </li></ul><ul><ul><li>Conçue spécialement pour PHP </li></ul></ul><ul><ul><ul><li>Perspectives d'évolutions futures facilitées </li></ul></ul></ul><ul><li>Avantages </li></ul><ul><ul><li>Plus rapide (20-30% plus rapide que libmysql)‏ </li></ul></ul><ul><ul><li>Amélioration de l'utilisation mémoire </li></ul></ul><ul><ul><li>Capacité de récupération de statistiques, pour tuning de perfs </li></ul></ul><ul><ul><li>Driver intégré : pas de dépendance externe </li></ul></ul><ul><ul><li>Intégration avec PHP </li></ul></ul><ul><ul><ul><li>Cycle de release + rapide / + facile : MAJ en même temps que PHP </li></ul></ul></ul><ul><ul><li>Intégration avec PDO </li></ul></ul><ul><li>A privilégier par rapport à libmysql </li></ul>mySQLnd #
  22. 22. <ul><li>class A { </li></ul><ul><li>public static function __callStatic( $name , $args ) { </li></ul><ul><li>echo &quot;__callStatic A:: { $name } (&quot; . implode( ', ' , $args ) . &quot;) &quot; ; </li></ul><ul><li>} </li></ul><ul><li>public static function methodS( $p1 ) { </li></ul><ul><li>echo 'A _methodS('. $p1. ')'.&quot; &quot; ; </li></ul><ul><li>} </li></ul><ul><li>public function __call( $name , $args ) { </li></ul><ul><li>echo &quot;__call A:: { $name } (&quot; . implode( ', ' , $args ) . &quot;) &quot; ; </li></ul><ul><li>} </li></ul><ul><li>public function method( $p1 ) { </li></ul><ul><li>echo &quot;A::method( $p1 ) &quot; ; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Résultat PHP 5.3 </li></ul><ul><li>$obj = new A(); </li></ul><ul><li>$obj ->method( 'param1' ); // A::method(param1)‏ </li></ul><ul><li>$obj ->test( 'param1' , 'param2' ); // __call A::test(param1, param2)‏ </li></ul><ul><li>A::methodS( 'param1' ); // A::methodS(param1)‏ </li></ul><ul><li>A::test( 'param1' , 'param2' ); // __callStatic A::test(param1, param2)‏ </li></ul><ul><li>Résultat PHP 5.2 </li></ul><ul><ul><li>Fatal Error : Call to undefined method A::test()‏ </li></ul></ul>__callStatic #
  23. 23. <ul><li>class A { </li></ul><ul><li>public static function methodS( $p1 ) { </li></ul><ul><li>echo &quot;A::methodS( $p1 ) &quot; ; </li></ul><ul><li>} </li></ul><ul><li>public function method( $p1 ) { </li></ul><ul><li>echo &quot;A::method( $p1 ) &quot; ; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Résultat PHP 5.3 </li></ul><ul><li>$className = 'A' ; </li></ul><ul><li>$methodName = 'method' ; </li></ul><ul><li>$obj = new $className (); </li></ul><ul><li>$obj -> $methodName ( 'param1' ); // A::method(param1)‏ </li></ul><ul><li>$staticMethodName = 'methodS' ; </li></ul><ul><li>$className :: $staticMethodName ( 'param1' ); // A::methodS(param1)‏ </li></ul><ul><li>Résultat PHP 5.2 </li></ul><ul><ul><li>Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM </li></ul></ul>Appels statiques dynamiques #
  24. 24. <ul><li>class Vehicule { </li></ul><ul><li>public static function a() { </li></ul><ul><li>echo __CLASS__ . &quot; &quot; ; </li></ul><ul><li>} </li></ul><ul><li>public static function b() { </li></ul><ul><li>//self::a(); // PHP 5.2 </li></ul><ul><li>static ::a(); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>class Voiture extends Vehicule { </li></ul><ul><li>public static function a() { </li></ul><ul><li>echo __CLASS__ . &quot; &quot; ; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Voiture::b(); </li></ul><ul><li>Résultat PHP 5.3 </li></ul><ul><ul><li>Résolution « tardive » : à l'exécution, et non à la compilation </li></ul></ul><ul><ul><li>« Voiture » </li></ul></ul><ul><li>Résultat PHP 5.2 </li></ul><ul><ul><li>« Vehicule » </li></ul></ul>Late Static Binding # 1 2 3 (5.2)‏ 3 (5.3)‏
  25. 25. <ul><li>Ajout de l'instruction «  goto  » </li></ul><ul><ul><li>Et de la notion de « label » (étiquette) </li></ul></ul><ul><li>echo '<p>a</p>' ; </li></ul><ul><li>goto c; </li></ul><ul><li>echo '<p>b</p>' ; </li></ul><ul><li>c: </li></ul><ul><li>echo '<p>c</p>' ; </li></ul><ul><li>A noter </li></ul><ul><ul><li>Pas de saut à l'intérieur d'une boucle / d'un switch </li></ul></ul><ul><ul><li>Autorisé à l'intérieur d'un if / else (utilité ?) </li></ul></ul><ul><ul><li>Pas de «  goto $label;  » </li></ul></ul><ul><ul><li>Instructions «  break  » et «  continue  » non modifiées </li></ul></ul><ul><ul><ul><li>Sortie de boucles imbriquées : «  break 2;  » </li></ul></ul></ul><ul><ul><ul><li>Pas de «  break label;  » </li></ul></ul></ul>Saut inconditionnel : « goto » #
  26. 26. <ul><li>Depuis PHP 4, syntaxe Heredoc </li></ul><ul><li>$str = <<<END_OF_STRING </li></ul><ul><li><h1>Hello, world!</h1> </li></ul><ul><li><div> </li></ul><ul><li>Démonstration syntaxe </li></ul><ul><li><strong> $syntaxe </strong> </li></ul><ul><li></div> </li></ul><ul><li>END_OF_STRING; </li></ul><ul><li>PHP 5.3 ajoute la syntaxe Nowdoc </li></ul><ul><ul><li>Simple-quotes : pas d'interpolation de variables </li></ul></ul><ul><li>$str = <<<'END_OF_STRING' </li></ul><ul><li><h1>Hello, world!</h1> </li></ul><ul><li><div> </li></ul><ul><li>Démonstration syntaxe </li></ul><ul><li><strong> $syntaxe </strong> </li></ul><ul><li></div> </li></ul><ul><li>END_OF_STRING; </li></ul><ul><ul><li>Doubles-quotes : Identique à Heredoc </li></ul></ul><ul><ul><ul><li>Plus consistant avec Nowdoc simple-quotes </li></ul></ul></ul><ul><ul><ul><li>Mais : deux façons de faire la même chose </li></ul></ul></ul>Syntaxe NOWDOC #
  27. 27. Lambdas et Closures <ul><li>Ceux qui ont fait du Javascript connaitront ! </li></ul><ul><ul><li>PHP 5.3 introduit les « Lambdas » et « Closures » </li></ul></ul><ul><li>Fonction anonyme </li></ul><ul><ul><li>Création </li></ul></ul><ul><li>$func = function () { </li></ul><ul><li>echo &quot;<p>Hello, World!</p>&quot; ; </li></ul><ul><li>}; </li></ul><ul><ul><li>Appel </li></ul></ul><ul><li>$func (); </li></ul><ul><li>Fonction anonyme avec paramètre(s) </li></ul><ul><li>$func = function ( $param ) { </li></ul><ul><li>echo &quot;<p>Hello, $param !</p>&quot; ; </li></ul><ul><li>}; </li></ul><ul><li>$func ( 'there' ); </li></ul><ul><li>Appel possible via call_user_func[_array] </li></ul><ul><ul><li>Fonctions « anonymes », mais fonctions quand même ! </li></ul></ul>#
  28. 28. <ul><li>«  use  » : Import d'une variable externe </li></ul><ul><li>$var = 'World' ; </li></ul><ul><li>$func1 = function () { </li></ul><ul><li>echo &quot;<p>Hello, $var !</p>&quot; ; </li></ul><ul><li>}; </li></ul><ul><li>$func2 = function () use ( $var ) { </li></ul><ul><li>echo &quot;<p>Hello, $var !</p>&quot; ; </li></ul><ul><li>}; </li></ul><ul><li>$func1 (); // Notice: Undefined variable: var … => Hello, ! </li></ul><ul><li>$func2 (); // Hello, World! </li></ul><ul><li>Import en lecture-seule </li></ul><ul><ul><li>Ou par référence : réutilisation de «  &  » </li></ul></ul><ul><ul><ul><li>Import en lecture-écriture </li></ul></ul></ul><ul><li>$func2 = function () use (& $var ) { </li></ul><ul><li>echo &quot;<p>Début 2 : $var </p>&quot; ; </li></ul><ul><li>$var = 2 ; </li></ul><ul><li>echo &quot;<p>Fin 2 : $var </p>&quot; ; </li></ul><ul><li>}; </li></ul>Lambdas et Closures #
  29. 29. Lambdas et Closures <ul><li>Création d'une closure </li></ul><ul><ul><li>$func = function ( $arg ) { </li></ul></ul><ul><ul><li>$compteur = $arg ; // Copie privée, en lecture seule </li></ul></ul><ul><ul><li>return function () use ( $compteur ) { </li></ul></ul><ul><ul><li>return ++ $compteur ; </li></ul></ul><ul><ul><li>}; </li></ul></ul><ul><ul><li>}; </li></ul></ul><ul><ul><li>$a1 = $func ( 10 ); </li></ul></ul><ul><ul><li>$a2 = $func ( 50 ); </li></ul></ul><ul><ul><li>echo 'a1 : ' . $a1 () . &quot; &quot; ; // 11 </li></ul></ul><ul><ul><li>echo 'a2 : ' . $a2 () . &quot; &quot; ; // 51 </li></ul></ul><ul><ul><li>echo 'a1 : ' . $a1 () . &quot; &quot; ; // 11 </li></ul></ul><ul><ul><li>echo 'a2 : ' . $a2 () . &quot; &quot; ; // 51 </li></ul></ul><ul><ul><li>echo 'a1 : ' . $a1 () . &quot; &quot; ; // 11 </li></ul></ul><ul><ul><li>echo 'a2 : ' . $a2 () . &quot; &quot; ; // 51 </li></ul></ul><ul><li>Fonction interne force la conservation de la valeur de $compteur </li></ul><ul><ul><li>C'est le principe même d'une closure ! </li></ul></ul><ul><ul><ul><li>Après Javascript, c'est maintenant possible en PHP ! </li></ul></ul></ul>#
  30. 30. <ul><li>Même chose, en lecture-écriture </li></ul><ul><ul><li>$func = function ( $arg ) { </li></ul></ul><ul><ul><li>$compteur = $arg ; // Copie privée, en lecture / écriture </li></ul></ul><ul><ul><li>return function () use (& $compteur ) { </li></ul></ul><ul><ul><li>return ++ $compteur ; </li></ul></ul><ul><ul><li>}; </li></ul></ul><ul><ul><li>}; </li></ul></ul><ul><ul><li>$a1 = $func ( 10 ); </li></ul></ul><ul><ul><li>$a2 = $func ( 50 ); </li></ul></ul><ul><ul><li>echo 'a1 : ' . $a1 () . &quot; &quot; ; // 11 </li></ul></ul><ul><ul><li>echo 'a2 : ' . $a2 () . &quot; &quot; ; // 51 </li></ul></ul><ul><ul><li>echo 'a1 : ' . $a1 () . &quot; &quot; ; // 12 </li></ul></ul><ul><ul><li>echo 'a2 : ' . $a2 () . &quot; &quot; ; // 52 </li></ul></ul><ul><ul><li>echo 'a1 : ' . $a1 () . &quot; &quot; ; // 13 </li></ul></ul><ul><ul><li>echo 'a2 : ' . $a2 () . &quot; &quot; ; // 53 </li></ul></ul><ul><li>$compteur conservée par la fonction interne </li></ul><ul><ul><li>$compteur importée par référence </li></ul></ul><ul><ul><li>Accessible en lecture-écriture, donc </li></ul></ul><ul><ul><ul><li>Comme les closures de Javascript </li></ul></ul></ul>Lambdas et Closures #
  31. 31. <ul><li>Extension «  intl  » incluse en standard </li></ul><ul><ul><li>Option –enable-intl </li></ul></ul><ul><ul><li>Objectif : faciliter l'internationalisation ( « i18n » ) et la localisation ( « l10n » ) d'applications </li></ul></ul><ul><ul><ul><li>Afficher une date sur un site multilingue : « 31/12/2008 » ? « 2008-31-12 » ? « 12/31/2008 » ? </li></ul></ul></ul><ul><ul><ul><li>Et pour une monnaie : « 1,024.12 € » ? « $ 1.024,12 » ? </li></ul></ul></ul><ul><li>Plusieurs nouvelles classes </li></ul><ul><ul><li>IntlDateFormatter </li></ul></ul><ul><ul><li>NumberFormatter </li></ul></ul><ul><ul><li>Locale </li></ul></ul><ul><ul><li>Collator </li></ul></ul>intl – Internationalisation #
  32. 32. <ul><li>Nombres / monnaies </li></ul><ul><li>echo NumberFormatter::create( 'fr_FR' , NumberFormatter::CURRENCY)->format( 123456789.987654 ) . &quot; &quot; ; </li></ul><ul><li>echo NumberFormatter::create( 'en_US' , NumberFormatter::CURRENCY)->format( 123456789.987654 ) . &quot; &quot; ; </li></ul><ul><li>123 456 789,99 € </li></ul><ul><li>$123,456,789.99 </li></ul><ul><li>Dates </li></ul><ul><li>echo IntlDateFormatter::create( 'fr_FR' , IntlDateFormatter::FULL, IntlDateFormatter::FULL)->format(time()) . &quot; &quot; ; </li></ul><ul><li>echo IntlDateFormatter::create( 'zh-Hant-TW' , IntlDateFormatter::FULL, IntlDateFormatter::FULL)->format(time(time())) . &quot; &quot; ; </li></ul><ul><li>jeudi 9 octobre 2008 04:21:10 GMT+00:00 </li></ul><ul><li>2008 年 10 月 9 日星期四 上午 04 時 21 分 10 秒 GMT+00:00 </li></ul><ul><li>Messages </li></ul><ul><li>$format_FR = 'Le {0,date,full} à {1,time,short}, {2,number,integer} pommes coûtent {3,number,currency}' ; </li></ul><ul><li>$data = array (time(), time(), 5 , 3.1415 ); </li></ul><ul><li>echo MessageFormatter::formatMessage( 'fr_FR' , $format_FR , $data ) . &quot; &quot; ; </li></ul><ul><li>Le jeudi 9 octobre 2008 à 04:31, 5 pommes coûtent 3,14 € </li></ul>Intl – Internationalisation #
  33. 33. <ul><li>« PHP Archive » </li></ul><ul><ul><li>Équivalent des .jar du monde JAVA </li></ul></ul><ul><ul><li>Regroupement de plusieurs fichiers en un seul </li></ul></ul><ul><ul><li>Intégré à PHP 5.3 : indépendant de PEAR / PECL </li></ul></ul><ul><li>Manipulation de fichiers Phar </li></ul><ul><ul><li>Inclusion </li></ul></ul><ul><ul><ul><li>include  'library.phar' ; </li></ul></ul></ul><ul><ul><li>Ajout d'un stream «  phar  » </li></ul></ul><ul><ul><ul><li>include  'phar:///chemin/vers/monphar.phar/fichier.php' ; </li></ul></ul></ul><ul><ul><li>Inclusion de fichiers packagés au sein d'une Phar </li></ul></ul><ul><ul><ul><li>Y compris d'un fichier vers l'autre </li></ul></ul></ul><ul><ul><li>Manipulation des fichiers à l’aide d’une classe Phar : </li></ul></ul><ul><ul><ul><li>$phar = new Phar ( __DIR__ . '/application.phar.php' ); </li></ul></ul></ul><ul><ul><ul><li>$phar -> addFile ( 'index.php' ); </li></ul></ul></ul><ul><ul><ul><li>$phar -> addFile ( 'included.php' ); </li></ul></ul></ul><ul><li>Exemples de possibilités </li></ul><ul><ul><li>Distribution d'une application entière en un seul fichier </li></ul></ul><ul><ul><ul><li>Pour les application CLI, et pour les applications Web ! </li></ul></ul></ul><ul><ul><ul><li>Comme installeur ? </li></ul></ul></ul><ul><ul><li>Framework et bibliothèque packagé en un seul fichier </li></ul></ul>PHAR – PHP Archive #
  34. 34. <ul><li>Ajout de la constante magique __DIR__ </li></ul><ul><ul><li>Indique le répertoire du script </li></ul></ul><ul><li>echo dirname(__FILE__) . &quot; &quot; ; // PHP 5.2 </li></ul><ul><li>echo __DIR__ . &quot; &quot; ; // PHP 5.3 </li></ul><ul><ul><li>Avantage : évalué à la compilation, et non à l'exécution </li></ul></ul><ul><li>Nouvelles fonctionnalités SSL </li></ul><ul><ul><li>Objectif de départ : implémentation d'openID en PHP </li></ul></ul><ul><li>Support de configuration par répertoire </li></ul><ul><ul><li>Par fichiers .ini </li></ul></ul><ul><ul><li>Pour ce qui est CGI / FastCGI </li></ul></ul><ul><ul><li>A la manière des .htaccess de Apache </li></ul></ul><ul><li>Améliorations apportées à getopt()‏ </li></ul><ul><ul><li>Support de windows </li></ul></ul><ul><ul><li>Support cross-platform des options longues (de la forme --option)‏ </li></ul></ul><ul><ul><li>Implémentation native indépendante du système </li></ul></ul>Nouveautés « diverses » #
  35. 35. <ul><li>Ajout de l'opérateur ?: </li></ul><ul><ul><li>Récupération de la valeur non vide parmi deux valeurs / expressions </li></ul></ul><ul><li>var_dump( true ?: false ); // bool(true)‏ </li></ul><ul><li>var_dump( false ?: true ); // bool(true)‏ </li></ul><ul><li>var_dump( 1 ?: 0 ); // int(1)‏ </li></ul><ul><li>var_dump( 'glop' ?: '' ); // string(4) &quot;glop&quot; </li></ul><ul><li>var_dump( array ( 10 ) ?: array ()); // array(1) {[0]=>int(10)} </li></ul><ul><li>var_dump(strlen( 'glop' ) ?: strlen( '' )); // int(4)‏ </li></ul><ul><li>var_dump( isset ( $a ) ?: 10 ); // int(10) ; avec $a non set </li></ul><ul><li>var_dump( isset ( $b ) ?: 10 ); // bool(true) ; avec $b set </li></ul><ul><ul><li>Attention si deux valeurs fausses : </li></ul></ul><ul><li>var_dump( isset ( $a ) ?: '' ); // string(0) &quot;&quot; </li></ul><ul><li>var_dump( '' ?: isset ( $a )); // bool(false)‏ </li></ul><ul><li>Ajout de fonctionnalité de profiling XSTL </li></ul><ul><li>Mode E_DEPRECATED </li></ul><ul><ul><li>Première victime : ereg </li></ul></ul><ul><li>Améliorations SPL </li></ul><ul><ul><li>Ajout GlobIterator </li></ul></ul><ul><ul><li>Ajout de classes gérant des structures de données : SplStack, SplQueue, SplHeap, SplDoublyLinkedList, ... </li></ul></ul>Nouveautés « diverses » #
  36. 36. <ul><li>Améliorations extension Date </li></ul><ul><ul><li>Ajout date_create_from_format </li></ul></ul><ul><li>$ts1 = strtotime( '25/04/2008 13:30:00' ); </li></ul><ul><li>var_dump(date( 'Y-m-d' , $ts1 )); // string(10) &quot;1970-01-01&quot; </li></ul><ul><li>$date = date_create( '25/04/2008 13:30:00' ); </li></ul><ul><li>var_dump( $date ); // bool(false)‏ </li></ul><ul><li>$date = date_create_from_format( 'd/m/Y H:i:s' , '25/04/2008 13:30:00' ); </li></ul><ul><li>var_dump( $date ->format( 'Y-m-d' )); // string(10) &quot;2008-04-25&quot; </li></ul><ul><ul><li>Ajout date_get_last_errors </li></ul></ul><ul><ul><ul><li>Mais messages d'erreurs d'une utilité toute relative :-( </li></ul></ul></ul>Nouveautés « diverses » #
  37. 37. <ul><li>Introduction </li></ul><ul><li>Installation </li></ul><ul><li>Nouveautés de PHP 5.3 </li></ul><ul><li>PHP.next </li></ul>Sommaire #
  38. 38. <ul><li>Historique </li></ul><ul><ul><li>En développement depuis 2006 </li></ul></ul><ul><ul><li>Objectif principal : Intégrer l’unicode à PHP </li></ul></ul><ul><ul><li>Objectif secondaire : nouveautés diverses </li></ul></ul><ul><ul><ul><li>Namespaces, LSB, etc. </li></ul></ul></ul><ul><ul><li>Devait succéder à PHP 5.2 </li></ul></ul><ul><li>Premiers écueils </li></ul><ul><ul><li>Retard dans le développement </li></ul></ul><ul><ul><li>Demande forte des nouveautés </li></ul></ul><ul><ul><li>Mise en route du projet PHP 5.3 </li></ul></ul><ul><li>Derniers rebondissements </li></ul><ul><ul><li>Retard de la mise en place de l’unicode </li></ul></ul><ul><ul><li>Demande toujours fortes de nouvelles fonctionnalités </li></ul></ul><ul><ul><ul><li>Type Hinting, Traits, Patches de performances </li></ul></ul></ul><ul><ul><li>Concurrence d’autres langages de scripts </li></ul></ul><ul><ul><li>Mort officielle de PHP 6 en mars 2010 </li></ul></ul><ul><ul><ul><li>http://news.php.net/php.internals/47120 </li></ul></ul></ul>PHP 6 #
  39. 39. <ul><li>Discussions en route : </li></ul><ul><ul><li>Numéro de version (actuellement sur le SVN : 5.3.99dev) </li></ul></ul><ul><ul><li>Organisation du projet </li></ul></ul><ul><ul><li>Intégrer quoi et comment? </li></ul></ul><ul><li>Que va t’on voir dans PHP.next </li></ul><ul><ul><li>Certains sujets font consensus </li></ul></ul><ul><ul><ul><li>Traits, Nettoyages des éléments obsolètes, Patch de performances </li></ul></ul></ul><ul><ul><li>D’autre un peu moins </li></ul></ul><ul><ul><ul><li>Type Hinting </li></ul></ul></ul><ul><ul><li>Renseignements : Liste internals et RFC </li></ul></ul><ul><ul><ul><li>Mais aussi sur les blogs http://blog.mageekbox.net/ </li></ul></ul></ul>PHP.next #
  40. 40. <ul><li>Traits ou Horizontal Reuse </li></ul><ul><ul><li>Améliorer la réutilisation du code entre les classes et la rendre plus flexible </li></ul></ul><ul><ul><li>Permet de regrouper des fonctions communes à des classes distincte </li></ul></ul><ul><ul><li>Exemple en PHP 5.3 et antérieur : </li></ul></ul><ul><ul><li><?php </li></ul></ul><ul><ul><li>class ezcReflectionMethod extends ReflectionMethod { </li></ul></ul><ul><ul><li>/* ... */ </li></ul></ul><ul><ul><li>function getReturnType () { /*1*/ } </li></ul></ul><ul><ul><li>function getReturnDescription () { /*2*/ } /* ... */ </li></ul></ul><ul><ul><li>}   </li></ul></ul><ul><ul><li>class ezcReflectionFunction extends ReflectionFunction { </li></ul></ul><ul><ul><li>/* ... */ </li></ul></ul><ul><ul><li>function getReturnType () { /*1*/ } </li></ul></ul><ul><ul><li>function getReturnDescription () { /*2*/ } /* ... */ </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>?> </li></ul></ul>Traits #
  41. 41. <ul><li>En PHP 5.next (peut-être) ? </li></ul><ul><ul><li><?php trait ezcReflectionReturnInfo { </li></ul></ul><ul><ul><li>function getReturnType () { /*1*/ } </li></ul></ul><ul><ul><li>function getReturnDescription () { /*2*/ } </li></ul></ul><ul><ul><li>}   </li></ul></ul><ul><ul><li>class ezcReflectionMethod extends ReflectionMethod { </li></ul></ul><ul><ul><li>use ezcReflectionReturnInfo ; /* ... */ </li></ul></ul><ul><ul><li>}   </li></ul></ul><ul><ul><li>class ezcReflectionFunction extends ReflectionFunction { </li></ul></ul><ul><ul><li>use ezcReflectionReturnInfo ; /* ... */ </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>?> </li></ul></ul><ul><li>Plus d’exemples sur http://wiki.php.net/rfc/horizontalreuse </li></ul>Traits #
  42. 42. <ul><li>Le langage s’améliore encore </li></ul><ul><ul><li>Optimisation des algorithmes de hashage </li></ul></ul><ul><ul><li>Réorganisation des constantes du langage </li></ul></ul><ul><ul><li>Optimisation du modèle objet </li></ul></ul><ul><li>En pratique </li></ul><ul><ul><li>Gains de 10 à 25% </li></ul></ul><ul><ul><li>Diminution de la consommation mémoire </li></ul></ul><ul><ul><li>Retours d’expérience : </li></ul></ul><ul><ul><ul><li>Doctrine 2 : http://news.php.net/php.internals/48148 </li></ul></ul></ul><ul><ul><ul><li>PHP Unit : http://news.php.net/php.internals/47612 </li></ul></ul></ul><ul><li>RFC : </li></ul><ul><ul><li>http://wiki.php.net/rfc/performanceimprovements </li></ul></ul>Performances #
  43. 43. <ul><li>PHP est un langage faiblement typé </li></ul><ul><ul><li>Cast automatique </li></ul></ul><ul><ul><li>Pas d’obligation de déclarer une variable </li></ul></ul><ul><ul><li>Pas de déclaration de type dans les fonctions </li></ul></ul><ul><li>Depuis PHP 5, on commence à voir apparaitre le typage implicite (en objet) </li></ul><ul><ul><li>function  test ( AutreClasse $autreclasse ) {         echo  $autreclasse -> var ; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>Fonctionne aussi sur les tableaux : </li></ul></ul><ul><ul><li>function  test ( array $tableau ) {         echo  $tableau[0] ; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>A venir? </li></ul><ul><ul><li>Généraliser ce système aux fonctions </li></ul></ul><ul><ul><li><? php function foo ( int $anInteger , float $aFloat ) {...}; ?> </li></ul></ul><ul><ul><li>Tout le monde n’est pas d’accord sur la manière de procéder : </li></ul></ul><ul><ul><ul><li>Notation, erreur (ou pas) à renvoyer, transtypage </li></ul></ul></ul>Type Hinting #
  44. 44. <ul><li>Fin des compatibilités </li></ul><ul><ul><li>PHP 3 (et oui…) </li></ul></ul><ul><ul><li>Les constructeurs PHP 4 </li></ul></ul><ul><ul><li>Les balises <% %> </li></ul></ul><ul><ul><li>Les propriétés : </li></ul></ul><ul><ul><ul><li>register_globals </li></ul></ul></ul><ul><ul><ul><li>register_long_arrays </li></ul></ul></ul><ul><ul><ul><li>magic_quotes_* </li></ul></ul></ul><ul><ul><ul><li>allow_call_time_pass_reference </li></ul></ul></ul><ul><ul><ul><li>sql_safe_mode </li></ul></ul></ul><ul><li>Apprenez à les connaitres </li></ul><ul><ul><li>Incorporation du système DTrace (améliorer le debug) </li></ul></ul><ul><ul><li>FPM , nouveau système remplaçant Fast CGI </li></ul></ul><ul><ul><li>La liste internals </li></ul></ul>Divers #
  45. 45. <ul><li>La grande inconnue </li></ul><ul><ul><li>Utilisation généralisée de mbstring? </li></ul></ul><ul><ul><li>Classe String? </li></ul></ul><ul><ul><li>Généralisation des fonctions d’internationalisation? </li></ul></ul><ul><li>Ce qu’on ne verra sans doute jamais : </li></ul><ul><ul><li>Noms de fonctions en chinois/russe/japonais, comme tout le code PHP : </li></ul></ul>Unicode ? # function маймуница() { echo &quot; 文字化け &quot; ;} маймуница(); // 文字化け
  46. 46. <ul><li>PHP est toujours vivant et… </li></ul><ul><ul><li>C’est tant mieux </li></ul></ul><ul><ul><li>Il y’a encore des marges de manoeuvre </li></ul></ul><ul><ul><li>Sais se remettre en question </li></ul></ul><ul><li>A venir : </li></ul><ul><ul><li>Le passage massif à PHP 5.3 </li></ul></ul><ul><ul><li>L’arrivée du web mobile </li></ul></ul><ul><ul><li>L’aventure de la compilation </li></ul></ul><ul><li>Stay Tuned! </li></ul>Conclusion #
  47. 47. <ul><li>PHP 5.3 </li></ul><ul><ul><li>LA référence : http://blog.pascal-martin.fr/tag/php-5.3 </li></ul></ul><ul><ul><li>LSB : http://www.colder.ch/news/08-24-2007/28/late-static-bindings-expl.html </li></ul></ul><ul><ul><li>SPL : http://www.alberton.info/php_5.3_spl_data_structures.html </li></ul></ul><ul><ul><li>Nouveautés : http://ilia.ws/archives/187-Introduction-to-PHP-5.3-Slides.html </li></ul></ul><ul><ul><li>TODO PHP53 : http://wiki.php.net/todo/php53 </li></ul></ul><ul><li>PHP 6 et PHP.next </li></ul><ul><ul><li>TODO php60 : http://wiki.php.net/todo/php60 </li></ul></ul><ul><ul><li>Infos au quotidien : http://news.php.net/php.internals </li></ul></ul><ul><ul><li>http://blog.mageekbox.net/?category/PHP-X </li></ul></ul><ul><li>« Divers » </li></ul><ul><ul><li>http://blog.roshambo.org/archives/A-brief-unofficial-history-about-register_globals-in-PHP.html </li></ul></ul>Sources / A Lire #
  48. 48. <ul><li>Groupe SQLI </li></ul><ul><li>Immeuble le Pressensé 268 Avenue du Président Wilson 93210 La Plaine Saint-Denis Tél: 01 55 93 26 00 / Fax: 01 55 93 26 01 </li></ul><ul><li>www.sqli.com </li></ul>#

×