Maison  >  Article  >  développement back-end  >  Comment utiliser le tableau de variables de fonction de PHP pour modifier la structure du code (avec exemples)

Comment utiliser le tableau de variables de fonction de PHP pour modifier la structure du code (avec exemples)

不言
不言avant
2018-10-16 16:22:561877parcourir

Ce que cet article vous apporte, c'est comment utiliser le tableau de variables de fonction de PHP pour modifier la structure du code (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. . aide.

Le projet devient de plus en plus gros, le code devient de plus en plus compliqué et de plus en plus difficile à maintenir. Il y a plusieurs raisons. Au début, pour réaliser la fonction, nous n'avons pas fait attention à la structure du code, c'était une société d'externalisation. Bien que le chef de projet de l'entreprise ait envisagé la réutilisation et l'encapsulation, j'estime que l'effet escompté n'a pas été atteint. Étant donné que les modèles de conception ne sont pas utilisés dans l’ensemble du code, cette structure n’est certainement pas meilleure. Bien que de nombreuses fonctions soient encapsulées, la superposition est particulièrement compliquée et ressemble à une encapsulation pour le plaisir de l'encapsulation. En fait, je ne comprends pas grand chose, mais après avoir écrit le code, je vais occasionnellement modifier légèrement la structure du code, afin de me creuser le moins de trous possible.

Problèmes avec la structure du code

L'interface dispose d'un grand nombre de méthodes Lorsque vous appelez l'interface, vous devez utiliser switch pour juger. :

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;
}

Dans les cas ci-dessus, les méthodes correspondantes sont appelées pour fusionner les informations XML requises par l'interface. Les paramètres de la méthode

transmettent respectivement le nom et les paramètres de la méthode d'interface d'épissage.

Un tel code de structure de jugement semble difficile à gérer. Pour ajouter une méthode, vous devez ajouter un appel de cas, et c'est également compliqué quand vous le regardez.

Améliorations de la structure du code

Par conséquent, des améliorations pertinentes ont été apportées Les améliorations sont les suivantes :

1. Définissez d'abord un tableau de méthodes pour. saving Le nom de la méthode est défini comme suit

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

S'il y a de nouvelles méthodes sous cette interface à l'avenir, ajoutez-les simplement directement au tableau. Cela évite beaucoup de jugements dans les cas de changement.

2. Modifier la structure du switch Le code est le suivant :

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

Modifier la structure du switch case en mode d'appel par indice de tableau. De cette façon, toutes les méthodes sont gérées de manière uniforme.

Les idées ci-dessus proviennent du traitement des messages Windows par le framework MFC.

équivaut à un tableau de pointeurs de fonction en langage C, ou à un délégué en C#.

Supplément de connaissances :

Variables de fonction orientées processus (rechercher)

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();

L'approche orientée objet en PHP est la suivante ( Implémenté par moi-même) :

<?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;);

Le résultat du code ci-dessus est le suivant :

func1 abc
func2 abc
func3 abc
func4 abc
func5 bcd

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer

Articles Liés

Voir plus