优秀的编程知识分享平台

网站首页 > 技术文章 正文

你不知道的PHP 8.3版本和它的一些有趣的变化

nanyue 2024-11-11 12:27:57 技术文章 1 ℃

hello,大家好呀,我是杨杨!今天在闲暇之余看到php8.3版本,目前php.net官方最新版本是8.2版,关于php8.3的rfc,我找到的资料是在2022年提出的,因此,我整理了下关于这个未来会发布的版本的已知的特性分享给大家



json_validate() 函数

PHP: rfc:json_validate

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

这里,$json是需要验证json字符串,$depth是解码结构的嵌套深度(最大值),$flags是解码标志的位码

正如我们所知,php8.3以前,PHP中还没有用于验证JSON的函数。我们必须做这样一个例子:

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

但是在PHP 8.3版本中,添加了一个名为json_validate的新函数。这个函数为我们轻松地完成了验证JSON字符串的工作。只需将JSON输入给这个函数:

$json = '{"name": "Iman Borumand Zadeh"}';
  if (json_validate($json)) {
   // Valid JSON
  } else {
   // Invalid JSON
  }

正如您所看到的,使用json_validate函数要容易得多,也方便得多。这个函数接收一个字符串输入,如果有效则返回true,否则返回false。

getFloat() 方法

getFloat()方法允许您在两个给定数字之间生成一个随机浮点数。

$randomizer = new \Random\Randomizer();

$randomizer->getFloat(0, 1); // 0.163456789

我们也可以使用这种方法来生成随机的纬度和经度

$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() 方法

此方法允许您生成一个介于0和1之间的随机浮点数。

$randomizer = new \Random\Randomizer();

$randomizer->nextFloat(); // 0.123456789
$randomizer->nextFloat(); // 0.987654321

动态获取类常量

到目前为止,PHP还支持动态或计算函数和属性。

$baz = 'foo';

$baz = 'bar';
  ^
// $foo 
// 动态调用类函数
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

Unserialize()错误处理改进

PHP当前的错误报告unserialize()非常不一致,这使得很难可靠地处理反序列化期间发生的错误。在PHP 8.3中将添加新的\UnserializationFailedException。另外,改进错误处理。

让我们来看一个例子:

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失败了。如果不应该处理错误,Catch块是可选的。
} finally {
    restore_error_handler();
}

在这里,您需要设置错误处理程序、捕获异常并恢复错误处理程序。您甚至不能保证在发生异常时恢复错误处理程序选项能够无缝地工作。这可能会有很多麻烦。

但是,新的PHP 8.3提供了一个改进的unserialize()函数。因此,如果unserialize()方法失败,它将抛出一个UnserializationFailedException异常。E_WARNING或E_NOTICE将被转换为异常,包装在UnserializationFailedException实例中。它使捕获和处理错误变得更加容易。

因此,不需要编写前面提到的代码片段,你可以像这样使用unserialize方法:

try {
$result = unserialize('B:2:"jon";');
var_dump($result);
} catch (\UnserializationFailureException $e) {
// unserialization failed.
}
最近发表
标签列表