目次
1. 読み取り専用クラスの改善
2. 新しい関数 json_validate()
3. Randomizer クラスの拡張
4. 型付きクラス定数
5. 匿名読み取り専用クラス
6.动态类常量获取
7. 更合适的日期/时间异常
8. 改进了 unserialize() 错误处理
9. 特征和静态属性
10. 堆栈溢出检测
11.不变的常量可见性
12.断言字符串评估清理
13.改进FFI\CData:void
14. posix_getrlimit()参数增强
15. gc_status() 改进
16. class_alias() 对内部类的支持
17. mysqli_poll()错误处理
18. array_pad() 功能增强
19. 删除 opcache.consistency_checks ini 指令
20. 使用 number_format() 正确处理小数位
ホームページ バックエンド開発 PHP8 PHP 8.3 メジャー アップグレード: 20 の新機能の包括的な分析

PHP 8.3 メジャー アップグレード: 20 の新機能の包括的な分析

Nov 28, 2023 am 11:27 AM
php php8.3

PHP 8.3 は、人気のあるサーバーサイド スクリプト言語の最新バージョンであり、Web 開発を簡素化し、パフォーマンスを向上させるために設計された多くの新機能と改善点をもたらします。これらの機能強化には、読み取り専用クラス、新しい関数 json_validate()、Randomizer クラスの拡張機能、およびより適切な日付/時刻例外が含まれます。これらは PHP 開発エクスペリエンスに革命をもたらし、Web 開発者や企業のニーズを満たすために、より効率的かつ安全なものになります。

1. 読み取り専用クラスの改善

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() メソッドで読み取り専用プロパティを再初期化できるようになりました。これにより、読み取り専用プロパティの整合性に影響を与えることなく、オブジェクトのディープ クローン作成が可能になります。

2. 新しい関数 json_validate()

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 アプリケーションのパフォーマンスとリソース使用率の向上に役立ちます。

3. Randomizer クラスの拡張

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 開発者に幅広いランダム データ生成オプションが提供されます。

4. 型付きクラス定数

型付きクラス定数の導入により、開発者は特定のデータ型を使用してクラス定数を定義できるため、クラス定義の型の安全性と明確さが向上します。この機能強化により、開発者はクラス定数に型制約を適用できるため、コードの可読性が向上し、予期しないデータ型の不一致が減少します。いくつかの例を通じて、この機能を詳しく見てみましょう:

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 アプリケーションの堅牢性が向上します。

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
ログイン後にコピー

在本示例中,使用 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 面向对象功能的表现力和多功能性,为某些用例提供了传统类声明的便捷替代方案。

6.动态类常量获取

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

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

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

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

try { 
    // 导致范围错误的日期操作
    // ...
 } catch (DateRangeError $e ) { 
    // 处理特定的 DateRangeError 异常
    // 记录错误,通知用户或采取适当的操作
    // ...
 } catch ( Exception  $e ) { 
    // 回退到通用异常处理
    // ...
 }
ログイン後にコピー

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

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

try {
    // 日期间隔解析操作
    // ...
} catch (DateMalformedIntervalStringException $e) {
    // 处理特定的日期间隔解析异常
    // ...
} catch (Exception $e) {
    // 回退到通用异常处理
    // ...
}
ログイン後にコピー

在本示例中,捕获 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 {
        // 回退到通用错误处理
        // ...
    }
}
ログイン後にコピー

在本示例中,尝试反序列化数据后,代码会检查结果是否为 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 应用程序中处理序列化数据时的调试能力和整体错误恢复能力。

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());
ログイン後にコピー

在本示例中,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 中的“特征和静态属性”功能可确保具有静态属性的特征在多个类中使用时表现一致且可预测。这为在基于特征的代码结构中处理静态属性提供了更强大和直观的机制。

10. 堆栈溢出检测

此功能新增了两个 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 改进了堆栈溢出情况的错误处理,减少了分段错误的可能性并促进了更有效的调试过程。

11.不变的常量可见性

此功能引入了使用 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 = &#39;1.0&#39;;
}
class ImplementationClass implements Constants {
    // VERSION 的可见性必须在实现类中保持公共
    private invariant string VERSION = &#39;2.0&#39;;
}
ログイン後にコピー

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

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

12.断言字符串评估清理

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

assert( &#39;is_numeric($value)&#39; );
ログイン後にコピー

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

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

assert(is_numeric($value));
ログイン後にコピー

在 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函数
ログイン後にコピー

在本示例中,C 函数 myFunction() 的返回类型为 void。在 PHP 8.3 中,使用 FFI 调用此函数时,返回值将为 null,而不是 FFI\CData 的实例。此改进简化了不返回值的 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 体验。

14. posix_getrlimit()参数增强

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 应用程序中有效管理资源时需要详细资源限制信息的场景。

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";
ログイン後にコピー

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

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

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

class_alias(&#39;DateTime&#39;, &#39;MyDateTime&#39;);
ログイン後にコピー

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

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

$date = new MyDateTime(&#39;2023-11-28&#39;);
echo $date->format(&#39;Y-m-d&#39;);
ログイン後にコピー

在本示例中,使用别名 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 {
    // 处理轮询错误
}
ログイン後にコピー

在本示例中,使用正确的参数(包括 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
ログイン後にコピー

在 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
ログイン後にコピー

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

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

以上がPHP 8.3 メジャー アップグレード: 20 の新機能の包括的な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

See all articles