PHP 7
et évolution de PHP
Nantes, 21 sept. 2015
Photo par laurent sur Flickr, CC-BY-NC-ND.
Conférence à Nantes, c'est le moment où jamais d'utiliser une photo de cet éléphant !
Pas de chance : pour une fois que je suis à Nantes, je comptais le voir... Mais il est en révision, cette semaine ;-(
Appuyez sur [s] pour ouvrir les notes présentateur dans une nouvelle fenêtre.
Je vais essayer d'ajouter ici, pour certains slides, des points que j'ai pu donner à l'oral lors de la présentation et/ou qui ne sont pas explicitement écrits sur les slides — afin de les rendre plus utiles aux lecteurs qui n'auraient pas assisté à la présentation.
Le style sera volontairement un peu oral , se rapprochant un peu de ce qui s'est dit lors de la présentation live .
Il était une fois...
Ils sont tout mignon ceux-là, moins effrayant que le gros avant ^^
Et puis, ils sont plus dans le vif du sujet.
8 juin 1995
On en est donc à 20 ans de PHP cette année !
PHP 1.0
Rasmus Lerdorf
« Personal Home Page Tools »
Orientation Web
Ensemble de binaires CGI en C
Orientation web : création de formulaires et réutilisation des informations saisies, mise en place de compteurs d'accès, suivi de logs.
Mail faisait référence à la facilité de mise en place d'un "livre d'or" !
1er nom de PHP.
$ tree php-108
php-108
├── common.c
├── common.h
├── config.h
├── error.c
...
├── README
├── subvar.c
├── version.h
├── wm.c
└── wm.h
0 directories, 18 files
Contenu de la distribution de PHP 1.0.8
Pas "grand chose" ;-)
18 fichiers, dont le readme... Aujourd'hui, c'est plusieurs milliers !
Novembre 1996
En gros un an après
Nouveau nom pour PHP !
PHP/FI 2.0
« PHP / Forms Interpreter »
2.0 : seule et unique version stable publiée !
On peut encore télécharger PHP 2.0 (et même 1.0) depuis http://museum.php.net/ !
mSQL Functions Demo
<?
msqlsethost("localhost");
$name = "bob";
$result = msql($database,"select * from table where firstname='$name'");
$num = msql_numrows($result);
echo "$num records found!<p>";
$i=0;
while($i<$num);
echo msql_result($result,$i,"fullname");
echo "<br>";
echo msql_result($result,$i,"address");
echo "<br>";
$i++;
endwhile;
>
Exemple copié-collé depuis la distribution de PHP 2.0
Corrections pour que ça marche en PHP 7 (si les fonctions et la variable $database existent, bien sûr) : le point-virgule à la fin de la ligne while
doit être transformé en deux-points. Et c'est tout.
Pas loin de 20 ans après, il ne faut modifier qu'un seul caractère !
Juin 1998
Deux ans après
La coupe du monde Et un, et deux, et trois... zéro.
PHP 3.0
Andi Gutmans et Zeev Suraski
« PHP: Hypertext Preprocessor »
À noter :
Ré-écriture complète de l'analyseur
Mécanisme d'extensions
Support Windows, Mac, ...
Lorsque PHP 3.0 a été annoncé, il était déjà utilisé sur plus de 70,000 domaines !
Pour les curieux
museum.php.net
On peut télécharger toutes le versions de PHP
(quand le serveur répond)
Mai 2000
Tournant du siècle (enfin, selon comment on compte)
PHP 4.0
Zend Engine, 1ère version
Amélioration performances
Fonctionnalités : sessions HTTP, ...
Support de + de serveurs Web
Ca ne fait qu'une version de plus du moteur ^^
Toujours cette orientation résolument "web"
"Améliorations perfs", c'est quelque chose qu'on va retrouver très souvent lors des annonces de sorties de nouvelles versions
Juillet 2004
4 ans après
Avec 4 versions mineures, je crois, de PHP 4 ?
PHP 5.0
Zend Engine 2
Nouveau modèle objet
6 versions mineures, sur 10 ans !
Ah, le nouveau modèle objet...
PHP 5.x
Langage professionnel
Applications d'envergure
Niveau de qualité qu'on attend en 2015
Efforts de la communauté, sur la qualité, les bonnes pratiques, les composants OSS, ...
Migration PHP 4 → 5 difficile
Il a fallu des années pour que PHP 5 passe devant PHP 4.
Ca a marqué les esprits.
Volonté que ça se passe mieux pour 5 → 7
PHP 5.1
Novembre 2005
PDO activée par défaut
Améliorations gestion des dates
Nouvelles fonctions
Amélioration des performances
PHP 5.2
Novembre 2006
Nouveau gestionnaire de mémoire
JSON, Zip, Filter, DateTime
Suivi d'upload de fichiers
Corrections et améliorations de sécurité
Amélioration des performances
PHP 5.3
Juin 2009
Espaces de noms
Fonctions anonymes, Closures
LSB, NOWDOC, ?:
, goto
, mysqlnd, Garbage Collector, Phar, Intl, Fileinfo, Sqlite3, ...
Amélioration des performances
Presque trois ans après 5.2
Release Announcement
Suppression (ou déplacement vers PECL) de pas mal d'extensions
PHP 5.3
Un tournant dans l'utilisation de PHP
Espaces de noms == plus facile pour se partager du code
Accompagné d'un changement de mentalités, "professionnalisation"
Arrivée de Composer !
Mars 2010
Alors que plusieurs versions de PHP 5.x étaient sorties, d'autres discussions avaient lieu en parallèle...
R.I.P. PHP 6
Projet ambitieux
Pas de réel besoin ?
Fonctionnalités backportées sur PHP 5.3
Unicode
Photo par Henry T. McLin sur Flickr, CC-BY-NC-ND.
Pasde "concurrence" pour pousser à sortir une nouvelle version majeure (comprendre : il n'y avait pas HHVM en face, à l'époque)
PHP 5.4
Mars 2012
Traits, serveur web de test, sucre syntaxique
Suppressions de register_globals
, magic_quotes
, safe_mode
Amélioration des performances, réduction consommation mémoire
Cycle de release
Une version mineure par an
Deux ans de support
+ 1 an pour correctifs de sécurité
Deux, c'est court, ou long, selon le point de vue.
Certaines distributions backportent les correctifs de sécurité pendant bien plus longtemps
Releases + souvent = versions avec moins de modifs = plus facile à mettre à jour
PHP 5.5
Juin 2013
Generators
OPcache, finally
, ::class
, API mots de passe
Améliorations syntaxe
Fin support Windows XP/2003
Un an après 5.4
Release Announcement
1ère fois que l'annonce de sortie ne parle pas des performances ! Mais cache d'opcodes intégré, qui joue pas mal.
Dans la salle, on était seulement trois ou quatre (sur une quarantaine) à utiliser des generators ;-(. Après la conf, j'ai discuté avec plusieurs personnes en donnant des exemples de cas où j'en utilise. Peut-être un blog-post dans quelques temps ?
PHP 5.6
Août 2014
Fonctions variadiques
use
pour fonctions et constantes
Expressions scalaires constantes
**
, surcharge d'opérateurs (classes internes), phpdbg
php.net/supported-versions.php
Screenshot fait aujourd'hui
Support sécurité PHP 5.4 terminé depuis le 14 septembre (il y a une semaine)
5.5 : support actif jusqu'à juillet 2015 (donc, finit)
5.6 : support actif jusqu'à fin août 2016
Source : w3techs.com
Screenshot fait hier, donc à jour également
Versions maintenues (avec fixes de sécurité, mais plus forcément correction de bugs), c'est 15% des installations de PHP 5. Ouch.
Une nouvelle version majeure !
Après 10 ans de PHP 5, il est temps de passer à la suite
PHP 6 and MySQL 5 for Dynamic Web Sites: Visual QuickPro Guide
PHP 6 Fast and Easy Web Development
Professional PHP6 (Wrox Programmer to Programmer)
PHP 6/MySQL Programming for the Absolute Beginner
PHP6 and MySQL Bible
Sur Amazon
La plupart de ces livres sont dispo en version "used". Et pour pas cher !
En cherchant "PHP 6", on a des articles qui parlent des nouveautés, des conférences.
Puis des gens qui se demande "mais quand est-ce que ça sort" ?
Et ça finit par un poisson d'avril "PHP 6 est sorti"...
Photo par Anant Nath Sharma sur Flickr, CC-.
Bref, version "6" c'est un peu une version maudite, chez PHP mais pas que (Cf Perl 6 par exemple)
Et ce "6" peut être une source de confusion...
5 + 1 = 6 7
Et donc, on saute la version 6 et on passe directement à 7
Une nouvelle version majeure !
Ca veut dire pas mal de nouveautés.
Et aussi accepter de casser la compatibilité (mais pas trop quand même, pour ne pas rendre la migration impossible)
PHP, espace, 7
Théoriquement, pour moi, on garde "PHP" en nom de logiciel et "7" comme version.
Ca ne devrait donc pas être tout attaché...
PHP 7
Les nouveautés
Pas mal de nouveautés sympa, passons les en revue
Photo par Wayne Williamson sur Flickr, CC-BY-SA.
Souvenirs, sourvenirs... On a tous déjà connu un BSOD, n'est-ce pas ?
En PHP, bien souvent...
Pas BLUE screen of death...
Mais WHITE screen of death :-(
Ou alors, sur un serveur mal configuré, il y aurait juste "Fatal error" écrit...
Gestion d'erreurs
Bref, des choses ont été améliorées au niveau de la gestion d'erreurs
Erreurs → exceptions
Une partie des erreurs Fatales
internes à / levées par PHP
sont transformées en Error
qui peuvent être catchées
Erreurs → exceptions
<?php
$obj = null;
try {
// Ooops !
$obj->methode();
}
catch (Error $e) {
var_dump($e->getMessage());
}
?>
string(43) "Call to a member function methode() on null"
Appel d'une méthode sur null
Erreurs → exceptions
<?php
$php = <<<'PHP'
$a = 10 // -- Parse error ! -- //
printf("\$a = %d\n", $a);
PHP;
try {
eval($php);
}
catch (ParseError $e) {
var_dump($e->getMessage());
}
?>
string(44) "syntax error, unexpected 'printf' (T_STRING)"
Erreur de syntaxe dans du code évalué (oué, eval()
c'est mal)
Erreurs → exceptions
echo "Fichier 1 - avant\n";
try {
// Fichier avec une erreur de syntaxe
include __DIR__ . '/test-06-2.php';
}
catch (Error $e) {
echo "Error catchée : ";
var_dump($e->getMessage());
}
echo "Fichier 1 - après\n";
Fichier 1 - avant
Error catchée : string(42) "syntax error, unexpected '$b' (T_VARIABLE)"
Fichier 1 - après
Parse errors peuvent être catchées si elles se produisent dans un autre contexte de compilation que le fichier courant.
Dans un fichier inclu, par exemple.
Le fichier courant doit être correct, lui, par contre.
Erreurs → exceptions
Hiérarchie d'erreurs / exceptions
interface Throwable
Exception implements Throwable
// Toutes les exceptions usuelles
Error implements Throwable
AssertionError extends Error
ParseError extends Error
TypeError extends Error
Séparation entre les Exception
, qui continuent à se comporter comme avant
Et les Error
, qu'on peut désormais catcher en plus
De l'ancien code qui catchait les exceptions ne catchera pas les errors et on garde donc, si on ne change rien, le comportement existant.
Erreurs → exceptions
Une partie des erreurs Fatales
internes à / levées par PHP
Type hints scalaires
Ca a été une source de débats et de combats, mais c'est arrivé !
Type hints scalaires
<?php
function add(int $a, int $b) {
return $a + $b;
}
var_dump( add(10, 20) );
var_dump( add('10', '20') );
int(30)
int(30)
Approche souple , par défaut
"20"
peut être converti en entier et l'est donc.
Type hints scalaires
try {
var_dump( add(10, 'abc') );
}
catch (TypeError $e) {
var_dump( $e->getMessage() );
}
string(148) "Argument 2 passed to add()
must be of the type integer, string given,
called in .../test-01.php on line 12"
"abc"
ne peut pas être converti en entier. Donc erreur
Types de retour
function add(int $a, int $b) : int {
return $a + $b;
}
Return Types
Levée d'erreur si la fonction essaye de retourner autre chose que le type spécifié dans sa déclaration
Surtout utile en développement / test ? Analyse statique !
Types de retour
function get_config() : array {
return 42;
}
get_config();
Fatal error: Uncaught TypeError:
Return value of get_config() must be
of the type array, integer returned
Exemple d'erreur : la fonction a essayé de retourner un entier, alors qu'elle était censée retourner un array.
Typage strict
<?php
declare(strict_types=1);
function add(int $a, int $b) {
return $a + $b;
}
add(10, '20');
Fatal error: Uncaught TypeError:
Argument 2 passed to add()
must be of the type integer, string given
Optionnellemnt, avec une directive declare()
(tout en haut du fichier et s'applique pour l'ensemble du fichier), on peut passer en mode de typage strict.
"20"
est une chaine, pas un entier, donc erreur
Souple / Strict ?
Paramètres : au choix de l'appelant
Sait si il manipule des types souples ou stricts
Retour : au choix de l'appelé
Sait si la fonction qu'il a écrite utilise des types souples ou stricts
Souple / Strict ?
Les données sont des types indiqués.
Détermine si des conversions sont ou non permises .
Null Coalesce Operator
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
$username = $_GET['user'] ?? 'nobody';
$model = Model::get($id) ?? $default_model;
function foo() {
echo "executed!", PHP_EOL;
}
var_dump(true ?? foo());
Null Coalesce Operator
On a tous utilisé la première écriture... Qui est longue et on se répête... La seconde est plus sympa, non ?
Prend la valeur de gauche ; ou celle de droite si celle de gauche était fausse
Peut être utilisé pour faire du short-circuit !
Dans peu de temps, dans notre galaxie...
Not this TIE Fighter ;-)
Photo par Rick sur Flickr, CC-BY.
"TIE" == "Cravate", en anglais ;-)
En cherchant "TIE Fighter" sur flickr, cette photo est un des résultats... Je n'ai pas pu m'empêcher de le partager ^^
<=>
Combined Comparison (Spaceship) Operator
function order_func($a, $b) {
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}
function order_func($a, $b) {
return $a <=> $b;
}
Combined Comparison (Spaceship) Operator
Fonction de comparaison pour, par exemple, usort()
Vu la forme de l'opérateur, il est appelé spaceship -- et il ressemble pas mal à un chasseur TIE ^^
Là encore, la seconde écriture est plus sympa que la première !
<=>
Ou avec des tableaux
function order_func($a, $b) {
return ($a->$x <=> $b->x) ?:
($a->y <=> $b->y) ?:
($a->foo <=> $b->foo);
}
function order_func($a, $b) {
return [$a->x, $a->y, $a->foo]
<=> [$b->x, $b->y, $b->foo];
}
Oui, écrire une fonction de comparaison correcte est difficile !
Il faut retourner -1, 0 ou 1 ; et pas juste un booléen !
Classes anonymes
Quand 5.3 a apporté les fonctions anonymes, pas mal de gens (ceux qui n'en utilisaient pas en JS, notamment) se demandaient à quoi ça allait servir. Maintenant, on en utilise tous les jours.
Il y a des chances que ça fasse un peu pareil pour les classes anonymes.
Classes anonymes
$obj = new class ("Monde") {
protected $qui;
public function __construct($qui) {
$this->qui = $qui;
}
public function hello() {
printf("Hello, %s !\n", $this->qui);
}
};
var_dump($obj);
$obj->hello();
Construction d'un objet à la volée, sans définir de classe.
On peut user un Trait, implémenter une interface, hériter d'une autre classe, ...
On ne peut pas sérialiser (puisqu'on ne saurait pas vers quoi dé-sérialiser)
Classes anonymes
object(class@anonymous)#1 (1) {
["qui":protected]=>
string(5) "Monde"
}
Hello, Monde !
La sortie obtenue. bref, ça marche.
Classes anonymes
Quelle utilité ?
Usage unique
Pas besoin de documentation
On verra ;-)
Classes anonymes
Exemples ?
Logger
SplObserver
, avec SplSubject
+ qu'une fonction anonyme
Très utilisé sous Android, par exemple, pour des callbacks avec par exemple une méthode "quand ça marche" et une méthode "quand ça marche pas"
Amélioration de assert()
Dans la salle (sur une 40aine de personnes), en gros personne n'utilise assert()
.
Ceux qui connaissent, c'est surtout parce qu'ils ont fait du C avant.
assert()
$a = 20;
assert($a == 10, "Echec assertion !");
printf("a = %d\n", $a);
Warning: assert(): Echec assertion !
assert()
lève un avertissement si une condition est fausse.
En gros, on instrument le code.
Oui, on ferait plutôt des TU, maintenant.
assert()
assert.exception = 1
try {
assert($a == 10);
}
catch (AssertionError $e) {
var_dump($e);
}
Ca peut maintenant lever une error et plus un warning
assert()
zend.assertions
1
: activées (dev)
0
: non exécutées
-1
: non compilées (prod)
Et ça c'est la grande amélioration : en PHP 5, les assertions étaient quand même évaluées, même en prod. Pas terrible.
Maintenant, on peut complétement les désactiver.
Regrouper les déclarations use
Group use declarations
use Mon\Espace\De\Nom\ClasseAa;
use Mon\Espace\De\Nom\ClasseBb;
use Mon\Espace\De\Nom\ClasseCc;
use Mon\Espace\De\Nom\Enfant\AutreClasse as ClassDd;
use Mon\Espace\De\Nom\ {
ClasseAa, ClasseBb, ClasseCc,
Enfant\AutreClasse as ClassDd
};
Les deux écritures dont pareil. La seconde est plus courte et moins répétitive
Group use declarations
use function Mon\Nom\fonc01;
use const Mon\Nom\CONST01;
use Mon\Nom\Class01;
use Mon\Nom\ {
function fonc01,
const CONST01,
Class01
};
Marche aussi pour les fonctions et constantes, qu'on peut user depuis PHP 5.4
Améliorations sécurité
Bien sûr, quelques améliorations de sécurité
Secure unserialize
$data = unserialize($serialized, [
"allowed_classes" => false
]);
$data = unserialize($serialized, [
"allowed_classes" => [
MaClasse::class,
'MonAutreClasse',
]
]);
Appel de __wakeup()
lors de unserialize()
, peut mener à des injections de code
Par défaut, allowed_classes
vaut true
et tout objet sera désérialisé vers une instance de sa classe (si elle existe)
Sinon, on peut interdire ou mettre une white-list de classes
Nombres aléatoires
var_dump( random_int(10, 100) );
var_dump( bin2hex(random_bytes(12)) );
int(23)
string(24) "903c636403869d3c3ab3310e"
rand()
et mt_rand()
sont pseudo -aléatoires et pas cryptographiquement sûres
mcrypt
bof et openssl
pas toujours dispo
Pas une révolution du langage, mais vise à faciliter la vie des utilisateurs, y compris les débutants qui ne sont pas experts en sécurité
JSON
Extension jsond
Option JSON_PRESERVE_ZERO_FRACTION
pour json_encode()
var_dump( json_encode(42.0) );
var_dump( json_encode(42.0, JSON_PRESERVE_ZERO_FRACTION) );
string(2) "42"
string(4) "42.0"
L'extension json
n'était pas libre. jsond
l'est.
"42"
donne en entier lors de l'appel à json_code()
, alors que "42.0"
donne un flottant. Ca joue, quand on introduit du typage statique.
Unicode et Intl
Classe IntlChar
Caractères unicodes
echo "Des chats : \u{1F638} \u{1F639} \u{1F63A}\n";
Des chats : 😸 😹 😺
Generators et return
function plop() {
yield 100;
yield 200;
return 42;
}
foreach (($generator = plop()) as $val) {
var_dump($val);
}
var_dump( $generator->getReturn() );
int(100)
int(200)
int(42)
PHP 5 : erreur si return
avec valeur
getReturn()
OK si le generator a terminé. Sinon, erreur.
Utile quand on veut un résultat à la fin d'une génération de données
Generator Delegation
function test() {
yield from [10, 20, 30];
}
foreach (test() as $val) {
var_dump($val);
}
int(10)
int(20)
int(30)
Depuis un Traversable
ou un array
Vu que quasiment personne dans la salle n'utilise de generateur, je passe là-dessus très vite : ça peut demander un peu de pratique avant d'être compris.
Generator Delegation
function sub_generator_1() {
yield 10;
yield 20;
}
function sub_generator_2() {
yield from [ 'aa', 'bb', ];
}
function delegating_generator() {
yield from sub_generator_1();
yield from sub_generator_2();
}
foreach (delegating_generator() as $val) {
var_dump($val);
}
int(10)
int(20)
string(2) "aa"
string(2) "bb"
Ou depuis un sous-Generator
(pareil)
Note to self : peut faire une idée d'article de blog...
Et encore
Pour finir avec les nouveautés...
Processus d'évolution de PHP
À force de parler de PHP et suite à de nombreuses questions, j'ai réalisé que peu d'utilisateurs savaient comment / pourquoi PHP évolue.
Donc, je propose de faire une pause et de parler de comment ça se passe, avant de revenir ensuite sur PHP 7
Open-Source
Pas « Zend » uniquement !
Y compris pour les décisions
Méritocratie ? Démocratie ?
Pas de BDFL
Zend est une entreprise qui participe au développement de PHP, parmi d'autres.
BDFL : Benevolent Dictator for Life - PHP n'est pas Ruby (Matz), Python (Guido van Rossum), Linux (Linus Torvalds), Perl (Larry Wall), ...
Des fois donne un peu l'impression d'être la cratie de celui qui parle le plus fort ^^
Nombre de commits
Contributeurs sur github
Nombre de commits augmente au fur et à mesure des années ; pour moi, c'est un bon signe, ça montre un projet vivant
"Top" depuis le début
Des gens qui étaient là et sont parti, des gens qui sont là depuis toujours, d'autres arrivés et repartis, d'autres arrivés récemment et déjà dans le top.
"Top" depuis Sept 2012
Espaces d'échanges
internals@
Des RFCs
Un processus de votes
Twitter, reddit, blog-posts, ... non officiels !
Ce n'est pas parce que certains parlent fort sur twitter/reddit/autres que c'est "officiel"
internals@
Mailing-list des développeurs de PHP
Discussions autour du développement de PHP
Active depuis 1997
Publique
Quelques centaines de mails par mois. Ou plus.
D'autres mailing-list existent, pour ce qui est documentation, site-web, notifications de commits, sécurité, extensions PECL, ...
Entre 500 et 800 mails les mois normaux. 1500 mails en janvier, 2500 mails en février : PHP 7 qui approche !
Pas tant de trolls que ça, en fait !
Photo par Matthijs sur Flickr, CC-BY-NC-ND.
4378 mails sur internals@ en août 2000 ; 2000 et 2001 ont été très actifs !
En général, quelques centaines de mails par mois
Plus de 2100 mails en février 2015 ; effet PHP 7
Oui, y'a des trolls, des fois. Mais pas que. Et il y a eu du progrès ces dernières années.
RFC ?
Formalisation des éventuels changements
Idée + implémentation
Template pour présenter une proposition
Principe apparu vers PHP 5.3
Assez calme, en ce moment.
Les efforts sont concentrés sur la stabilisation de PHP 7 et sa sortie.
Ce qui est "évolutions" reprendra, je pense, ensuite.
Discussions
Échanges sur internals@
Avant de créer une RFC ?
Autour d'une RFC
Pendant la phase de votes
Discuter avant de créer une RFC : pour tâter le terrain !
RFC souvent mise à jour pour tenir compte des retours
Bien sûr, il y a toujours du monde qui ne réagit qu'une fois la RFC en phase de votes...
Points de vue
Conservateurs
Progressistes
Égoistes ?
...
Bon, on ne peut pas toujours mettre tout le monde dans des cases
Et je grossis un peu le trait
Photo par Scubaben sur Flickr, CC-BY-NC-ND.
Des fois, c'est un peu la foire...
Points de vue
Développeurs de fonctionnalités
Utilisateurs de PHP
Mainteneurs de PHP
...
Qui se souvient de Ben Kenobi et de son histoire sur les points de vue ?
Photo par Torsten Reimer sur Flickr, CC-BY-NC-ND.
Oui, il existe un world pillow fight day ^^
Et oui, des fois, c'est un peu le foutoir ^^
Points de vue
Stabilité vs BC-breaks vs évolution
Langage complet vs accessible
Sujets sensibles
Typage souple vs strict
Langage dynamique vs statique
Annotations
Façon de procéder : procédures vs comme avant
...
Voilà encore d'autres points de vue différents !
Photo par Scott Beale sur Flickr, CC-BY-NC-ND.
Des fois, certains y laissent des plumes...
Votes
Par défaut : 50%+1
Modification du langage : 2/3
Min. 2 semaines après RFC
Qui peut voter ?
Durée des votes ?
Voting on PHP features
Durée des votes : 1 semaine minimum. Peut être plus long.
Qui peut voter : ceux avec un compte Git, quelques représentants de la communauté
Et à l'AFUP ?
On est à un événement organisé par l'AFUP, parlons un peu de ce qu'on fait, à l'AFUP ;-)
Et à l'AFUP ?
Une mailing-list
Des discussions
Un post sur internals@
Un blog-post
AFUP
php-internals@afup.org
Une ML où on discute entre membres AFUP.
Inscription depuis l'admin de votre compte ;-)
AFUP
1300+ mails depuis août 2014 !
Ca en fait LA ML AFUP la plus active \o/
AFUP
~50 avis sur internals@
En environ six mois, on en est à une cinquantaine de fois où on a dit sur internals@ ce qu'on pensait à propos d'une RFC, en tant que "communauté d'utilisateurs"
Ce feedback ne peut pas faire de mal !
Et j'ai eu plusieurs retours qui montraient que c'est apprécié.
AFUP
php-internals.afup.org
Une 20 aine de posts publiés.
Merci à Jean, qui en a rédigé un paquet ces derniers temps !
La communauté
Photo par Oscar Gende Villar sur Flickr, CC-BY.
Non, pas celle-là.
D'ailleurs, j'ai du mal à voir lequel est Legolas, là ?
En fait...
Pas une communauté, mais plusieurs
Communautés Drupal, symfony, ...
Ca fait encore des points de vue différents !
En fait...
Plusieurs types de développeurs
Ca fait encore des points de vue différents !
Photo par
Jay Cross sur Flickr, BY.
Un débutant, face à un manuel PHP aussi long que tout ça, il fait quoi ?
J'ai un peu à l'esprit la photo avec "Javascript the good parts" qui fait un centimètre d'épaisseur, et "Javascript la bible complète" qui en fait 5 ou 6...
En fait...
Plusieurs types de développeurs
Débutants
Amateurs
Utilisateurs et intégrateurs de logiciels
Développeurs (PHP) full-time
Hébergeurs
Ca fait encore des points de vue différents !
En fait...
Des besoins très différents
Certains s'expriment plus que d'autres
The vast majority of the PHP community never ever interacts with internals@
, never attend
conferences, don't write blog posts about PHP and are generally completely 'under the radar'.
Zeev Suraski
Vous !
Un petit jeu ;-)
Combien de collègues développeurs PHP ?
Combien faisaient de la veille ?
Combien suivaient le développement de PHP ?
Combien participent à des événements communautaires ?
Combien sont membres AFUP ?
Alors ?
Le chiffre de la fin est bien différent de celui-du début, n'est-ce pas ?
Vous !
Même question, avec utilisateurs de PHP , sans se limiter à un cadre profesionnel .
La communauté
Sommes-nous représentatifs de la majorité des utilisateurs de PHP ?
C'est une vrai question que je me pose parfois, surtout vu que je poste notre avis sur internals@ suite aux échanges sur notre ML...
Mais en même temps, difficile d'avoir l'avis de ceux qui ne s'expriment pas...
I would actually go to argue that the people who do attend conferences,
participate on internals@
or write blog posts - are not
representative of the PHP userbase at large.
Zeev Suraski
Une nouvelle versionmajeure !
Ca veut dire pas mal de nouveautés.
Et aussi accepter de casser la compatibilité (mais pas trop quand même, pour ne pas rendre la migration impossible)
PHP 7
Les suppressions
Je disais plus haut qu'il s'agissait d'une nouvelle version majeure
Ca veut dire que c'est le moment où on peut faire des bc-breaks
Même s'il ne faut pas en abuser !
Ménage !
Suppression des fonctionnalités obsolètes
Assignment of new
by reference
set_magic_quotes_runtime()
et magic_quotes_runtime()
dl()
on fpm-fcgi
Scoped calls of non-static methods from incompatible $this
context
Ménage !
Suppression des fonctionnalités obsolètes
Directives ini d'encodage pour mbstring
et iconv
Commentaires en #
dans les fichiers .ini
Paramètre $is_dst
de mktime()
et gmmktime()
Directive ini xsl.security_prefs
Série d'autres fonctions
Ménage !
Suppression des fonctionnalités obsolètes
Uploads curl non-sûrs
Modificateur /e
de preg_replace()
Noms de catégories sous forme de chaînes de caractères pour setlocale()
...
Ménage !
Suppression d'extensions
ext/ereg
→ PCRE
ext/mysql
→ mysqli
Enfin !
Ca fait une éternité qu'on dit qu'il ne faut plus utiliser les fonctions mysql_*()
!
Ménage !
Suppression d'extensions
ext/imap
et ext/mcrypt
ont été conservées, mais sont basées sur des bibliothèques non maintenues !
Ménage !
Suppression de SAPIs
sapi/aolserver
sapi/apache
sapi/apache_hooks
sapi/apache2filter
sapi/caudium
sapi/continuity
sapi/isapi
Ménage !
Suppression de SAPIs
sapi/milter
sapi/phttpd
sapi/pi3web
sapi/roxen
sapi/thttpd
sapi/tux
sapi/webjames
PHP 7
La cohérence du langage
Enfin,on va corriger des trucs, des comportements, qui étaient parfois un peu bizarres
Tags alternatifs
Supprimés !
<%
et <%=
... %>
Directive asp_tags
<script language="php">
... </script>
<?
et <?=
sont conservés !
Sérieusement, quelqu'un utilisait les tags ASP ? À part ceux qui ont fait de l'ASP ?
Et ceux en script
? Fallait déjà savoir que ça existait ^^
Lexer contextualisé
class Query {
public function where() { return $this; }
public function and() { return $this; }
public function or() { return $this; }
public function not() { return $this; }
}
$obj = new Query();
$obj->where('condition')
->or('autre condition')
->and()->not('encore');
Certains mots clefs peuvent maintenant être utilisés comme noms de méthodes.
Par exemple : and
, or
, not
, in
, ... Peut être sympa pour une classe genre un QueryBuilder
switch
+ >1 default
switch (10) {
default:
var_dump("premier default");
break;
default:
var_dump("second default");
break;
}
Fatal error: Switch statements may only contain one default clause
Ca donnait quoi, ça ?
Avec PHP 5.x, ça donnait string(14) "second default"
Avec HHVM, ça devait donner le premier
Maintenant, c'est supprimé. De toute, ça n'avait aucun sens d'écrire deux default
et l'erreur levée permet d'identifier une erreur dans notre code.
Mots réservés
Usage interdit en tant que :
Classe
Trait
Interface
Espace de nom
Un peu à l'inverse de ce qu'on disait plus haut...
Mots réservés
int
float
bool
string
true
et false
null
Mots déjà utilisés, soit en PHP 5, soit en PHP 7 pour le type-hinting scalaire
Mots réservés
resource
object
scalar
mixed
numeric
Mots qui signifient quelque chose aujourd'hui, mais ne sont pas encore vraiment utilisés.
Réservés lors de la nouvelle version majeure, en vue d'utilisation sur une prochaine mineure, sans causer de bc-break
Mais aussi
Constructeurs façon PHP 4 ⇒ E_DEPRECATED
Erreurs E_STRICT
transformées en E_DEPRECATED
ou E_NOTICE
ou E_WARNING
Arrêt du support des nombres hexa dans chaînes : "OxAB"
Les constructeurs PHP 4, avec constructeur = méthode du même nom que la classe, c'était un peu le foutoir : pas supporté dans certains cas, comportement pas trop clair dans d'autres...
Mais aussi
Cohérence pour list()
et chaînes
Cohérence pour foreach()
Output buffering utilisable en cas d'abandon de connexion
Mais aussi
Arbre syntaxique (AST) utilisé pour la compilation
Constructeurs de classes internes
Comportement cross-plate-formes identique pour les entiers
Parse error sur numériques invalides : 0891
À propos d'entiers
mt_rand(0, 9.0E21);
srand(9.0E21);
Avec PHP 5.6 :
Warning: mt_rand(): max(-2011107970261188608) is smaller than min(0)
Avec PHP 7.0 :
Warning: mt_rand() expects parameter 2 to be integer, float given
Warning: srand() expects parameter 1 to be integer, float given
Un nombre flottant très grand. Trop grand pour pouvoir tenir dans un nombre entier.
Avant, ça faisait un peu n'importe quoi.
Maintenant, on a une erreur explicite.
Variables : syntaxe uniforme
Syntaxe cohérente et complète
Permet de nouvelles écritures
Mais change / casse certaines syntaxes rarement utilisées
Variables : syntaxe uniforme
function plop() {
return [
'a' => 'aaa', // Nom d'une fonction
'b' => 'bbb',
'c' => 'ccc',
];
}
function aaa() { var_dump(__FUNCTION__); } // La fonction
function bbb() { var_dump(__FUNCTION__); }
function ccc() { var_dump(__FUNCTION__); }
$fonction = 'plop';
$fonction()['a']();
Bon, on n'utilisera pas ça tous les jours
Variables : syntaxe uniforme
class MaClasse {
public $propriete;
public function __construct($val) {
$this->propriete = $val;
}
}
$a = new MaClasse(42);
$b = new MaClasse(123);
var_dump( [ $a, $b ][0]->propriete );
Variables : syntaxe uniforme
class MaClasse {
public function maMethode() {
var_dump(__METHOD__);
}
}
$obj = new MaClasse();
[ $obj, 'maMethode' ]();
Variables : syntaxe uniforme
class MaClasse {
public static function maMethode() {
var_dump(__METHOD__);
}
}
$methode = 'maMethode';
'MaClasse'::$methode();
Variables : syntaxe uniforme
Appel d'une fonction anonyme
function ma_fonction() {
var_dump(__FUNCTION__);
}
( function () {
return 'ma_fonction'();
})();
Ca par contre, c'est cool.
Pouvoir appeler une fonction anynome sans avoir à passer par une variable pour faire $fonction()
Variables : syntaxe uniforme
Écriture désormais invalide :
global $$foo->bar;
À remplacer par :
global ${$foo->bar};
En même temps, si vous aviez ça dans votre code...
Variables : syntaxe uniforme
Changements
// écriture // PHP 5 // PHP 7
$$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz']
$foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz']
$foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']()
Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
Ca par contre, changement de comportement de manière silencieuse, ça peut faire mal.
Surtout les deux du milieu, qui étaient parfois utilisées...
PHP 7
Les performances !
C'est forcément une question qui se pose à un moment ou à un autre ;-)
Sujet figurant dans un paquet de Release Annoucement pour PHP 5.x ; et ça ne changera pas pour PHP 7.0 ^^
phpng
Ensemble d'améliorations internes orientées performances
bench.php
Wordpress
Optimisations mémoire
zval
: 24 → 16 octets
Hashtable
: 76 → 56 octets
Entrée de Hashtable
: 72 → 32 octets
Optimisation sur tableaux immuables
Nouvel allocateur mémoire
zval = représentation interne d'une variable
Hashtable = tout ce qui est liste, tableau, et stockage de plein de trucs en interne
Optimisations CPU
Fast ZPP
API itération hashtable + rapide
JIT PCRE activé par défaut
Conversion de certaines fonctions en opcodes : strlen()
, is_*()
, defined()
...
ZPP= passage de paramètres
OPcache en fichiers
--enable-opcache-file
; php.ini
opcache.file_cache=/var/tmp
; php-cli.ini
opcache.enable_cli=1
opcache.file_cache=/var/tmp
opcache.file_cache_only=1
Peut servir pour du cache d'opcode en CLI.
Ou pour éviter de repartir d'un cache froid en cas de re-démarrage du serveur web. reste à voir comment effacer les bons fichiers de cache en cas de modification de sources...
Performances
Sur applications réelles
50% à 100% supérieures à PHP 5.6
Proches de celles de HHVM 3.7
Consommation mémoire diminuée
HHVM : PHP 7 est des fois plus rapide, des fois moins ; ça dépend des applications
Ca dépend de vos applications, comme toujours !
PHP 7
Mais pas...
On ne peut pas tout avoir non plus...
Même si certains auraient aimé avoir certaines features ^^
Named Parameters
Ne spécifier que les paramètres utiles
htmlspecialchars($string, double_encode => false);
Ou juste s'y retrouver
strpos(hasytack => "foobar", needle => "bar");
Loop... or
while ($cond) {
// loop body
}
or {
// did not enter while loop
}
Loop... or... un peu sur le modèle de ce que permet Twig, par exemple
Valable aussi pour for
, foreach
Plein de cas possibles, pas que celui-ci. Donc pour l'instant aucun de mis en place.
Static classes
Classe non instanciable, uniquement des méthodes statiques
static class Environment
{
private static $rootDirectory = '/var/www/project';
public static function getRootDirectory()
{
return self::$rootDirectory;
}
}
Static classes
On a remplacé fonctions.inc
par des classes Utils
blindées de méthodes statiques (c'est mal)
Ceci aurait permis d'être vraiment static
, sans risque d'erreur.
Mais vu que c'est mal ...
Using objects as keys
class Plop {
public function __hash() {
return 'une chaine'; // ou un entier
}
}
$obj = new Plop();
$array = [
$obj => "une valeur",
];
Using objects as keys
Idée intéressante ; mais ne stocke pas les objets comme clefs : uniquement le retour de __hash()
Donc, avec un foreach ($arr as $k => $v)
, $k
ne contient pas l'objet !
Parameter skipping
// Dernier param vaut true par défaut
// On spécifie les valeurs par défaut
// pour les deux paramètres précédents
echo htmlspecialchars("plop",
ENT_COMPAT | ENT_HTML401,
ini_get("default_charset"),
false
);
Aurait pu devenir
echo htmlspecialchars("plop", default,
default, false);
Parameter skipping
Aurait pu être sympa, mais pas au niveau des paramètres nommés.
Au lieu d'avoir cette feature, globalement, on préfére attendre 7.1 ou 7.2 et peut-être les paramètres nommés.
Threads / Async
Pas la façon de faire de PHP
Threads : Extension pthreads
Async : ReactPHP, Icicle
Il existe des solutions, mais pas intégrées à PHP.
Peut-être que, un jour, si le multi-threads et/ou l'asynchrone deviennent fortement utilisés en PHP, la question d'en avoir en natif dans le langage se posera ?
JIT
Pas pour PHP 7.0
Les améliorations qui arrivent en PHP 7.0 peuvent aider à mettre du JIT. Mais il n'y en a pas pour l'instant.
PHP 7
Et la migration ?
Volontairement, je fais court : ça dépend beaucoup de vos applis, des bibliothèques que vous utilisez, ...
Elle devrait plutôt bien se passer !
Dans l'ensemble, je suis assez optimiste.
Objectif
Plus rapide que PHP 4 → PHP 5
Objectif qui est resté dans les esprits tout au long du développement de PHP 7 : que la migration soit plus facile que "la dernière fois".
Compatibilité
Pas de gros changement
Modifications (cohérence) sur des points de syntaxe peu utilisés
Suppression de fonctionnalités obsolètes depuis longtemps
Quelques points de syntaxe, notamment sur les variables : c'est ce qui me fait le plus peur, car difficile à détecter.
Documentation
php.net/migration70
Comme toujours, un guide de migration qui reprend tout ce qui change
Pour tester ?
Plein de solutions, en fonction de vos préférences
Un exemple ?
Tests atoum
Durée divisée par 1.6
2 tests KO
Dont un à cause d'une extension non installée !
Une de mes applis au boulot
Vos applis ?
Testez !
Signalez les problèmes ;-)
Signalez, que ce soit des problèmes dans PHP, dans des extensions, ou dans des bibliothèques
Rappels
EOL de PHP 5.6 approche
Gains de performances
Fonctionnalités
Source de motivation pour vos développeurs ?
C'est encourageant !
Deux premiers articles : retours qui disent que ça marche plutôt bien.
Troisième : Wordpress qui va supporter PHP 7 dès sa publication.
Et encore ?
Fin de cette présentation.
On a vu : histoire de PHP, PHP 7, processus d'évolution
Futur ? De PHP 7 ?
$ $HOME/bin/php-7.0/bin/php --version
PHP 7.1.0-dev (cli) (built: Sep 20 2015 10:48:32)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
PHP 7.1 : des RFCs commencent à arriver. Et master
correspond déjà à PHP 7.1
7.x : probablement, cf cycle de releases (une mineure par an ? )
PHP 8 : Dans 10 ans ? Ou plutôt 5 ?
Forum PHP
event.afup.org/forum-php-2015
23 et 24 novembre 2015
Track spéciale PHP 7 !
Une track spécifique PHP 7
Deux autres tracks
Je donnerai une présentation à propos des Flux !
Participez !
Du code, des tests, des PRs
Testez PHP 7
Postez vos retours d'expérience
Améliorez la doc
Plus il y a de testeurs, moins il y a de bugs ;-)
Plus il y a de gens qui migrent, plus il y a de gens qui migrent !
La documentation
Sur toutes les pages de la doc...
La documentation
... il y a ces deux liens...
La documentation
Le premier ouvre un éditeur en ligne, où on peut effectuer des modifications (même pas besoin de créer un compte ni rien)
Contribuez !
Photo par ~Zoe~ sur Flickr, CC-BY-NC-ND.
PHP, Open-source, évolution par les contributions
Langage qui met à manger sur la table ?
Photo par Pieter & Renée Lanser sur Flickr, CC-BY.
Je n'avais pas encore affiché de chaton...
... désolé !
J'ai une réputation à tenir :-p
Questions ?
Photo par Falcon® Photography sur Flickr, CC-BY-SA.
Questions tout au long de la présentation ?
Mais peut-être encore quelques unes ?
Normalement, c'est une vue de Nantes...