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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (44)

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

有没有更好的方法呢?我做错了吗?谢谢

提问于
用户回答回答于

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

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";
用户回答回答于

这实际上取决于你想如何处理它。被切换选项或一个可行的吗?是三元,如果更漂亮或方便?

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

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

扫码关注云+社区

领取腾讯云代金券