Déclarations de type scalaire

Les déclarations de type des paramètres de fonction en PHP 7 peuvent désormais être des types scalaires. En PHP 5, seuls les noms de classe, les interfaces, array ou callable (depuis PHP 5.4, c'est-à-dire les fonctions, y compris les fonctions anonymes) étaient autorisés. Désormais, string, int, float et bool peuvent également être utilisés.

<?php
// 强制模式
function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}

var_dump(sumOfInts(2, '3', 4.1));

L'exemple ci-dessus affichera :

int(9)

Notez que le problème du mode strict mentionné ci-dessus s'applique également ici : en mode coercitif (par défaut, c'est-à-dire conversion de type forcée), les paramètres qui ne correspondent pas aux attentes sont quand même convertis ; en mode strict, une TypeError fatale est déclenchée.


Déclarations de type de retour

PHP 7 ajoute la prise en charge des déclarations de type de retour. Comme pour les déclarations de type des paramètres, les déclarations de type de retour spécifient le type de la valeur de retour d'une fonction. Les types disponibles sont les mêmes que ceux disponibles dans les déclarations de paramètres.

<?php

function arraysSum(array ...$arrays): array
{
    return array_map(function(array $array): int {
        return array_sum($array);
    }, $arrays);
}

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

L'exemple ci-dessus affichera :

Array
(
    [0] => 6
    [1] => 15
    [2] => 24
)

Opérateur de coalescence NULL

Comme il y a de nombreux cas où les expressions ternaires et isset() sont utilisées ensemble dans le code quotidien, l'opérateur de coalescence NULL renvoie la valeur de la variable elle-même si elle existe et n'est pas NULL ; sinon, il renvoie son deuxième opérande.

L'exemple est le suivant :

<?php
// 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值
$username = $_GET['user'] ?? 'nobody';
// 类似的三元运算符
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
?>

Opérateur vaisseau spatial (opérateur de comparaison combiné)

L'opérateur vaisseau spatial est utilisé pour comparer deux expressions. Il renvoie -1, 0 ou 1 lorsque $a est respectivement supérieur, égal ou inférieur à $b.

L'exemple est le suivant :

<?php
// 整型
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// 浮点型
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
 
// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>

Tableaux constants avec define()

L'exemple est le suivant :

<?php
define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[1]; // 输出 "cat"
?>

Classes anonymes

L'instanciation d'une classe anonyme avec new class est désormais prise en charge. L'exemple est le suivant :

<?php
interface Logger {
    public function log(string $msg);
}

class Application {
    private $logger;

    public function getLogger(): Logger {
         return $this->logger;
    }

    public function setLogger(Logger $logger) {
         $this->logger = $logger;
    }
}

$app = new Application;
$app->setLogger(new class implements Logger {
    public function log(string $msg) {
        echo $msg;
    }
});

var_dump($app->getLogger());
?>

L'exemple ci-dessus affichera :

object(class@anonymous)#2 (0) {
}

Syntaxe d'échappement de point de code Unicode

Elle accepte un point de code Unicode sous forme hexadécimale et affiche une chaîne en encodage UTF-8 entourée de guillemets doubles ou d'un heredoc. Tout point de code valide est accepté, et les zéros non significatifs peuvent être omis.

echo "\u{aa}";
echo "\u{0000aa}";
echo "\u{9999}";

L'exemple ci-dessus affichera :

ª
ª (same as before but with optional leading 0's)
香

Closure::call()

Closure::call() bénéficie désormais de meilleures performances, permettant de lier temporairement une closure à un objet et de l'appeler de façon concise.

<?php
class A {private $x = 1;}

// Pre PHP 7 代码
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
echo $getX();

// PHP 7+ 代码
$getX = function() {return $this->x;};
echo $getX->call(new A);

L'exemple ci-dessus affichera :

1
1

Filtrage pour unserialize()

Cette fonctionnalité vise à fournir un moyen plus sûr de décompresser des données non fiables. Elle empêche une éventuelle injection de code grâce à une approche par liste blanche.

<?php

// 转换对象为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => false]);

// 转换对象为 __PHP_Incomplete_Class 对象,除了 MyClass 和 MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);

// 默认接受所有类
$data = unserialize($foo, ["allowed_classes" => true]);

IntlChar

La classe IntlChar nouvellement ajoutée vise à exposer davantage de fonctionnalités d'ICU. Cette classe définit de nombreuses méthodes statiques pour manipuler des caractères Unicode dans plusieurs jeux de caractères.

<?php
printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));

L'exemple ci-dessus affichera :

10ffff
COMMERCIAL AT
bool(true)

Pour utiliser cette classe, veuillez d'abord installer l'extension Intl.


Expectations

Expectations est un moyen rétrocompatible d'améliorer l'assert() précédent. Il rend l'activation des assertions en environnement de production sans coût, et offre la possibilité de lever des exceptions spécifiques lorsque les assertions échouent.

<?php
ini_set('assert.exception', 1);

class CustomError extends AssertionError {}

assert(false, new CustomError('Some error message'));
?>

L'exemple ci-dessus affichera :

Fatal error: Uncaught CustomError: Some error message

Amélioration de use

Les classes, fonctions et constantes importées depuis le même espace de noms peuvent désormais être importées en une seule fois à l'aide d'une seule instruction use.

<?php

//  PHP 7 之前版本用法
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// PHP 7+ 用法
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
?>


Amélioration des générateurs

La fonctionnalité de Generator a été améliorée, ce qui permet de mettre en œuvre de nombreuses fonctionnalités avancées.

<?php
<?php

function gen()
{
    yield 1;
    yield 2;

    yield from gen2();
}

function gen2()
{
    yield 3;
    yield 4;
}

foreach (gen() as $val)
{
    echo $val, PHP_EOL;
}

?>

L'exemple ci-dessus affichera :

1
2
3
4

Division entière

Une nouvelle fonction de division entière intdiv() a été ajoutée. Exemple d'utilisation :

<?php
var_dump(intdiv(10, 3));
?>

L'exemple ci-dessus affichera :

int(3)

Pour plus d'informations, veuillez consulter :http://www.example.com/php/php7-new-features.html。