Как прочитать spagetti php сокращенное выражение if (тернарные операторы) и преобразовать его в оператор if и else

Кто-то написал это «ошеломляющее» заявление, заключенное в короткую руку. Я уверен, что даже не предполагается, что это будет сделано так, но я хочу рассказать об этом, чтобы кто-то другой (в том числе и я) смог это хорошо понять, разбив его на операторы if и else. Интересно, где именно так и должно быть изложено утверждение. ? и: позиция действительно смутила меня и заставила меня спуститься в никуда! (т.е. есть? за другим? как это может быть?

$cust->is_company() ? 'TekCustomer__'.($cust->getID() ? $cust->getID() : 'new'.($next_new_id-1)) : 'Person__'.($cust->people[0]->getID() ? $cust->people[0]->getID() : 'new'.$next_new_id++)

-1

Решение

Я настоятельно рекомендую против использования вложенных троичных операторов. Как вы выяснили, они далеко не читабельны. Преобразование в правильное выражение if, безусловно, сделает его более читабельным. Мы можем начать с его форматирования, чтобы разбить его:

$cust->is_company() ?
'TekCustomer__'.($cust->getID() ? $cust->getID() : 'new'.($next_new_id-1)) :
'Person__'.($cust->people[0]->getID() ? $cust->people[0]->getID() : 'new'.$next_new_id++)

Ага! На самом деле это не так ужасно, как кажется на первый взгляд (особенно из-за странного поведения PHP на вложенных тернариях *).

Во-первых, это проверка $cust->is_company() и делает одну из двух вещей. Это дает нам:

if($cust->is_company()){
'TekCustomer__'.($cust->getID() ? $cust->getID() : 'new'.($next_new_id-1));
}else{
'Person__'.($cust->people[0]->getID() ? $cust->people[0]->getID() : 'new'.$next_new_id++)
}

Обратите внимание, что обычно вы будете делать что-то со значениями. Это будет зависеть от того, как выражение использовалось изначально.

Я оставлю внутренние тройки в качестве упражнения для читателя!

* PHP разрешает вложенные троичные операторы слева направо, а не справа налево. Увидеть http://php.net/manual/en/language.operators.comparison.php

1

Другие решения

Вот как это, вероятно, должно быть расширено. Это называется троичным оператором.

$statement ? value_if_true : value_if_false,

if($cust->is_company())
{
$string = 'TekCustomer__';

if($cust->getId())
{
$string .= $cust->getID();
}
else
{
$string .= 'new'.($next_new_id-1));
}
}
else
{
$string = 'Person__';

if($cust->people[0]->getID())
{
$string .= $cust->people[0]->getID();
}
else
{
$string .= 'new'.$next_new_id++;
}
}
1

Вы, вероятно, найдете его более читабельным, как это:

$cust->is_company() ?
'TekCustomer__' . ( $cust->getID() ? $cust->getID() : 'new'.($next_new_id-1) )
:
'Person__' . ( $cust->people[0]->getID() ? $cust->people[0]->getID() : 'new'.$next_new_id++)

В основном это проверяет, является ли это Компания :

  • Да: строит строку TekCustomer__ с текущим идентификатором покупатель если он существует. Если не это кажется создать новый идентификатор.
  • Нет: строит строку Person__ с текущим идентификатором клиенты если он существует. Если не это кажется создать новый идентификатор.
1

Я понятия не имею, что содержит каждая переменная, но это способ ее деконструировать.

if($cust->is_company())
{
echo 'TekCustomer__';
if($cust->getID())
{
echo $cust->getID();
}else
{
echo 'new'.$next_new_id-1;
}
}else
{
echo 'Person__';
if($cust->people[0]->getID())
{
echo $cust->people[0]->getID();
}else
{
echo 'new'.$next_new_id++;
}
}
0
if ($cust->is_company())
if ($cust->getID())
return 'TekCustomer__' . $cust->getID();
else
return 'TekCustomer__new'.($next_new_id-1);
else
if ($cust->people[0]->getID())
return 'Person__' . $cust->people[0]->getID();
else
return 'Person__new'.$next_new_id++);
0

Похоже, что это утверждение в правой части назначения. Итак, нам нужна переменная для построения строки, а затем просто разбить ее на скобки:

$tmp = '';
if ($cust->is_company()) { // first '?'
$tmp .= 'TekCustomer__';
if ($cust->getID()) { // second '?'
$tmp .= $cust->getID();
} else {
$tmp .= 'new' . ($next_new_id - 1);
}
} else {
$tmp .= 'Person__';
if ($cust->people[0]->getID()) { // third '?'
$tmp .= $cust->people[0]->getID();
} else {
$tmp .= 'new' . $next_new_id++;
}
}
0
По вопросам рекламы [email protected]