Heim > Backend-Entwicklung > PHP8 > PHP 8.3 großes Upgrade: umfassende Analyse von 20 neuen Funktionen

PHP 8.3 großes Upgrade: umfassende Analyse von 20 neuen Funktionen

DDD
Freigeben: 2023-11-28 11:27:43
Original
4285 Leute haben es durchsucht

PHP 8.3 ist die neueste Version der beliebten serverseitigen Skriptsprache und bringt viele neue Funktionen und Verbesserungen mit sich, die die Webentwicklung vereinfachen und die Leistung verbessern sollen. Zu diesen Verbesserungen gehören schreibgeschützte Klassen, eine neue Funktion json_validate(), eine Erweiterung der Randomizer-Klasse und geeignetere Datums-/Uhrzeitausnahmen. Sie werden die PHP-Entwicklungserfahrung revolutionieren und sie effizienter und sicherer machen, um den Anforderungen von Webentwicklern und Unternehmen gerecht zu werden.

1. Verbesserungen an schreibgeschützten Klassen

PHP 8.3 bringt erhebliche Verbesserungen an schreibgeschützten Klassen und gibt Entwicklern eine flexiblere Kontrolle über ihren Code. Eine der bemerkenswerten Änderungen besteht darin, dass schreibgeschützte Eigenschaften beim Klonen neu initialisiert werden können, um einen bestimmten, aber kritischen Grenzfall zu beheben. Diese Verbesserung ermöglicht ein tiefes Klonen von schreibgeschützten Eigenschaften und erweitert so die Verwendung von schreibgeschützten Klassen in PHP. Schauen Sie sich die folgende schreibgeschützte Klasse mit der DateTime-Eigenschaft an:

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

Im obigen Beispiel verfügt die Post-Klasse über eine schreibgeschützte Eigenschaft $createdAt, die das Erstellungsdatum des Beitrags darstellt. Eine Verbesserung in PHP 8.3 ermöglicht es der Methode __clone(), schreibgeschützte Eigenschaften neu zu initialisieren. Dies ermöglicht ein tiefes Klonen von Objekten, ohne die Integrität schreibgeschützter Eigenschaften zu beeinträchtigen.

2. Neue Funktion json_validate()

PHP 8.3 führt die Funktion json_validate() ein und bietet Entwicklern eine effizientere und direktere Möglichkeit, JSON-Strings zu überprüfen. Diese Funktion ist besonders nützlich, da sie die Gültigkeit einer JSON-Zeichenfolge bestimmen kann, ohne sie zu dekodieren.

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

Im obigen Beispiel wird die Funktion json_validate() verwendet, um den JSON-String $jsonString direkt zu validieren. Wenn die JSON-Zeichenfolge gültig ist, wird die entsprechende Meldung angezeigt. Diese Funktion bietet eine einfache Möglichkeit, JSON-Daten ohne Decodierung und Fehlerbehandlung zu validieren.

Sie können sogar benutzerdefinierte Tiefen und Flags angeben.

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

Im folgenden Beispiel wird die Funktion json_validate() mit einer benutzerdefinierten Tiefe und Flags zur Validierung von JSON-Daten verwendet. Der zweite Parameter gibt die maximale Tiefe der JSON-Daten an und der dritte Parameter legt das Validierungsflag fest. Dadurch können Entwickler den Verifizierungsprozess an spezifische Anforderungen anpassen.

Die Funktion json_validate() in PHP 8.3 vereinfacht den JSON-Validierungsprozess und bietet eine speichereffizientere Alternative zur Validierung von JSON-Daten. Diese Verbesserung ist besonders wertvoll in Szenarien, in denen Sie nur die Gültigkeit von JSON-Daten bestimmen müssen, und trägt dazu bei, die Leistung und Ressourcennutzung von PHP-Anwendungen zu verbessern.

3. Erweiterte Randomizer-Klasse

Die Randomizer-Klasse wurde um neue Methoden erweitert, die es Entwicklern ermöglichen, Zufallsdaten mit besserer Kontrolle und Flexibilität zu generieren. Diese zusätzlichen Funktionen erweitern die Funktionalität der Randomizer-Klasse und bieten Unterstützung für die Generierung von Zufallswerten innerhalb bestimmter Bereiche und Einschränkungen.

use Randomizer;
$string = "Hello, World!";
$length = 10;
$randomBytes = Randomizer::getBytesFromString($string, $length);
var_dump($randomBytes);
Nach dem Login kopieren

In diesem Beispiel wird die Methode getBytesFromString() der Randomizer-Klasse verwendet, um aus der angegebenen Eingabezeichenfolge eine zufällige Bytezeichenfolge mit angegebener Länge zu generieren. Diese Methode bietet eine bequeme Möglichkeit, eine zufällige Bytesequenz basierend auf einer Quellzeichenfolge zu erstellen, und eignet sich für Szenarien, in denen Zufallsdaten generiert werden müssen.

Sie können sogar zufällige Ganzzahlen innerhalb eines bestimmten Bereichs generieren.

use Randomizer;
use IntervalBoundary;
$min = 10;
$max = 20;
$randomInteger = Randomizer::getRandomInteger($min, $max, IntervalBoundary::Closed);
echo $randomInteger;
Nach dem Login kopieren

In diesem Beispiel wird die Methode getRandomInteger() der Randomizer-Klasse verwendet, um eine zufällige Ganzzahl innerhalb eines angegebenen Bereichs zu generieren. Der Bereich wird durch die Parameter $min und $max definiert. Die Aufzählung IntervalBoundary::Closed gibt an, dass die Minimal- und Maximalwerte im Bereich enthalten sein sollen. Mit dieser Methode können Entwickler zufällige Ganzzahlen innerhalb bestimmter Grenzen generieren und so eine präzise Kontrolle über die generierten Werte ermöglichen.

Neue Ergänzungen zur Randomizer-Klasse in PHP 8.3 bieten leistungsstarke Funktionen zum Generieren kontrollierter Zufallsdaten für eine Vielzahl von Anwendungsfällen. Diese Methoden machen die Randomizer-Klasse allgemeiner und nützlicher und bieten PHP-Entwicklern eine größere Auswahl an Optionen zur Zufallsdatengenerierung.

4. Typisierte Klassenkonstanten

Die Einführung typisierter Klassenkonstanten bietet Entwicklern die Möglichkeit, Klassenkonstanten mithilfe spezifischer Datentypen zu definieren und so die Typsicherheit und Klarheit in Klassendefinitionen zu verbessern. Diese Erweiterung ermöglicht es Entwicklern, Typeinschränkungen für Klassenkonstanten durchzusetzen, wodurch die Lesbarkeit des Codes verbessert und unerwartete Datentypkonflikte reduziert werden. Lassen Sie uns diese Funktionalität anhand einiger Beispiele untersuchen:

class MathOperations {
    public const PI: float = 3.14159;
    public const MAX_ITERATIONS: int = 1000;
}
Nach dem Login kopieren

In diesem Beispiel definiert die MathOperations-Klasse zwei Konstanten mit bestimmten Datentypen: PI und MAX_ITERATIONS. PI ist vom Typ float und MAX_ITERATIONS ist vom Typ int. Dadurch wird sichergestellt, dass diese Konstanten immer einen Wert des angegebenen Datentyps enthalten, was die Typsicherheit und Codeklarheit verbessert.

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 常量
        // 定义为布尔值
        // ...
     }
}
Nach dem Login kopieren

In diesem Beispiel verwendet die Configuration-Klasse typisierte Klassenkonstanten, um Standard-Timeouts und Protokollierungskonfigurationsoptionen zu definieren. Die DEFAULT_TIMEOUT-Konstante ist vom Typ int und stellt sicher, dass sie immer einen ganzzahligen Wert enthält. Die ENABLE_LOGGING-Konstante ist vom Typ bool, wodurch sichergestellt wird, dass sie immer einen booleschen Wert enthält. Dies verbessert die Codekonsistenz und Typsicherheit bei der Verwendung dieser Konstanten innerhalb von Klassenmethoden.

Typisierte Klassenkonstanten, die in PHP 8.3 eingeführt wurden, ermöglichen Entwicklern die Angabe von Datentypen für Klassenkonstanten und verbessern so die Ausdruckskraft und Zuverlässigkeit von Klassendefinitionen. Diese Funktion trägt dazu bei, die Codequalität zu erhöhen, die Dokumentation zu verbessern und die Wahrscheinlichkeit von Datentypfehlern in Klassenkonstanten zu verringern, wodurch die Robustheit von PHP-Anwendungen erhöht wird.

5. Anonyme schreibgeschützte Klassen

PHP 8.3 führt Unterstützung für anonyme Klassen ein, die als schreibgeschützt markiert sind, was eine größere Flexibilität für die dynamische Erstellung unveränderlicher Objekte bietet. Lassen Sie uns diese Funktion anhand einiger Beispiele untersuchen:

$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
Nach dem Login kopieren

在本示例中,使用 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 )
Nach dem Login kopieren

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

在本示例中,使用 $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)
Nach dem Login kopieren

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

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

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

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

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

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

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

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

在本示例中,捕获 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 {
        // 回退到通用错误处理
        // ...
    }
}
Nach dem Login kopieren

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

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

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

在本示例中,代码使用 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());
Nach dem Login kopieren

在本示例中,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)
Nach dem Login kopieren

在本示例中,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
Nach dem Login kopieren

在本示例中,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); // 大量递归调用
Nach dem Login kopieren

在本示例中,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;
}
Nach dem Login kopieren

在本例中,父类 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;;
}
Nach dem Login kopieren

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

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

12.断言字符串评估清理

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

assert( &#39;is_numeric($value)&#39; );
Nach dem Login kopieren

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

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

assert(is_numeric($value));
Nach dem Login kopieren

在 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函数
Nach dem Login kopieren

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

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

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

在本示例中,检查 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";
Nach dem Login kopieren

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

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

// 获取 CPU 时间的限制
$hardLimit = posix_getrlimit(POSIX_RLIMIT_CPU, POSIX_RLIMIT_HARD);
echo "CPU 时间的限制:" . $hardLimit . "\n";
Nach dem Login kopieren

在本示例中,使用 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";
Nach dem Login kopieren

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

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

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

class_alias(&#39;DateTime&#39;, &#39;MyDateTime&#39;);
Nach dem Login kopieren

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

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

$date = new MyDateTime(&#39;2023-11-28&#39;);
echo $date->format(&#39;Y-m-d&#39;);
Nach dem Login kopieren

在本示例中,使用别名 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 {
    // 处理轮询错误
}
Nach dem Login kopieren

在本示例中,使用正确的参数(包括 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
Nach dem Login kopieren

在 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
Nach dem Login kopieren

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

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

Das obige ist der detaillierte Inhalt vonPHP 8.3 großes Upgrade: umfassende Analyse von 20 neuen Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage