PHP 8.0 新特性
PHP 8.0 有哪些重磅更新
PHP 8.0 是一个大版本更新,带来了很多革命性的特性。
1. JIT 编译
PHP 8.0 引入了 JIT(即时编译),性能大幅提升,计算密集型场景性能翻倍。
2. 命名参数
array_filter(array: $array, callback: fn($x) => $x > 0);
不用按顺序传参,写参数名就行,可读性更好。
3. 枚举 Enum
enum Status: string
{
case Pending = 'pending';
case Active = 'active';
case Rejected = 'rejected';
}
4. 构造函数属性提升
class User {
public function __construct(
public int $id,
public string $name
) {}
}
不用再写 $this->id = $id 了,构造函数直接定义属性。
5. 空安全运算符
$user?->getAddress()?->city;
不用层层判断 null,有 null 直接返回 null。
6. Match 表达式
$result = match($status) {
200 => '成功',
404 => '未找到',
default => '未知'
};
比 switch 更简洁,还能直接赋值。
7. 联合类型
function foo(int|string $input) {}
参数可以是多种类型。
总结
PHP 8.0 是现代 PHP 的起点,类型系统更完善,语法更现代。新项目强烈推荐用 PHP 8.0+。
MySQL 8.0 新特性
MySQL 8.0 有哪些重要更新
MySQL 8.0 是目前最主流的大版本,相比 5.7 提升很大。
1. 性能提升
8.0 的性能比 5.7 提升约 2 倍,尤其是读取和写入并发场景下提升明显。
2. 原子 DDL
8.0 支持原子 DDL,建表、删表操作要么全成功要么全失败,不会出现一半成功一半失败的情况。
3. 窗口函数
支持窗口函数,比如 ROW_NUMBER()、RANK(),做排名统计很方便:
SELECT name, score,
RANK() OVER (ORDER BY score DESC) as rank
FROM students;
4. CTE 公共表表达式
支持 WITH 语法,复杂 SQL 写起来更清晰:
WITH top_users AS (
SELECT id, name FROM users WHERE vip = 1
)
SELECT * FROM top_users;
5. JSON 增强
JSON 操作函数更丰富,性能也更好,基本可以替代 MongoDB 的简单场景。
6. 隐藏索引
可以把索引设为隐藏状态,不删除但暂时不用,用来测试索引是否真的有用。
7. 字符集变化
默认字符集从 latin1 改成了 utf8mb4,支持 Emoji 表情。
总结
MySQL 8.0 是目前新项目的首选,性能好、特性全。老项目从 5.7 升级要注意兼容性,尤其是 SQL 模式和函数变化。
PHP 7.4 新特性
PHP 7.4 有哪些实用新特性
PHP 7.4 是 7.x 系列的最后一个版本,带来了不少语法糖和性能优化,至今还有很多项目在用。
1. 类型属性
类的属性可以声明类型了:
class User {
public int $id;
public string $name;
public ?string $email;
}
之前属性不能写类型,只能靠 PHPDoc 注释,现在直接写在代码里,IDE 提示更准确。
2. 箭头函数
支持短闭包:
$users = array_map(fn($user) => $user['name'], $users);
比传统的 function ($user) use (...) {} 简洁多了,自动捕获外层变量。
3. 空合并赋值
$data['user'] ??= [];
相当于:
if (!isset($data['user'])) {
$data['user'] = [];
}
4. 数组展开
$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];
$merged = [...$arr1, ...$arr2];
5. 数字字面量分隔
$amount = 1_000_000;
$price = 9_999.99;
大数字用下划线分隔,可读性提升。
6. 性能提升
PHP 7.4 比 7.3 性能提升约 10%,内存占用也更少。
总结
PHP 7.4 虽然不是大版本,但实用特性很多,尤其是类型属性和箭头函数,写起来舒服不少。新项目建议直接上 PHP 8+,老项目升级到 7.4 也很稳妥。
PHP 8.3 新特性详解:类型类获取、动态常量获取和更多实用功能
前言
PHP 8.3 于 2023 年 11 月正式发布,作为 PHP 8.x 系列的第四个版本,它带来了一系列实用的语法增强和性能优化。本文将深入介绍 PHP 8.3 中最值得关注的几个新特性。
1. 类型类获取(Typed class constants)
在 PHP 8.3 之前,类常量无法声明类型。从 PHP 8.3 开始,类常量可以指定类型,这有助于提高代码的类型安全性。
class Foo
{
const string BAR = 'bar';
const int MAX_COUNT = 100;
}
声明了类型的常量必须与声明的类型匹配,否则会抛出 TypeError。支持的类型包括:标量类型、array、object、static、self、parent、类名/接口名以及 iterable。
2. 动态类常量获取
PHP 8.3 新增了 constant() 函数的增强,允许通过表达式动态获取类常量:
class Status
{
const DRAFT = 'draft';
const PUBLISHED = 'published';
const ARCHIVED = 'archived';
}
$status = 'PUBLISHED';
echo constant(Status::class . "::$status"); // 输出: published
这在需要根据变量动态选择常量时非常有用,避免了大量的 switch 或 match 分支。
3. #[\Override] 注解
PHP 8.3 引入了 #[\Override] 注解,用于显式标记一个方法是重写父类的方法:
abstract class Controller
{
abstract public function handle(): void;
}
class UserController extends Controller
{
#[\Override]
public function handle(): void
{
echo "Handling user request...";
}
}
如果使用了 #[\Override] 注解,但方法实际上并没有重写任何父类方法(比如方法名拼错了),PHP 会在编译时报错。这在大型项目中非常有价值,可以防止因为方法名不一致导致的隐蔽 bug。
4. Readonly 深拷贝
PHP 8.3 改进了 readonly 属性的处理。在 PHP 8.2 中,readonly 属性不能通过克隆来修改。PHP 8.3 允许在克隆时修改 readonly 属性:
class Point
{
public function __construct(
public readonly int $x,
public readonly int $y
) {}
}
$p1 = new Point(10, 20);
$p2 = clone $p1;
$p2->x = 30; // PHP 8.3 中允许,PHP 8.2 会报错
这个特性在值对象模式中特别有用,可以创建修改后的副本而不影响原始对象。
5. 其他实用改进
json_validate() 函数
PHP 8.3 新增了 json_validate() 函数,用于验证 JSON 字符串是否有效,而不需要解码:
$json = '{"name": "Alice", "age": 30}';
if (json_validate($json)) {
echo "Valid JSON";
}
这比 json_decode() 更高效,因为它不需要分配内存来存储解码后的结果。
随机浮点数
PHP 8.3 的 Random\Randomizer 类新增了 getFloat() 方法:
$r = new Random\Randomizer();
$float = $r->getFloat(0, 10, \Random\IntervalBoundary::ClosedOpen);
总结
PHP 8.3 虽然不是一个大版本更新,但它带来的每一个新特性都直击开发者的日常痛点。类型类常量和 #[\Override] 注解增强了代码的可维护性,动态常量获取简化了代码逻辑,readonly 深拷贝则让值对象模式更加实用。
建议正在使用 PHP 8.x 的项目尽快升级到 8.3,既能获得这些新特性的好处,也能享受性能上的小幅提升。