如何读取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++) 

我强烈建议不要使用嵌套的三元运算符。正如你所发现的那样,它们还很难阅读。在这里转换为适当的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++;
    }
}

最新更新