ホームページ >バックエンド開発 >PHPチュートリアル >PHPの関数変数配列を使ってコード構造を変更する方法(例あり)
この記事の内容は、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; }
上記の場合 対応するメソッドが呼び出され、インターフェイスに必要な XML 情報が結合されます。
メソッドのパラメータは、それぞれスプライシング インターフェイス メソッドの名前とパラメータを渡します。
このような判定構造のコードは管理が難しく、メソッドを追加するにはケースコールを追加する必要があり、見た目も煩雑です。
コード構造の改善
したがって、関連する改善が行われました。改善内容は次のとおりです:
1. まず、メソッド配列を定義します。保存 メソッド名は次のように定義されます
protected $arr = []; public function __construct() { // 初始化接口方法 $this->arr = [ 'getAV' => 'getAV', 'sendOrder' => 'sendOrder', 'ecfareQuery' => 'ecfareQuery', 'getInterAV' => 'getInterAV', // ... ]; }
今後、このインターフェイスに新しいメソッドが追加される場合は、それらを配列に直接追加するだけです。これにより、スイッチケースの判断を大幅に節約できます。
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 中国語 Web サイトの他の関連記事を参照してください。