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.

Qui suis-je ?

PHP 7

En approche !

Timeline

  • Dernières RFC visant PHP 7.0
    → Mars 2015 !
  • Terminer les développements → Juin
  • Releases Candidates → Octobre
  • PHP 7.0
    → Octobre 2015 !

Une nouvelle version
majeure !

Null Coalesce Operator


$username = $_GET['user'] ?? 'nobody';
                    

$model = Model::get($id) ?? $default_model;
                    

function foo() {
    echo "executed!", PHP_EOL;
}
var_dump(true ?? foo());
                    

Return Types


function add($a, $b) : DateTime {
    return $a + $b;
}
                    

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
                    
TIE Fighter

In a few months, in our galaxy...

Not this TIE Fighter ;-)

Not this TIE Fighter ;-)

<=>

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);
}
                    

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 !

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/mssql
  • ext/sybase_ct

ext/imap et ext/mcrypt ont été conservées, mais sont basées sur des bibliothèques non maintenues !

Performances ?

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...

PHP 5.7

Pas de version 5.7 prévue.

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()

Loop... or


while ($cond) {
    // loop body
}
or {
    // did not enter while loop
}
                    

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;
    }
}
                    

Using objects as keys


class Plop {
    public function __hash() {
        return 'une chaine'; // ou un entier
    }
}

$obj = new Plop();
$array = [
    $obj => "une valeur",
];

                    

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);
                    

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

Nombre de commits

Nombre de commits

"Top" depuis le début

Top contributeurs depuis le début

"Top" depuis Oct 2012

Top contributeurs depuis octobre 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.

Attention

Github n'est qu'un miroir du repository officiel.

Espaces d'échanges

  • internals@
  • Des RFCs
  • Un processus de votes
  • Twitter, reddit, blog-posts, ... non officiels !

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.

Pas tant de trolls que ça,
en fait !

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,
};
                    

Moi, certains matins ^^

Discussions

  • Échanges sur internals@
  • Avant de créer une RFC ?
  • Autour d'une RFC
  • Pendant la phase de votes

Points de vue

  • Conservateurs
  • Progressistes
  • Égoistes ?
  • ...

Points de vue

  • Développeurs de fonctionnalités
  • Utilisateurs de PHP
  • Mainteneurs de PHP
  • ...

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
    • ...

Votes

  • Par défaut : 50%+1
  • Modification du langage : 2/3
  • Min. 2 semaines après RFC
  • Qui peut voter ?
  • Durée des votes ?

Et à l'AFUP ?

Et à l'AFUP ?

  • Une mailing-list
  • Des discussions
  • Un post sur internals@
  • Un blog-post
Mon tableau de suivi

AFUP

php-internals@afup.org

AFUP

962+ mails depuis août 2014 !

AFUP

30+ avis sur internals@

AFUP

php-internals.afup.org

La communauté

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

Group Use Declarations

Parfait exemple ;-)

  • Proposition en fin de vote (aujourd'hui)
  • Pas de consensus sur notre ML
  • Débat : IDE, ou pas IDE ?

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 ?
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 ?

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 ?

PHP 7

Et peut-être, donc ?

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 !

Contribuez !

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
code coverage de la branche master

gcov.php.net

Plein de bugs ouverts !

bugs.php.net

Le futur ?

Demain : PHP 7.0

  • Puis PHP 7.1, PHP 7.2, ...
  • ...
  • Et PHP 8

Contribuez !

Oui, encore une fois !

Merci ;-)

blog.pascal-martin.fr
@pascal_martin