> 백엔드 개발 > PHP8 > 본문

PHP 8.3 주요 업그레이드: 20가지 새로운 기능에 대한 포괄적 분석

DDD
풀어 주다: 2023-11-28 11:27:43
원래의
4214명이 탐색했습니다.

PHP 8.3은 널리 사용되는 서버 측 스크립팅 언어의 최신 버전으로, 웹 개발을 단순화하고 성능을 향상시키도록 설계된 많은 새로운 기능과 개선 사항을 제공합니다. 이러한 향상된 기능에는 읽기 전용 클래스, 새로운 함수 json_validate(), Randomizer 클래스 확장 및 보다 적절한 날짜/시간 예외가 포함됩니다. 이는 PHP 개발 경험에 혁명을 일으켜 웹 개발자와 기업의 요구 사항을 더욱 효율적이고 안전하게 충족할 것입니다.

1. 읽기 전용 클래스 개선

PHP 8.3은 읽기 전용 클래스를 대폭 개선하여 개발자가 코드를 보다 유연하게 제어할 수 있게 해줍니다. 주목할만한 변경 사항 중 하나는 복제 시 읽기 전용 속성을 다시 초기화할 수 있도록 허용하여 구체적이지만 중요한 극단적인 경우를 해결하는 것입니다. 이 개선 사항을 통해 읽기 전용 속성의 심층 복제가 가능해지며 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 문자열을 확인하는 보다 효율적이고 직접적인 방법을 제공하는 json_validate() 함수가 도입되었습니다. 이 함수는 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 데이터의 유효성을 검사합니다. 두 번째 매개변수는 JSON 데이터의 최대 깊이를 지정하고, 세 번째 매개변수는 유효성 검사 플래그를 설정합니다. 이를 통해 개발자는 검증 프로세스를 특정 요구 사항에 맞게 조정할 수 있습니다.

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 클래스는 특정 데이터 유형인 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿