17611538698
webmaster@21cto.com

PHP 8.3 RC1 之新功能盘点

编程语言 1 1211 2023-09-07 08:57:06
导读:PHP 8.3 的第一个Release Current 候选版本现已可供测试,它是本年度的功能较全版本。



PHP 8.3 RC1 发布,支持 json_validate、匿名只读类等。PHP 8.3 的第一个Release Current 候选版本现已可供测试,它是本年度的功能较全的版本。


背景


PHP 8.3 正在开发中,目标是在 11 月底以稳定版向开发者正式亮相。PHP 8.3 的第一个候选版本于9月3日如期发布,随后将每两周发布六个候选版本。PHP 8.3.0 将于 11 月 23 日左右全面发布。


PHP版本之对比


使用PHP8的数据,与其它版本的对比:




目前使用PHP8的市场份额:


1、目前大约77.5% 的网站是基于 PHP 构建的,这就是 PHP 的流行程度!在服务器端语言已知的所有网站中,大约 7.7% 使用 PHP 版本 8。

现在 PHP 8 的不同子版本已经发布,让我们看看它们在当前市场上的使用情况如何。在所有使用 PHP 8 的网站中,约 57.4% 使用 PHP 8.0,39.3% 使用 v8.1,约 3.2% 使用PHP 8.2。




接下来,我们梳理一下 PHP 8.3的新功能和它们的用例:


新的Json验证函数


大家知道 JSON 字符串由指定的数据格式组成。它不包含任何方法,仅包含属性。编写 JSON 字符串需要将字符串放在双引号中。如果将其写在单引号中,则视为无效。


在开发中,如果你想验证 JSON 字符串,则必须使用函数 json_decode()。类似于写这样的东西:



$json = '{"name": "Alicia Joe"}';
$data = json_decode($json); // function to validate JSON
if (json_last_error() === JSON_ERROR_NONE) {
	// Valid JSON
} else {
	// Invalid JSON
}


当用了8.3后,我们就可以使用json_validate()方法:



$json = '{"name": "Alicia Joe"}';
$valid = json_validate($json);
if ($valid) {
	// Valid JSON
} else {
	// Invalid JSON
}


比较这两段代码,我们会发现使用 json_validate( ) 方法更加容易和简单。如果内容是有效的 JSON 字符串,则返回 true,否则它将返回 False。


这样我们不必再依赖 json_last_error() 函数。请来看下面提到的 json_validate() 函数格式:


json_validate(string $json, int $depth = 512, int $flags = 0): bool


其中 $json是需要验证的JSON字符串,$depth是解码结构的嵌套深度(最大),$flags是解码标志的位数。


Unserialize() 函数的错误处理改进


随着 PHP 8.3 的发布,捕获错误和异常将变得更加容易。到目前为止,如果出现错误,开发人员会收到 E_WARNING 或 E_NOTICE,系统会抛出综合的错误异常。


开发者必须编写类似这样的内容来进行错误处理:



try {
set_error_handler(static function ($severity, $message, $file, $line) {
throw new \ErrorException($message, 0, $severity, $file, $line);
});
$result = unserialize($serialized);
} catch (\Throwable $e) {
	// Unserialization failed. Catch block is optional in case the error shouldn’t be handled.
} finally {
	restore_error_handler();
}
var_dump($result);


在上面,你需要设置错误处理程序、捕获异常并恢复错误处理程序。我们可能无法保证恢复错误处理程序选项在出现异常时能够无缝运行,这可能会带来很多的麻烦。


好的事情是,新的 PHP 8.3 附带了改进的 unserialize( ) 函数。因此,如果你的 unserialize() 方法失败,它将抛出 UnserializationFailedException。E_WARNING 或 E_NOTICE 将转换为异常,包含在 UnserializationFailedException 的实例中。它使捕获和处理错误变得更加容易。


因此,我们可以使用如下的 unserialize 方法:



try {
	$result = unserialize('B:2:"jon";');
	var_dump($result);
	// Do something with the $result.
} catch (\UnserializationFailureException $e) {
	// unserialization failed.
}


Randomizer 类中的新函数


为 \Random\Randomizer 类提出了几种方法。在这些函数的帮助下,您将有更好的机会创建随机值。在这里,看看 PHP 上一个版本中添加的一些功能。


一、getBytesFromString()函数


随机字符串生成


这种方法可以在多种场合使用。例如,您可以从字符串中随机选择的字符生成,并生成所需长度的字符串。为了更好地理解,请来看以下代码:



$randomizer = new \Random\Randomizer();
$randomizer->getBytesFromString('abcdef', 3); // 'bda'


在这里,我们将长度指定为 3,并且该函数从提供的字符串中随机选择了3个字符。以下是一些现实中的例子:


创建多元素身份证验证代码



$randomizer = new \Random\Randomizer();
var_dump(
implode('-', str_split($randomizer->getBytesFromString('0123456789', 20), 5))
);
// string(23) "09292-16502-59535-88886"


随机创建子域名



$randomizer = new \Random\Randomizer();
var_dump(
$randomizer->getBytesFromString('abcdefghijklmnopqrstuvwxyz', 10) . '.example.com'
);
// string(20) "jxqzjxqzjx.example.com"


创建 DNA 序列



$randomizer = new \Random\Randomizer();
	var_dump(
	$randomizer->getBytesFromString('ATGC', 30)
);
// string(30) "TCTGCTGCTGCTGCTGCTGCTGCTGCTGCT"


二. getfloat()方法



public function getFloat(
	float $min,
	float $max,
	IntervalBoundary $boundary = IntervalBoundary::ClosedOpen
): float {}


获取随机浮点数


该函数用于随机获取任意两个提供的数字之间的浮点数。这里,查看代码供您参考:



$randomizer = new \Random\Randomizer();
$randomizer->getFloat(0, 1); // 0.123456789


随机生成纬度和经度



$randomizer = new \Random\Randomizer();
var_dump(
$randomizer->getFloat(-90, 90, \Random\IntervalBoundary::ClosedClosed),
$randomizer->getFloat(-180, 180, \Random\IntervalBoundary::OpenClosed)
);
// Lat: float(-45.123456789)
// Long: float(123.123456789)


三.nextfloat() 函数


语法格式:


public function nextFloat(): float {}


随机生成数字 0 和 1 之间的浮点数。



$randomizer = new \Random\Randomizer();
$randomizer->nextFloat(); // 0.123456789
$randomizer->nextFloat(); // 0.987654321


当然,它可能看起来类似于 getfloat() 方法,但它严格用于生成 0 到 1 之间的随机浮点数。


例1.模拟抛硬币



$randomizer = new \Random\Randomizer();
var_dump(
	$randomizer->nextFloat() > 0.5 ? 'Heads' : 'Tails'
);
// string(5) "Tails"


例2.模拟掷骰子



$randomizer = new \Random\Randomizer();
var_dump(
	(int) ($randomizer->nextFloat() * 6) + 1
);
// int(3)


动态获取类常量


到目前为止,PHP 确定支持动态或计算方法和属性。



//Calling variables dynamically
$baz = 'foo';
$$baz = 'bar';
^
// $foo

// Calling class functions dynamically
class Foo
{
	public function hello()
	{
		echo 'Hello world!';
	}
}
$dynamicMethod = 'hello';
$a = new Foo();
$a->{$dynamicMethod}(); //prints 'Hello!'


然而,动态调用类常量还不可行。但是在 PHP 8.3 中,你可以期待此功能的出现。



class Foo
{
	public const BAR = 'bar';
}
$dynamicConstant = 'BAR';
echo Foo::{$dynamicConstant};
//prints 'bar'


如果尝试访问不存在的常量,它将抛出如下所示的错误:



class Foo {}
$bar = 'BAR';
echo Foo::{$bar};
// Error: Undefined constant Foo::BAR


改进的日期/时间异常处理


在 PHP 8.3 中,一些日期/时间异常预计将得到充分改进。在以前版本中大多数异常都是非常通用的,并且没有提供有关这些错误的太多信息,因此很难捕获。

在 PHP 8.3 更新中,这个问题将得到解决,将会出现更具体的异常。例如,以下错误和异常将可用。

  • DateTime 对象、DateTimeImmutable 对象、DateTimeZone 对象和 DatePeriod 对象的序列化数据无效。
  • 无法修改只读属性 DatePeriod::$%s
  • 反序列化时位置 %d (%c) 处出现错误或未知格式 (%s) 的警告:%s
  • 比较未初始化的 DateTimeZone 对象时出错
  • 迭代器不能通过引用与 foreach 一起使用
  • 值错误
  • 类型错误
  • DateError 例如 DateObjectError 和 DateRangeError。

例外情况

DateException,例如 DateInvalidTimeZoneException、DateInvalidOperationException、DateMalformedStringException、DateMalformedIntervalStringException 和 DateMalformedPeriodStringException。

虽然,我们将在新更新中享受到的一些最有用的功能和更新,但也必须注意一些向后兼容性问题。


PHP 8.3 更新期间需要注意的向后兼容性问题


如果出现“ Epoch does not fit in a PHP integer ”错误时,你现在将得到一个 DateRangeError,而不是通用的 ValueError。如果使用 32 位系统,这可能是一个问题。

对于“减法仅支持非特殊相对时间规范”警告,你会遇到带有 date_sub() 和 DateTime::sub() 等函数的 DateInvalidOperationException。


以下对即将正式版的PHP8.3功能列表如下。


PHP 8.3更新一览表


PHP 8.3 带来的新变化包括:


- 实现了更合适的日期/时间异常处理;

- 添加 json_validate() 函数用来验证 JSON;

- 实现 #[\Override] 属性 RFC;

- 更新 Zip 扩展,并添加新的设置/获取存档标志方法;

- PHP POSIX 支持添加了 posix_sysconf、posix_pathconf、posix_fpathconf 和 posix_eaccess;

- 新的 PHP Socket 选项;

- 随机生成器类,增加新的方法;

- 通过 cURL 7.87 ,添加了新的 cURL 参数和常量支持;

- 在操作 DOM 节点和元素添加了各种新的 DOM 操作方法;

- 支持对 number_format() 函数内负数进行舍入;

- 在 OpenBSD 平台上支持 zend_call_stack_get;

- 支持使用php -l 选项一次检查多个文件;

- 支持数组中的负索引。;

- 支持匿名只读类;

- 常量支持类型化; 

- 其它更多错误修复和改进。


结论


新的 PHP 8.3 预计将为这个脚本语言带来新功能和改进。如随机化器添加、json() 验证、unserialize() 错误处理。但更重要的是,对于必须绞尽脑汁理解一般错误和异常的开发和测试人员来说,这将是一次特殊的更新。

通过包含指定的错误和异常建议,将能够捕获错误,更能无缝地纠正代码。让我们一起期待~


评论