用 PHP 函数变量数组改变代码结构
2024-09-07 18:19:10
项目越做越大,代码越来越乱,维护困难。原因很多吧。起初为了实现功能,并没有注重代码的结构,外包公司嘛。虽然公司的项目负责人一直考虑复用、封装,但是我觉得基本上没有达到想要的效果。因为整个代码中没有用到设计模式,这样结构肯定好不到哪去。虽然很多功能都封装了,但是分层特别的乱,有种为了封装而封装的感觉。其实,很多东西我也不懂,但是写完代码之后,偶尔还是会去把代码的结构稍微的修改修改,尽量的少给自己挖坑吧。
代码结构的问题
接口有大量的方法,调用接口时需要使用 switch 进行判断,大致结构如下:
private function makeXML($xmlName, $xmlNameParam)
{
$requestData = null; switch ($xmlName) {
// ...
case 'sendOrder':
$requestData = $this->sendOrder($xmlNameParam);
break;
case 'ecfareQuery':
$requestData = $this->ecfareQuery($xmlNameParam);
break;
case 'getInterAV':
$requestData = $this->getInterAV($xmlNameParam);
break;
// ...
} return $requestData;
}
以上 case 中都是调用对应的方法来拼接接口所需的 XML 信息的。
方法的参数分别传递了拼接接口方法的名称和参数。
这样的判断结构代码感觉不好管理,增加一个方法方法,就需要增加一个 case 调用,而且看的时候也比较乱。
代码结构的改进
因此进行了相关的改进,改进方式如下:
1、先定义一个方法数组,用于保存方法名,定义如下:
protected $arr = []; public function __construct()
{
// 初始化接口方法
$this->arr = [
'getAV' => 'getAV',
'sendOrder' => 'sendOrder',
'ecfareQuery' => 'ecfareQuery',
'getInterAV' => 'getInterAV',
// ...
];
}
将来该接口下有了新的方法,直接添加到数组里就可以了。这样可以省去大量的 switch case 的判断。
2、修改 switch 的结构,代码如下:
private function makeXML($xmlName, $xmlNameParam)
{
$requestData = null; $fun = $this->arr[$xmlName]; $requestData = $this->$fun($xmlNameParam); return $requestData;
}
将 switch case 的结构改成了以数组下标的方式进行调用的方式。这样就把所有的方法统一管理了起来。
以上思路来自于 MFC 框架对 Windows 消息的处理。
相当于 C 语言中的函数指针数组,或 C# 里的委托。
知识补充:
面向过程的函数变量(往上找的)
function come() { //定义com函数
echo "来了<p>";
} function go($name = "jack") { //定义go函数
echo $name."走了<p>";
} function back($string) //定义back函数
{
echo "又回来了,$string<p>";
} $func = "come"; //声明一个变量,将变量赋值为“come”
$func(); //使用变量函数来调用函数come()
$func = "go"; //重新给变量赋值
$func("Tom"); //使用变量函数来调用函数go()
$func = "back"; //重新给变量赋值
$func("Lily"); //使用变量函数来调用函数back();
对于 PHP 中面向对象的方式如下(自己实现的):
<?php class test
{
public $arr = []; public function __construct()
{
$this->arr = array(
'func1'=>'func1',
'func2'=>'func2',
'func3'=>'func3',
'func4'=>'func4',
'func5'=>'func5',
);
} public function submit($func, $str)
{
$f = $this->arr[$func];
$this->$f($str);
} static public function func1($str)
{
print 'func1' . ' ' . $str . "\n";
} static public function func2($str)
{
print 'func2' . ' ' . $str . "\n";
} public function func3($str)
{
print 'func3' . ' ' . $str . "\n";
} private function func4($str)
{
print 'func4' . ' ' . $str . "\n";
} private function func5($str)
{
print 'func5' . ' ' . $str . "\n";
}
} $t = new test(); // 实例化类 $f = $t->arr['func1'];
test::$f('abc'); // func1 func2 是静态方法
$f = $t->arr['func2'];
test::$f('abc'); $f = $t->arr['func3']; // func3 的调用
$t->$f('abc'); // func4 func5 的调用需要使用 submit 方法进行分发
$t->submit('func4', 'abc');
$t->submit('func5', 'bcd');
以上代码的输出结果如下:
func1 abc
func2 abc
func3 abc
func4 abc
func5 bcd
我的微信公众号:“码农UP2U”
最新文章
- MySQL 使用JOIN优化子查询
- [WPF系列]-数据邦定之DataTemplate 对分层数据的支持
- 直接拿来用!最火的Android开源项目(二)(转)
- python之2048
- PowerDesigner16建表在SQL SERVER 2008报 对象名 &#39;sysproperties&#39; 无效。
- Rails常用命令
- 自己总结的一些android公共库
- Eclipse配置使用web.xml
- sql 字段字符串内容替换
- 禁止chrome中CORS跨域资源共享错误
- 五毛的cocos2d-x学习笔记05-场景与场景动画,动作
- 编译 MVC View
- Android -- 贝塞尔实现水波纹动画(划重点!!)
- LINUX0.11 内核阅读笔记
- spring boot application.properties详解
- Java环境变量配置----JDK开发环境及环境变量设置
- dede的应用
- linux 中搜索命令的对比
- PyQt5系列教程(八)定时器QTimer的使用
- vue使用sweetalert2弹窗插件
热门文章
- centos7下mysql5.7的安装与配置
- Spring Cloud Gateway-自定义异常处理
- 利用Python突破验证码限制
- springcloud vue 微服务分布式 activiti工作流 前后分离 集成代码生成器 shiro权限
- CSS的border-radius 设置圆弧
- union注入的几道ctf题,实验吧简单的sql注入1,2,这个看起来有点简单和bugku的成绩单
- 熟悉的味道——从Java单例写到C++单例
- 记录MySql错误消息
- 比hive快10倍的大数据查询利器presto部署
- [Go] 测试go连接imap的tcp长连接