-1

誰かがこの「見事な」短い要約されたステートメントを書きました。私はそれがこのように行われることさえ想定していないと確信していますが、他の誰か (私自身も) がそれをよく理解できるように、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++) 
4

6 に答える 6

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__の現在の ID が存在する場合は、その文字列を作成します。そうでない場合は、新しい ID を生成するようです。
  • いいえ :存在する場合、顧客Person__の現在の ID を使用して文字列を作成します。そうでない場合は、新しい ID を生成するようです。
于 2014-10-21T13:58:04.693 に答える
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++;
    }
}
于 2014-10-21T13:58:45.223 に答える
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++)

あはは!実際には、最初に見えるほど恐ろしい引用ではありません (特に、ネストされた 3 項* に対する PHP の奇妙な動作のため)。

まず$cust->is_company()、2 つのことのいずれかをチェックして実行します。これにより、次のことがわかります。

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++)
}

ここで、通常、値を使用して何かを行うことに注意してください。これは、式が最初にどのように使用されたかによって異なります。

内部 3 項は、読者の演習として残しておきます。

*PHP は、ネストされた三項演算子を右から左ではなく左から右に解決します。http://php.net/manual/en/language.operators.comparison.phpを参照してください。

于 2014-10-21T13:59:19.053 に答える
0

各変数が何を保持しているかはわかりませんが、これはそれを分解する方法です。

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++;
    }
}
于 2014-10-21T13:57:57.313 に答える
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++);
于 2014-10-21T13:58:20.203 に答える
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++;
    }
}
于 2014-10-21T13:58:56.777 に答える