Я должен оценить очень длинное условие в 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";
Да, это приемлемо. Тем не менее, ваши переменные там все логические, так что вам даже не нужно == 1.
if($isNameValid && $isDescriptionValid && $isPriceValid && $isImageValid)
Это действительно зависит от того, как вы хотите справиться с этим.
Является переключатель вариант или жизнеспособный?
Является троичный, если красивее или удобнее?
Из того, что я вижу, я предполагаю, что у вас есть цель проверки и входящие операции в зависимости от проверки. Почему бы не создать функцию или класс, который обрабатывает ваш ввод и проверяет правильность? И там вы можете получить весь грязный код, какой захотите. На вашем логическом коде вам просто нужно сделать (например, класса)
$someClass = new SomeClass();
$someClass->validate($fields);
if ($someClass->isValidated()) ...
Таким образом, вы на самом деле следовали бы некоторым стандартам, тогда как его целью было бы работать как средство проверки (все? Зависит от ваших потребностей) ваших данных
Например, тройной ифс
$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) ...