有人写了这个"惊人"的简短封装语句。我确信它甚至不应该这样做,但我想把它分解成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在嵌套的ternarys*上的奇怪行为)。
首先,它检查$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++)
}
请注意,通常情况下,您会使用这些值来执行某些操作。这将取决于表达式最初的使用方式。
我将把内部ternarys留给读者练习!
*PHP从左到右而不是从右到左解析嵌套的三元运算符。看见http://php.net/manual/en/language.operators.comparison.php
这就是它可能应该被扩展的方式。它被称为三元运算符。
CCD_ 2。
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__
,当前ID为customer(如果存在)。如果不是,则似乎生成一个新的id - 否:它构建了一个字符串
Person__
,其中包含客户人员的当前ID(如果存在)。如果不是,则似乎生成一个新的id
我不知道每个变量包含什么,但这是一种解构它的方法。
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++;
}
}