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/mysqlAssignment of new by reference 
                        Scoped calls of non-static methods from incompatible $this context 
                        dl() on fpm-fcgiset_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/aolserversapi/apachesapi/apache_hookssapi/apache2filtersapi/caudiumsapi/continuitysapi/isapi 
                    
                 
                
                    Ménage ! 
                    Suppression de SAPIs
                    
                        sapi/miltersapi/phttpdsapi/pi3websapi/roxensapi/thttpdsapi/tuxsapi/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 exempleValable 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, 
                    
                        
                            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 propositionPrincipe 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 !