Maison  >  Article  >  développement back-end  >  Résumé des nouvelles fonctionnalités de syntaxe dans PHP7.0 et php7.1

Résumé des nouvelles fonctionnalités de syntaxe dans PHP7.0 et php7.1

不言
不言original
2018-08-07 11:15:192892parcourir

Le contenu de cet article est un résumé des nouvelles fonctionnalités de syntaxe de PHP7.0 et php7.1. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Nouvelles fonctionnalités de php7.0 :

1. ?)

Jugement simplifié

$param = $_GET['param'] ?? 1;

équivaut à :

$param = isset($_GET['param']) ? $_GET['param'] : 1;

2. Déclaration de type de variable

Deux modes : obligatoire (par défaut) et mode strict
Types : string, int, float et bool

function add(int $a) { 
    return 1+$a; 
} 
var_dump(add(2);

Déclaration de type de valeur de retour

Les fonctions et les fonctions anonymes peuvent spécifier le type de valeur de retour

function show(): array { 
    return [1,2,3,4]; 
}

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

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

L'opérateur de 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. Le principe de comparaison suit les règles de comparaison habituelles de PHP.

// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

5. Classes anonymes

Prend désormais en charge l'instanciation d'une classe anonyme via une nouvelle classe, qui peut être utilisée pour remplacer certaines "désintégrations après utilisation" Définition complète de la classe. .

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

6. Syntaxe de traduction du point de code Unicode

Cela accepte un point de code Unicode au format hexadécimal et imprime un UTF entouré de guillemets doubles ou au format codé heredoc -8. chaîne. Tout point de code valide est accepté et le premier 0 peut être omis.

 echo "\u{9876}"

Sortie de l'ancienne version : u{9876}
Entrée de la nouvelle version : top

7. >Closure ::call() a désormais de meilleures performances et constitue un moyen court et concis de lier temporairement une méthode à une fermeture sur un objet et de l'appeler.

8. Fournir un filtrage pour unserialize()
class Test {
    public $name = "lixuan";
}

//PHP7和PHP5.6都可以
$getNameFunc = function () {
    return $this->name;
};
$name = $getNameFunc->bindTo(new Test, &#39;Test&#39;);
echo $name();
//PHP7可以,PHP5.6报错
$getX = function () {
    return $this->name;
};
echo $getX->call(new Test);

Cette fonctionnalité est conçue pour fournir un moyen plus sûr de décompresser les données peu fiables. Il empêche l’injection potentielle de code via la liste blanche.

9. IntlChar
//将所有对象分为__PHP_Incomplete_Class对象
$data = unserialize($foo, ["allowed_classes" => false]);
//将所有对象分为__PHP_Incomplete_Class 对象 除了ClassName1和ClassName2
$data = unserialize($foo, ["allowed_classes" => ["ClassName1", "ClassName2"]);
//默认行为,和 unserialize($foo)相同
$data = unserialize($foo, ["allowed_classes" => true]);

La classe IntlChar nouvellement ajoutée est conçue pour exposer davantage de fonctions ICU. Cette classe elle-même définit de nombreuses méthodes statiques pour exploiter les caractères Unicode à partir de plusieurs jeux de caractères. Intl est une extension Pecl. Elle doit être compilée en PHP avant utilisation. Vous pouvez également apt-get/yum/port installer php5-intl

La routine ci-dessus affichera :

10ffff <.>COMMERCIAL AT
printf(&#39;%x&#39;, IntlChar::CODEPOINT_MAX);
echo IntlChar::charName(&#39;@&#39;);
var_dump(IntlChar::ispunct(&#39;!&#39;));
bool(true)



10. Expectation

Expectation est une méthode qui utilise à l'envers et améliore l'assert() précédente. Cela rend l'activation des assertions rentable en production et offre la possibilité de lancer des exceptions spécifiques lorsque les assertions échouent. L'ancienne version de l'API continuera d'être maintenue à des fins de compatibilité, et assert() est désormais une construction de langage qui permet au premier argument d'être une expression, et non seulement une chaîne à calculer ou un booléen à tester.

La routine ci-dessus affichera :

Erreur fatale : Uncaught CustomError : un message d'erreur

ini_set(&#39;assert.exception&#39;, 1);
class CustomError extends AssertionError {}
assert(false, new CustomError(&#39;Some error message&#39;));

11. Déclarations d'utilisation de groupe

Les classes, fonctions et constantes importées à partir du même espace de noms peuvent désormais être importées en même temps avec une seule instruction d'utilisation.

12. intp()

//PHP7之前
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;

// PHP7之后
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};

reçoit deux paramètres comme dividende et diviseur, et renvoie la partie entière de leur résultat de division.

Output int(3)

var_dump(intp(7, 2));
13. CSPRNG

Ajoutez deux nouvelles fonctions : random_bytes() et random_int(). production d'entiers et de chaînes protégés. Bref, les nombres aléatoires deviennent sûrs. random_bytes — chaîne pseudo-aléatoire protégée cryptographiquement random_int — entier pseudo-aléatoire protégé cryptographiquement


14, preg_replace_callback_array()

Une nouvelle fonction preg_replace_callback_array( ) a été ajouté. L'utilisation de cette fonction peut rendre le code plus élégant lors de l'utilisation de la fonction preg_replace_callback(). Avant PHP7, la fonction de rappel était appelée pour chaque expression régulière, et la fonction de rappel était contaminée sur certaines branches.

15. Options de session

Désormais, la fonction session_start() peut recevoir un tableau en tant que paramètre, qui peut remplacer les éléments de configuration de session dans php.ini. Par exemple, définissez cache_limiter sur privé et fermez la session immédiatement après l'avoir lue.


16. Valeur de retour du générateur

session_start([&#39;cache_limiter&#39; => &#39;private&#39;,
               &#39;read_and_close&#39; => true,
]);

Introduit le concept de générateur en PHP5.5. Chaque fois que la fonction génératrice est exécutée, elle obtient une valeur identifiée par rendement. En PHP7, lorsque l'itération du générateur est terminée, la valeur de retour de la fonction génératrice peut être obtenue. Obtenu via Generator::getReturn().

Le résultat est : 1 2 3 a

function generator() {
    yield 1;
    yield 2;
    yield 3;
    return "a";
}

$generatorClass = ("generator")();
foreach ($generatorClass as $val) {
    echo $val ." ";

}
echo $generatorClass->getReturn();
Introduire d'autres générateurs dans le générateur

Vous pouvez introduire un autre générateur dans le générateur Pour un ou plusieurs générateurs, écrivez simplement rendement depuis functionName1

Sortie : 1 2 3 4 5 6

function generator1() {
    yield 1;
    yield 2;
    yield from generator2();
    yield from generator3();
}

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

function generator3() {
    yield 5;
    yield 6;
}

foreach (generator1() as $val) {
    echo $val, " ";
}
Définir un tableau constant.

Nouvelles fonctionnalités de php7.1 :

define(&#39;ANIMALS&#39;, [&#39;dog&#39;, &#39;cat&#39;, &#39;bird&#39;]);
echo ANIMALS[1]; // outputs "cat"

Type nullable

les types peuvent désormais être nuls. Lorsque cette fonctionnalité est activée, les paramètres transmis ou le résultat renvoyé par la fonction seront soit le type donné, soit nul. Vous pouvez rendre un type nullable en le faisant précéder d'un point d'interrogation.

La routine ci-dessus affichera :

string(5) "tpunt"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...

2、Void 函数

在PHP 7 中引入的其他返回值类型的基础上,一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,null 不是一个合法的返回值。

function swap(&$left, &$right) : void {
    if ($left === $right) {
        return;
    }
    $tmp = $left;
    $left = $right;
    $right = $tmp;
}
$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);

以上例程会输出:

null
int(2)
int(1)

试图去获取一个 void 方法的返回值会得到 null ,并且不会产生任何警告。这么做的原因是不想影响更高层次的方法。

3、短数组语法 Symmetric array destructuring

短数组语法([])现在可以用于将数组的值赋给一些变量(包括在foreach中)。 这种方式使从数组中提取值变得更为容易。

$data = [
    [&#39;id&#39; => 1, &#39;name&#39; => &#39;Tom&#39;],
    [&#39;id&#39; => 2, &#39;name&#39; => &#39;Fred&#39;],
];
while ([&#39;id&#39; => $id, &#39;name&#39; => $name] = $data) {
    // logic here with $id and $name
}

 4、类常量可见性

现在起支持设置类常量的可见性。

class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

5、iterable 伪类

现在引入了一个新的被称为iterable的伪类 (与callable类似)。 这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象。 至于子类,当用作参数时,子类可以收紧父类的iterable类型到array 或一个实现了Traversable的对象。对于返回值,子类可以拓宽父类的 array或对象返回值类型到iterable。

function iterator(iterable $iter) {
    foreach ($iter as $val) {
        //
    }
}

6、多异常捕获处理

一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。

try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
} catch (\Exception $e) {
    // ...
}

7、list()现在支持键名

现在list()支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)

$data = [
    [&#39;id&#39; => 1, &#39;name&#39; => &#39;Tom&#39;],
    [&#39;id&#39; => 2, &#39;name&#39; => &#39;Fred&#39;],
];
while (list(&#39;id&#39; => $id, &#39;name&#39; => $name) = $data) {
    // logic here with $id and $name
}

8、支持为负的字符串偏移量

现在所有接偏移量的内置的基于字符串的函数都支持接受负数作为偏移量,包括数组解引用操作符([]).

var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));

以上例程会输出:

string (1) "e"
int(3)

9、ext/openssl 支持 AEAD

通过给openssl_encrypt()和openssl_decrypt() 添加额外参数,现在支持了AEAD (模式 GCM and CCM)。 
通过 Closure::fromCallable() 将callables转为闭包 
Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。

class Test {
    public function exposeFunction() {
        return Closure::fromCallable([$this, &#39;privateFunction&#39;]);
    }
    private function privateFunction($param) {
        var_dump($param);
    }
}
$privFunc = (new Test)->exposeFunction();
$privFunc(&#39;some value&#39;);

以上例程会输出:

string(10) "some value"

10、异步信号处理 Asynchronous signal handling

A new function called pcntl_async_signals() has been introduced to enable asynchronous signal handling without using ticks (which introduce a lot of overhead). 
增加了一个新函数 pcntl_async_signals()来处理异步信号,不需要再使用ticks(它会增加占用资源)

pcntl_async_signals(true); // turn on async signals
pcntl_signal(SIGHUP,  function($sig) {
    echo "SIGHUP\n";
});
posix_kill(posix_getpid(), SIGHUP);

以上例程会输出:

SIGHUP

11、HTTP/2 服务器推送支持 ext/curl

Support for server push has been added to the CURL extension (requires version 7.46 and above). This can be leveraged through the curl_multi_setopt() function with the new CURLMOPT_PUSHFUNCTION constant. The constants CURL_PUST_OK and CURL_PUSH_DENY have also been added so that the execution of the server push callback can either be approved or denied. 
翻译: 
对于服务器推送支持添加到curl扩展(需要7.46及以上版本)。 
可以通过用新的CURLMOPT_PUSHFUNCTION常量 让curl_multi_setopt()函数使用。 
也增加了常量CURL_PUST_OK和CURL_PUSH_DENY,可以批准或拒绝 服务器推送回调的执行

相关文章推荐:

php7和php5有什么不同之处?php5与php7之间的对比

PHP新特性:finally关键字的用法

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn