Кто-то написал это «ошеломляющее» заявление, заключенное в короткую руку. Я уверен, что даже не предполагается, что это будет сделано так, но я хочу рассказать об этом, чтобы кто-то другой (в том числе и я) смог это хорошо понять, разбив его на операторы 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++)
Я настоятельно рекомендую против использования вложенных троичных операторов. Как вы выяснили, они далеко не читабельны. Преобразование в правильное выражение 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
Вот как это, вероятно, должно быть расширено. Это называется троичным оператором.
$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++;
}
}
Вы, вероятно, найдете его более читабельным, как это:
$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__
с текущим идентификатором клиенты если он существует. Если не это кажется создать новый идентификатор.Я понятия не имею, что содержит каждая переменная, но это способ ее деконструировать.
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++;
}
}
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++);
Похоже, что это утверждение в правой части назначения. Итак, нам нужна переменная для построения строки, а затем просто разбить ее на скобки:
$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++;
}
}