首頁 >後端開發 >php教程 >如何使用php的函數變數數組實現程式碼結構的改變(附範例)

如何使用php的函數變數數組實現程式碼結構的改變(附範例)

不言
不言轉載
2018-10-16 16:22:561900瀏覽

這篇文章帶給大家的內容是關於如何使用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;
}

以上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(
            &#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;);

以上程式碼的輸出結果如下:

func1 abc
func2 abc
func3 abc
func4 abc
func5 bcd

以上是如何使用php的函數變數數組實現程式碼結構的改變(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除

相關文章

看更多