+33 6 51 85 78 28 cedrick@benittah.com

PHP 7 vs PHP 5.x : quelles sont les différences ?

Le développement de PHP suit son court et il a été décidé en 2014 qu’il sauterait une version pour passer de la version 5.x à la version 7. Le processus de développement est relativement long. Si vous n’en avez pas encore entendu parlé, il est temps de rattraper votre retard.

Pourquoi PHP est-il passé de la version 5 à la version 7 ?

En juillet 2014, les contributeurs du projet PHP se sont prononcés sur un passage direct de PHP 5.x à PHP 7.x (voir le wiki du projet). En fait, PHP 6 a bien existé, mais il est resté à l’état de chantier. Cette version devait conduire à l’intégration de l’Unicode au langage (en vue de faciliter la manipulation de texte dans différentes langues). Mais face aux trop nombreuses difficultés techniques, l’initiative a été abandonnée. Les autres évolutions envisagées dans PHP 6 ont depuis été réintégrées à de nouvelles versions intermédiaires (PHP 5.3 et 5.4). C’est pour éviter la confusion qu’est née alors cette idée de passer directement à la version 7.

Enfin pour les partisans de PHP 7, le chiffre 6 a aussi trop souvent été associé à la notion d’échec dans le monde des environnements de développement web : « PHP 6 a été un échec ; Perl 6 a été un échec. Il est en fait associé à l’échec, même en dehors du monde des langages dynamiques :MySQL 6 existait, mais n’a jamais été publié. »

Sortie de PHP 7

La finalisation et l’implémentation des dernières fonctionnalités vont se faire entre Mars et Juin 2015. Une première version RC (Release Candidate) sera publiée courant Juin / Juillet 2015. Vous pourrez finalement enfin profiter de cette nouvelle version à partir d’Octobre, voire Novembre 2015.

2015

Amélioration des performances

PHP 7 sera basé sur PHPNG (PHP Next-Gen) qui a été initialement développé par Zend pour améliorer son framework.

Le gain de performance est énorme. Il va de 25% à 70% selon les applications que vous utilisez. Ce gain se fait sans modifier une seule ligne de code. Il suffira de mettre à jour la version PHP de votre serveur pour en bénéficier.

Voici un exemple en nombre de requêtes par seconde pour la nouvelle version sera capable d’avaler face à son prédécesseur :

php7-ameliorations

Les performances sont en constante évolution. Quand PHPNG a été publié pour la première fois, il fallait environ 9.4 milliards d’instructions CPU pour afficher la page d’accueil de WordPress. Actuellement, il n’en faut déjà plus que 2.6 milliards. C’est 72% de moins.

wp-php7

Nouveautés de PHP 7

Nouvel opérateur <=>

PHP 7 introduit un nouvel opérateur : expr <=> expr

Il retourne 0 si les 2 expressions sont égales, 1 si l’expression de gauche est plus grande et -1 si l’expression de droite est plus grande.

Voici quelques exemples :

echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1

Il peut notamment être utilisé pour classer une liste d’éléments.

if (($handle = fopen("people.csv", "r")) !== FALSE) {
    while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
         $data[] = $row;
    }
    fclose($handle);
}

usort($data, function ($left, $right) {
     return $left[1] <=> $right[1];
});

Déclaration des fonctions

Il sera possible de définir le type de valeur que doit retourner la fonction.

function foo(): array {
    return [];
}

function foo(): DateTime { 
    return null; // incorrect
}

Sémantique des entiers

Selon les plateformes qui exécutent PHP, les valeurs de certains entiers sont différents. L’idée est ici d’uniformiser les valeurs de ces entiers.

var_dump((int)NAN);
// Avant: int(-9223372036854775808)
// Après: int(0)

var_dump((int)INF);
// Avant: int(-9223372036854775808)
// Après: int(0)

var_dump(1 << -2);
// Avant: int(4611686018427387904)
// Après: bool(false) and E_WARNING

var_dump(8 >> 64);
// Avant: int(8)
// Après: int(0)

Suppression de tag

Certains tags vont être supprimés. J’en ai personnellement utilisé certains de cette liste. C’est de l’histoire ancienne.

  • <% tag d’ouverture
  • <%= tag d’ouverture avec echo
  • %> tag de fermeture
  • (<script\s+language\s*=\s*(php| »php »|’php’)\s*>)i tag d’ouverture
  • (</script>)i tag de fermeture

Plus de support de l’hexadécimal

Il est possible actuellement d’utiliser des nombres hexadécimaux, sous forme de string, qui sont considérés comme des int. Par contre, quand on compare ces nombres avec de vrais int, le résultat est parfois farfelue. Encore une fois pour harmoniser tout ça, les hexadécimaux passent à la trappe.

var_dump((int)   "0x123"); // int(0)
var_dump((float) "0x123"); // float(0)

$str = '0x123';
if (!is_numeric($str)) {
    throw new Exception('Pas un nombre');
}
// l'exception n'est pas levée !
$n = (int) $str; // 0

var_dump('0x123' == '291'); // TRUE
var_dump((int) '0x123' == (int) '291'); // FALSE

Nouvel opérateur ??

Cet opérateur permet de gagner du temps lorsqu’on teste si une variable existe. Si elle existe, le contenu de cette variable est renvoyée, sinon l’opérateur renvoi une chaîne prédéfinie.

// $prenom prend la valeur du paramètre GET si il existe, sinon il devient 'personne'
$prenom = $_GET['user'] ?? 'personne';

$x = NULL;
$y = NULL;
$z = 3;
var_dump($x ?? $y ?? $z); // int(3)

Modification du switch case

Avant, il était tout à fait possible d’avoir plusieurs ‘default’ dans un switch case. Aucune erreur n’était affichée alors que maintenant, votre script lèvera une erreur de type E_COMPILE_ERROR lors de son exécution.

switch ($expr) {
  default:
    jamaisExecute();
    break;
  default:
    execute();
}

D’autres modifications ont été implémentées. Si vous souhaitez voir la liste complète pour vous préparer, rendez-vous sur cette page.