PHP 8.3 将于2023 年 11 月 23 日发布;它对只读类、新JSON_validate()函数、最近添加的Randomizer类、堆栈溢出检测等进行了改进。 在本文中,我们将逐一介绍所有功
PHP 8.3 将于2023 年 11 月 23 日发布;它对只读类、新JSON_validate()函数、最近添加的Randomizer类、堆栈溢出检测等进行了改进。
在本文中,我们将逐一介绍所有功能、性能改进、更改和弃用。
只读修改征求意见稿
此 RFC 提出了两个更改,只有一个被接受:能够在克隆时重新初始化只读属性。这听起来可能很重要,但此 RFC 仅解决了一个非常具体(但重要)的边缘情况:覆盖 中的属性值__clone(),以允许深度克隆只读属性。
readonly class Post
{
public function __construct(
public DateTime $createdAt,
) {}
public function __clone(){ $this->createdAt = new DateTime(); // This is allowed, // even though `createdAt` is a readonly property.}
}
您可以在此处阅读有关此 RFC 和一些旁注的深入文章。
#匿名只读类升级中
以前,您无法将匿名类标记为只读。这在 php 8.3 中已修复:
$class = new readonly class {
public function __construct(
public string $foo = ‘bar’,
) {}
};
#新json_validate()功能征求意见稿
以前,验证字符串是否为有效 JSON 的唯一方法是对其进行解码并检测是否抛出任何错误。json_validate()如果您只需要知道输入是否为有效的 JSON,这个新函数就很有用,因为与解码字符串相比,它使用的内存更少。
json_validate(string $json, int $depth = 512, int $flags = 0): bool
#Randomizer加法征求意见稿
PHP 8.2 添加了新的Randomizer类。本次更新带来了一些小的补充:
Randomizer::getBytesFromString(string $string, int $length): string
此方法允许您生成具有给定长度的字符串,该字符串由从给定字符串中随机选择的字节组成。
Randomizer::getFloat(
float $min,
float $max,
IntervalBoundary b o u n d a r y = I n t e r v a l B o u n d a r y : : C l o s e d O p e n ) : f l o a t g e t F l o a t ( ) boundary = IntervalBoundary::ClosedOpen ): float getFloat() boundary=IntervalBoundary::ClosedOpen):floatgetFloat()min返回一个介于和之间的浮点数 m a x 。由于枚举,您可以定义是否 max。由于枚举,您可以定义是否 max。由于枚举,您可以定义是否min以及应该包括在内。表示包含该值,而表示不包含该值。$maxIntervalBoundaryClosedOpen
Randomizer::nextFloat(): float {}
最后,nextFloat()是 的简写,换句话说:它会给你一个介于 0 和 1 之间的随机浮点数,其中 1 被排除在外。getFloat(0, 1, IntervalBoundary::ClosedOpen)
#动态类常量获取征求意见稿
PHP 8.3 允许您使用更动态的语法获取常量:
class Foo
{
const BAR = ‘bar’;
}
$name = ‘BAR’;
// Instead of this:
constant(Foo::class . ‘::’ . $name);
// You can now do this:
Foo::{$name};
#更合适的日期/时间例外征求意见稿 打破
在许多情况下,PHP 会简单地抛出一个ExceptionorError对象;或者在处理日期和时间时出现问题时发出警告或错误。此 RFC 遍历了所有这些边缘情况,并为它们添加了适当的、专用的例外。
我们现在有DateMalfORMedIntervalStringException、DateInvalidOperationException和 之类的例外DateRangeError。
通常,这些添加不会破坏任何代码,因为这些新添加的异常和错误是泛型Exception和Error类的子类。但是,此 RFC 附带了三个小的破坏性更改:
现在Epoch doesn’t fit in a PHP integer返回一个 newDateRangeError而不是 generic ValueError,它不子类化。这只是 32 位平台的问题。
Only non-special relative time specifications are supported for subtraction带有和 的警告变为新的.DateTime::sub()date_sub()DateInvalidOperationException
在与 OO 接口一起使用时,在解析错误/损坏的字符串时创建的Unknown or bad format (%s) at position %d (%c): %s和警告现在将抛出一个新的,而不是显示警告并返回 false。String ‘%s’ contains non-relative elementsDateIntervalDateMalformedIntervalStringException
#改进的unserialize()错误处理征求意见稿
unserialize()E_WARNING现在在遇到问题时总是发出一个,而不是有时发出一个E_NOTICE.
此 RFC 还建议在运行时添加更多异常unserialize(),但该部分未被接受。
#堆栈溢出检测公关
PHP 8.3 添加了两个新的 ini 指令,名为zend.max_allowed_stack_size和zend.reserved_stack_size。接近溢出调用堆栈的程序现在可能会抛出错误zend.max_allowed_stack_size当使用 more than和之间的区别zend.reserved_stack_size。
此功能的好处是堆栈溢出引起的分段错误不会再导致段错误,从而使调试变得更加容易。
的默认值zend.max_allowed_stack_size是0,这意味着 PHP 将自动确定一个值。您还可以提供-1以指示没有限制或特定字节数。该zend.reserved_stack_size指令用于确定“缓冲区”,以便 PHP 仍然能够抛出错误而不是实际耗尽内存。这里的值应该是字节数,但是 PHP 会为你确定一个合理的默认值,所以你不一定需要设置它,除非你遇到特定程序的边缘情况。
最后一点,对于纤程,现有fiber.stack_size指令用作最大允许堆栈大小。
zend.max_allowed_stack_size=128K
#小而显着的变化
并非 PHP 中的每个更改都通过 RFC 流程。事实上,大部分更改包括维护和错误修复,并且不需要 RFC。所有这些更改都列在升级文档中。我将列出一些最突出的,但如果您想了解最微小的细节,您一定要通读整个列表。
使用FFI时,返回类型为voidnow returnnull而不是 return 的C 函数FFI\CData:void
posix_getrlimit()现在采用可选$res参数以允许获取单个资源限制。
GC_status()有四个新字段:running、protected、full和buffer_size。
class_alias()现在支持创建内部类的别名。
Mysqli_poll()现在ValueError在传递 read nor error 参数时引发 a。
array_pad()现在仅受数组可以包含的最大元素数限制。以前,一次最多只能添加 1048576 个元素。
新的 posix 函数:posix_sysconf()、posix_pathconf()、posix_fpathconf()和posix_eaccess()
proc_get_status()多次执行现在将始终在 posix 系统上返回正确的值。
暂时就是这些,但是这个列表会随着时间的推移而增加。
来源地址:https://blog.csdn.net/qq_52010446/article/details/130252518
--结束END--
本文标题: PHP 8.3 中的新功能
本文链接: https://www.lsjlt.com/news/433841.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0