这是在 PHP 中编写长条件的好方法吗?
Is this a good way of writing long conditions in PHP?
我必须在 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 && ... && ...)
有更好的方法吗?我做错了吗?谢谢
是的,这是可以接受的。但是,你的变量都是布尔值,所以你甚至不需要 ==1.
if($isNameValid && $isDescriptionValid && $isPriceValid && $isImageValid)
这真的取决于你想如何处理它。
switch 是一个选项还是一个可行的选项?
ternary if 更漂亮还是更方便?
据我所知,我猜您有一个验证目的和一个操作传入,具体取决于验证。为什么不创建一个函数或 class 来处理您的输入和验证?在那里,你可以拥有所有你想要的脏代码。在你的逻辑代码上,你只需要做(例如 class)
$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) ...
我不关心在这里创建额外的变量;这使得代码难以维护且不可重用。我建议将您的验证逻辑分解为易于阅读、可维护、可重用的函数:
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";
我必须在 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 && ... && ...)
有更好的方法吗?我做错了吗?谢谢
是的,这是可以接受的。但是,你的变量都是布尔值,所以你甚至不需要 ==1.
if($isNameValid && $isDescriptionValid && $isPriceValid && $isImageValid)
这真的取决于你想如何处理它。 switch 是一个选项还是一个可行的选项? ternary if 更漂亮还是更方便?
据我所知,我猜您有一个验证目的和一个操作传入,具体取决于验证。为什么不创建一个函数或 class 来处理您的输入和验证?在那里,你可以拥有所有你想要的脏代码。在你的逻辑代码上,你只需要做(例如 class)
$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) ...
我不关心在这里创建额外的变量;这使得代码难以维护且不可重用。我建议将您的验证逻辑分解为易于阅读、可维护、可重用的函数:
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";