PHP 8.3 大升级:20 个新特性全面解析

PHP 8.3 是流行的服务器端脚本语言的最新版本,带来了许多新功能和改进,旨在简化 Web 开发并提高性能。这些增强功能包括只读类、新函数 json_validate() 、Randomizer 类的扩展以及更合适的日期/时间异常。它们将彻底改变 PHP 开发体验,使其更加高效、安全,以满足 Web 开发人员和企业的需求。

1. Readonly 类改进

PHP 8.3 对只读类进行了重大改进,使开发人员能够更灵活地控制其代码。其中一个显著的变化是允许在克隆时重新初始化只读属性,解决了特定但关键的边缘情况。此增强功能允许深度克隆只读属性,从而扩大了只读类在 PHP 中的应用范围。看看以下带有DateTime属性的只读类:

readonly  class  Post  {      public  function  __construct ( public DateTime $createdAt ) {          // 构造函数逻辑     }      public  function  __clone ( ) {          $this ->createdAt = new  DateTime (); }          // 现在允许重新初始化只读属性     }  }登录后复制

2.新函数json_validate()

PHP 8.3 引入了 json_validate() 函数,为开发人员提供了一种更高效、更直接的验证 JSON 字符串的方法。此函数特别有用,因为它可以在不解码 JSON 字符串的情况下确定其有效性。

$jsonString = '{ "姓名" : "xx" , "年龄" : 30 , "城市" : "xxx" }'; if (json_validate( $jsonString )) { echo "JSON 字符串有效。" ; } else { echo "JSON 字符串无效。" ; }登录后复制

您甚至可以指定自定义深度和标志。

$jsonString = '{ "姓名" : "xx" , "年龄" : 30 , "城市" : "xxx" }'; // 使用自定义深度和标志验证 JSON 字符串 if (json_validate( $jsonString , 512 , JSON_THROW_ON_ERROR )) { echo "The JSON string is valid." ; } else { echo "JSON 字符串无效。" ; }登录后复制

PHP 8.3 中的 json_validate() 函数简化了 JSON 验证过程,提供了一种更节省内存的替代方案,用于验证 JSON 数据。此增强功能在仅需要确定 JSON 数据有效性的场景中特别有价值,有助于提高 PHP 应用程序的性能和资源利用率。

3. 扩展 Randomizer 类

Randomizer 类已通过新方法得到增强,使开发人员能够以更好的控制和灵活生成随机数据。这些附加功能扩展了 Randomizer 类的功能,为生成指定范围和约束内的随机值提供了支持。

use Randomizer; $string = "Hello, World!"; $length = 10; $randomBytes = Randomizer::getBytesFromString($string, $length); var_dump($randomBytes);登录后复制

您甚至可以生成一定范围内的随机整数。

use Randomizer; use IntervalBoundary; $min = 10; $max = 20; $randomInteger = Randomizer::getRandomInteger($min, $max, IntervalBoundary::Closed); echo $randomInteger;登录后复制

PHP 8.3 中对 Randomizer 类的新增功能提供了生成受控随机数据的强大功能,可满足各种用例。这些方法使 Randomizer 类更加通用和实用,并为 PHP 开发人员提供了更广泛的随机数据生成选项。

4.类型化类常量

类型化类常量的引入为开发人员提供了使用特定数据类型定义类常量的功能,从而提高类定义中的类型安全性和清晰度。此增强功能使开发人员能够对类常量实施类型约束,从而增强代码可读性并减少意外的数据类型不匹配。让我们通过几个示例来探讨此功能:

class MathOperations { public const PI: float = 3.14159; public const MAX_ITERATIONS: int = 1000; }登录后复制

class Configuration { public const DEFAULT_TIMEOUT: int = 30; public const ENABLE_LOGGING: bool = true; public function setRequestTimeout ( int $timeout ): void { // 使用 DEFAULT_TIMEOUT 常量设置请求超时 // 定义为整数 // ... } public function enableLogging ( bool $enable ): void { // 启用或禁用日志记录基于 ENABLE_LOGGING 常量 // 定义为布尔值 // ... } }登录后复制

PHP 8.3 中引入的类型化类常量允许开发人员为类常量指定数据类型,从而增强了类定义的表现力和可靠性。此功能有助于提高代码质量、改善文档并减少类常量中出现数据类型错误的可能性,从而增强 PHP 应用程序的稳健性。

5. 匿名只读类

PHP 8.3 引入了对匿名类标记为只读的支持,这为动态创建不可变对象提供了更大的灵活性。让我们通过几个示例来探讨此功能:

$person = new class { public function __construct ( public string $name , public int $age ) {} }; $john = new $person ( 'xx' , 30 ); echo $john->name;// 输出:xx echo $john ->age; // 输出:30登录后复制

您甚至可以对数据结构使用匿名只读类。

$data = new class { public array $values = []; public function addValue($value): void { $this->values[] = $value; } }; $data -> addValue ( 'A' ); $data -> addValue ( 'B' ); $data -> addValue ( 'C' ); print_r ( $data -> alues); // 输出:数组 ( [0] => A [1] => B [2] => C )登录后复制

PHP 8.3 中引入的匿名只读类为开发人员提供了一种轻量级且灵活的方式来动态创建不可变对象和数据结构。此功能增强了 PHP 面向对象功能的表现力和多功能性,为某些用例提供了传统类声明的便捷替代方案。

6.动态类常量获取

此功能允许开发人员使用更动态的语法来获取类常量,从而在使用类常量时提供更大的灵活性和表现力。让我们通过几个示例来探讨此功能:

class Configuration { public const DEFAULT_TIMEOUT = 30; public const ENABLE_LOGGING = true; } $constantName = 'DEFAULT_TIMEOUT'; echo Configuration::{$constantName}; // Output: 30登录后复制

您甚至可以在函数内使用动态类常量。

class Configuration { public const DEFAULT_TIMEOUT = 30; public const ENABLE_LOGGING = true; } function getConstantValue(string $constantName): mixed { return Configuration::{$constantName}; } echo getConstantValue('ENABLE_LOGGING'); // Output: 1 (true)登录后复制

PHP 8.3 中引入的“动态类常量获取”功能允许开发人员以更加动态和通用的方式访问类常量,从而允许根据运行时的常量值检索。此增强功能增强了使用类常量的表现力和灵活性,适合动态常量访问有利于应用程序逻辑和功能的场景。

7. 更合适的日期/时间异常

此功能为日期和时间操作引入了专用异常,以处理各种边缘情况。此增强功能旨在提高日期和时间相关代码的稳健性和可靠性,通过提供更细粒度和更具体的错误处理。让我们通过几个示例来探讨此功能:

try { // 导致范围错误的日期操作 // ... } catch (DateRangeError $e ) { // 处理特定的 DateRangeError 异常 // 记录错误,通知用户或采取适当的操作 // ... } catch ( Exception $e ) { // 回退到通用异常处理 // ... }登录后复制

您甚至可以处理日期格式错误的间隔字符串异常。

try { // 日期间隔解析操作 // ... } catch (DateMalformedIntervalStringException $e) { // 处理特定的日期间隔解析异常 // ... } catch (Exception $e) { // 回退到通用异常处理 // ... }登录后复制

PHP 8.3 中的“更合适的日期/时间异常”功能为开发人员提供了更精确和结构化的方法来处理与日期和时间相关的错误。通过针对特定日期和时间边缘情况引入专用异常,此增强功能可促进更好的错误管理,并有助于更有针对性地处理与日期和时间相关的异常。这最终有助于提高 PHP 应用程序中日期和时间操作的整体可靠性和稳健性。

8. 改进了 unserialize() 错误处理

此功能改进了 unserialize() 函数的错误处理机制,使其在数据反序列化期间遇到问题时更加一致和可预测。此改进旨在简化错误报告,确保 unserialize() 更有效地处理错误,从而提高错误管理和调试功能。让我们通过几个示例来探讨此功能:

$data = '...'; // 序列化数据 $result = unserialize($data); if ($result === false) { $error = error_get_last(); if ($error && $error['type'] === E_WARNING) { // 处理 unserialize() 的 E_WARNING 错误 // 记录错误,通知用户或采取适当的操作 // ... } else { // 回退到通用错误处理 // ... } }登录后复制

您甚至可以通过 unserialize 方法使用异常处理。

$data = '...'; // 序列化数据 try { $result = unserialize($data); // 处理非序列化数据 // ... } catch (UnserializeException $e) { // 处理 unserialize() 失败的异常 // 记录错误、通知用户或采取适当的操作 // ... } catch (Exception $e) { // 回退到通用异常处理 // ... }登录后复制

PHP 8.3 中的“改进的 unserialize() 错误处理”功能为该函数引入了更加一致和结构化的错误处理。此功能为开发人员提供了在数据反序列化过程中对错误报告和管理的增强控制。通过提供更可预测的错误处理机制,此改进有助于提高在 PHP 应用程序中处理序列化数据时的调试能力和整体错误恢复能力。

9. 特征和静态属性

此功能对使用具有静态属性的特征的行为进行了更改。此增强功能解决了在特征中重新声明从父类继承的静态属性的问题。现在,合并该特征的每个类都将为静态属性维护单独的存储。这种行为类似于将静态属性直接添加到没有特征的类中。这使得对特征内静态属性的处理更加可预测和一致。让我们通过几个示例来探讨此功能:

trait Loggable { protected static $log = []; public static function addToLog($message) { self::$log[] = $message; } public static function getLog() { return self::$log; } } class User { use Loggable; } class Product { use Loggable; } User::addToLog('User logged in'); Product::addToLog('New product added'); var_dump(User::getLog()); var_dump(Product::getLog());登录后复制

您甚至可以将特征与静态属性的初始化一起使用

trait Counter { protected static int $count = 0; public static function increment() { self::$count++; } public static function getCount() { return self::$count; } } class Order { use Counter; } class Invoice { use Counter; } Order::increment(); Invoice::increment(); Order::increment(); var_dump(Order::getCount()); // 输出: int(2) var_dump(Invoice::getCount()); // 输出: int(1)登录后复制

PHP 8.3 中的“特征和静态属性”功能可确保具有静态属性的特征在多个类中使用时表现一致且可预测。这为在基于特征的代码结构中处理静态属性提供了更强大和直观的机制。

10. 堆栈溢出检测

此功能新增了两个 php.ini 指令,即 zend.max_allowed_stack_size 和 zend.reserved_stack_size,用于检测和防止堆栈溢出。此增强功能旨在通过检测和处理堆栈溢出来提高 PHP 应用程序的可靠性和稳定性,从而减少分段错误的发生概率并简化调试。让我们通过几个示例来探讨此功能:

// php.ini zend.max_allowed_stack_size = 128K登录后复制

// php.ini zend.reserved_stack_size = 16K // PHP code function recursiveFunction($n) { if ($n myFunction(); // 调用C函数登录后复制

您甚至可以像这样检查返回类型:

$result = $ffi->myFunction(); if ($result === null) { echo "函数执行成功,返回 null。"; } else { echo "意外的返回值。"; }登录后复制

PHP 8.3 中的“改进的 FFI\CData:void”功能简化了 PHP 中返回 void 的 C 函数的表示,从而简化了通过 FFI 与此类函数的交互。此增强功能允许这些函数在 PHP 中表示为 null,从而在使用不返回值的 C 函数时提供更直观和一致的 FFI 体验。

14. posix_getrlimit()参数增强

PHP 8.3 引入了对 posix_getrlimit() 函数的改进,允许它采用可选参数来获取单个资源限制。此改进使开发人员可以更灵活地获取特定资源的限制,从而简化了在 PHP 应用程序中获取详细资源使用信息的过程。让我们通过几个示例来探讨此功能:

// 获取最大打开文件数的软限制 $softLimit = posix_getrlimit(POSIX_RLIMIT_NOFILE, POSIX_RLIMIT_SOFT); echo "打开文件最大数量的软限制:{$softLimit}\n";登录后复制

您甚至可以获取 CPU 时间的限制。

// 获取 CPU 时间的限制 $hardLimit = posix_getrlimit(POSIX_RLIMIT_CPU, POSIX_RLIMIT_HARD); echo "CPU 时间的限制:" . $hardLimit . "\n";登录后复制

PHP 8.3 中的“posix_getrlimit() 参数增强”使开发人员可以获取单个资源限制,提供更细粒度和更有针对性的方法来检索资源使用信息。此增强功能提高了处理资源限制的准确性和灵活性,适用于在 PHP 应用程序中有效管理资源时需要详细资源限制信息的场景。

15. gc_status() 改进

PHP 8.3 中对 gc_status() 函数进行了增强,新增了 8 个字段,以提供更全面的垃圾收集过程视图。这些字段提供有关 PHP 应用程序内存管理和垃圾收集的详细信息。

新领域包括:

  • running:垃圾收集是否正在运行。

  • protected:内存块是否受到垃圾回收的保护。

  • full:是否正在进行完整的垃圾收集周期。

  • buffer_size:垃圾收集的缓冲区大小,以字节为单位。

  • application_time:总的应用程序时间,包括垃圾收集周期所花费的时间。

  • collector_time:收集周期所花费的时间,包括析构函数的执行和值的释放。

  • destructor_time:循环收集期间执行析构函数所花费的时间。

  • free_time:循环收集期间释放值所花费的时间。

  • $status = gc_status(); echo "垃圾收集是否正在运行:" . ($status['running'] ? '是' : '否') . "\n"; echo "是否存在受保护的内存块:" . ($status['protected'] ? '是' : '否') . "\n"; echo "是否正在进行完整垃圾收集:" . ($status['full'] ? '是' : '否') . "\n"; echo "垃圾收集的缓冲区大小:" . $status['buffer_size'] . " 字节\n"; echo "总应用时间:" . $status['application_time'] . " 秒\n"; echo "收集周期所花费的时间:" . $status['collector_time'] . " 秒\n"; echo "执行析构函数所花费的时间:" . $status['destructor_time'] . " 秒\n"; echo "释放值所花费的时间:" . $status['free_time'] . " 秒\n";登录后复制

    16. class_alias() 对内部类的支持

    PHP 8.3 新增了对 class_alias() 函数的支持,允许开发人员为内部 PHP 类创建别名。此增强功能为内部类的使用提供了更大的灵活性和便利性,可以简化类引用并提高代码可读性。让我们通过几个示例来探讨此功能:

    class_alias('DateTime', 'MyDateTime');登录后复制

    您甚至可以使用类别名进行内部类初始化。

    $date = new MyDateTime('2023-11-28'); echo $date->format('Y-m-d');登录后复制

    PHP 8.3 新增的 class_alias() 函数支持内部类,简化了为内部类创建别名的过程。此功能为开发人员提供了一种方便的机制来定义内部类的替代名称,从而提高代码组织和可读性。该增强功能有助于形成更具表现力和连贯性的代码库,从而允许在 PHP 应用程序中进行更清晰且更上下文相关的类引用。

    17. mysqli_poll()错误处理

    此功能对错误处理行为进行了更改。具体来说,如果调用 mysqli_poll() 函数时未提供读取或错误参数,则现在将引发 ValueError 异常。此增强功能确保了 mysqli_poll() 函数只能与适当的参数一起使用,从而在涉及异步 MySQL 查询执行的场景中促进了更强大和可预测的错误处理。让我们考虑一个例子来说明这种行为:

    // MySQL 链接数组 $links = [...]; // 初始化变量 $read = []; $error = []; $reject = []; // 轮询 MySQL 连接 if (mysqli_poll($links, $read, $error, $reject, $timeout)) { // 处理结果 foreach ($read as $link) { // 处理成功的查询执行 } foreach ($error as $link) { // 处理查询执行错误 } foreach ($reject as $link) { // 处理被拒绝的连接 } } else { // 处理轮询错误 }登录后复制

    PHP 8.3 通过在未传递 read 或 error 参数时引发 ValueError 错误,促进了更明确和可靠的错误处理实践。此增强功能鼓励开发人员提供调用 mysqli_poll() 所需的所有参数,从而提高 PHP 应用程序中异步 MySQL 查询执行的整体稳健性和可预测性。

    18. array_pad() 功能增强

    PHP 8.3 增强了 array_pad() 函数,消除了之前一次最多只能添加 1048576 个元素的限制。此改进使开发人员可以用大量元素填充数组,从而增强了 PHP 应用程序中数组填充操作的灵活性和可扩展性。

    19. 删除 opcache.consistency_checks ini 指令

    PHP 8.3 删除了 opcache.consistency_checks INI 指令,该指令以前用于启用或禁用 OPCache 中的一致性检查。此删除消除了对 opcache.consistency_checks 指令的管理需求,从而简化了 OPCache 配置,并使 OPCache 设置和维护更容易。以下示例说明了此更改如何影响 OPCache 配置:

    opcache.consistency_checks = 1登录后复制

    20. 使用 number_format() 正确处理小数位

    PHP 8.3 中对 round() 函数进行了增强,使其能够正确处理负整数的 decimal 参数。以前,负数 decimal 会被默默地忽略,并且数字会四舍五入到小数点后零位。现在,使用负值 decimal 意味着将 num 四舍五入到小数点前指定的有效位数。让我们通过几个示例来探讨此功能:

    $num = 1234.56789 ; $formatted1 = number_format ( $num , 2 ); // 1,234.57 $formatted2 = number_format ( $num , - 2 ); // 1,200登录后复制

    恭喜!您完成了对 PHP 8.3 中引入的 20 个特性和改进的学习。这个最新版本增强了大量的特性,以满足开发人员和企业不断变化的需求,使他们能够编写更高效、可靠和可维护的代码。

    以上就是PHP 8.3 大升级:20 个新特性全面解析的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!