4

いくつかの選択可能な基準を提供するいくつかのドロップダウン ボックスから POST された入力を取得し、最後に一意のコードを含む 1 つ以上の文字列変数を吐き出す小さな PHP スクリプトを作成するように依頼されました。

変数は $thingPlaceType の形式で、それぞれが一意です。ドロップダウン ボックスでは、次の項目を選択できます。

  • 1つの「もの」またはすべての「もの」を一緒に
  • 1 つの「場所」またはすべての「場所」を一緒に
  • 1 つの「タイプ」またはすべての「タイプ」を一緒に

ネストされた switch ステートメントに頼らずにこれらのコードを選択する方法がわかりません。

switch($_POST['thing'])
{
  case "thing1":
     switch($_POST['place'])
     {
       case "place1":
          switch($_POST['type'])
          {
            case "type1":
               $output = $thing1Place1Type1;
            case "type2":
               $output = $thing1Place1Type2;
            case "alltypes":
               $output = $thing1Place1Type1.$thing1Place1Type2.$thing1PlaceType3;
           }
        case "place2":
        ...
        case "allplaces":
        ...
      }
  case "thing2":
     switch($_POST['place'])
     {
       case "place1":
          switch($_POST['type'])
          {
            case "type1":
               $output = $thing1Place1Type1;
            ...
      ...
  ...
}

コードが Arrow Anti-Pattern に変わっているようです。多次元配列、または値とキーを照合する単一の配列を使用して、何かできる可能性があると考えています。しかし、私はそれがストローを握っていると感じており、私が見逃しているものがあるに違いありません. 文字列をプロパティを持つ適切なオブジェクトに変換する時が来ましたか?

4

3 に答える 3

4

コードを関数にリファクタリングする必要があります。例えば:-

switch($_POST['thing'])
{
  case "thing1":
      $result = processThings($thing1);
      break;
  case "thing2":
      $result = processThings($thing2);
      break;
}

function processThings($thing)
{
    //processing code goes here
}

私はあなたがその考えを理解すると確信しています。必要に応じて、関数内にさらにスイッチ ブロックを含めることができます。これにより、アンチパターンが回避され、コードが理解しやすくなります。

于 2012-05-25T16:18:18.457 に答える
2

それらをオブジェクトに変換したい場合..これを作成できます。

  class Object {
        private $thing;
        private $place;
        private $type;

        public function __construct() {
            $this->thing = $_POST['thing'];
            $this->place = $_POST['place'];
            $this->type  = $_POST['type'];

            $this->processThing($this->thing, $this->place, $this->type);
        }

        public function processThing($thing = false, $place = false, $type = false) {
               //noW that you have all the properties you just need just process it
        }

    }

    if(isset($_POST['thing']) && isset($_POST['place']) && isset($_POST['type'])) {
        $object = new Object();
    }
于 2012-05-25T16:45:01.473 に答える
0

ターゲット変数名に接頭辞を使用するなどして、サイトが危険にさらされるのを防ぐ方法を見つけることができれば、次のようにすることができます。

$variableName = "A prefix_".$_POST['thing'].$_POST['type'].$_POST['place'];

$evaluatedVariable = $$variableName;

これらは「可変変数」と呼ばれます。おそらく私はそれらを使用すると炎上するでしょうが、責任を持って使用できる場合、過去にそれらが役立つことがわかりました.

もちろん、これは「alltypes」の場合には直接機能しません。提案を使用して関数にリファクタリングできます

于 2012-05-25T16:18:27.010 に答える