PHP Conference Japan 2024
已发布!
PHP 8.2 是 PHP 语言的一个主要更新。
它包含许多新特性,包括只读类、null、false 和 true 作为独立类型、弃用的动态属性、性能改进等等。

只读类 RFC 文档

PHP < 8.2
class BlogData
{
public readonly
string $title;

public readonly
Status $status;

public function
__construct(string $title, Status $status)
{
$this->title = $title;
$this->status = $status;
}
}
PHP 8.2
readonly class BlogData
{
public
string $title;

public
Status $status;

public function
__construct(string $title, Status $status)
{
$this->title = $title;
$this->status = $status;
}
}

析取范式 (DNF) 类型 RFC 文档

PHP < 8.2
class Foo {
public function
bar(mixed $entity) {
if (((
$entity instanceof A) && ($entity instanceof B)) || ($entity === null)) {
return
$entity;
}

throw new
Exception('Invalid entity');
}
}
PHP 8.2
class Foo {
public function
bar((A&B)|null $entity) {
return
$entity;
}
}
DNF 类型允许我们组合 联合交集 类型,遵循一个严格的规则:当组合联合类型和交集类型时,交集类型必须用括号括起来。

允许 nullfalsetrue 作为独立类型 RFC RFC

PHP < 8.2
class Falsy
{
public function
almostFalse(): bool { /* ... */ *}

public function
almostTrue(): bool { /* ... */ *}

public function
almostNull(): string|null { /* ... */ *}
}
PHP 8.2
class Falsy
{
public function
alwaysFalse(): false { /* ... */ *}

public function
alwaysTrue(): true { /* ... */ *}

public function
alwaysNull(): null { /* ... */ *}
}

新的 "Random" 扩展 RFC RFC 文档

PHP 8.2
use Random\Engine\Xoshiro256StarStar;
use
Random\Randomizer;

$blueprintRng = new Xoshiro256StarStar(
hash('sha256', "Example seed that is converted to a 256 Bit string via SHA-256", true)
);

$fibers = [];
for (
$i = 0; $i < 8; $i++) {
$fiberRng = clone $blueprintRng;
// Xoshiro256**'s 'jump()' method moves the blueprint ahead 2**128 steps, as if calling
// 'generate()' 2**128 times, giving the Fiber 2**128 unique values without needing to reseed.
$blueprintRng->jump();

$fibers[] = new Fiber(function () use ($fiberRng, $i): void {
$randomizer = new Randomizer($fiberRng);

echo
"{$i}: " . $randomizer->getInt(0, 100), PHP_EOL;
});
}

// The randomizer will use a CSPRNG by default.
$randomizer = new Randomizer();

// Even though the fibers execute in a random order, they will print the same value
// each time, because each has its own unique instance of the RNG.
$fibers = $randomizer->shuffleArray($fibers);
foreach (
$fibers as $fiber) {
$fiber->start();
}

"random" 扩展提供了一个新的面向对象 API 用于随机数生成。它不再依赖于使用梅森旋转算法的全局种子随机数生成器 (RNG),而是提供了一个面向对象的 API,其中包含多个类 ("Engine"),这些类允许访问现代算法,这些算法将其状态存储在对象中,从而允许多个独立的可播种序列。

\Random\Randomizer 类提供了一个高级接口,用于使用引擎的随机性生成随机整数、随机排列数组或字符串、选择随机数组键等等。

特征中的常量 RFC 文档

PHP 8.2
trait Foo
{
public const
CONSTANT = 1;
}

class
Bar
{
use
Foo;
}

var_dump(Bar::CONSTANT); // 1
var_dump(Foo::CONSTANT); // 错误
无法通过 trait 的名称访问常量,但可以通过使用该 trait 的类来访问常量。

弃用动态属性 RFC 文档

PHP < 8.2
class User
{
public
$name;
}

$user = new User();
$user->last_name = 'Doe';

$user = new stdClass();
$user->last_name = 'Doe';
PHP 8.2
class User
{
public
$name;
}

$user = new User();
$user->last_name = 'Doe'; // 弃用通知

$user = new stdClass();
$user->last_name = 'Doe'; // 仍然允许

创建动态属性已被弃用,以帮助避免错误和拼写错误,除非类通过使用 #[\AllowDynamicProperties] 属性选择加入。stdClass 允许动态属性。

__get/__set 魔术方法的使用不受此更改的影响。

弃用和向后兼容性中断

To Top