ホームページ >バックエンド開発 >PHPチュートリアル >PHPの関数変数配列を使ってコード構造を変更する方法(例あり)

PHPの関数変数配列を使ってコード構造を変更する方法(例あり)

不言
不言転載
2018-10-16 16:22:561888ブラウズ

この記事の内容は、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(
            &#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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。

関連記事

続きを見る