代码之家  ›  专栏  ›  技术社区  ›  FranP

这是用PHP编写长条件的好方法吗?

  •  0
  • FranP  · 技术社区  · 6 年前

    我必须在PHP中计算一个很长的条件,因此,为了避免错误并尝试编写更可读的代码,我执行了以下操作:

     //this returns 1 when true, and nothing when false, although expected TRUE or FALSE
    
      $isNameValid=strlen($dataDecoded['nombre'])>=3;
    
      $isDescriptionValid=(strlen($dataDecoded['descripcion'])>=10) &&  strlen($dataDecoded['descripcion'])<=300;
    
      $isPriceValid=$dataDecoded['precio'] >0;
    
      $isImageValid=(($dataDecoded['imagen'] != "") && ($dataDecoded['imagen'] != NULL) );
    

    现在,我可以做以下事情:

     if($isNameValid==1 && $isDescriptionValid==1 && $isPriceValid==1 && $isImageValid==1)
      {
          echo "ok";
      }
      else{
          echo "no";
      }
    

    它似乎工作得很好,但也许是一种奇怪的做事方式。我想避免以下情况,因为我觉得这样更容易混淆,也更容易犯错误

    if(strlen($dataDecoded['nombre'])>=3 && ... && ...)
    

    有更好的办法吗?我做的错了吗?谢谢

    3 回复  |  直到 6 年前
        1
  •  3
  •   ggorlen Hoàng Huy Khánh    6 年前

    我不喜欢在这里创建额外的变量;这使得代码难以维护和不可用。我建议将验证逻辑分解为易于阅读、可维护、可重用的功能:

    function valid($data) {
        return validName($data['nombre']) && 
               validDescription($data['descripcion']) &&
               validPrice($data['precio']) &&
               validImage($data['imagen']);
    }
    
    function validName($name) {
        return strlen($name) >= 3;
    }
    
    function validDescription($desc) {
        return strlen($desc) >= 10 && strlen($desc) <= 300;
    }
    
    function validPrice($price) {
        return $price > 0;
    }
    
    function validImage($image) {
        return $image !== "" && $image != NULL;
    }
    
    $dataDecoded = [
        "nombre" => "foo",
        "descripcion" => "foo bar foo bar",
        "precio" => 15,
        "imagen" => "foo.png"
    ];
    
    // now your main code is beautiful:
    echo (valid($dataDecoded) ? "ok" : "no") . "\n";
    
        2
  •  3
  •   Liftoff    6 年前

    是的,这是可以接受的。但是,您的变量都是布尔型的,所以您甚至不需要==1。

    if($isNameValid && $isDescriptionValid && $isPriceValid && $isImageValid)
    
        3
  •  1
  •   abr    6 年前

    这真的取决于你想怎么处理。 是 switch 选择还是可行? 是 ternary if 更漂亮还是更方便?

    据我所见,我猜您有一个验证目的和一个操作传入,这取决于验证。为什么不创建一个函数或类来处理您的输入和验证呢?在那里,你可以拥有所有你想要的肮脏代码。在你的逻辑代码中,你只需要做(例如一个类)

    $someClass = new SomeClass();
    $someClass->validate($fields);
    if ($someClass->isValidated()) ...
    

    这样,您实际上会遵循一些标准,而它的目的是作为(所有?取决于你的需要)你的数据

    例如三值ifs

    $isNameValid = count($dataDecoded['nombre'])>=3 ? true : false;
    $isDescriptionValid = count($dataDecoded['descripcion']) >= 10 && count($dataDecoded['descripcion']) <= 300 ? true : false;
    $isPriceValid = count($dataDecoded['precio']) > 0 ? true : false;
    $isImageValid = empty($dataDecoded['imagen']) === false ? true : false;
    
    
    if ($isNameValid && $isDescriptionValid && $isPriceValid && $isImageValid) ...