说明:标题提到的PHP 8.3在本文写作时(2023年2月)尚未发布(PHP 8.3于2023年11月发布)。
本文基于PHP 8.x的使用经验,以及PHP 8.3的预期特性(根据开发计划和RFC),聊聊PHP 8系列的新特性和进阶技巧。
一、PHP 8系列回顾
1. PHP 8.0
PHP 8.0是一个重大版本。
主要新特性:
- JIT编译器
- 命名参数
- 联合类型
- 匹配表达式(match)
- 构造函数属性提升
- 空安全运算符(?->)
- 字符串与数字的比较更合理
PHP 8.0让PHP变得更现代、更安全。
2. PHP 8.1
PHP 8.1继续改进。
主要新特性:
- 枚举(Enums)
- Fibers(纤程)
- 只读属性(readonly)
- 交叉类型
- 新的数组解包语法
- 性能改进
PHP 8.1让PHP的类型系统更完善。
3. PHP 8.2
PHP 8.2进一步发展。
主要新特性:
- 只读类(readonly classes)
- 独立的类型(null、false、true)
- 弃用动态属性
- 性能改进
- 新的随机数扩展
PHP 8.2让PHP更严谨、更高效。
二、PHP 8.3预期特性
根据开发计划和已通过的RFC,PHP 8.3可能包括:
1. 类型化类常量
PHP 8.3可能支持类型化类常量。
class Foo {
const string BAR = 'bar';
const int BAZ = 1;
}这让常量也有了类型约束,更安全。
2. 只读属性的深拷贝
PHP 8.3可能改进只读属性的克隆行为。
- 克隆对象时,只读属性可以被重新初始化
- 解决了只读对象不能被克隆的问题
- 让只读属性更实用
3. 新的json_validate函数
PHP 8.3可能增加json_validate函数。
if (json_validate($jsonString)) {
$data = json_decode($jsonString);
}- 比json_decode更高效
- 只验证不解析
- 节省内存
4. 随机数扩展改进
PHP 8.3可能继续改进随机数扩展。
- 更安全的随机数生成
- 更多随机数函数
- 更好的性能
5. 性能改进
每个PHP版本都有性能改进。
- JIT编译器优化
- 内存使用优化
- 常用函数优化
- 整体性能提升
三、进阶技巧一:类型系统
1. 严格类型
PHP 8系列,类型系统更完善了。
declare(strict_types=1);
function add(int $a, int $b): int {
return $a + $b;
}- 开启严格类型
- 参数和返回值都有类型
- 避免隐式类型转换
- 代码更安全
建议:所有新代码都开启strict_types。
2. 联合类型
联合类型,让参数可以是多种类型。
function foo(int|string $bar): void {
// $bar可以是int或string
}- 比只用mixed更精确
- 更好的类型提示
- 更好的静态分析
3. 交叉类型
交叉类型,要求参数同时满足多个类型。
function foo(A&B $bar): void {
// $bar必须同时实现A和B
}- 适合接口组合
- 更精确的类型约束
- 面向接口编程
4. 只读属性和只读类
只读属性和只读类,让不可变对象更容易。
// 只读属性
class Foo {
public readonly string $bar;
public function __construct(string $bar) {
$this->bar = $bar;
}
}
// 只读类(PHP 8.2+)
readonly class Foo {
public string $bar;
public function __construct(string $bar) {
$this->bar = $bar;
}
}- 不可变对象
- 线程安全
- 更容易推理
- 函数式编程风格
5. 枚举
枚举,让代码更清晰。
enum Status: string {
case Active = 'active';
case Inactive = 'inactive';
case Pending = 'pending';
}
function setStatus(Status $status): void {
// ...
}- 类型安全
- 代码更清晰
- 避免魔法字符串
- 可以有方法
四、进阶技巧二:新语法
1. 匹配表达式
match表达式,比switch更强大。
$result = match($status) {
'active' => '用户活跃',
'inactive' => '用户不活跃',
'pending' => '用户待审核',
default => '未知状态',
};- 表达式,可以直接赋值
- 严格比较
- 不需要break
- 更简洁
2. 命名参数
命名参数,让函数调用更清晰。
function foo(string $a, int $b, bool $c = false): void {
// ...
}
foo(b: 1, a: 'hello', c: true);- 参数顺序不重要
- 更清晰
- 可选参数更灵活
- 自文档化
注意:命名参数会让参数名成为API的一部分,改名要小心。
3. 空安全运算符
空安全运算符,避免大量的null检查。
// 以前
$country = null;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
// 现在
$country = $user?->getAddress()?->country;- 更简洁
- 更安全
- 减少样板代码
- 链式调用更方便
4. 构造函数属性提升
构造函数属性提升,减少样板代码。
// 以前
class Foo {
private string $bar;
private int $baz;
public function __construct(string $bar, int $baz) {
$this->bar = $bar;
$this->baz = $baz;
}
}
// 现在
class Foo {
public function __construct(
private string $bar,
private int $baz,
) {}
}- 更简洁
- 更少的代码
- 更清晰
- 推荐使用
5. Fibers
Fibers(纤程),让异步编程更容易。
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('foo');
echo "恢复后收到: $value\n";
});
$value = $fiber->start();
echo "挂起时返回: $value\n";
$fiber->resume('bar');- 比生成器更强大
- 可以在任何函数中挂起
- 异步编程的基础
- 配合事件循环使用
五、进阶技巧三:性能优化
1. JIT编译器
PHP 8的JIT编译器,能提升性能。
配置:
opcache.enable=1
opcache.enable_cli=1
opcache.jit_buffer_size=100M
opcache.jit=1255- 对计算密集型代码提升明显
- 对IO密集型代码提升有限
- 需要测试才能看到效果
- 不是所有场景都适合
2. OPcache
OPcache是PHP性能的基础。
配置:
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0 // 生产环境- 必须开启
- 合理配置内存
- 生产环境关闭时间戳验证
- 能大幅提升性能
3. 预加载
PHP 7.4+支持预加载。
// preload.php
opcache_compile_file('/path/to/framework.php');opcache.preload=/path/to/preload.php
opcache.preload_user=www-data- 框架启动更快
- 减少每次请求的编译开销
- 适合常驻框架
- 需要测试兼容性
4. 类型声明
类型声明,不仅安全,也能提升性能。
- 有类型的代码,JIT优化更好
- 减少类型检查的开销
- 更好的静态分析
- 推荐所有代码都加类型
5. 避免动态属性
PHP 8.2弃用了动态属性。
class Foo {
// 没有声明$bar属性
}
$foo = new Foo();
$foo->bar = 'baz'; // PHP 8.2会报Deprecated- 动态属性影响性能
- 容易出错
- 应该声明所有属性
- 用#[AllowDynamicProperties]如果真的需要
六、进阶技巧四:最佳实践
1. 使用枚举代替常量
用枚举代替类常量。
// 以前
class Status {
const ACTIVE = 'active';
const INACTIVE = 'inactive';
}
// 现在
enum Status: string {
case Active = 'active';
case Inactive = 'inactive';
}- 类型安全
- 更清晰
- 可以有方法
- 推荐使用
2. 使用只读类
值对象用只读类。
readonly class User {
public function __construct(
public int $id,
public string $name,
public string $email,
) {}
}- 不可变
- 线程安全
- 更容易推理
- 适合值对象
3. 使用match代替switch
能用match就用match。
- 更简洁
- 更安全
- 表达式形式
- 推荐使用
4. 使用命名参数
参数多的时候,用命名参数。
- 更清晰
- 更灵活
- 自文档化
- 但要注意参数名的稳定性
5. 严格类型
所有新代码都开启严格类型。
<?php
declare(strict_types=1);- 更安全
- 更少的隐式转换
- 更好的工具支持
- 推荐作为默认
七、常见问题
1. 要不要升级到PHP 8?
要。
- PHP 7已经停止维护
- PHP 8性能更好
- 新特性很有用
- 安全性更好
如果还在用PHP 5或PHP 7,尽快升级。
2. 升级有风险吗?
有一些。
- 有些废弃的特性被移除了
- 有些行为变了
- 需要测试
- 但总体兼容性不错
建议:先在测试环境升级,测试通过后再上生产。
3. PHP 8性能提升明显吗?
看场景。
- 计算密集型:提升明显,特别是JIT
- IO密集型:提升有限
- 总体来说,比PHP 7快20-30%
- 配合OPcache和预加载,效果更好
4. 老项目怎么升级?
老项目升级步骤:
- 先升级到PHP 7.4
- 修复所有Deprecated警告
- 升级到PHP 8.0
- 测试
- 逐步使用新特性
- 再升级到8.1、8.2
不要跳太多版本,逐步升级。
八、写在最后
PHP 8系列,是PHP的重大进步。
从PHP 8.0到8.2,再到即将发布的8.3,PHP变得更现代、更安全、更高效。类型系统、新语法、性能优化,这些新特性让PHP开发体验更好。
2023年了,如果你还在用PHP 7,建议尽快升级到PHP 8。如果你已经在用PHP 8,建议深入学习这些新特性,用它们写出更好的代码。
最后,用一句话总结:"PHP 8系列的新特性,让PHP变得更现代、更安全、更高效。掌握这些特性,能让你写出更好的代码。"
希望这篇文章能帮你更好地使用PHP 8。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录