이 기사의 내용은 PHP 7.3의 업데이트 내용에 대한 자세한 소개입니다. 필요한 친구가 참고할 수 있기를 바랍니다.
PHP는 핵심 유지 관리 팀의 신속한 업데이트로 인해 여전히 다른 스크립팅 언어에 대한 강력한 경쟁자입니다.
PHP 7.0 출시 이후 커뮤니티에서는 개발자가 프로젝트에 PHP를 적용하는 방식을 크게 개선한 많은 새로운 기능의 탄생을 목격했습니다. PHP 애플리케이션의 성능과 보안을 향상시키는 것이 이러한 개선의 주요 목적입니다.
PHP는 최근 PHP 7.3 출시라는 또 다른 이정표를 달성했습니다. 새 버전에는 꼭 필요한 업데이트가 포함되어 있습니다.
이 기사에서는 새로 출시된 PHP 7.3 기능과 업데이트에 대해 설명하겠습니다. 좋은 소식은 테스트 서버에 새 버전을 직접 설치하고 새로운 기능을 확인할 수 있다는 것입니다. 그러나 오래된 속담처럼 프로덕션 서버에서는 RC 버전 업데이트를 사용하지 마십시오. 이미 실행 중인 애플리케이션이 손상될 수 있습니다.
다음은 이전 버전에 비해 PHP 7.3의 성능을 크게 향상시키는 버전 7.3에 도입된 업데이트 중 일부입니다.
유연한 Heredoc 및 Nowdoc 구문
함수 호출 시 후행 쉼표 허용
JSON_THROW_ON_ERROR
PCRE2 마이그레이션
list() 할당 참조
is_countable 함수
array_key_first (), array_key_last()
Argon2 비밀번호 해싱 개선
지원 중단 및 제거 image2wbmp()
지원 중단 및 대소문자 구분 상수
동일 사이트 쿠키
FPM 업데이트
Windows에서 향상된 파일 삭제
위의 각 업데이트에 대해 하나씩 논의해 보겠습니다.
Heredoc 및 Nowdoc 구문은 여러 줄로 구성된 긴 문자열을 작업할 때 큰 도움이 될 수 있습니다. 끝 식별자는 새 줄에 나타나는 첫 번째 문자열이어야 합니다.
// 除了这样: $query = <<<SQL SELECT * FROM `table` WHERE `column` = true; SQL; // 这样也可以: $query = <<<SQL SELECT * FROM `table` WHERE `column` = true; SQL;
전반적으로 이번 업데이트에서는 다음과 같은 두 가지 개선 사항을 제안합니다.
식별자를 닫기 전 들여쓰기 지원
식별자를 닫은 후 더 이상 강제 줄 바꿈이 없습니다.
위의 예에서 이러한 변경 사항을 쉽게 확인할 수 있습니다. .
매개변수, 요소 및 변수 목록 끝에 후행 쉼표를 추가하세요. 때로는 배열 및 함수 호출(특히 가변 매개변수 함수)에서 많은 수의 요소를 전달해야 할 경우 쉼표가 누락되면 오류가 보고됩니다. 이 경우 후행 쉼표가 매우 유용합니다. 이 기능은 이미 배열 내에서 허용되며 PHP 7.2부터 그룹화된 네임스페이스(그룹화된 네임스페이스
) 구문에서는 후행 쉼표도 지원합니다. Grouped Namespaces
)语法也开始支持尾部逗号。
use Foo\Bar\{ Foo, Bar, }; $foo = [ 'foo', 'bar', ];
当新值需要被追加在此处时,尾部逗号便显得十分实用。在可变参函数例如 unset()
内,更是如此。
unset( $foo, $bar, $baz, );
同时,当你使用 compact()
函数给模版引擎传递一批变量时,也是个能用到的例子。
echo $twig->render( 'index.html', compact( 'title', 'body', 'comments', ) );
在某些需要构造连续或分组数据情况下,经常要使用 array_merge()
函数合并数组。也可以利用尾部逗号:
$newArray = array_merge( $arrayOne, $arrayTwo, ['foo', 'bar'], );
同样,你也可以在调用任意方法、函数以及闭包时使用此特性。
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 响应数据,有 json_encode()
以及 json_decode()
两个函数可供使用。不幸的是,它们都没有恰当的错误抛出表现。json_encode
失败时仅会返回 false
;json_decode
失败时则会返回 null
,而 null
可作为合法的 JSON 数值。唯一获取错误的方法是,调用 json_last_error()
或 json_last_error_msg()
,它们将分别返回机器可读和人类可读的全局错误状态。
该 RFC 提出的解决方案是,为 JSON 函数新增 JSON_THROW_ON_ERROR
常量用于忽略全局错误状态。当错误发生时,JSON 函数将会抛出 JsonException
异常,异常消息(message
)为 json_last_error()
的返回值,异常代码(code
)为 json_last_error_msg()
的返回值。如下是调用例子:
json_encode($data, JSON_THROW_ON_ERROR); json_decode("invalid json", null, 512, JSON_THROW_ON_ERROR); // 抛出 JsonException 异常
PHP 使用 PCRE 作为正则表达式引擎。但从 PHP 7.3 开始,PCRE2 将作为新的正则引擎大显身手。所以,你需要将现有的正则表达式迁移到符合 PCRE2 的规则。这些规则比以前更具侵入性。请看以下实例:
preg_match('/[\w-.]+/', '');
这个表达式在新版 PHP 内将会匹配失败且不会触发警告。因为 PCRE2 现严格要求,若需匹配连字符(-
)而非用于表示范围,则必须移动到末尾或将其转义。
更新到 PCRE2 10.x 后,支持了以下以及更多特性:
相对后向引用 g{+2}
(等效于已存在的 g{-2}
$array = [1, 2]; list($a, &$b) = $array;
unset()
과 같은 가변 함수 내에서 특히 그렇습니다. 🎜$array = [1, 2]; $a = $array[0]; $b =& $array[1];
compact()
함수를 사용하여 변수 배치를 템플릿 엔진에 전달할 때에도 사용할 수 있는 예입니다. 🎜$array = [[1, 2], [3, 4]]; foreach ($array as list(&$a, $b)) { $a = 7; } var_dump($array);
array_merge()
함수를 사용하여 배열을 병합하는 경우가 많습니다. 후행 쉼표를 사용할 수도 있습니다: 🎜if (is_array($foo) || $foo instanceof Countable) { // $foo 是可数的 }
if (is_countable($foo)) { // $foo 是可数的 }
json_encode()
및 json_decode()
라는 두 가지 함수가 있습니다. 불행하게도 그들 중 누구도 적절한 오류 발생 동작을 갖고 있지 않습니다. json_encode
가 실패하면 false
만 반환하고, json_decode
가 실패하면 null
을 반환합니다. >null은 유효한 JSON 값으로 사용될 수 있습니다. 오류를 가져오는 유일한 방법은 json_last_error()
또는 json_last_error_msg()
를 호출하는 것입니다. 이는 기계가 읽을 수 있는 전역 오류 상태와 사람이 읽을 수 있는 전역 오류 상태를 각각 반환합니다. 🎜🎜이 RFC에서 제안하는 솔루션은 JSON 함수에 JSON_THROW_ON_ERROR
상수를 추가하여 전역 오류 상태를 무시하는 것입니다. 오류가 발생하면 JSON 함수는 JsonException
예외를 발생시킵니다. 예외 메시지(message
)는 json_last_error()
의 반환 값입니다. 예외 코드(code
)는 json_last_error_msg()
의 반환 값입니다. 다음은 호출의 예입니다. 🎜// 关联数组的用法 $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);
具有自定义成员方法的名称的Argon2id与PASSWORD_ARGON2I的使用方法相同 password_hash('password',PASSWORD_ARGON2ID,['memory_cost'=> 1 << 17,'time_cost'=> 4,'threads'=> 2]);
-
)이 범위를 나타내는 데 사용되는 대신 일치해야 하는 경우 끝으로 이동하거나 이스케이프해야 합니다. 🎜🎜PCRE2 10.x로 업데이트한 후 다음 기능과 더 많은 기능이 지원됩니다. 🎜🎜🎜🎜상대 역참조 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 官方手册的中文译本。
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);
在 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 是可数的 }
当前版本的 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/arra...
在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,'time_cost'=> 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]); // 返回真
该函数能够将图像输出为 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: 废弃使用与定义时的大小写不一致的名称,访问大小写不敏感的常量。true
、false
以及 null
除外。
PHP 7.3 在建议在使用 cookies 时,增加同站点标志。这个 RFC 会影响4个系统函数。
setcookie
setrawcookie
session_set_cookie_params
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 ]]] ) // 两种方式均可.
FastCGI 进程管理器也进行了更新,现在提供了新的方式来记录 FPM 日志。
log_limit: 设置允许的日志长度,可以超过 1024 字符。
log_buffering: 允许不需要额外缓冲去操作日志。
decorate _workers_output: 当启用了 catch_workers_output 时,系统会去禁用渲染输出。
如官方文档所述:
默认情况下,文件描述符以共享读、写、删除的方式去操作。 这很有效的去映射 POSIX 并允许去删除正在使用中的文件。但这并不是100%都是一样的,不同的平台可能仍存在一些差异。删除操作之后,文件目录仍存在直到所有的文件操作被关闭。
위 내용은 PHP 7.3 업데이트 내용에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!