PHP 8.2版本发布
PHP 8.2是PHP语言现代化进程中的一个重要里程碑。
除了令人振奋的新功能和改进之外,PHP 8.2 还通过取消对动态类属性的支持,在遇到某些非最佳 INI 配置值时发出警告,以及修复一些影响 PHP 对数组排序和某些类型的字符串转换/编码操作的传统 PHP 行为来简化语言。
最新版php8.2带来了类型系统的改进,以实现表达式和细粒度的类型安全、只读类、敏感参数编辑支持、新的随机扩展,以及许多新的功能,还有一些简化和现代化的PHP语言的变化。
类型系统的改进
PHP 8.2 解决了 PHP 类型系统的一些缺点和限制,使 PHP 应用程序享有更好的类型安全。
这包括增加对 true 类型的支持,允许 null 和 false 类型作为独立的类型使用,以及对 DNF 类型的支持。
PHP 8.2 支持 Disjoint Normal Form (DNF) 类型 - 现在可以结合 Union Types (PHP 8.0) 和 Intersection Types (PHP 8.1),使得声明精确和富有表现力的参数、返回和属性类型成为可能。
function process((HTMLRequest & RequestInterface) | APIRequest $request) {
// ...
}
(HTMLRequest & RequestInterface) | APIRequest类型声明确保$request值是APIRequest的实例,或者是实现/扩展/实例HTMLRequest和RequestInterface的类对象。
支持true和false作为独立的类型,这使得在布尔值总是相同的情况下替换布尔类型声明成为可能。
function alwaysReturnsFalse(): false {}
function alwaysReturnsNull(): null {}
function alwaysReturnsTrue(): true {}
在旧的PHP版本中,已经可以声明nullable类型或带有null的联合类型。
从 PHP 8.2 开始,也允许将 null 作为一个独立的类型进行声明。
只读类
PHP 8.1 增加了对只读属性的支持。
一个只读属性只能被设置一次,而且PHP会主动防止该值被修改,即使是在类的范围内。
PHP 8.2 通过只读类使只读属性更上一层楼。
当一个类被声明为只读时,它的所有属性都被自动声明为只读。此外,它还防止了只读类的动态属性,并确保所有属性都是类型化的。
readonly class User {
public string $username;
public string $uid;
}
所有只读用户类的属性都被自动声明为只读。
//PHP 8.1 和 PHP 8.2
class User {
public readonly int $uid;
public readonly string $username;
}
readonly class User {
public int $uid;
public string $username;
}
新的随机扩展
在PHP的历史上,它支持各种随机数生成器(RNG),其性能、用例和对安全应用的适应程度各不相同。PHP 8.2更进一步,将所有与RNG相关的功能重构到一个名为随机的新扩展。
随机扩展在不破坏任何API的情况下提供了相同的功能,因此现有的rand、mt_rand、random_bytes和random_int函数可以继续工作而不需要改变。它还提供了一个新的OOP API来生成具有可插拔架构的随机数,所以现在很容易模拟RNG并提供新的RNG,使PHP应用安全且易于测试。
特质中的常量
在 PHP 8.2 中,现在可以在 traits 中声明常量。特质不能被直接访问,但当一个类使用该特质时,这些常量会成为类的常量。
trait FooBar {
const FOO = 'foo';
private const BAR = 'bar';
final const BAZ = 'baz';
final protected const QUX = 'qux';
}
class Test {
use FooBar;
}
echo Test::BAZ; // 'bar'
这在 PHP 8.1 及以前的版本中是不允许的。
特质常量不能被直接访问(例如:FooBar::FOO是不允许的)。
特质常量也不能与其他特质或使用它们的直接类发生冲突。
敏感参数值重新处理支持
PHP 8.2 增加了一个新的内置参数属性,名为 #[\SensitiveParameter],PHP 确保在堆栈跟踪和错误信息中对实际值进行编辑。
接受密码、私钥或其他敏感信息的函数可以用 #[\SensitiveParameter] 属性声明参数。如果其中的函数调用导致PHP错误或异常,传递给该参数的实际值将被替换为一个 \SensitiveparameterValue 对象。
PHP的内置函数如password_hash和password_verify已经用#[\SensitiveParameter]属性声明。
function passwordHash(string $password) {
function passwordHash(#[\SensitiveParameter] string $password) {
debug_print_backtrace();
}
passwordHash('hunter2');
在#[\SensitiveParameter]属性存在的情况下,所有的堆栈跟踪都会主动编辑传递给参数的实际值:
array(1) {
[0]=> array(4) {
["file"]=> string(38) "..."
["line"]=> int(9)
["function"]=> string(3) "foo"
["args"]=> array(1) {
[0]=> string(38) "hunter2"
[0]=> object(SensitiveParameterValue)#1 (0) {}
}
}
}
新的函数和类
除了主要的新特性外,PHP 8.2 还带来了一系列新的函数和类。
解析 INI 数量值:
ini_parse_quantity
ini_parse_quantity 函数解析了 PHP INI 值所认可的任何数据大小(如 56K、256M 或 1G),并以字节为单位返回数据大小。
ini_parse_quantity('256M'); // 268435456
保持一个Curl连接的活力:
curl_upkeep
在 PHP 8.2 Curl 扩展中的 curl_upkeep 函数会触发底层的 Curl 库来运行必要的任务以保持 Curl 连接的活力。这个函数最常见的使用情况是通过定期调用 curl_upkeep 函数来保持一个 HTTP 持久连接(Keep-Alive)。
检索密码密钥长度:
openssl_cipher_key_length
在 PHP 8.2 OpenSSL 中,有一个名为 openssl_cipher_key_length 的新函数,用于返回任何支持的 OpenSSL 密码所需的密钥长度(字节)。
这个函数消除了为OpenSSL密码操作硬编码所需的密钥长度的需要。
openssl_cipher_key_length("CHACHA20-POLY1305"); // 32
openssl_cipher_key_length("AES-128-GCM"); // 16
openssl_cipher_key_length("AES-256-GCM"); // 32
重置记录的内存使用峰值:
memory_reset_peak_usage
PHP 8.2 增加了一个名为 memory_reset_peak_usage 的新函数,用来重置 memory_get_peak_usage 函数返回的峰值内存使用量。
这对于多次调用或迭代一个动作,并需要记录每次调用的峰值内存使用量的应用程序很有帮助。如果没有新的memory_reset_peak_usage函数重置内存使用的能力,memory_get_peak_usage就会返回整个运行过程中的绝对峰值内存使用。
相关文章:PHP 8.2中的弃用情况
https://www.zongscan.com/demo333/96086.html
相关文章