Rumah > pembangunan bahagian belakang > tutorial php > 如何使用php的函数变量数组实现代码结构的改变(附示例)

如何使用php的函数变量数组实现代码结构的改变(附示例)

不言
Lepaskan: 2023-04-04 10:06:01
ke hadapan
1909 orang telah melayarinya

本篇文章给大家带来的内容是关于如何使用php的函数变量数组实现代码结构的改变(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

项目越做越大,代码越来越乱,维护困难。原因很多吧。起初为了实现功能,并没有注重代码的结构,外包公司嘛。虽然公司的项目负责人一直考虑复用、封装,但是我觉得基本上没有达到想要的效果。因为整个代码中没有没有用到设计模式,这样结构肯定好不到哪去。虽然很多功能都封装了,但是分层特别的乱,有种为了封装而封装的感觉。其实,很多东西我也不懂,但是写完代码之后,偶尔还是会去把代码的结构稍微的修改修改,尽量的少给自己挖坑吧。

代码结构的问题

接口有大量的方法,调用接口时需要使用 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;
}
Salin selepas log masuk

以上 case 中都是调用对应的方法来拼接接口所需的 XML 信息的。

方法的参数分别传递了拼接接口方法的名称和参数。

这样的判断结构代码感觉不好管理,增加一个方法方法,就需要增加一个 case 调用,而且看的时候也比较乱。

代码结构的改进

因此进行了相关的改进,改进方式如下:

1、先定义一个方法数组,用于保存方法名,定义如下

protected $arr = [];
public function __construct()
{
    // 初始化接口方法
    $this->arr = [
        'getAV'                    => 'getAV',
        'sendOrder'                => 'sendOrder',
        'ecfareQuery'              => 'ecfareQuery',
        'getInterAV'               => 'getInterAV',
        // ...
    ];
}
Salin selepas log masuk

将来该接口下有了新的方法,直接添加到数组里就可以了。这样可以省去大量的 switch case 的判断。

2、修改 switch 的结构,代码如下:

private function makeXML($xmlName, $xmlNameParam)
{
    $requestData = null;
    
    $fun = $this->arr[$xmlName];
    
    $requestData = $this->$fun($xmlNameParam);
    
    return $requestData;
}
Salin selepas log masuk

将 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();
Salin selepas log masuk

对于PHP中面向对象的方式如下(自己实现的):

<?php
class test
{
    public $arr = [];
    
    public function __construct()
    {
        $this->arr = array(
            &#39;func1&#39;=>&#39;func1&#39;,
            &#39;func2&#39;=>&#39;func2&#39;,
            &#39;func3&#39;=>&#39;func3&#39;,
            &#39;func4&#39;=>&#39;func4&#39;,
            &#39;func5&#39;=>&#39;func5&#39;,
        );
    }
    public function submit($func, $str)
    {
        $f = $this->arr[$func];
        $this->$f($str);
    }
    static public function func1($str)
    {
        print &#39;func1&#39; . &#39; &#39; . $str . "\n";
    }
    static public function func2($str)
    {
        print &#39;func2&#39; . &#39; &#39; . $str . "\n";
    }

    public function func3($str)
    {
        print &#39;func3&#39; . &#39; &#39; . $str . "\n";
    }
    private function func4($str)
    {
        print &#39;func4&#39; . &#39; &#39; . $str . "\n";
    }
    private function func5($str)
    {
        print &#39;func5&#39; . &#39; &#39; . $str . "\n";
    }
}
$t = new test();        // 实例化类
$f = $t->arr[&#39;func1&#39;];
test::$f(&#39;abc&#39;);        // func1 func2 是静态方法
$f = $t->arr[&#39;func2&#39;];
test::$f(&#39;abc&#39;);
$f = $t->arr[&#39;func3&#39;];  // func3 的调用
$t->$f(&#39;abc&#39;);
// func4 func5 的调用需要使用 submit 方法进行分发
$t->submit(&#39;func4&#39;, &#39;abc&#39;);
$t->submit(&#39;func5&#39;, &#39;bcd&#39;);
Salin selepas log masuk

以上代码的输出结果如下:

func1 abc
func2 abc
func3 abc
func4 abc
func5 bcd
Salin selepas log masuk

Atas ialah kandungan terperinci 如何使用php的函数变量数组实现代码结构的改变(附示例). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
php
sumber:cnblogs.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan