新增命名參數(shù)的功能。
新增注解的功能。
新增構(gòu)造器屬性提升功能 在構(gòu)造函數(shù)中聲明類的屬性)。
新增 聯(lián)合類型。
新增 match
表達(dá)式。
新增Nullsafe 運(yùn)算符(?->
)。
新增 WeakMap 類。
新增 ValueError 類。
現(xiàn)在,只要類型兼容,任意數(shù)量的函數(shù)參數(shù)都可以用一個(gè)可變參數(shù)替換。 例如允許編寫下面的代碼:
<?php
class A {
public function method(int $many, string $parameters, $here) {}
}
class B extends A {
public function method(...$everything) {}
}
?>
static ("后期靜態(tài)綁定"中) 可以作為返回類型:
<?php
class Test {
public function create(): static {
return new static();
}
}
?>
現(xiàn)在可以通過(guò) $object::class
獲取類名,返回的結(jié)果和 get_class($object)
一致。
new
、instanceof
可用于任何表達(dá)式,
用法為 new (expression)(...$args)
和 $obj instanceof (expression)
。
添加對(duì)一些變量語(yǔ)法一致性的修復(fù),例如現(xiàn)在能夠編寫
Foo::BAR::$baz
。
添加 Stringable interface, 當(dāng)一個(gè)類定義 __toString() 方法后會(huì)自動(dòng)實(shí)現(xiàn)該接口。
Trait 可以定義私有抽象方法(abstract private method)。 類必須實(shí)現(xiàn) trait 定義的該方法。
可作為表達(dá)式使用 throw
。
使得可以編寫以下用法:
<?php
$fn = fn() => throw new Exception('Exception in arrow function');
$user = $session->user ?? throw new Exception('Must have user');
參數(shù)列表中的末尾逗號(hào)為可選。
<?php
function functionWithLongSignature(
Type1 $parameter1,
Type2 $parameter2, // <-- 這個(gè)逗號(hào)也被允許了
) {
}
現(xiàn)在允許 catch (Exception)
一個(gè) exception 而無(wú)需捕獲到變量中。
支持 mixed 類型。
Private methods declared on a parent class no longer enforce any inheritance rules on the methods of a child class (with the exception of final private constructors). The following example illustrates which restrictions have been removed:
<?php
class ParentClass {
private function method1() {}
private function method2() {}
private static function method3() {}
// Throws a warning, as "final" no longer has an effect:
private final function method4() {}
}
class ChildClass extends ParentClass {
// All of the following are now allowed, even though the modifiers aren't
// the same as for the private methods in the parent class.
public abstract function method1() {}
public static function method2() {}
public function method3() {}
public function method4() {}
}
?>
get_resource_id() has been added, which returns the same value as
(int) $resource
. It provides the same functionality under a clearer API.
DateTime::createFromInterface() and DateTimeImmutable::createFromInterface() have been added.
The DateTime format specifier p
has been added, which is the same as
P
but returns Z
rather than +00:00
for UTC.
DOMParentNode and DOMChildNode with new traversal and manipulation APIs have been added.
FILTER_VALIDATE_BOOL
has been added as an alias for
FILTER_VALIDATE_BOOLEAN
. The new name is preferred, as it uses the canonical
type name.
enchant_dict_add(), enchant_dict_is_added(), and
LIBENCHANT_VERSION
have been added.
Added a new option pm.status_listen
that allows getting the status from
different endpoint (e.g. port or UDS file) which is useful for getting the status when all
children are busy with serving long running requests.
HashContext objects can now be serialized.
The IntlDateFormatter::RELATIVE_FULL
,
IntlDateFormatter::RELATIVE_LONG
,
IntlDateFormatter::RELATIVE_MEDIUM
, and
IntlDateFormatter::RELATIVE_SHORT
constants have been added.
ldap_count_references() has been added, which returns the number of reference messages in a search result.
If the opcache.record_warnings ini setting is enabled, OPcache will record compile-time warnings and replay them on the next include, even if it is served from cache.
Added Cryptographic Message Syntax (CMS) (? RFC 5652)
support composed of functions for encryption, decryption, signing, verifying and reading. The API
is similar to the API for PKCS #7 functions with an addition of new encoding constants:
OPENSSL_ENCODING_DER
, OPENSSL_ENCODING_SMIME
and OPENSSL_ENCODING_PEM
:
preg_last_error_msg() has been added, which returns a human-readable message for the last PCRE error. It complements preg_last_error(), which returns an integer enum value instead.
The following methods can now return information about default values of parameters of internal functions:
SQLite3::setAuthorizer() and respective class constants have been added to set a userland callback that will be used to authorize or not an action on the database.
str_contains(), str_starts_with() and
str_ends_with() have been added, which check whether haystack
contains,
starts with or ends with needle
, respectively.
fdiv() has been added, which performs a floating-point division under IEEE 754 semantics.
Division by zero is considered well-defined and will return one of Inf
,
-Inf
or NaN
.
get_debug_type() has been added, which returns a type useful for error messages. Unlike gettype(), it uses canonical type names, returns class names for objects, and indicates the resource type for resources.
printf() and friends now support the %h
and
%H
format specifiers. These are the same as %g
and
%G
, but always use "."
as the decimal separator, rather
than determining it through the LC_NUMERIC
locale.
printf() and friends now support using "*"
as width or
precision, in which case the width/precision is passed as an argument to printf. This also allows
using precision -1
with %g
, %G
,
%h
and %H
. For example, the following code can be used to
reproduce PHP's default floating point formatting:
<?php
printf("%.*H", (int) ini_get("precision"), $float);
printf("%.*H", (int) ini_get("serialize_precision"), $float);
?>
proc_open() now supports pseudo-terminal (PTY) descriptors. The following
attaches stdin
, stdout
and stderr
to the
same PTY:
<?php
$proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
?>
proc_open() now supports socket pair descriptors. The following attaches a
distinct socket pair to stdin
, stdout
and
stderr
:
<?php
$proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
?>
Unlike pipes, sockets do not suffer from blocking I/O issues on Windows. However, not all programs may work correctly with stdio sockets.
Sorting functions are now stable, which means that equal-comparing elements will retain their original order.
array_diff(), array_intersect() and their variations can now be used with a single array as argument. This means that usages like the following are now possible:
<?php
// OK even if $excludes is empty:
array_diff($array, ...$excludes);
// OK even if $arrays only contains a single array:
array_intersect(...$arrays);
?>
The flag
parameter of ob_implicit_flush() was changed
to accept a bool rather than an int.
PhpToken adds an object-based interface to the tokenizer. It provides a more uniform and ergonomic representation, while being more memory efficient and faster.
The Zip extension has been updated to version 1.19.1.
New ZipArchive::setMtimeName() and ZipArchive::setMtimeIndex() to set the modification time of an entry.
New ZipArchive::registerProgressCallback() to provide updates during archive close.
New ZipArchive::registerCancelCallback() to allow cancellation during archive close.
New ZipArchive::replaceFile() to replace an entry content.
New ZipArchive::isCompressionMethodSupported() to check optional compression features.
New ZipArchive::isEncryptionMethodSupported() to check optional encryption features.
The ZipArchive::lastId property to get the index value of the last added entry has been added.
Errors can now be checked after an archive has been closed using the ZipArchive::status and ZipArchive::statusSys properties, or the ZipArchive::getStatusString() method.
The 'remove_path'
option of ZipArchive::addGlob() and
ZipArchive::addPattern() is now treated as an arbitrary string prefix (for
consistency with the 'add_path'
option), whereas formerly it was treated as a
directory name.
Optional compression / encryption features are now listed in phpinfo.