PHP 8.3 大升级:20 个新特性全面解析

2023年 11月 28日 26.6k 0

PHP 8.3 是流行的服务器端脚本语言的最新版本,带来了许多新功能和改进,旨在简化 Web 开发并提高性能。这些增强功能包括只读类、新函数 json_validate() 、Randomizer 类的扩展以及更合适的日期/时间异常。它们将彻底改变 PHP 开发体验,使其更加高效、安全,以满足 Web 开发人员和企业的需求。

1. Readonly 类改进

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_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 数据。第二个参数指定 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 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 应用程序内存管理和垃圾收集的详细信息。

新领域包括:

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

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

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

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

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

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

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

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

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

    登录后复制

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

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

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

    class_alias('DateTime', 'MyDateTime');

    登录后复制

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

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

    $date = new MyDateTime('2023-11-28');
    echo $date->format('Y-m-d');

    登录后复制

    在本示例中,使用别名 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 个新特性全面解析的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论