PHP 7
Processus d'évolution de PHP
Apéro PHP Lyon, 25 février 2015
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 .
Qui suis-je ?
Ces slides ont été utilisés comme support de présentation
lors de l'Apero PHP Lyon, le 25 février 2015.
PHP 7
En approche !
Photo par RayMorris1 sur Flickr, CC-BY-NC-ND.
OK, il n'y a que 6 éléphants et pas 7, désolé...
Timeline
Dernières RFC visant PHP 7.0→ Mars 2015 !
Terminer les développements → Juin
Releases Candidates → Octobre
PHP 7.0→ Octobre 2015 !
RFC: PHP 7.0 timeline
Il ne reste que très peu de temps pour des nouvelles features, puisque feature-freeze en mars.
PHP 7 devrait sortir avant la fin de cette année ! Bientôt, donc !
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)
Null Coalesce Operator
$username = $_GET['user'] ?? 'nobody';
$model = Model::get($id) ?? $default_model;
function foo() {
echo "executed!", PHP_EOL;
}
var_dump(true ?? foo());
Null Coalesce Operator
Prend la valeur de gauche ; ou celle de droite si celle de gauche était fausse
Peut être utilisé pour faire du short-circuit !
Return Types
function add($a, $b) : DateTime {
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 !
Return Types
function get_config(): array {
return 42;
}
get_config();
Catchable fatal error:
Return value of get_config() must be of the type array,
integer returned in %s on line %d
Exemple d'erreur : la fonction a essayé de retourner un entier, alors qu'elle était censée retourner un array.
In a few months, in our galaxy...
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;
}
function order_func($a, $b) {
return [$a->x, $a->y, $a->foo]
<=> [$b->x, $b->y, $b->foo];
}
<=>
Plus facile à écrire ;-)
function order_func($a, $b) {
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}
function order_func($a, $b) {
return ($a->$x <=> $b->x) ?:
($a->y <=> $b->y) ?:
($a->foo <=> $b->foo);
}
Oui, écrire une fonction de comparaison correcte est difficile !
Il faut retourner -1, 0 ou 1 ; et pas juste un booléen !
Et aussi
More secure unserialize()
/ Filtered unserialize()
Disallow multiple default
blocks in a single switch
statement
Fix list()
behavior inconsistency
Remove hex support in numeric strings
Et aussi
Fix foreach
behavior
Preserve Fractional Part in JSON encode
Replacing current json
extension with jsond
Unicode Codepoint Escape Syntax
$ ~/bin/php-7.0/bin/php -r 'echo "Un chat : \u{1F638} \n";'
Un chat : 😸
Et aussi
Abstract Syntax Tree
Remove alternative PHP tags
Integer Semantics
ZPP Failure On Overflow
Quelques BC-breaks
Version majeure !
Une version majeure, c'est le moment où on peut se permettre de casser quelques trucs.
C'est pas non plus une obligation ;-)
Et limiter le nombre de trucs qui cassent facilitera grandement la migration !
Ménage !
Suppression des fonctionnalités obsolètes
ext/ereg
et ext/mysql
Assignment of new by reference
Scoped calls of non-static methods from incompatible $this context
dl()
on fpm-fcgi
set_magic_quotes_runtime()
et magic_quotes_runtime()
Ménage !
Suppression des fonctionnalités obsolètes
Série d'autres fonctions
Directive ini xsl.security_prefs
Directives ini d'encodage pour mbstring
et iconv
Paramètre $is_dst
de mktime()
et gmmktime()
Commentaires en #
dans les fichiers .ini
Ménage !
Suppression des fonctionnalités obsolètes
Noms de catégories sous forme de chaînes de caractères pour setlocale()
Uploads curl non-sûrs
Modificateur /e
de preg_replace()
...
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
Ménage !
Suppression d'extensions
ext/imap
et ext/mcrypt
ont été conservées, mais sont basées sur des bibliothèques non maintenues !
Performances ?
C'est forcément une question qui se pose à un moment ou à un autre ;-)
phpng
Ensemble d'optimisations orientées performances
Fast Parameter Parsing API
Fix "foreach" behavior
Wordpress : 26.76 sec → 12.63 sec
micro_bench.php
: 8.1 sec → 4.8 sec
PHP 7
Mais pas...
On ne peut pas tout avoir non plus...
Même si certains auraient aimé avoir certaines features ^^
PHP 5.7
Pas de version 5.7 prévue.
PHP 5.7 aurait pu aider à la migration, en levant des avertissement pour ce qui va casser.
Mais ça représente du boulot pour les mainteneurs.
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");
Safe Casting Functions
Levée d'exception (ou retour de null
) en cas d'échec de validation / cast.
to_int()
et try_int()
to_float()
et try_float()
to_string()
et try_string()
Safe Casting Functions
Aurait pu être sympa... Mais touche au typage, donc sujet difficile (et n'y touche pas assez pour recevoir masse de soutien non plus)
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 !
Default constructors / Default parent constructors
class MaClasse extends ParentSansConstructeur {
public function __construct() {
// Ceci serait possible :
parent::__construct();
}
}
$obj = new MaClasse();
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.
Processus
Comment est-ce que PHP s'améliore ?
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
"Top" depuis Oct 2012
Contributeurs
Des contributeurs qui sont là depuis longtemps.
D'autres qui sont arrivés récemment.
Certains arrivés puis repartis.
D'autres qui ne commitent plus mais sont encore présents.
Là aussi, un projet vivant, avec des arrivées, des départs, des gens qui restent, certains qui commitent beaucoup et d'autres moins
Attention
Github n'est qu'un miroir du repository officiel.
Stats présentées précédemment ne sont donc pas forcément 100% justes
Mais doivent donner une bonne tendance, tout de même
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
PHP 7 en approche !
4 RFCs se terminent cette semaine
Nuit 19-20 février : 4 nouveau threads de RFCs
Aujourd'hui : Group Use Declarations
use Doctrine\Common\Collections\Expr\{
Comparison, Value, CompositeExpression
};
use Symfony\Component\Console\{
Helper\Table,
Question\ChoiceQuestion as Choice,
Question\ConfirmationQuestion,
};
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 Apero PHP 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
Ca, c'est mon google doc de suivi des RFCs... Y'en a un paquet :-D
AFUP
php-internals@afup.org
Une ML où on discute entre membres AFUP.
Inscription depuis l'admin de votre compte ;-)
AFUP
962+ mails depuis août 2014 !
Ca en fait LA ML AFUP la plus active \o/
AFUP
30+ avis sur internals@
En environ six mois, on en est à une trentaine 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 !
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
Plusieurs types de développeurs
Débutants
Amateurs
Utilisateurs et intégrateurs de logiciels
Développeurs (PHP) full-time
Des besoins très différents
Certains s'expriment plus que d'autres
Communautés Drupal, symfony, ...
Ca fait encore des points de vue différents !
Si vous avez des propositions de "types d'utilisateurs", faites moi signe ! J'ai un blog-post en préparation depuis l'été dernier, sur ce sujet...
Group Use Declarations
Parfait exemple ;-)
Proposition en fin de vote (aujourd'hui)
Pas de consensus sur notre ML
Débat : IDE, ou pas IDE ?
Même entre membres AFUP, il n'est pas toujours évident d'être d'accord.
Et pourtant, nous faisons à peu près tous partie d'un même "type" d'utilisateurs de PHP !
Expectations
Autre exemple ;-)
Proposition en fin de vote (demain)
Large majorité de -1 sur notre ML
Immense majorité de +1 sur les votes :
20 "oui" avec exceptions personnalisées
11 "oui" sans exception personnalisée
1 seul et unique "non"
Pourquoi ?
Sur celle-ci, on est à l'opposé des votes !
On a dû se concentrer sur un point ; et peut-être pas sur l'ensemble de la RFC ?
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
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
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...
PHP 7
Et peut-être, donc ?
On a parlé ce qui arrivait, de ce qui n'arrivait pas... Reste ce qui arrivera peut-être.
Scalar Type Declarations v0.5
function ma_fonction_01(int $entier)
{
var_dump($entier);
}
Appel avec une chaîne
Catchable fatal error: Argument 1 passed to
ma_fonction_01() must be of the type integer, string given
Mode souple ou strict à l'appel.
Coercive Types for Function Arguments
Approche intermédiaire
entre typage souple et strict
Migration, pour les fonctions internes
7.0 : E_DEPRECATED
8.0 : E_RECOVERABLE_ERROR
Et encore ?
Improve array to string conversion
Move pecl_sync to core
Exceptions in the engine
UString
Introduce script only include/require
Et encore ?
Anonymous Classes
Comparable
Generator Return Expressions
Context Sensitive lexer
pecl_http
Bientôt le feature-freeze !
Feature-freeze en mars pour PHP 7.0.
Il ne reste plus longtemps pour pouvoir ajouter des fonctionnalités !
Et donc, c'est le rush
Contribuez !
Photo par ~Zoe~ sur Flickr, CC-BY-NC-ND.
PHP, Open-source, évolution par les contributions
Langage qui met à manger sur la table ?
C'est le moment !
Participez aux discussions
Sur la ML AFUP
Et/ou sur internals@
Participez au projet
Testez !!!
Complétez la documentation ou contribuez du code
Évangélisez
Même si vous ne codez pas en C, il y a plein d'autres façons de contribuer
gcov.php.net
Le code coverage gagnerait à être amélioré, par l'ajout de tests
bugs.php.net
Ou faire un peu de tri sur les bugs ouverts, ça aiderait !
Ou les compléter avec des exemples de code (court) pour reproduire.
Lien "random" en haut ;-)
Le futur ?
Demain : PHP 7.0
Puis PHP 7.1, PHP 7.2, ...
...
Et PHP 8
PHP 5.0 : 2004
PHP 5.1 : 2005
PHP 5.2 : 2006
PHP 5.3 : 2009
PHP 5.6 : 2014
Pas forcément 10 ans à attendre pour PHP 8
Contribuez !
Oui, encore une fois !