2015-05-07 2 views
1

Я читаю книгу, и автор использует следующую функцию. Я не понимаю преимущества равного оператора. Может кто-нибудь объяснить причину использования равного оператора.Возврат оператора сравнения 0 ==

public function isDiscounted() 
{ 
return 0 == $this->getRow()->discountPercent ? false : true; 
} 

Не было бы легче пойти на

public function isDiscounted() 
{ 
return $this->getRow()->discountPercent ? false : true; 
} 

?

С наилучшими пожеланиями, Герберт

+1

это будет, до тех пор, как скидкаpercentage возвращает логическое значение. Первый лучше читать и понимать в будущем. – dmaij

+1

«Преимущество» оператора состоит в том, чтобы дать понять, что вы сравниваете процент скидки с 0. – Barmar

ответ

2

Преимущество оператора == состоит в том, чтобы сделать намерение программы более четким, чтобы вы сравнивали числовую переменную с нулем. Это эквивалентно записи:

if (0 == $this->getRow()->discountPercent) { 
    return false; 
} else { 
    return true; 
} 

Вы также можете написать:

return $this->getRow()->discountPercent ? true : false; 

, но это говорит о том, что discountPercent это логическое значение, а не числовое. Аналогичным образом, вы можете написать:

return !$this->getRow()->discountPercent; 

, но это также говорит о том, что это логическое значение. Хотя PHP является гибким с типами, подобными этому, обработка всех не фальшивых значений как истинных, исходный код легче понять читателям.

4

В вашем примере вам нужно будет поменять истинным и ложным:

return $this->getRow()->discountPercent ? true : false; 

Однако вы можете просто бросить целое возвращение к логическому:

return (bool)$this->getRow()->discountPercent; 

или даже:

return 0 != $this->getRow()->discountPercent; 

Нет необходимости в тернаре, возвращающем true или false.

0

В PHP вы можете свободно сравнивать или строго сравнивать. Это действительно зависит от того, что вы пытаетесь сравнить, иногда свободные - это хорошо, иногда вам нужно быть строгим.

свободно против строгого

/** loose **/ 
0 == 0; // true 
0 == false; // true 
0 == ''; // true 
0 == null; // true 

/** strict **/ 
0 === 0; // true 
0 === false; // false 
0 === ''; // false 
0 === null; // false 

, как он относится к вашему примеру

/** 
* When doing the loose comparison, anything is isn't 
* 0, false, '', or null will always evaluate to true. 
* 
* So for instance: 
*/ 

'iamateapot' == true; // true 
'false' == true; // true, this is true because it's a string of false not a boolean of false; 
0 == true; // false; 

В вашем конкретном случае, вы делаете

$this->getRow()->discountPercent ? false : true; 

Что делает свободное сравнение, я предпочитаю всегда указывать, с чем вы сравниваете, поэтому ваш первый пример будет тем, что я бы выбрал лично.

+0

. Какое это имеет отношение к тому, можно ли исключить сравнение полностью? Оставляя это, похоже на свободное сравнение. – Barmar

+0

Я поправился, чтобы включить пример, относящийся к вопросу. – Augwa

0

Нет, это не просто пойти на

return $this->getRow()->discountPercent ? false : true 

На самом деле, это не так. Вы должны вернуть false, если discountPercent равен нулю. В предложенном коде, если discountPercent равен нулю, он будет оценивать значение false, поскольку он используется как условие и возвращает true.

Если вы действительно хотите сохранить ту же логику, но сделать его короче лучший способ пойти об этом было бы:

return $this->getRow()->discountPercent != 0 

У меня есть правило, я всегда следовать: Если результат условного оператора является boolean, а затем return/condition. Кроме того, я не согласен с тем, что письмо:

return 0 == $this->getRow()->discountPercent ? false : true; 

делает код более удобочитаемым. Если мы пойдем по тому, что функция должна делать, я хотел бы написать что-то вроде этого:

return $this->getRow()->discountPercent > 0 

, который ясно показывает, что если discountPercent имеет значение больше нуля, то дисконтируется. Простой, точный и понятный. Затем он также берет на себя отрицательные значения.

Смежные вопросы