這篇文章帶給大家的內容是關於如何使用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( '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
以上是如何使用php的函數變數數組實現程式碼結構的改變(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!