Maison > développement back-end > PHP8 > Mise à jour majeure de PHP 8.3 : analyse complète de 20 nouvelles fonctionnalités

Mise à jour majeure de PHP 8.3 : analyse complète de 20 nouvelles fonctionnalités

DDD
Libérer: 2023-11-28 11:27:43
original
4294 Les gens l'ont consulté

PHP 8.3 est la dernière version du populaire langage de script côté serveur, apportant de nombreuses nouvelles fonctionnalités et améliorations conçues pour simplifier le développement Web et améliorer les performances. Ces améliorations incluent des classes en lecture seule, une nouvelle fonction json_validate(), une extension de la classe Randomizer et des exceptions date/heure plus appropriées. Ils révolutionneront l'expérience de développement PHP, la rendant plus efficace et plus sécurisée pour répondre aux besoins des développeurs Web et des entreprises.

1. Améliorations des classes en lecture seule

PHP 8.3 apporte des améliorations significatives aux classes en lecture seule, donnant aux développeurs un contrôle plus flexible sur leur code. L’un des changements notables est de permettre la réinitialisation des propriétés en lecture seule lors du clonage, répondant ainsi à un cas spécifique mais critique. Cette amélioration permet un clonage approfondi des propriétés en lecture seule, élargissant ainsi l'utilisation des classes en lecture seule en PHP. Jetez un œil à la classe en lecture seule suivante avec la propriété DateTime :

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

Dans l'exemple ci-dessus, la classe Post a une propriété en lecture seule $createdAt qui représente la date de création de la publication. Une amélioration de PHP 8.3 permet à la méthode __clone() de réinitialiser les propriétés en lecture seule. Cela permet un clonage profond d'objets sans affecter l'intégrité des propriétés en lecture seule.

2. Nouvelle fonction json_validate()

PHP 8.3 introduit la fonction json_validate(), offrant aux développeurs un moyen plus efficace et plus direct de vérifier les chaînes JSON. Cette fonction est particulièrement utile car elle permet de déterminer la validité d'une chaîne JSON sans la décoder.

$jsonString  = '{ "姓名" : "xx" , "年龄" : 30 , "城市" : "xxx" }'; 
if (json_validate( $jsonString )) { 
    echo "JSON 字符串有效。" ; 
} else { 
    echo "JSON 字符串无效。" ; 
}
Copier après la connexion

Dans l'exemple ci-dessus, la fonction json_validate() est utilisée pour valider directement la chaîne JSON $jsonString. Si la chaîne JSON est valide, le message approprié s'affiche. Cette fonction fournit un moyen simple de valider les données JSON sans décodage ni gestion des erreurs.

Vous pouvez même spécifier une profondeur et des drapeaux personnalisés.

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

Dans l'exemple suivant, la fonction json_validate() est utilisée avec une profondeur et des indicateurs personnalisés pour valider les données JSON. Le deuxième paramètre spécifie la profondeur maximale des données JSON et le troisième paramètre définit l'indicateur de validation. Cela permet aux développeurs d'adapter le processus de vérification à des exigences spécifiques.

La fonction json_validate() de PHP 8.3 simplifie le processus de validation JSON, offrant une alternative plus efficace en mémoire pour valider les données JSON. Cette amélioration est particulièrement utile dans les scénarios où il vous suffit de déterminer la validité des données JSON, contribuant ainsi à améliorer les performances et l'utilisation des ressources des applications PHP.

3. Classe Randomizer étendue

La classe Randomizer a été améliorée avec de nouvelles méthodes, permettant aux développeurs de générer des données aléatoires avec un meilleur contrôle et une meilleure flexibilité. Ces fonctionnalités supplémentaires étendent les fonctionnalités de la classe Randomizer pour prendre en charge la génération de valeurs aléatoires dans des plages et des contraintes spécifiées.

use Randomizer;
$string = "Hello, World!";
$length = 10;
$randomBytes = Randomizer::getBytesFromString($string, $length);
var_dump($randomBytes);
Copier après la connexion

Dans cet exemple, la méthode getBytesFromString() de la classe Randomizer est utilisée pour générer une chaîne d'octets aléatoire de longueur spécifiée à partir de la chaîne d'entrée donnée. Cette méthode constitue un moyen pratique de créer une séquence d'octets aléatoires basée sur une chaîne source et convient aux scénarios dans lesquels des données aléatoires doivent être générées.

Vous pouvez même générer des entiers aléatoires dans une certaine plage.

use Randomizer;
use IntervalBoundary;
$min = 10;
$max = 20;
$randomInteger = Randomizer::getRandomInteger($min, $max, IntervalBoundary::Closed);
echo $randomInteger;
Copier après la connexion

Cet exemple utilise la méthode getRandomInteger() de la classe Randomizer pour générer un entier aléatoire dans une plage spécifiée. La plage est définie par les paramètres $min et $max. L'énumération IntervalBoundary::Closed indique que les valeurs minimales et maximales doivent être incluses dans la plage. Cette méthode permet aux développeurs de générer des entiers aléatoires dans des limites spécifiques, offrant ainsi un contrôle précis sur les valeurs générées.

Les nouveaux ajouts à la classe Randomizer dans PHP 8.3 offrent de puissantes fonctionnalités pour générer des données aléatoires contrôlées pour répondre à une variété de cas d'utilisation. Ces méthodes rendent la classe Randomizer plus générale et plus utile, et offrent aux développeurs PHP une plus large gamme d'options de génération de données aléatoires.

4. Constantes de classe typées

L'introduction de constantes de classe typées offre aux développeurs la possibilité de définir des constantes de classe en utilisant des types de données spécifiques, améliorant ainsi la sécurité des types et la clarté des définitions de classe. Cette amélioration permet aux développeurs d'appliquer des contraintes de type sur les constantes de classe, améliorant ainsi la lisibilité du code et réduisant les incompatibilités inattendues de types de données. Explorons cette fonctionnalité à travers quelques exemples :

class MathOperations {
    public const PI: float = 3.14159;
    public const MAX_ITERATIONS: int = 1000;
}
Copier après la connexion

Dans cet exemple, la classe MathOperations définit deux constantes avec des types de données spécifiques : PI et MAX_ITERATIONS. PI est de type float et MAX_ITERATIONS est de type int. Cela garantit que ces constantes contiennent toujours une valeur du type de données spécifié, améliorant ainsi la sécurité du type et la clarté du code.

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 常量
        // 定义为布尔值
        // ...
     }
}
Copier après la connexion

Dans cet exemple, la classe Configuration utilise des constantes de classe typées pour définir les délais d'attente par défaut et les options de configuration de journalisation. La constante DEFAULT_TIMEOUT est de type int, garantissant qu'elle contient toujours une valeur entière. La constante ENABLE_LOGGING est de type bool, garantissant qu'elle contient toujours une valeur booléenne. Cela améliore la cohérence du code et la sécurité des types lors de l'utilisation de ces constantes dans les méthodes de classe.

Les constantes de classe typées introduites dans PHP 8.3 permettent aux développeurs de spécifier des types de données pour les constantes de classe, améliorant ainsi l'expressivité et la fiabilité des définitions de classe. Cette fonctionnalité permet d'augmenter la qualité du code, d'améliorer la documentation et de réduire la probabilité d'erreurs de type de données dans les constantes de classe, améliorant ainsi la robustesse des applications PHP.

5. Classes anonymes en lecture seule

PHP 8.3 introduit la prise en charge des classes anonymes marquées en lecture seule, ce qui offre une plus grande flexibilité pour créer dynamiquement des objets immuables. Explorons cette fonctionnalité avec quelques exemples :

$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
Copier après la connexion

在本示例中,使用 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 )
Copier après la connexion

在本示例中,使用匿名只读类创建了一个简单的数据结构,用于存储值。该类具有一个公共属性 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
Copier après la connexion

在本示例中,使用 $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)
Copier après la connexion

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

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

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

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

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

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

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

try {
    // 日期间隔解析操作
    // ...
} catch (DateMalformedIntervalStringException $e) {
    // 处理特定的日期间隔解析异常
    // ...
} catch (Exception $e) {
    // 回退到通用异常处理
    // ...
}
Copier après la connexion

在本示例中,捕获 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 {
        // 回退到通用错误处理
        // ...
    }
}
Copier après la connexion

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

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

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

在本示例中,代码使用 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());
Copier après la connexion

在本示例中,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)
Copier après la connexion

在本示例中,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
Copier après la connexion

在本示例中,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); // 大量递归调用
Copier après la connexion

在本示例中,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;
}
Copier après la connexion

在本例中,父类 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;;
}
Copier après la connexion

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

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

12.断言字符串评估清理

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

assert( &#39;is_numeric($value)&#39; );
Copier après la connexion

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

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

assert(is_numeric($value));
Copier après la connexion

在 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函数
Copier après la connexion

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

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

$result = $ffi->myFunction();
if ($result === null) {
    echo "函数执行成功,返回 null。";
} else {
    echo "意外的返回值。";
}
Copier après la connexion

在本示例中,检查 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";
Copier après la connexion

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

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

// 获取 CPU 时间的限制
$hardLimit = posix_getrlimit(POSIX_RLIMIT_CPU, POSIX_RLIMIT_HARD);
echo "CPU 时间的限制:" . $hardLimit . "\n";
Copier après la connexion

在本示例中,使用 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";
Copier après la connexion

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

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

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

class_alias(&#39;DateTime&#39;, &#39;MyDateTime&#39;);
Copier après la connexion

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

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

$date = new MyDateTime(&#39;2023-11-28&#39;);
echo $date->format(&#39;Y-m-d&#39;);
Copier après la connexion

在本示例中,使用别名 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 {
    // 处理轮询错误
}
Copier après la connexion

在本示例中,使用正确的参数(包括 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
Copier après la connexion

在 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
Copier après la connexion

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

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal