PHP 是一种被大量用户用于 Web 开发目的的脚本语言。 PHP 的最新稳定更新版本 8.3 于 2023 年 11 月 23 日发布。自 2000 年发布 PHP 3.x 以来,已经有了许多创新和变化。PHP 仍然是最流行的 Web 开发(网页设计)语言之一,拥有大量受众。在本文中,我们将通过代码示例来检验和分析 PHP 8.3 中的创新和变化。

PHP 8.3 主要新功能和改进

与之前的 PHP 版本 PHP 8.2 相比,PHP 8.3 有许多重大创新和改进。同时,一些功能已被弃用。现在我们将通过代码示例一一检验这些创新和改进。

类型化类常量

声明类型对于开发人员来说是一个非常重要的功能,它可以提高 Web 开发的稳定性并降低错误率。 PHP 7.4 中添加了类中属性的类型声明功能。尽管在后来的版本中对此功能进行了很多改进,但对于类中的常量来说,该功能仍然不可用。在 PHP 8.3 中,现在可以在类中声明常量的类型。

// Doğru kullanım:
class MyClass {
    // Bildirilen tür ve değer aynı
    const string VERSION = "PHP 8.3"; // değer string
}

// Hatalı kullanım:
class MyClass {
    // Bildirilen tür ile değer farklı
    const int VERSION = "PHP 8.3"; // değer string
}

// Hatalı kullanım:
class MyClass {
    // Bildirilen tür sınıf sabitleri için desteklenmiyor
    const void VERSION = "PHP 8.3"; // değer string
}

类常量不支持某些类型声明。

不支持的类常量类型声明: void, callable, never

新函数:json_validate()

当使用JSON格式的数据(json编码数据)时,我们需要在使用数据之前验证传入的数据是否有效。我们在 PHP 8.3 之前的版本中使用以下或类似的方法执行此操作。

// PHP 8.3'ten önceki sürümlerde JSON verisini doğrulama

$data = $json_decode($maybeJSON);

if (json_last_error() === JSON_ERROR_NONE) {
    // $data ile gerçekleştirilecek işlemler
}

在这个旧示例中,验证 JSON 数据时,PHP 可能会消耗大量内存,具体取决于数据的大小。在 PHP 8.3 中,添加了一个新的 PHP 函数,它创建了一个面向性能的快速解决方案:json_validate()。下面我们举例说明了该功能的使用场景。

// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);

if (json_validate($maybeJSON)) {
    // $data ile gerçekleştirilecek işlemler
}

新功能:#[覆盖]

在PHP中实现接口时,我们为接口中的方法提供了详细的功能。创建类的实例时,我们可以通过创建具有相同名称和兼容签名的替代版本来覆盖父方法。这可能会导致软件出现重大问题。简而言之,问题在于我们认为由于一个被忽视的小拼写错误而覆盖了 main 方法。

PHP 8.3 #[Override]功能为这个问题提供了解决方案。现在让我们在示例中看看这一点。

class A {
    protected function myOverrideFunc(): void {}

// Doğru kullanım
// Bu örnek çalışacak
// Üstteki sınıfta ilgili method var ve geçersiz kılındı
class B extends A {
    #[\Override]
    public function myOverrideFunc(): void {}

// Hatalı kullanım
// Bu örnek çalışmayacak, çünkü ana sınıfta method yok
// Muhtemelen gözden kaçan bir yazım hatası
class C extends A {
    #[\Override]
    public function myOverrideFunction(): void {}
}

只读属性的深度克隆

PHP 引入了在 PHP 8.1 中将单个类属性声明为只读并在 PHP 8.2 中将它们分配给整个类的可能性。然而,大多数 Web 开发人员认为,在使用包含此类功能的类时所施加的限制阻碍了编程逻辑的实用性。

要改变这个 RFC 提出了两项主要建议:

只读

  1. readonly 允许不允许扩展的类
  2. readonly 允许在克隆期间重新启动功能

第二个建议包含在 PHP 8.3 中。 PHP 8.3 中添加了这种新方法 readonly 具有属性的类的实例readonly 属性) __clone 它允许它用它的神奇方法重新启动。

RFC 中的代码示例可以帮助我们理解这种新方法的工作原理:

动态获取类常量和枚举成员

与 PHP 中的其他功能不同,使用变量名捕获类常量和枚举成员有点复杂。在 PHP 8.3 之前,我们可以像下面的示例那样执行此操作:

class Foo {
    public function __construct(
        public readonly DateTime $bar,
        public readonly DateTime $baz
    ) {}

    public function __clone() {
        // Klon çağrıldığında $bar yeni bir DateTime alacak
        $this->bar = clone $this->bar;

        // Ardından bu metod çağrılacak
        $this->cloneBaz();
    }

    private function cloneBaz() {
       // Bu __clone içinden çağrıldığından dolayı doğru bir kullanımdır
        unset($this->baz);
    }
}

$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clone $foo;
class MyClass {
    public const THE_CONST = 9;
}

enum MyEnum: int {
    case FirstMember = 9;
    case SecondMember = 10;
}

$constantName = 'THE_CONST';
$memberName = 'FirstMember';

echo constant('MyClass::' . $constantName);
echo constant('MyEnum::' . #memberName)->value;

现在,让我们在 PHP 8.3 中使用上面示例中的类和枚举定义来获取值:

$constantName = 'THE_CONST';
$memberName = 'FirstNumber';

echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;

新方法:getBytesFromString()

可以说,这种方法是 PHP 8.3 添加的功能中最出乎意料的:使用预先批准的字符集合生成随机文本。

这个新方法非常简单明了。我们向该方法提供一些字符作为资源,并指定我们要使用其中的数量。就这样!现在我们的方法将返回带有随机字符的结果,直到达到指定的长度。现在让我们用一个例子来澄清这一点

$generateRandomString = new Random\Randomizer();
$allowedChars = 'ABCDEFGHJKMNPQRSTVWXYZ';

$generateRandomString->getBytesFromString($allowedChars, 6) // "MBDSFD" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 6) // "DJSDKA" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 4) // "SDLA" - rastgele gelen veri

输出可能比我们指定的字符总长度长。我们在下面的例子中做到了这一点:

$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';

$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veri

如果我们作为参数给出的所有字符都不同,则选择其中一个的概率是相等的。但是,我们可以通过将多个相同字符添加到支持的字符列表中来使更多相同字符出现在输出中。我们在下一个示例中展示了这一点。

$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';

$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veri

新方法:getFloat() 和 nextFloat()

在这项创新中,PHP 8.3 引入了两种扩展 PHP 随机扩展的新方法:getFloat() 和 nextFloat()。

这些方法的示例:

$generateRandomNumber = new Random\Randomizer();

// Rastgele ondalıklı (float) bir rakam oluştur
// Değer 0 ile 5 arasında olsun
$generateRandomNumber->getFloat(0,5); // 2.483929 - rastgele gelen veri

// 0 ile 1 arasında rastgele ondalıklı bir rakam oluştur
$generateRandomNumber->nextFloat(); // 0.4828258 rastgele gelen veri

PHP 8.3 中的微小创新和改进

除了上述创新之外,PHP 8.3 还有数十项其他小规模改进和创新。我们将它们及其源文档一起列在下面的列表中。

PHP 8.3 中已弃用

对于 PHP 的每个新版本,某些代码都会被标记为弃用。一旦这些功能被完全弃用,就不建议再使用它们。如果使用了已弃用的代码,则执行该代码时将返回错误消息。

PHP 8.3 中的弃用列表:

PHP 8.3

在本文中,我们回顾了 PHP 8.3 中的重要变化和创新。有关 PHP 8.3 中所有更改的更详细列表 官方变更日志 我们建议您查看一下。如果您想将代码或网站从 PHP 8.2 升级到 PHP 8.3,本指南可能有用:PHP 8.3 迁移指南 -> https://www.php.net/manual/en/migration83.php

如果您担心 PHP 版本和迁移,我们建议给新版本一些时间升级到 PHP 8.3。

全面覆盖PHP和JavaScript语言及相关技术作为Onur Özden Web Çözümleri 网络软件 我们提供服务。  如果您有疑问或要求,您可以通过左下角的 Whatsapp 按钮快速联系我们以获得报价。