sans la complexité d’implémenter l’interface Iterator • Réduit la mémoire requise lors de la construction d’un jeu de données http://php.net/manual/en/language.generators.overview.php
il est possible d’ajouter un bloc finally, dont le code sera exécuté quel que soit le résultat try { // Code à tester } catch (Exception $e) { // Code en cas d'exception } finally { // Code exécuté dans tous les cas } http://php.net/manual/en/language.exceptions.php
FQN (Fully Qualified Name) d’une classe, grâce à ::class namespace Name\Space; class ClassName {} echo ClassName::class; // Name\Space\ClassName" use App\Security\Hasher; $this->prophesize(Hasher::class); http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class
type que des variables function always_empty() { return ''; } if (empty(always_empty())) { // Ce code sera exécuté } http://php.net/manual/en/function.empty.php#refsect1-function.empty-parameters
à propos du hachage fourni • password_hash() — Crée une clé de hachage pour un mot de passe • password_needs_rehash() — Vérifie que le hachage fourni est conforme à l'algorithme et aux options spécifiées • password_verify() — Vérifie qu'un mot de passe correspond à un hachage http://php.net/manual/en/book.password.php
tableaux et des objets Traversable, dans la liste d’arguments Décompression des arguments avec … function add($a, $b, $c) { return $a + $b + $c; } $operators = [2, 3]; echo add(1, ...$operators); // 6 http://php.net/manual/en/migration56.new-features.php#migration56.new-features.splat
et use function namespace Name\Space { const FOO = 42; function fn() { echo "Hello"; } } namespace { use const Name\Space\FOO; use function Name\Space\fn; echo FOO; // 42 fn(); // Hello } http://php.net/manual/en/language.namespaces.importing.php
été remplacées par des levées d’exceptions (ParseError, TypeError…) • Ces exceptions héritent toutes de la classe Error, qui elle-même implémente l’interface Throwable • Throwable est la nouvelle interface de base pour tout objet pouvant être lancé par le mot clé throw http://php.net/manual/en/language.errors.php7.php
Error vont remonter jusqu’au premier bloc catch • Si aucun bloc catch n’a été trouvé, le gestionnaire d’erreur défini par set_exception_handler() sera appelé • Si aucun gestionnaire d’erreur n’a été défini et qu’il n’y a pas de gestionnaire par défaut, alors une erreur fatale — à l’ancienne – sera lancée http://php.net/manual/en/language.errors.php7.php
fonction Ce typage implique un transtypage de la valeur retournée Déclaration des types de retour function greet(string $name): string { return "Hello $name!"; } var_dump(greet('World')); // string(12) "Hello World!" function sum($a, $b): float { return $a + $b; } var_dump(sum(1, 2)); // float(3) http://php.net/manual/en/functions.returning-values.php#functions.returning-values.type-declaration
qui existe et différente de NULL Opérateur d’union nul (null coalescing) $username = $_GET['user'] ?? 'anonymous'; // Est l'équivalent de : $username = isset($_GET['user']) ? $_GET['user'] : 'anonymous'; // Il peut être chaîné : $username = $_GET['user'] ?? $_POST['user'] ?? 'anonymous'; http://php.net/manual/en/language.operators.comparison.php
est un tableau Définition de constante avec un tableau define('ANIMALS', [ 'dog', 'cat', 'bird', ]); echo ANIMALS[1]; // "cat" http://php.net/manual/en/language.constants.syntax.php
groupées lors de l’import Déclarations groupées avec use // Avant PHP 7 use Name\Space\ClassA; use Name\Space\ClassB as B; use function Name\Space\fnA; use function Name\Space\fnB; use const Name\Space\CONST_A; use const Name\Space\CONST_B; // Après PHP 7 use Name\Space\{ClassA, ClassB as B}; use function Name\Space\{fnA, fnB}; use const Name\Space\{CONST_A, CONST_B}; http://php.net/manual/en/language.namespaces.importing.php#language.namespaces.importing.group
new class, lorsque de simples objets uniques ont besoin d’être créés Classes anonymes $logger = new class { public function log($msg) { echo $msg; } }; var_dump($logger); // object(class@anonymous)#1 (0) {} $logger->log('Hello world'); // Hello world http://php.net/manual/en/language.oop5.anonymous.php
après avoir passé tous les yield du générateur return final d’un générateur $generator = (function () { yield 1; yield 2; return 'The end!'; })(); foreach ($generator as $value) { echo "$value "; } // 1 2 echo $generator->getReturn(); // "The end!" http://php.net/manual/en/generator.getreturn.php
ou d’un tableau Délégation du générateur avec yield from function count_to_ten() { yield 1; yield from new ArrayIterator([2, 3, 4]); yield from five_to_ten(); } function five_to_ten() { yield from [5, 6, 7, 8, 9, 10]; } foreach (count_to_ten() as $num) { echo "$num "; } // 1 2 3 4 5 6 7 8 9 10 http://php.net/manual/en/language.generators.syntax.php#control-structures.yield.from
Il n’est donc plus possible d’utiliser les fonctions associées, comme : mysql_connect(), mysql_query(), mysql_fetch_array()... Alternatives : PDO ou mysqli http://php.net/manual/en/ref.mysql.php - http://php.net/manual/en/ref.mssql.php
a été supprimé Il n’est donc plus possible d’utiliser les fonctions associées, comme : ereg(), ereg_replace(), split()... Alternative : les expressions rationnelles Perl (PCRE) http://php.net/manual/en/ref.regex.php
nullable en le préfixant de ? Ajout du nullable avec ? function fn(?string $name) { var_dump($name); } fn('Hello'); // string(5) "Hello" fn(null); // NULL fn(); // Fatal error: Uncaught ArgumentCountError: // Too few arguments to function fn() http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration
du type de retour void function no_return(): void { // valide } function empty_return(): void { return; // valide } function returns_one(): void { return 1; // Fatal error: A void function must not return a value } function returns_null(): void { return null; // Fatal error: A void function must not return a value } https://wiki.php.net/rfc/void_return_type
string Offset de string négatif $string = 'bar'; echo "Le dernier caractère de '$string' est '$string[-1]'."; // "Le dernier caractère de 'bar' est 'r'." http://php.net/manual/en/language.types.string.php#language.types.string.substr
à une fonction personnalisée où il manque des arguments Exception lors d’un manque d’argument function fn($param) { var_dump($param); } fn(); // Avant PHP 7.1 : // Warning: Missing argument 1 for fn() // Après PHP 7.1 : // Fatal Error: Uncaught ArgumentCountError: // Too few arguments to function fn() http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.too-few-arguments-exception
les microsecondes DateTime gère les microsecondes var_dump(new DateTime() == new DateTime()); // Avant PHP 7.1 : bool(true) // Après PHP 7.1 : bool(false) http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.datetime-microseconds
de PHPUnit 6.0 ont été renommées pour utiliser les namespaces // Avant PHPUnit 6.0 class SerialiserTest extends \PHPUnit_Framework_TestCase { public function testSerialize() {} } // Depuis PHPUnit 6.0 use PHPUnit\Framework\TestCase; class SerialiserTest extends TestCase { public function testSerialize() {} } https://thephp.cc/news/2017/02/migrating-to-phpunit-6
à pré-charger, en passant des headers HTTP Link • Utile pour le “Server Push” HTTP/2 • Intègre les helpers Twig link(), preload(), dns_prefetch(), preconnect(), prefetch(), prerender() http://symfony.com/blog/new-in-symfony-3-3-weblink-component
dépassé • Objectif : faciliter la prise en main de webpack https://www.npmjs.com/package/@symfony/webpack-encore Symfony ne seraient-ils pas en train de se disperser ? https://symfony.com/blog/introducing-webpack-encore-for-asset-management
un temps déterminé pour éviter les traitements parallèles $store = new MemcachedStore($memcached, $ttl) $factory = new Factory($store); $lock = $factory->createLock('pdf-generation'); if ($lock->acquire()) { // The resource "pdf-generation" is locked. $lock->release(); } http://symfony.com/blog/new-in-symfony-3-3-lock-component
Plus standard que le fichier parameters.yml • bin/console --env=prod devient SYMFONY_ENV=prod bin/console • 1 seul fichier de contrôleur public/index.php configuré par nginx