SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
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.
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.
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
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 !