概述
- 遵守PSR规范,详细参考Accepted部分
- 数据库设计规范(参考)详细参考
- 以数据表为单位设计“微服务”,详细参考
- 尽量提炼抽取共同的函数、方法
- 合并重复的条件代码片段
不良代码示例:
function paginate($page=1, $pageTotal=10)
{
if($page < 1){
$page =1 ;
redirectTo($page);
}
else if($page > $pageTotal){
$page = $pageTotal;
redirectTo($page);
}
else{
redirectTo($page);
}
}
改进代码示例:
function paginate($page=1, $pageTotal=10)
{
if($page < 1){
$page =1 ;
}
else if($page > $pageTotal){
$page = $pageTotal;
}
redirectTo($page);
}
- 把条件分支语句提炼成函数
提炼之前代码示例:
$month = date('m');
if(in_array($month, [1, 11, 12])){
echo 'winter', PHP_EOL;
}
提炼之后:
function isWinter($month){
if(in_array($month, [1, 11, 12])){
return true;
}
return false;
}
$month = date('m');
if(isWinter($month)){
echo 'winter', PHP_EOL;
}
- 合理利用循环
未优化的代码:
function isAnyParamEmpty($params){
if(empty($params['a'])){
echo 'a can not be empty', PHP_EOL;
return true;
}
if(empty($params['b'])){
echo 'b can not be empty', PHP_EOL;
return true;
}
if(empty($params['c'])){
echo 'c can not be empty', PHP_EOL;
return true;
}
if(empty($params['d'])){
echo 'd can not be empty', PHP_EOL;
return true;
}
return false;
}
优化后的代码:
function isAnyParamEmpty($params){
foreach ($params as $key => $param) {
if(empty($param)){
echo "$key can not be empty", PHP_EOL;
return true;
}
}
return false;
}
- 提前让函数退出(注意条件语句及循环语句中的代码)
改进前的代码:
function process($params)
{
$ret = true;
if(empty($params['a'])){
$ret = false;
}
$data = getData();
if(empty($data)){
$ret = false;
}
return $ret;
}
改进后的代码:
function process($params)
{
if(empty($params['a'])){
return false;
}
$data = getData();
if(empty($data)){
return false;
}
return true;
}
- 使用一个数组或对象参数代替参数列表,可以避免参数错位也提高了可扩展性
改进前的代码:
//万一某一天要扩展更多参数则可能需要修改之前调用的代码
function process($param1, $param2)
{
echo $param1, PHP_EOL;
echo $param2, PHP_EOL;
}
process('a', 1);
process(1, 'a');
改进后的代码:
function process($params)
{
echo $params['a'], PHP_EOL;
echo $params['b'], PHP_EOL;
// 如果process($params)之前已经被大量应用,扩展参数c不会对之前的代码产生破坏
if(!empty($params['c'])){
echo $params['c'], PHP_EOL;
}
}
process(['a' => 'a', 'b' => 1]);
process(['a' => 'a', 'b' => 1, 'c'=> 'hello,world']);
- 涉及复杂业务处理的地方尽量避免使用链式调用,这样才能使业务逻辑更加清晰,便于维护。如果只是对数据的操作处理,且每个开发维护人员没有业务障碍,则可以优雅地使用链式操作。
- 如果开发中发现函数或方法里的代码即将开始膨胀,则需要重新捋一下业务逻辑,进行代码拆分、提取。
- 为了维护方便,同一模块对接不同平台的情况下(处理逻辑有不一样的地方)按平台名称(建议使用拼音首字母缩写)划分文件夹,如需要对两个渠道A和B的订单进行处理,则处理的分别为路径为A/OrderService.php、B/OrderService.php,避免在一个OrderService.php里面使用两个方法
public function generateOrderA($params)
、public function generateOrderB($params)
分别处理,使用不同的文件夹和文件可以减少git提交冲突 - 同一模块的不同功能可以按不同文件夹进行开发,如订单模块可以按不公功能设计程序文件保存到app(前台提交)、import(后台导入)、cron(定时任务)、queue(队列)等文件夹下,避免在同一个文件下完成不同的功能
- 避免trait嵌套,每个trait应该是独立的功能,不要组装不同trait的功能
- 基础数据接口和前端数据接口按不同系统项目分开,便于做到“大中台、小前端”,提供给前端的接口调用微服务化的基础数据接口并进行整合,按需提供给前端app使用
- 充分利用依赖包完成业务开发,但是如果要得到更优的性能则还是尽量使用PHP扩展
- 充分利用PHP自带函数进行开发,避免自己重复造轮子
- 充分利用索引优化查询
- 充分利用缓存、队列、事件、定时等技术提升业务能力和服务性能
- 尽量实施微服务架构
- 做好git版本控制管理
- 要求写好单元测试
- 项目成员要熟悉业务,并根据掌握的业务规则随时优化代码
- 一定要有个备忘系统,便于记录之前出现过的问题及解决办法,或者已经确定下来的业务决定等
- 项目完成后一定要及时进行总结,包括技术方面和管理方面。
- 目标明确,优化项目分工,避免项目并行,提高效率,敏捷开发、小步快跑、快速迭代
- 项目团队成员有问题尽量当面沟通,本着“能当面不微信,能微信不邮件”的原则进行沟通。项目人员尽量“走起”,“谁主张谁举证”,有问题或不清楚的东西主动走到需要询问对象跟前进行沟通,不要在工位上等微信,甚至等邮件。
- 对相应岗位人员充分授权,充分发挥人员的主观能动性和创造力。疑人不用,用人不疑。对项目人员要有信心和信任。
- 目标驱动,避免疲软型的加班,项目完成后大家一定要有收获。
- 网站性能优化攻略
- 大型网站技术架构设计思维导图
- 一种更为高效的数据库无限级分类表设计
- PHP学习中比较少注意到的地方
- 代码中要把业务相关代码和非业务相关代码进行隔离
最后
以上就是跳跃大船为你收集整理的PHP项目开发经验整理的全部内容,希望文章能够帮你解决PHP项目开发经验整理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复