PHP 8.3 は、人気のあるサーバーサイド スクリプト言語の最新バージョンであり、Web 開発を簡素化し、パフォーマンスを向上させるために設計された多くの新機能と改善点をもたらします。これらの機能強化には、読み取り専用クラス、新しい関数 json_validate()、Randomizer クラスの拡張機能、およびより適切な日付/時刻例外が含まれます。これらは PHP 開発エクスペリエンスに革命をもたらし、Web 開発者や企業のニーズを満たすために、より効率的かつ安全なものになります。
PHP 8.3 では読み取り専用クラスが大幅に改善され、開発者がコードをより柔軟に制御できるようになりました。注目すべき変更の 1 つは、クローン作成時に読み取り専用プロパティを再初期化できるようになり、特定かつ重要なエッジ ケースに対処できるようになりました。この機能強化により、読み取り専用プロパティのディープクローン作成が可能になり、PHP での読み取り専用クラスの使用が拡張されます。 DateTime プロパティを持つ次の読み取り専用クラスを見てください:
readonly class Post { public function __construct ( public DateTime $createdAt ) { // 构造函数逻辑 } public function __clone ( ) { $this ->createdAt = new DateTime (); } // 现在允许重新初始化只读属性 } }
上記の例では、Post クラスには投稿の作成日を表す読み取り専用プロパティ $createdAt があります。 PHP 8.3 の改良により、__clone() メソッドで読み取り専用プロパティを再初期化できるようになりました。これにより、読み取り専用プロパティの整合性に影響を与えることなく、オブジェクトのディープ クローン作成が可能になります。
PHP 8.3 では json_validate() 関数が導入され、開発者に JSON 文字列を検証するためのより効率的かつ直接的な方法を提供しました。この関数は、JSON 文字列をデコードせずに有効性を判断できるため、特に便利です。
$jsonString = '{ "姓名" : "xx" , "年龄" : 30 , "城市" : "xxx" }'; if (json_validate( $jsonString )) { echo "JSON 字符串有效。" ; } else { echo "JSON 字符串无效。" ; }
上の例では、json_validate() 関数を使用して、JSON 文字列 $jsonString を直接検証します。 JSON 文字列が有効な場合は、適切なメッセージが表示されます。この関数は、デコードやエラー処理を行わずに JSON データを検証する簡単な方法を提供します。
カスタムの深さとフラグを指定することもできます。
$jsonString = '{ "姓名" : "xx" , "年龄" : 30 , "城市" : "xxx" }'; // 使用自定义深度和标志验证 JSON 字符串 if (json_validate( $jsonString , 512 , JSON_THROW_ON_ERROR )) { echo "The JSON string is valid." ; } else { echo "JSON 字符串无效。" ; }
次の例では、json_validate() 関数をカスタムの深さとフラグとともに使用して、JSON データを検証します。 2 番目のパラメータは JSON データの最大深さを指定し、3 番目のパラメータは検証フラグを設定します。これにより、開発者は検証プロセスを特定の要件に合わせて調整できます。
PHP 8.3 の json_validate() 関数は、JSON 検証プロセスを簡素化し、JSON データを検証するためのよりメモリ効率の高い代替手段を提供します。この機能強化は、JSON データの有効性のみを判断する必要があるシナリオで特に価値があり、PHP アプリケーションのパフォーマンスとリソース使用率の向上に役立ちます。
Randomizer クラスが新しいメソッドで強化され、開発者がより優れた制御と柔軟性でランダム データを生成できるようになりました。これらの追加機能は、Randomizer クラスの機能を拡張し、指定された範囲および制約内でランダムな値を生成するためのサポートを提供します。
use Randomizer; $string = "Hello, World!"; $length = 10; $randomBytes = Randomizer::getBytesFromString($string, $length); var_dump($randomBytes);
この例では、Randomizer クラスの getBytesFromString() メソッドを使用して、指定された入力文字列から指定された長さのランダムなバイト文字列を生成します。このメソッドは、ソース文字列に基づいてランダムなバイト シーケンスを作成する便利な方法を提供し、ランダム データを生成する必要があるシナリオに適しています。
範囲内でランダムな整数を生成することもできます。
use Randomizer; use IntervalBoundary; $min = 10; $max = 20; $randomInteger = Randomizer::getRandomInteger($min, $max, IntervalBoundary::Closed); echo $randomInteger;
この例では、Randomizer クラスの getRandomInteger() メソッドを使用して、指定された範囲内のランダムな整数を生成します。範囲は、$min パラメーターと $max パラメーターによって定義されます。列挙型 IntervalBoundary::Closed は、最小値と最大値が範囲に含まれる必要があることを示します。この方法を使用すると、開発者は特定の範囲内でランダムな整数を生成でき、生成された値を正確に制御できます。
PHP 8.3 の Randomizer クラスに新しく追加された機能は、さまざまなユースケースに合わせて制御されたランダム データを生成するための強力な機能を提供します。これらのメソッドにより、Randomizer クラスがより汎用的で便利になり、PHP 開発者に幅広いランダム データ生成オプションが提供されます。
型付きクラス定数の導入により、開発者は特定のデータ型を使用してクラス定数を定義できるため、クラス定義の型の安全性と明確さが向上します。この機能強化により、開発者はクラス定数に型制約を適用できるため、コードの可読性が向上し、予期しないデータ型の不一致が減少します。いくつかの例を通じて、この機能を詳しく見てみましょう:
class MathOperations { public const PI: float = 3.14159; public const MAX_ITERATIONS: int = 1000; }
この例では、MathOperations クラスは、特定のデータ型を持つ 2 つの定数、PI と MAX_ITERATIONS を定義します。 PI は float 型で、MAX_ITERATIONS は int 型です。これにより、これらの定数が常に指定されたデータ型の値を保持するようになり、型の安全性とコードの明瞭さが向上します。
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 常量 // 定义为布尔值 // ... } }
この例では、Configuration クラスは型付きクラス定数を使用して、デフォルトのタイムアウトとログ構成オプションを定義します。 DEFAULT_TIMEOUT 定数は int 型で、常に整数値を保持します。 ENABLE_LOGGING 定数は bool 型で、常にブール値を保持します。これにより、クラス メソッド内でこれらの定数を使用する場合のコードの一貫性と型の安全性が向上します。
PHP 8.3 で導入された型付きクラス定数により、開発者はクラス定数のデータ型を指定できるため、クラス定義の表現力と信頼性が向上します。この機能は、コードの品質を向上させ、ドキュメントを改善し、クラス定数のデータ型エラーの可能性を減らすのに役立ち、それによって PHP アプリケーションの堅牢性が向上します。
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
在本示例中,使用 new class { … } 语法创建了一个匿名只读类。该类具有 name 和 age 两个公共属性。然后,$john 变量从该匿名类实例化了一个对象。这允许创建一个简单、轻量级的对象,而不需要正式的类声明。
您甚至可以对数据结构使用匿名只读类。
$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 )
在本示例中,使用匿名只读类创建了一个简单的数据结构,用于存储值。该类具有一个公共属性 values,用于保存值的数组,以及一个 addValue() 方法,用于向数组添加值。这展示了如何使用匿名只读类来创建临时数据结构,而无需正式的类声明。
PHP 8.3 中引入的匿名只读类为开发人员提供了一种轻量级且灵活的方式来动态创建不可变对象和数据结构。此功能增强了 PHP 面向对象功能的表现力和多功能性,为某些用例提供了传统类声明的便捷替代方案。
此功能允许开发人员使用更动态的语法来获取类常量,从而在使用类常量时提供更大的灵活性和表现力。让我们通过几个示例来探讨此功能:
class Configuration { public const DEFAULT_TIMEOUT = 30; public const ENABLE_LOGGING = true; } $constantName = 'DEFAULT_TIMEOUT'; echo Configuration::{$constantName}; // Output: 30
在本示例中,使用 $constantName 变量动态获取类常量 DEFAULT_TIMEOUT 的值。这种动态语法允许根据运行时值检索类常量,从而提供更灵活的方法来处理类常量。
您甚至可以在函数内使用动态类常量。
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)
在本示例中,定义了一个 getConstantValue() 函数,用于根据提供的常量名称动态获取类常量的值。这展示了如何在函数中利用动态类常量获取功能来动态检索类常量值。
PHP 8.3 中引入的“动态类常量获取”功能允许开发人员以更加动态和通用的方式访问类常量,从而允许根据运行时的常量值检索。此增强功能增强了使用类常量的表现力和灵活性,适合动态常量访问有利于应用程序逻辑和功能的场景。
此功能为日期和时间操作引入了专用异常,以处理各种边缘情况。此增强功能旨在提高日期和时间相关代码的稳健性和可靠性,通过提供更细粒度和更具体的错误处理。让我们通过几个示例来探讨此功能:
try { // 导致范围错误的日期操作 // ... } catch (DateRangeError $e ) { // 处理特定的 DateRangeError 异常 // 记录错误,通知用户或采取适当的操作 // ... } catch ( Exception $e ) { // 回退到通用异常处理 // ... }
在本示例中,捕获 DateRangeError 异常来处理日期操作导致的范围错误。这允许针对日期范围错误进行有针对性的错误处理,以便根据异常类型采取适当的操作。
您甚至可以处理日期格式错误的间隔字符串异常。
try { // 日期间隔解析操作 // ... } catch (DateMalformedIntervalStringException $e) { // 处理特定的日期间隔解析异常 // ... } catch (Exception $e) { // 回退到通用异常处理 // ... }
在本示例中,捕获 DateMalformedIntervalStringException 异常,以处理日期间隔字符串格式错误的情况。通过使用这种特定的异常类型,开发人员可以针对涉及格式错误的日期间隔字符串的场景实现定制的错误处理。
PHP 8.3 中的“更合适的日期/时间异常”功能为开发人员提供了更精确和结构化的方法来处理与日期和时间相关的错误。通过针对特定日期和时间边缘情况引入专用异常,此增强功能可促进更好的错误管理,并有助于更有针对性地处理与日期和时间相关的异常。这最终有助于提高 PHP 应用程序中日期和时间操作的整体可靠性和稳健性。
此功能改进了 unserialize() 函数的错误处理机制,使其在数据反序列化期间遇到问题时更加一致和可预测。此改进旨在简化错误报告,确保 unserialize() 更有效地处理错误,从而提高错误管理和调试功能。让我们通过几个示例来探讨此功能:
$data = '...'; // 序列化数据 $result = unserialize($data); if ($result === false) { $error = error_get_last(); if ($error && $error['type'] === E_WARNING) { // 处理 unserialize() 的 E_WARNING 错误 // 记录错误,通知用户或采取适当的操作 // ... } else { // 回退到通用错误处理 // ... } }
在本示例中,尝试反序列化数据后,代码会检查结果是否为 false,这是错误的标志。然后,代码会使用 error_get_last() 函数检索最后一个错误,并检查错误类型。如果错误类型为 E_WARNING,代码会将 unserialize() 错误视为警告,从而允许针对 unserialize() 问题进行特定的错误处理。
您甚至可以通过 unserialize 方法使用异常处理。
$data = '...'; // 序列化数据 try { $result = unserialize($data); // 处理非序列化数据 // ... } catch (UnserializeException $e) { // 处理 unserialize() 失败的异常 // 记录错误、通知用户或采取适当的操作 // ... } catch (Exception $e) { // 回退到通用异常处理 // ... }
在本示例中,代码使用 try-catch 块来处理反序列化过程。如果抛出 UnserializeException,则允许针对 unserialize() 异常进行特定的错误处理。这使开发人员能够针对 unserialize() 问题实施有针对性的错误管理。
PHP 8.3 中的“改进的 unserialize() 错误处理”功能为该函数引入了更加一致和结构化的错误处理。此功能为开发人员提供了在数据反序列化过程中对错误报告和管理的增强控制。通过提供更可预测的错误处理机制,此改进有助于提高在 PHP 应用程序中处理序列化数据时的调试能力和整体错误恢复能力。
此功能对使用具有静态属性的特征的行为进行了更改。此增强功能解决了在特征中重新声明从父类继承的静态属性的问题。现在,合并该特征的每个类都将为静态属性维护单独的存储。这种行为类似于将静态属性直接添加到没有特征的类中。这使得对特征内静态属性的处理更加可预测和一致。让我们通过几个示例来探讨此功能:
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());
在本示例中,Loggable 特征包含静态属性 $log 以及将消息添加到日志和检索日志的方法。User 类和 Product 类都使用该 Loggable 特征来合并日志记录功能。每个类都为静态属性维护单独的存储,即 $log,确保用户类和产品类之间的日志数据是隔离且不同的。
您甚至可以将特征与静态属性的初始化一起使用
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)
在本示例中,Counter 特征初始化静态属性 $count,并提供增加计数和检索计数值的方法。Order 和 Invoice 类使用 Counter 特征来分别跟踪订单和发票的计数。每个类都维护自己的计数,这表明不同类的特征中的静态属性是单独存储的。
PHP 8.3 中的“特征和静态属性”功能可确保具有静态属性的特征在多个类中使用时表现一致且可预测。这为在基于特征的代码结构中处理静态属性提供了更强大和直观的机制。
此功能新增了两个 php.ini 指令,即 zend.max_allowed_stack_size 和 zend.reserved_stack_size,用于检测和防止堆栈溢出。此增强功能旨在通过检测和处理堆栈溢出来提高 PHP 应用程序的可靠性和稳定性,从而减少分段错误的发生概率并简化调试。让我们通过几个示例来探讨此功能:
// php.ini zend.max_allowed_stack_size = 128K
在本示例中,PHP 配置文件中的 zend.max_allowed_stack_size 指令设置为 128 KB。该指令指定 PHP 程序允许的最大堆栈大小。这使开发人员能够定义调用堆栈大小的上限。
// php.ini zend.reserved_stack_size = 16K // PHP code function recursiveFunction($n) { if ($n <= 0) { return; } recursiveFunction($n - 1); } recursiveFunction(100000); // 大量递归调用
在本示例中,PHP 配置文件中的 zend.reserved_stack_size 指令设置为 16 KB。PHP 代码包含一个递归函数,该函数会进行大量递归调用,可能导致堆栈溢出。使用 zend.reserved_stack_size 指令后,PHP 可以检测调用堆栈何时接近溢出,并通过抛出错误来处理这种情况。这可以防止分段错误并使调试更容易。
PHP 8.3 中的“堆栈溢出检测”功能为开发人员提供了设置调用堆栈大小限制并检测潜在堆栈溢出情况的方法,从而增强 PHP 应用程序的稳定性和健壮性。通过引入这些 ini 指令,PHP 改进了堆栈溢出情况的错误处理,减少了分段错误的可能性并促进了更有效的调试过程。
此功能引入了使用 invariant 关键字声明类常量的功能,确保常量的可见性在由子类扩展时保持不变。此增强功能提供了一种更明确和受控的方式来定义类常量,从而保持它们在继承层次结构中的可见性。让我们通过几个示例来探讨此功能:
class ParentClass { public final int MAX_VALUE = 100; } class ChildClass extends ParentClass { // 尝试更改 MAX_VALUE 的值将导致编译错误 protected final int MAX_VALUE = 200; }
在本例中,父类 ParentClass 声明了一个公有的不变常量 MAX_VALUE,其值为 100。当子类 ChildClass 尝试将 MAX_VALUE 的可见性更改为受保护时,会出现编译错误。这是为了确保在继承层次结构中常量保持不变的可见性。
您还可以在接口中使用不变常量。
interface Constants { public invariant string VERSION = '1.0'; } class ImplementationClass implements Constants { // VERSION 的可见性必须在实现类中保持公共 private invariant string VERSION = '2.0'; }
在本示例中,接口 Constants 声明了一个值为“1.0”的公共不变常量 VERSION。当类 ImplementationClass 尝试将 VERSION 的可见性更改为 private 时,会发生编译错误。这确保了常量的可见性保持与接口中指定的不变。
PHP 8.3 中的“不变常量可见性”功能提供了一种更强大、更明确的方式来定义类常量。它确保常量的可见性在继承层次结构和接口实现中保持一致和不变。此增强功能提高了代码的可维护性,并降低了对常量可见性进行意外更改的可能性。这有助于提高 PHP 代码库的整体可靠性和可预测性。
此功能弃用字符串评估的代码断言,以促进更安全、更可维护的编码实践。此增强功能旨在防止使用字符串评估代码进行断言,因为这可能会导致安全漏洞和代码维护挑战。让我们通过几个示例来探讨此功能:
assert( 'is_numeric($value)' );
在本示例中,使用断言函数和字符串比较代码断言来检查是否 $value 为数字。这种方法存在安全风险,因此在 PHP 8.3 中已被弃用。
这是使用直接表达式的断言的更新版本。
assert(is_numeric($value));
在 PHP 8.3 中,推荐使用直接表达式进行断言,而不是使用字符串计算的代码。直接调用 is_numeric() 函数来断言值是否为数字,使代码更安全且更易于维护。
PHP 8.3 中的“断言字符串评估清理”功能旨在鼓励开发人员放弃使用字符串评估代码进行断言,从而促进更安全、更可靠的编码实践。弃用这种方法可以增强代码安全性和可维护性,最终有助于 PHP 应用程序的整体稳健性。
此功能增强了 FFI 扩展,使返回类型为 void 的 C 函数在 PHP 中可以表示为 null,而不是 FFI\CDatabd5a1e13576e3bda78550ab59ba3a990 的实例。此改进简化了不返回值的 C 函数的处理,使其行为与 PHP 中预期的 null 返回类型保持一致。让我们通过几个示例来探讨此功能:
// C code void myFunction() { // 函数实现 } // PHP FFI $ffi = FFI::cdef(" void myFunction(); ", "mylib.so"); $ffi->myFunction(); // 调用C函数
在本示例中,C 函数 myFunction() 的返回类型为 void。在 PHP 8.3 中,使用 FFI 调用此函数时,返回值将为 null,而不是 FFI\CDatabd5a1e13576e3bda78550ab59ba3a990 的实例。此改进简化了不返回值的 C 函数的处理。
您甚至可以像这样检查返回类型:
$result = $ffi->myFunction(); if ($result === null) { echo "函数执行成功,返回 null。"; } else { echo "意外的返回值。"; }
在本示例中,检查 C 函数 myFunction() 的返回值。如果返回值为 null,则表明函数执行成功并且没有返回值。这与返回 void 的函数的预期行为一致。
PHP 8.3 中的“改进的 FFI\CData:void”功能简化了 PHP 中返回 void 的 C 函数的表示,从而简化了通过 FFI 与此类函数的交互。此增强功能允许这些函数在 PHP 中表示为 null,从而在使用不返回值的 C 函数时提供更直观和一致的 FFI 体验。
PHP 8.3 引入了对 posix_getrlimit() 函数的改进,允许它采用可选参数来获取单个资源限制。此改进使开发人员可以更灵活地获取特定资源的限制,从而简化了在 PHP 应用程序中获取详细资源使用信息的过程。让我们通过几个示例来探讨此功能:
// 获取最大打开文件数的软限制 $softLimit = posix_getrlimit(POSIX_RLIMIT_NOFILE, POSIX_RLIMIT_SOFT); echo "打开文件最大数量的软限制:{$softLimit}\n";
在本示例中,posix_getrlimit() 函数用于获取最大打开文件数的软限制。使用可选参数 POSIX_RLIMIT_SOFT,该函数检索并返回特定的资源限制值,从而提供有关资源使用情况的详细信息。
您甚至可以获取 CPU 时间的限制。
// 获取 CPU 时间的限制 $hardLimit = posix_getrlimit(POSIX_RLIMIT_CPU, POSIX_RLIMIT_HARD); echo "CPU 时间的限制:" . $hardLimit . "\n";
在本示例中,使用 posix_getrlimit() 函数获取 CPU 时间的硬限制。通过指定 POSIX_RLIMIT_HARD 作为可选参数,该函数可以检索并返回特定的资源限制,从而精确访问资源使用详细信息。
PHP 8.3 中的“posix_getrlimit() 参数增强”使开发人员可以获取单个资源限制,提供更细粒度和更有针对性的方法来检索资源使用信息。此增强功能提高了处理资源限制的准确性和灵活性,适用于在 PHP 应用程序中有效管理资源时需要详细资源限制信息的场景。
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";
通过访问这些字段,开发人员可以获得有关垃圾收集、内存保护、循环收集时间和资源利用率状态的宝贵见解。这些详细信息使开发人员能够就内存做出明智的决策。
PHP 8.3 新增了对 class_alias() 函数的支持,允许开发人员为内部 PHP 类创建别名。此增强功能为内部类的使用提供了更大的灵活性和便利性,可以简化类引用并提高代码可读性。让我们通过几个示例来探讨此功能:
class_alias('DateTime', 'MyDateTime');
在本示例中,使用 class_alias() 函数为内部 PHP 类 DateTime 创建了别名 MyDateTime。这允许开发人员在整个代码库中使用别名 MyDateTime 来引用该类,从而为该类提供更具描述性或上下文的名称。
您甚至可以使用类别名进行内部类初始化。
$date = new MyDateTime('2023-11-28'); echo $date->format('Y-m-d');
在本示例中,使用别名 MyDateTime 实例化了内部类 DateTime 的对象。别名提供了更直观、更有意义的名称,从而增强了代码的清晰度和可维护性。
PHP 8.3 新增的 class_alias() 函数支持内部类,简化了为内部类创建别名的过程。此功能为开发人员提供了一种方便的机制来定义内部类的替代名称,从而提高代码组织和可读性。该增强功能有助于形成更具表现力和连贯性的代码库,从而允许在 PHP 应用程序中进行更清晰且更上下文相关的类引用。
此功能对错误处理行为进行了更改。具体来说,如果调用 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 { // 处理轮询错误 }
在本示例中,使用正确的参数(包括 read、error 和 reject 数组)调用 mysqli_poll() 函数。此用法遵循 PHP 8.3 中更新的行为,确保使用必要的参数调用该函数来处理轮询操作的结果。
PHP 8.3 通过在未传递 read 或 error 参数时引发 ValueError 错误,促进了更明确和可靠的错误处理实践。此增强功能鼓励开发人员提供调用 mysqli_poll() 所需的所有参数,从而提高 PHP 应用程序中异步 MySQL 查询执行的整体稳健性和可预测性。
PHP 8.3 增强了 array_pad() 函数,消除了之前一次最多只能添加 1048576 个元素的限制。此改进使开发人员可以用大量元素填充数组,从而增强了 PHP 应用程序中数组填充操作的灵活性和可扩展性。
PHP 8.3 删除了 opcache.consistency_checks INI 指令,该指令以前用于启用或禁用 OPCache 中的一致性检查。此删除消除了对 opcache.consistency_checks 指令的管理需求,从而简化了 OPCache 配置,并使 OPCache 设置和维护更容易。以下示例说明了此更改如何影响 OPCache 配置:
opcache.consistency_checks = 1
在 PHP 8.2 之前,需要使用 opcache.consistency_checks INI 指令来启用或禁用 OPCache 中的一致性检查。在 PHP 8.3 中,该指令已被删除,因此不再需要在 OPCache 中进行一致性检查的配置。此更改简化了 OPCache 配置过程,并降低了管理 OPCache 一致性检查的复杂性。
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 中,number_format() 函数对负值 decimal 的处理得到了增强,使其能够正确舍入数字到小数点前指定的有效位数。此增强功能可确保使用该函数对数字进行舍入时行为更加一致和可预测,从而使开发人员能够更好地控制数值的格式。
恭喜!您完成了对 PHP 8.3 中引入的 20 个特性和改进的学习。这个最新版本增强了大量的特性,以满足开发人员和企业不断变化的需求,使他们能够编写更高效、可靠和可维护的代码。
以上がPHP 8.3 メジャー アップグレード: 20 の新機能の包括的な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。