【问题标题】:Is this a good way of writing long conditions in PHP?这是用 PHP 编写长条件的好方法吗?
【发布时间】:2019-01-01 16:00:31
【问题描述】:

我必须在 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 && ... && ...)

有没有更好的方法来做到这一点?我做错了吗?谢谢

【问题讨论】:

    标签: php conditional variable-assignment


    【解决方案1】:

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

    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】:

    这真的取决于你想如何处理它。 switch 是一种选择还是可行的选择? ternary if更漂亮还是更方便?

    据我所知,我猜你有一个验证目的和一个根据验证的操作传入。为什么不创建一个函数或一个类来处理您的输入并进行验证?在那里,你可以拥有所有你想要的脏代码。在你的逻辑代码上,你只需要做(例如一个类)

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

    这样,您实际上会遵循一些标准,而其目的是作为(全部?取决于您的需要)您的数据的验证器

    三元 if 的例子

    $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) ...
    

    【讨论】:

      【解决方案3】:

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

      if($isNameValid && $isDescriptionValid && $isPriceValid && $isImageValid)
      

      【讨论】:

      • 但是条件是如何返回 1 或什么都不返回,而不是 TRUE 或 FALSE?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 2014-12-17
      • 1970-01-01
      • 2012-06-02
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多