Maison >développement back-end >tutoriel php >Un article pour vous aider à comprendre la mise à jour PHP 7.3

Un article pour vous aider à comprendre la mise à jour PHP 7.3

步履不停
步履不停original
2019-06-19 09:59:055904parcourir

Un article pour vous aider à comprendre la mise à jour PHP 7.3

PHP reste un concurrent sérieux par rapport aux autres langages de script, principalement en raison des mises à jour rapides de son équipe de maintenance principale.

Depuis la sortie de PHP 7.0, la communauté a assisté à la naissance de nombreuses nouvelles fonctionnalités qui ont grandement amélioré la façon dont les développeurs appliquent PHP dans leurs projets. L'amélioration des performances et de la sécurité des applications PHP est l'objectif principal de ces améliorations.

PHP a récemment franchi une nouvelle étape - sortie de PHP 7.3. La nouvelle version apporte des mises à jour indispensables.

Dans cet article, je discuterai des nouvelles fonctionnalités PHP 7.3 et des mises à jour. La bonne nouvelle est que vous pouvez installer vous-même la nouvelle version sur votre serveur de test et découvrir les nouvelles fonctionnalités. Mais comme le dit le vieil adage, n'utilisez jamais de mises à jour de la version RC sur les serveurs de production, car elles pourraient interrompre vos applications déjà actives.

Voici quelques-unes des mises à jour introduites dans la version 7.3 qui améliorent considérablement les performances de PHP 7.3 par rapport aux versions précédentes.

  • Syntaxe Heredoc et Nowdoc flexible
  • Autoriser les virgules de fin dans les appels de fonction
  • JSON_THROW_ON_ERROR
  • Migrations PCRE2
  • list( ) référence d'allocation
  • fonctions is_countable
  • array_key_first(), array_key_last()
  • Améliorations du hachage de mot de passe Argon2
  • obsolète et supprimée image2wbmp()
  • Constantes insensibles à la casse obsolètes et supprimées
  • Cookies du même site
  • Mise à jour FPM
  • Suppression de fichiers améliorée sous Windows

Parlons de chacun des ci-dessus, les mises à jour une par une.

Syntaxe flexible Heredoc et Nowdoc La syntaxe

Heredoc et Nowdoc peut être d'une grande aide lorsque vous travaillez avec de longues chaînes comportant plusieurs lignes. Cela nécessite que l'identifiant de fin soit la première chaîne qui apparaît sur une nouvelle ligne.

// 除了这样:

$query = <<<SQL

SELECT *

FROM `table`

WHERE `column` = true;

SQL;

// 这样也可以:

$query = <<<SQL

   SELECT *

   FROM `table`

   WHERE `column` = true;

   SQL;

Globalement, cette mise à jour propose deux améliorations, comme suit :

  1. L'indentation est prise en charge avant la fermeture d'un identifiant
  2. Pas plus après la fermeture d'un identifiant Forcer la nouvelle ligne

Dans l'exemple ci-dessus, vous pouvez facilement voir ces changements.

Les virgules de fin sont autorisées dans les appels de fonction.

Ajoutez des virgules de fin à la fin des listes de paramètres, d'éléments et de variables. Parfois, nous devons transmettre un grand nombre d'éléments dans les tableaux et les appels de fonctions (en particulier les fonctions à paramètres variables). Si une virgule est manquée, une erreur sera signalée. Dans ce cas, la virgule finale est très utile. Cette fonctionnalité est déjà autorisée dans les tableaux, et à partir de PHP 7.2, la syntaxe de l'espace de noms de regroupement (Grouped Namespaces) prend également en charge les virgules de fin.

use Foo\Bar\{
   Foo,
   Bar,
};

$foo = [
   &#39;foo&#39;,
   &#39;bar&#39;,
];

La virgule de fin est très utile lorsqu'une nouvelle valeur doit être ajoutée ici. Cela est particulièrement vrai dans les fonctions variadiques telles que unset().

unset(
   $foo,
   $bar,
   $baz,
);

En même temps, lorsque vous utilisez la fonction compact() pour transmettre un lot de variables au moteur de modèle, c'est aussi un exemple qui peut être utilisé.

echo $twig->render(
   'index.html',
   compact(
       'title',
       'body',
       'comments',
   )
);

Dans certaines situations où des données continues ou groupées doivent être construites, la fonction array_merge() est souvent utilisée pour fusionner des tableaux. Vous pouvez également utiliser une virgule de fin :

$newArray = array_merge(
   $arrayOne,
   $arrayTwo,
   ['foo', 'bar'],
);

De même, vous pouvez utiliser cette fonctionnalité lors de l'appel d'une méthode, d'une fonction ou d'une fermeture.

class Foo
{
 public function __construct(...$args) {
   //
 }

 public function bar(...$args) {
   //
 }

 public function __invoke(...$args) {
   //
 }
}

$foo = new Foo(
 'constructor',
 'bar',
);

$foo->bar(
 'method',
 'bar',
);

$foo(
 'invoke',
 'bar',
);

JSON_THROW_ON_ERROR

Analyse les données de réponse JSON, il y a deux fonctions json_encode() et json_decode() disponibles. Malheureusement, aucun d’entre eux n’a un comportement de lancement d’erreur approprié. json_encode ne renverra false qu'en cas d'échec ; json_decode renverra null en cas d'échec, et null peut être utilisé comme valeur JSON légale. La seule façon d'obtenir une erreur est d'appeler json_last_error() ou json_last_error_msg(), qui renverront respectivement un statut d'erreur global lisible par la machine et lisible par l'homme.

La solution proposée par cette RFC est d'ajouter une nouvelle JSON_THROW_ON_ERROR constante à la fonction JSON pour ignorer l'état d'erreur global. Lorsqu'une erreur se produit, la fonction JSON lèvera une exception JsonException, le message d'exception (message) est la valeur de retour de json_last_error() et le code d'exception (code) est la valeur de retour de json_last_error_msg() . Voici un exemple d'appel :

json_encode($data, JSON_THROW_ON_ERROR);

json_decode("invalid json", null, 512, JSON_THROW_ON_ERROR);

// 抛出 JsonException 异常

Upgrade PCRE2

PHP utilise PCRE comme moteur d'expression régulière. Mais à partir de PHP 7.3, PCRE2 montrera ses talents de nouveau moteur régulier. Par conséquent, vous devez migrer les expressions régulières existantes pour vous conformer aux règles PCRE2. Ces règles sont plus intrusives qu’auparavant. Veuillez consulter l'exemple suivant :

preg_match('/[\w-.]+/', '');

Cette expression ne parviendra pas à correspondre dans la nouvelle version de PHP et ne déclenchera pas d'avertissement. En raison des exigences strictes du PCRE2, les tirets (-) qui doivent correspondre au lieu d'être utilisés pour représenter des plages doivent être déplacés vers la fin ou échappés.

Après la mise à jour vers PCRE2 10.x, les fonctionnalités suivantes et bien d'autres sont prises en charge :

  • 相对后向引用 \g{+2}(等效于已存在的 \g{-2}
  • PCRE2 版本检查 (?(VERSION>=x)...)
  • (*NOTEMPTY)(*NOTEMPTY_ATSTART) 告知引擎勿返回空匹配
  • (*NO_JIT) 禁用 JIT 优化
  • (*LIMIT_HEAP=d) 限制堆大小为 d KB
  • (*LIMIT_DEPTH=d) 设置回溯深度限制为 d
  • (*LIMIT_MATCH=d) 设置匹配数量限制为 d

译者注:国内正则术语参差不一,「后向引用」—— Back References,又称「反向引用」、「回溯引用」等,此处参考 PHP 官方手册的中文译本。

list() 赋值引用

PHP 中的 list() 现在可以赋值给引用,在当前版本中 list() 中赋值不能使用引用,在 PHP 7.3 中将允许使用引用,新改进的语法如下:

$array = [1, 2];
list($a, &$b) = $array;

相当于

$array = [1, 2];
$a = $array[0];
$b =& $array[1];

在 PHP 7.3 的变更中,我们还可以与 foreach() 方法一起嵌套使用

$array = [[1, 2], [3, 4]];
foreach ($array as list(&$a, $b)) {
   $a = 7;
}
var_dump($array);

is_countable 函数

在 PHP 7.2 中,用 count() 获取对象和数组的数量。如果对象不可数,PHP 会抛出警告⚠️ 。所以需要检查对象或者数组是否可数。 PHP 7.3 提供新的函数 is_countable() 来解决这个问题。

该 RFC 提供新的函数 is_countable(),对数组类型或者实现了 Countable 接口的实例的变量返回 true 。

之前:

if (is_array($foo) || $foo instanceof Countable) {
   // $foo 是可数的
}

之后:

if (is_countable($foo)) {
   // $foo 是可数的
}

array_key_first(), array_key_last()

当前版本的 PHP 允许使用 reset()end()key() 等方法,通过改变数组的内部指针来获取数组首尾的键和值。现在,为了避免这种内部干扰,PHP 7.3 推出了新的函数来解决这个问题:

  • $key = array_key_first($array); 获取数组第一个元素的键名
  • $key = array_key_last($array); 获取数组最后一个元素的键名

让我们看一个例子:

// 关联数组的用法
$array = ['a' => 1, 'b' => 2, 'c' => 3];

$firstKey = array_key_first($array);
$lastKey = array_key_last($array);

assert($firstKey === 'a');
assert($lastKey === 'c');

// 索引数组的用法
$array = [1 => 'a', 2 => 'b', 3 => 'c'];

$firstKey = array_key_first($array);
$lastKey = array_key_last($array);

assert($firstKey === 1);
assert($lastKey === 3);

译者注:array_value_first()array_value_last() 并没有通过 RFC 表决;因此 PHP 7.3 内仅提供了 array_key_first() 以及 array_key_last() 函数。
参考链接:https://wiki.php.net/rfc/array_key_first_l...

Argon2 和 Hash 密码加密性能增强

在PHP的早期版本中,我们增加了Argon2和哈希密码加密算法,这是一种使用哈希加密算法来保护密码的现代算法。它有三种不同的类型,Argon2i,Argon2d和Argon 2id。 我们针对Argon2i密码散列和基于密码的密钥生成进行了优化。 Argon2d性能更快,并使用依赖于内存的数据访问。 Argon2i使用与内存无关的数据访问。 Argon2id是Argon2i和Argon2d的混合体,使用依赖于数据和与数据独立的存储器访问的组合。

password_hash():

Argon2id现在是在paswword_ *函数中使用的推荐的Argon2变量。

具有自定义成员方法的名称的Argon2id与PASSWORD_ARGON2I的使用方法相同
password_hash('password',PASSWORD_ARGON2ID,['memory_cost'=> 1 << 17,&#39;time_cost&#39;=> 4,'threads'=> 2]);

password_verify();

除了Argon2i之外,password_verify()函数也适用于Argon2id。

password_needs_rehash();

此函数也将接受Argon2id哈希值,如果任何变量成员发生变化,则返回true。

$hash = password_hash('password', PASSWORD_ARGON2ID);
password_needs_rehash($hash, PASSWORD_ARGON2ID); // 返回假
password_needs_rehash($hash, PASSWORD_ARGON2ID, ['memory_cost' => 1<<17]); // 返回真

废弃并移除 image2wbmp()

该函数能够将图像输出为 WBMP 格式。另一个名为 imagewbmp() 的函数也同样具备单色转换的作用。因此,出于重复原因,image2wbmp() 现已被废弃,你可使用 imagewbmp() 代替它。此函数被弃用后,再次调用它将会触发已弃用警告。待后续此函数被移除后,再次调用它将会触发致命错误。

废弃并移除大小写不敏感的常量

使用先前版本的 PHP,你可以同时使用大小写敏感和大小写不敏感的常量。但大小写不敏感的常量会在使用中造成一点麻烦。所以,为了解决这个问题,PHP 7.3 废弃了大小写不敏感的常量。

原先的情况是:

  • 类常量始终为「大小写敏感」。
  • 使用 const 关键字定义的全局常量始终为「大小写敏感」。注意此处仅仅是常量自身的名称,不包含命名空间名的部分,PHP 的命名空间始终为「大小写不敏感」。
  • 使用 define() 函数定义的常量默认为「大小写敏感」。
  • 使用 define() 函数并将第三个参数设为 true 定义的常量为「大小写不敏感」。

如今 PHP 7.3 提议废弃并移除以下用法:

  • In PHP 7.3: 废弃使用 true 作为 define() 的第三个参数。
  • In PHP 7.3: 废弃使用与定义时的大小写不一致的名称,访问大小写不敏感的常量。truefalse 以及 null 除外。

同站点 Cookie

PHP 7.3 在建议在使用 cookies 时,增加同站点标志。这个 RFC 会影响4个系统函数。

  1. setcookie
  2. setrawcookie
  3. session_set_cookie_params
  4. session_get_cookie_params

这个影响会在两种情况下起作用。其中一种方式会添加函数的新参数
,另一种方式允许以数组形式的选项代替其他单独选项。

bool setcookie(

   string $name

   [, string $value = ""

   [, int $expire = 0

   [, string $path = ""

   [, string $domain = ""

   [, bool $secure = false

   [, bool $httponly = false ]]]]]]

)

bool setcookie (

   string $name

   [, string $value = ""

   [, int $expire = 0

   [, array $options ]]]

)

// 两种方式均可.

FPM 更新

FastCGI 进程管理器也进行了更新,现在提供了新的方式来记录 FPM 日志。

log_limit: 设置允许的日志长度,可以超过 1024 字符。

log_buffering: 允许不需要额外缓冲去操作日志。

decorate _workers_output: 当启用了 catch_workers_output 时,系统会去禁用渲染输出。

改进 Windows 下的文件删除

官方文档所述:

默认情况下,文件描述符以共享读、写、删除的方式去操作。 这很有效的去映射 POSIX 并允许去删除正在使用中的文件。但这并不是100%都是一样的,不同的平台可能仍存在一些差异。删除操作之后,文件目录仍存在直到所有的文件操作被关闭。

结束语

之前我们已经讲解了最新版本的 PHP7.3 的特点,包含了许多新增跟弃用的功能。这些功能都可以在 php.net 网站上找到,并且已经合并到主分支上了。你现在就可以使用这些新功能部署在自己的服务器上,你也可以打开官方RFC页面查阅每一个详细版本。如果你对着新版 PHP7.3 有任何问题,你可以在评论下写下自己的想法。

相关PHP视频教程推荐:《PHP视频教程》

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