Home > Backend Development > PHP8 > PHP 8.3 major upgrade: comprehensive analysis of 20 new features

PHP 8.3 major upgrade: comprehensive analysis of 20 new features

DDD
Release: 2023-11-28 11:27:43
Original
4292 people have browsed it

PHP 8.3 is the latest version of the popular server-side scripting language, bringing many new features and improvements designed to simplify web development and improve performance. These enhancements include read-only classes, a new function json_validate(), an extension to the Randomizer class, and more appropriate date/time exceptions. They will revolutionize the PHP development experience, making it more efficient and secure to meet the needs of web developers and enterprises.

1. Readonly class improvements

PHP 8.3 has made significant improvements to readonly classes, giving developers more flexible control over their code. One of the notable changes is to allow read-only properties to be reinitialized when cloning, addressing a specific but critical edge case. This enhancement allows for deep cloning of read-only properties, expanding the use of read-only classes in PHP. Take a look at the following read-only class with DateTime property:

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

In the above example, the Post class has a read-only property $createdAt that represents the creation date of the post. An improvement in PHP 8.3 enables the __clone() method to reinitialize read-only properties. This enables deep cloning of objects without affecting the integrity of read-only properties.

2. New function json_validate()

PHP 8.3 introduced the json_validate() function, providing developers with a more efficient and direct way to verify JSON strings. This function is particularly useful because it can determine the validity of a JSON string without decoding it.

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

In the above example, use the json_validate() function to directly validate the JSON string $jsonString. If the JSON string is valid, the appropriate message is displayed. This function provides a simple way to validate JSON data without decoding and error handling.

You can even specify custom depth and flags.

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

In the following example, the json_validate() function is used with a custom depth and flags to validate JSON data. The second parameter specifies the maximum depth of the JSON data, and the third parameter sets the validation flag. This allows developers to tailor the verification process to specific requirements.

The json_validate() function in PHP 8.3 simplifies the JSON validation process, providing a more memory-efficient alternative for validating JSON data. This enhancement is particularly valuable in scenarios where you only need to determine the validity of JSON data, helping to improve the performance and resource utilization of PHP applications.

3. Extending the Randomizer class

The Randomizer class has been enhanced with new methods, allowing developers to generate random data with greater control and flexibility. These additional features extend the functionality of the Randomizer class to provide support for generating random values ​​within specified ranges and constraints.

use Randomizer;
$string = "Hello, World!";
$length = 10;
$randomBytes = Randomizer::getBytesFromString($string, $length);
var_dump($randomBytes);
Copy after login

In this example, the getBytesFromString() method of the Randomizer class is used to generate a random byte string of specified length from the given input string. This method provides a convenient way to create a random byte sequence based on a source string, and is suitable for scenarios where random data needs to be generated.

You can even generate random integers within a range.

use Randomizer;
use IntervalBoundary;
$min = 10;
$max = 20;
$randomInteger = Randomizer::getRandomInteger($min, $max, IntervalBoundary::Closed);
echo $randomInteger;
Copy after login

This example uses the getRandomInteger() method of the Randomizer class to generate a random integer within the specified range. The range is defined by the $min and $max parameters. The enumeration IntervalBoundary::Closed indicates that the minimum and maximum values ​​should be included in the range. This method allows developers to generate random integers within specific bounds, providing precise control over the generated values.

New additions to the Randomizer class in PHP 8.3 provide powerful capabilities for generating controlled random data to suit a variety of use cases. These methods make the Randomizer class more general and useful, and provide PHP developers with a wider range of random data generation options.

4. Typed class constants

The introduction of typed class constants provides developers with the ability to define class constants using specific data types, thereby improving type safety and clarity in class definitions Spend. This enhancement enables developers to enforce type constraints on class constants, thereby enhancing code readability and reducing unexpected data type mismatches. Let's explore this functionality through a few examples:

class MathOperations {
    public const PI: float = 3.14159;
    public const MAX_ITERATIONS: int = 1000;
}
Copy after login

In this example, the MathOperations class defines two constants with specific data types: PI and MAX_ITERATIONS. PI is of type float and MAX_ITERATIONS is of type int. This ensures that these constants always hold a value of the specified data type, improving type safety and code clarity.

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 常量
        // 定义为布尔值
        // ...
     }
}
Copy after login

In this example, the Configuration class uses typed class constants to define default timeouts and logging configuration options. The DEFAULT_TIMEOUT constant is of type int, ensuring that it always holds an integer value. The ENABLE_LOGGING constant is of type bool, ensuring that it always holds a boolean value. This improves code consistency and type safety when using these constants within class methods.

Typed class constants introduced in PHP 8.3 allow developers to specify data types for class constants, thereby enhancing the expressiveness and reliability of class definitions. This feature helps increase code quality, improve documentation, and reduce the likelihood of data type errors in class constants, thereby enhancing the robustness of PHP applications.

5. Anonymous read-only classes

PHP 8.3 introduces support for anonymous classes marked as read-only, which provides greater flexibility for dynamically creating immutable objects. Let's explore this feature with a few examples:

$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
Copy after login

在本示例中,使用 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 )
Copy after login

在本示例中,使用匿名只读类创建了一个简单的数据结构,用于存储值。该类具有一个公共属性 values,用于保存值的数组,以及一个 addValue() 方法,用于向数组添加值。这展示了如何使用匿名只读类来创建临时数据结构,而无需正式的类声明。

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
Copy after login

在本示例中,使用 $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)
Copy after login

在本示例中,定义了一个 getConstantValue() 函数,用于根据提供的常量名称动态获取类常量的值。这展示了如何在函数中利用动态类常量获取功能来动态检索类常量值。

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

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

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

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

在本示例中,捕获 DateRangeError 异常来处理日期操作导致的范围错误。这允许针对日期范围错误进行有针对性的错误处理,以便根据异常类型采取适当的操作。

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

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

在本示例中,捕获 DateMalformedIntervalStringException 异常,以处理日期间隔字符串格式错误的情况。通过使用这种特定的异常类型,开发人员可以针对涉及格式错误的日期间隔字符串的场景实现定制的错误处理。

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 {
        // 回退到通用错误处理
        // ...
    }
}
Copy after login

在本示例中,尝试反序列化数据后,代码会检查结果是否为 false,这是错误的标志。然后,代码会使用 error_get_last() 函数检索最后一个错误,并检查错误类型。如果错误类型为 E_WARNING,代码会将 unserialize() 错误视为警告,从而允许针对 unserialize() 问题进行特定的错误处理。

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

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

在本示例中,代码使用 try-catch 块来处理反序列化过程。如果抛出 UnserializeException,则允许针对 unserialize() 异常进行特定的错误处理。这使开发人员能够针对 unserialize() 问题实施有针对性的错误管理。

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());
Copy after login

在本示例中,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)
Copy after login

在本示例中,Counter 特征初始化静态属性 $count,并提供增加计数和检索计数值的方法。Order 和 Invoice 类使用 Counter 特征来分别跟踪订单和发票的计数。每个类都维护自己的计数,这表明不同类的特征中的静态属性是单独存储的。

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

10. 堆栈溢出检测

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

// php.ini 
zend.max_allowed_stack_size = 128K
Copy after login

在本示例中,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); // 大量递归调用
Copy after login

在本示例中,PHP 配置文件中的 zend.reserved_stack_size 指令设置为 16 KB。PHP 代码包含一个递归函数,该函数会进行大量递归调用,可能导致堆栈溢出。使用 zend.reserved_stack_size 指令后,PHP 可以检测调用堆栈何时接近溢出,并通过抛出错误来处理这种情况。这可以防止分段错误并使调试更容易。

PHP 8.3 中的“堆栈溢出检测”功能为开发人员提供了设置调用堆栈大小限制并检测潜在堆栈溢出情况的方法,从而增强 PHP 应用程序的稳定性和健壮性。通过引入这些 ini 指令,PHP 改进了堆栈溢出情况的错误处理,减少了分段错误的可能性并促进了更有效的调试过程。

11.不变的常量可见性

此功能引入了使用 invariant 关键字声明类常量的功能,确保常量的可见性在由子类扩展时保持不变。此增强功能提供了一种更明确和受控的方式来定义类常量,从而保持它们在继承层次结构中的可见性。让我们通过几个示例来探讨此功能:

class ParentClass {
    public final int MAX_VALUE = 100;
}
class ChildClass extends ParentClass {
    // 尝试更改 MAX_VALUE 的值将导致编译错误
    protected final int MAX_VALUE = 200;
}
Copy after login

在本例中,父类 ParentClass 声明了一个公有的不变常量 MAX_VALUE,其值为 100。当子类 ChildClass 尝试将 MAX_VALUE 的可见性更改为受保护时,会出现编译错误。这是为了确保在继承层次结构中常量保持不变的可见性。

您还可以在接口中使用不变常量。

interface Constants {
    public invariant string VERSION = &#39;1.0&#39;;
}
class ImplementationClass implements Constants {
    // VERSION 的可见性必须在实现类中保持公共
    private invariant string VERSION = &#39;2.0&#39;;
}
Copy after login

在本示例中,接口 Constants 声明了一个值为“1.0”的公共不变常量 VERSION。当类 ImplementationClass 尝试将 VERSION 的可见性更改为 private 时,会发生编译错误。这确保了常量的可见性保持与接口中指定的不变。

PHP 8.3 中的“不变常量可见性”功能提供了一种更强大、更明确的方式来定义类常量。它确保常量的可见性在继承层次结构和接口实现中保持一致和不变。此增强功能提高了代码的可维护性,并降低了对常量可见性进行意外更改的可能性。这有助于提高 PHP 代码库的整体可靠性和可预测性。

12.断言字符串评估清理

此功能弃用字符串评估的代码断言,以促进更安全、更可维护的编码实践。此增强功能旨在防止使用字符串评估代码进行断言,因为这可能会导致安全漏洞和代码维护挑战。让我们通过几个示例来探讨此功能:

assert( &#39;is_numeric($value)&#39; );
Copy after login

在本示例中,使用断言函数和字符串比较代码断言来检查是否 $value 为数字。这种方法存在安全风险,因此在 PHP 8.3 中已被弃用。

这是使用直接表达式的断言的更新版本。

assert(is_numeric($value));
Copy after login

在 PHP 8.3 中,推荐使用直接表达式进行断言,而不是使用字符串计算的代码。直接调用 is_numeric() 函数来断言值是否为数字,使代码更安全且更易于维护。

PHP 8.3 中的“断言字符串评估清理”功能旨在鼓励开发人员放弃使用字符串评估代码进行断言,从而促进更安全、更可靠的编码实践。弃用这种方法可以增强代码安全性和可维护性,最终有助于 PHP 应用程序的整体稳健性。

13.改进FFI\CData:void

此功能增强了 FFI 扩展,使返回类型为 void 的 C 函数在 PHP 中可以表示为 null,而不是 FFI\CData 的实例。此改进简化了不返回值的 C 函数的处理,使其行为与 PHP 中预期的 null 返回类型保持一致。让我们通过几个示例来探讨此功能:

// C code
void myFunction() {
    // 函数实现
}
// PHP FFI
$ffi = FFI::cdef("
    void myFunction();
", "mylib.so");
$ffi->myFunction();  // 调用C函数
Copy after login

在本示例中,C 函数 myFunction() 的返回类型为 void。在 PHP 8.3 中,使用 FFI 调用此函数时,返回值将为 null,而不是 FFI\CData 的实例。此改进简化了不返回值的 C 函数的处理。

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

$result = $ffi->myFunction();
if ($result === null) {
    echo "函数执行成功,返回 null。";
} else {
    echo "意外的返回值。";
}
Copy after login

在本示例中,检查 C 函数 myFunction() 的返回值。如果返回值为 null,则表明函数执行成功并且没有返回值。这与返回 void 的函数的预期行为一致。

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";
Copy after login

在本示例中,posix_getrlimit() 函数用于获取最大打开文件数的软限制。使用可选参数 POSIX_RLIMIT_SOFT,该函数检索并返回特定的资源限制值,从而提供有关资源使用情况的详细信息。

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

// 获取 CPU 时间的限制
$hardLimit = posix_getrlimit(POSIX_RLIMIT_CPU, POSIX_RLIMIT_HARD);
echo "CPU 时间的限制:" . $hardLimit . "\n";
Copy after login

在本示例中,使用 posix_getrlimit() 函数获取 CPU 时间的硬限制。通过指定 POSIX_RLIMIT_HARD 作为可选参数,该函数可以检索并返回特定的资源限制,从而精确访问资源使用详细信息。

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

15. gc_status() 改进

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

新领域包括:

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

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

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

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

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

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

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

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

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

通过访问这些字段,开发人员可以获得有关垃圾收集、内存保护、循环收集时间和资源利用率状态的宝贵见解。这些详细信息使开发人员能够就内存做出明智的决策。

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

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

class_alias(&#39;DateTime&#39;, &#39;MyDateTime&#39;);
Copy after login

在本示例中,使用 class_alias() 函数为内部 PHP 类 DateTime 创建了别名 MyDateTime。这允许开发人员在整个代码库中使用别名 MyDateTime 来引用该类,从而为该类提供更具描述性或上下文的名称。

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

$date = new MyDateTime(&#39;2023-11-28&#39;);
echo $date->format(&#39;Y-m-d&#39;);
Copy after login

在本示例中,使用别名 MyDateTime 实例化了内部类 DateTime 的对象。别名提供了更直观、更有意义的名称,从而增强了代码的清晰度和可维护性。

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 {
    // 处理轮询错误
}
Copy after login

在本示例中,使用正确的参数(包括 read、error 和 reject 数组)调用 mysqli_poll() 函数。此用法遵循 PHP 8.3 中更新的行为,确保使用必要的参数调用该函数来处理轮询操作的结果。

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
Copy after login

在 PHP 8.2 之前,需要使用 opcache.consistency_checks INI 指令来启用或禁用 OPCache 中的一致性检查。在 PHP 8.3 中,该指令已被删除,因此不再需要在 OPCache 中进行一致性检查的配置。此更改简化了 OPCache 配置过程,并降低了管理 OPCache 一致性检查的复杂性。

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
Copy after login

在 PHP 8.3 中,number_format() 函数对负值 decimal 的处理得到了增强,使其能够正确舍入数字到小数点前指定的有效位数。此增强功能可确保使用该函数对数字进行舍入时行为更加一致和可预测,从而使开发人员能够更好地控制数值的格式。

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

The above is the detailed content of PHP 8.3 major upgrade: comprehensive analysis of 20 new features. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template