以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);
推荐阅读
- 茶叶的三大特性是什么,祁红的特点是什么
- 3分钟短文 | PHP new self 跟 new static 啥区别?
- PHP开发环境搭建工具有哪些?
- PHP这门编程语言在各大网站使用情况怎么样?
- 关于Oracle数据库12c 新特性总结
- 茶树生育的相关特性,茶树总发育周期
- Klein.php - 轻量级PHP路由库
- Laravel作为PHP框架,它的优点和功能是什么?
- Linux 5.7内核新特性介绍
- 轮胎该怎么选,米其林、普利司通各大品牌特性,你都知道吗?
