PHP 8 中新特性以及重大调整( 二 )


以ORM为例 , 它们通常实现保存对实体类的引用的缓存 , 从而提高实体类之间关联的性能 。只要缓存中存在对这些实体类的引用 , 那么这些类就无法被垃圾回收机制回收 , 尽管除了缓存中 , 已经没有别处再引用这些实体类 , 它们依然不会被垃圾处理机制处理 。
如果这个缓存层使用了弱引用和弱映射 , 那么 PHP 将会在这些实体类没有任何其他引用时 , 对其进行垃圾回收 。尤其是对于 ORMs , 它可以管理一个请求中的数百个(如果不是数千个)实体;弱映射可以提供一种更好的、对资源更友好的方式来处理这些对象 。
下面是弱映射基本的例子 , 摘抄自 RFC :
class Foo
{
private WeakMap $cache;
 
public function getSomethingWithCaching(object $obj): object
{
return $this->cache[$obj]
??= $this->computeSomethingExpensive($obj);
}
}
允许对对象使用 ::class一个很小但是很有用的新特性:现在可以在对象上使用 :: class  , 而不必在对象上使用 get_class()  , 它的工作方式跟 get_class() 相同 。
$foo = new Foo();
var_dump($foo::class);
Non-capturing catches在PHP 8 之前 , 无论何时你想要捕获一个异常 , 你都需要先将其存储到一个变量中 , 不管这个变量你是否会用到 。通过 Non-capturing catches 你可以忽略变量 , 所以替换下面的代码:
try {
// Something goes wrong
} catch (MySpecialException $exception) {
Log::error("Something went wrong");
}
你现在可以这么做:
try {
// Something goes wrong
} catch (MySpecialException) {
Log::error("Something went wrong");
}
请注意 , 必须始终指定类型 , 不允许将 catch 留空 , 如果你想要捕获所有类型的异常和错误 , 需要使用 Throwable 作为捕获类型 。
参数列表中的尾部逗号当调用函数时已经支持尾部逗号 , 但是参数列表中仍然缺少尾随逗号支持 。现在PHP8中允许这样做 , 这意味着您可以执行以下操作:
public function(
string $parameterA,
int $parameterB,
Foo $objectfoo,
) {
// …
}
从接口创建DateTime 对象你已经可以使用 DateTime::createFromImmutable($immutableDateTime) 从 DateTimeImmutable 对象创建一个 DateTime 对象 ,  而另一种方法则更加取巧 。通过添加DateTime::createFromInterface()和DatetimeImmutable::createFromInterface()现在有一种通用的方法可以将DateTime和DatetimeImmutable对象相互转换 。
DateTime::createFromInterface(DateTimeInterface $other);
DateTimeImmutable::createFromInterface(DateTimeInterface $other);




推荐阅读