Nouvelles fonctionnalités de PHP7


1. Core

  • Ajout d'une déclaration de syntaxe d'utilisation de groupe. RFC : https://wiki.php.net/rfc/group_use_declarations
  • Ajout d'un opérateur de coalescence nul ??. RFC : https://wiki.php.net/rfc/isset_ternary
  • La longueur de la chaîne PHP7 64 bits peut dépasser 2 ^ 31 octets.
  • Ajout de la méthode Closure::call().
  • Les chaînes entre guillemets et les héréditaires prennent en charge l'utilisation de u{xxxxx} pour déclarer les caractères Unicode.
  • define() peut définir un tableau comme constante.
  • Ajout de l'opérateur de comparaison de fusion <=>. RFC : https://wiki.php.net/rfc/combined-comparison-operator
  • Rendement ajouté de l'opérateur. https://wiki.php.net/rfc/generator-delegation
  • les mots clés peuvent également être utilisés dans des scénarios spécifiques. RFC : https://wiki.php.net/rfc/context_sensitive_lexer
  • Ajout de la fonction de déclaration de type scalaire. RFC : https://wiki.php.net/rfc/scalar_type_hints_v5
  • Ajout d'une interface pour fournir un générateur de nombres aléatoires sûr et pratique pour la couche utilisateur. RFC : https://wiki.php.net/rfc/easy_userland_csprng


①Déclaration de type scalaire PHP et de valeur de retour

Déclaration de type scalaire

Par défaut, tous les fichiers PHP sont en mode de vérification de type faible.

PHP 7 ajoute la fonctionnalité de déclaration de type scalaire. Il existe deux modes pour la déclaration de type scalaire :

  • mode forcé (par défaut) mode strict

  • mode strict

Syntaxe de déclaration de type scalaire. format :

declare(strict_types=1);

La valeur de strict_types (1 ou 0) est spécifiée dans le code. 1 indique un mode de vérification de type strict, qui s'applique aux appels de fonction et aux instructions de retour ; 0 indique un mode de vérification de type faible.

Les paramètres de type pouvant être utilisés sont :

  • int

  • float

  • bool

  • string

  • interfaces

  • tableau

  • callable

Exemple de modèle obligatoire :

<?php
// 强制模式
function sum(int ...$ints)
{
   return array_sum($ints);
}
print(sum(2, '3', 4.1));
?>

Le résultat de l'exécution du programme ci-dessus est :

9

Résumé de l'exemple : convertissez le paramètre 4.1 en un entier 4, puis ajoutez-le.

Exemple de mode strict :

<?php
// 严格模式
declare(strict_types=1);

function sum(int ...$ints)
{
   return array_sum($ints);
}

print(sum(2, '3', 4.1));
?>

Étant donné que le programme ci-dessus adopte le mode strict, si un type entier inapproprié apparaît dans le paramètre, une erreur sera signalée. Le résultat de l'exécution est :

PHP Fatal error:  Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……

Type de retour. déclaration

PHP 7 ajoute la prise en charge des déclarations de type de retour, qui spécifient le type de valeur de retour de la fonction.

Les types de retour pouvant être déclarés sont :

  • int

  • float

  • bool

  • string

  • interfaces

  • tableau

  • callable

Exemple de déclaration de type de retour :

Dans l'exemple, le résultat renvoyé doit être un entier :

<?php
declare(strict_types=1);
function returnIntValue(int $value): int
{
   return $value;
}
print(returnIntValue(5));
?>

Le résultat de sortie de l'exécution du programme ci-dessus est :

5

Exemple d'erreur de déclaration de type de retour :

<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
   return $value + 1.0;
}

print(returnIntValue(5));
?>

En raison du mode strict, la valeur de retour de le programme ci-dessus doit être un entier, mais le calcul Le résultat est un flottant, donc une erreur sera signalée. Le résultat de l'exécution est :

Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...

②Opérateur de fusion PHP NULL

PHP 7 Le NULL nouvellement ajouté. L'opérateur de fusion (??) est utilisé pour exécuter le raccourci isset() pour détecter les opérations ternaires.

L'opérateur de fusion NULL déterminera si la variable existe et si la valeur n'est pas NULL. Si tel est le cas, il renverra sa propre valeur, sinon il renverra son deuxième opérande.

Nous avions l'habitude d'écrire l'opérateur ternaire comme ceci :

$site = isset($_GET['site']) ? $_GET['site'] : 'PHP中文网';

Maintenant, nous pouvons l'écrire directement comme ceci :

$site = $_GET['site'] ?? 'PHP中文网';

Exemple

<?php
// 获取 $_GET['site'] 的值,如果不存在返回 'PHP中文网'
$site = $_GET['site'] ?? 'PHP中文网';

print($site);
print(PHP_EOL); // PHP_EOL 为换行符

// 以上代码等价于
$site = isset($_GET['site']) ? $_GET['site'] : 'PHP中文网';

print($site);
print(PHP_EOL);
// ?? 链
$site = $_GET['site'] ?? $_POST['site'] ?? 'PHP中文网';

print($site);
?>

Le résultat de sortie de l'exécution du programme ci-dessus est :

PHP中文网
PHP中文网
PHP中文网

③Opérateur d'opération de vaisseau spatial PHP (opérateur de comparaison combiné)

Le nouvel opérateur de vaisseau spatial PHP 7 (opérateur de comparaison combiné) est utilisé pour comparer deux expressions $a et $b Si $a est inférieur, égal à,. ou supérieur à $b, il renvoie respectivement -1, 0 ou 1.

Exemple

<?php
// 整型比较
print( 1 <=> 1);print(PHP_EOL);
print( 1 <=> 2);print(PHP_EOL);
print( 2 <=> 1);print(PHP_EOL);
print(PHP_EOL); // PHP_EOL 为换行符

// 浮点型比较
print( 1.5 <=> 1.5);print(PHP_EOL);
print( 1.5 <=> 2.5);print(PHP_EOL);
print( 2.5 <=> 1.5);print(PHP_EOL);
print(PHP_EOL);

// 字符串比较
print( "a" <=> "a");print(PHP_EOL);
print( "a" <=> "b");print(PHP_EOL);
print( "b" <=> "a");print(PHP_EOL);
?>

Le résultat de l'exécution du programme ci-dessus est :

0
-1
1

0
-1
1

0
-1
1

④Tableau constant PHP

Uniquement en PHP 5.6 Les tableaux de constantes peuvent être définis via const, PHP 7 peut être défini via finish().

Exemple

<?php// 使用 define 函数来定义数组define('sites', [
   'Google',
   'PHP',
   'Taobao']);print(sites[1]);?>

Le résultat de l'exécution du programme ci-dessus est :

PHP

⑤PHP Closure::call()

PHP 7's Closure::call() a de meilleures performances, liaison dynamique une fonction de fermeture à une nouvelle instance d’objet et appelez la fonction.

Exemple

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

// PHP 7 之前版本定义闭包函数代码
$getXCB = function() {
    return $this->x;
};

// 闭包函数绑定到类 A 上
$getX = $getXCB->bindTo(new A, 'A'); 

echo $getX();
print(PHP_EOL);

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

Le résultat de l'exécution du programme ci-dessus est :

1
1

⑥PHP CSPRNG

CSPRNG (Cryptographically Secure Pseudo-Random Number Generator, générateur de nombres pseudo-aléatoires).

PHP 7 fournit un mécanisme simple pour générer des nombres aléatoires cryptographiquement forts en introduisant plusieurs fonctions CSPRNG.

  • random_bytes() - Chaîne pseudo-aléatoire protégée cryptographiquement.

  • random_int() - entier pseudo-aléatoire protégé cryptographiquement mètres

longueur - aléatoire Le nombre d'octets renvoyés dans la chaîne.

Valeur de retour

Renvoie une chaîne et accepte un paramètre d'entrée de type int représentant le nombre d'octets du résultat renvoyé.

Instance

string random_bytes ( int $length )
Le résultat de l'exécution du programme ci-dessus est

<?php
$bytes = random_bytes(5);
print(bin2hex($bytes));
?>
  • random_int()

Format de grammaire

6f36d48a29
paramètres

min - La valeur minimale renvoyée doit être supérieure ou égale à PHP_INT_MIN.

max - la valeur maximale renvoyée doit être inférieure ou égale à PHP_INT_MAX .

Valeur de retour

    Renvoie un nombre entier dans la plage spécifiée.
  • Instance

int random_int ( int $min , int $max )

Le résultat de l'exécution du programme ci-dessus est :

<?php
print(random_int(100, 999));
print(PHP_EOL);
print(random_int(-1000, 0));
?>

  • ⑦Classe anonyme PHP

PHP 7 prend en charge l'instanciation d'un classe anonyme via une nouvelle classe, qui peut être utilisé pour remplacer certaines définitions de classe complètes qui sont "gravées après utilisation".

Exemple

723
-64
Le résultat de l'exécution du programme ci-dessus est :
<?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;
// 使用 new class 创建匿名类
$app->setLogger(new class implements Logger {
   public function log(string $msg) {
      print($msg);
   }
});
$app->getLogger()->log("我的第一条日志");
?>


⑧Instruction PHP 7 use PHP 7 peut utiliser une utilisation pour importer des classes, des fonctions et des constantes à partir du même espace de noms :
我的第一条日志

2. Module Opcache

  • Ajout d'un mécanisme de mise en cache des opcodes secondaires basé sur des fichiers. Vous pouvez définir opcache.file_cache=<DIR> dans le fichier php.ini. Lorsque le service est redémarré ou que SHM est réinitialisé, l'utilisation du mécanisme de mise en cache des fichiers secondaires peut améliorer les performances.
  • Vous pouvez également définir opcache.file_cache_only=1 pour limiter l'utilisation du cache de fichiers uniquement.
  • Vous pouvez définir le paramètre opcache.file_cache_consistency_checks=0 pour accélérer le chargement.
  • Vous pouvez définir opcache.huge_code_pages=0/1 pour décider si vous souhaitez placer les pages de codes PHP dans des pages volumineuses. http://www.laruence.com/2015/10/02/3069.html
  • La version Windows ajoute l'élément de configuration opcache.file_cache_fallback=1.

3. Le module OpenSSL

ajoute l'option "alpn_protocols".

4. Reflection

  • La classe ReflectionGenerator est ajoutée pour le rendement des traces, du fichier/ligne actuel, etc.
  • Ajout de la classe ReflectionType pour mieux prendre en charge les nouvelles valeurs de retour et fonctions de déclaration scalaire.

5. Streaming

La version Windows ajoute l'option de lecture en bloc. Peut être activé en passant le paramètre array("pipe" => array("blocking" => true)).