两种模式
- 强制(默认)
- 严格模式
使用 declare(strict_types=1);
声明在头部
类型速查
https://www.php.net/manual/zh/language.types.declarations.php
标量类型
- string
- bool
- float
- int
复合数据类型
- 类(Object)
- 数组
特殊数据类型
- NULL
- Resource (资源类型)
- 接口(interface)
- Callable(Callback 回调函数)
两者的区别
总而言之,核心就是 严格模式下: 严格限制返回类型 严格限制传入类型
默认模式下 则是可选的(不会报错)
解构赋值
list($a, $b) = [$a, $b];
...[$a, $b];
NULL 合并运算符
$user = ['name' => 'dcf'];
echo $user['age'] ?? "[error] 不存在的值";
太空操作符
用的比较少,场景可以放在 sort 中进行使用,反正回调函数 就是需要返回 0,-1,1
echo 1 <=> 1 // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
Define 定义常量
场景用来构建可变参数参量,早起的 const
无法支持定义一个 可变变量常量,参考如下
const HOST = getenv('HOST'); // 此方法 将 error: 表达式不允许作为常量值
define('HOST_T', getenv('HOST_T')); // 正常运行
匿名类
不参考,不建议使用
命名空间 use
缩减代码量,也不是太建议,当包多的时候有些包名容易重复,不适合全局搜索管理
//use Intervention\Image\AbstractFont;
//use Intervention\Image\Image;
//use Intervention\Image\ImageManager;
use Intervention\Image\{AbstractFont, Image, ImageManager};
生成器
不建议使用,维护成本,使用不当容易出问题,推荐异步函数或者 JOB 队列处理
intdiv
var_dump(intdiv(200, 3)); // 不会进行四舍五入,向下取整
整体的性能提升
- JIT
- Zval 的改变
https://www.laruence.com/2018/04/08/3170.html
- 内部类型 zend_string
- PHP 数组的变化(HashTable 和 Zend Array)
- 函数调用机制(Function Calling Convention)
- 通过宏定义和内联函数(inline),让编译器提前完成部分工作
以上的涉及的都是底层,没有研究过就不说了。说一下关于原生 php 之外的性能
运行层方面
php 大多使用的为 PHP-FPM来运行,每次运行都会开启一个连接子进程,相互独立而不干扰,但是也导致了每次都需要连接数据库、redis 等等外部工具
所以,可以在适当环境或者抽离 api,进行改造,将并发量大的 或者 核心模块的项目进行抽离,使用微服务模式运行,并使用常驻模式,如 swoole 、workman 相关
同事,进行适当压测,测算可运行承载量,进行合理分配内存和服务器
缓存方面
擅用 各种缓存,不限于 文件缓存,Redis 等 或者接入 RQ 之类的异步处理框架。由于 PHP 运行的项目原因,大多采用混合开发,在各种文件方面,让 PHP 不要承载除 API 其他的工作,如
- 图片等资源放入 OSS、CDN 等等
- 数据库使用 RDS
- 日志使用 ES 等等
秉承单一工作职责,有效隔离
代码层方面
禁止使用面条示写法,多使用 类进行编写。
而每个类都进行有效隔离,抽离公共方法,私有方法。合理分配目录进行管理。
- 擅于 搜索优化,拒绝长延时 sql,拒绝长时间读取远程 api 或者文件等等。
- 请求、连接等等都要进行设立 超时时间,防止整体项目停止运行
- 做好异常处理汇报工作
- 擅于设计模式,能异步则异步,提高整体 api 运行效率
本文由 邓尘锋 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Feb 16, 2023 at 11:16 am