если (что-то) против если (что-то === правда) - PullRequest
2 голосов
/ 20 июня 2010

Я занимался самообучением по cakephp (версия 1.26).Я получил простое текстовое поле для ввода HTML, например:

<input type="text" name="data[testing][name]" id="data[testing][name]">

Значение из поля ввода текста было проверено в базе данных.Если значение соответствует данным, хранящимся в базе данных, оно вернет true.Вот код:

{
  $t=$this->data;
  $result=$this->User->findByname($t['testing']['name']); 
  if($result){ //doing something;}
}

Я столкнулся с вопросом, когда я изменил код выше с небольшим изменением,но тогда это не сработало тогда:

 {
      $t=$this->data;
      $result=$this->User->findByname($t['testing']['name']); 
      if($result===true){ //doing something;}
    }

Может кто-нибудь помочь, пожалуйста?

Ответы [ 7 ]

7 голосов
/ 20 июня 2010

Вы используете строгое сравнение типов с === вместо ==, это означает, что $result на самом деле не равно true, выполняя условиепотерпеть поражение.Попробуйте узнать, что происходит в переменной $result:

var_dump($result);

Или попробуйте это условие с помощью (==):

if($result == true){ //doing something;}

Или просто:

if ($this->User->findByname($t['testing']['name'])){ //doing something;}
3 голосов
/ 20 июня 2010

Предполагая, что findByName возвращает какой-то объект или массив.если вы используете if ($result), этот объект / массив будет приведен к логическому значению.

Если вы используете if ($result === true), вы строго сравниваете объект / массив с логическим значением true, это сравнение всегдаоцените как ложное.

2 голосов
/ 20 июня 2010

Справочник по PHP имеет очень хорошее объяснение того, как выполняется сравнение типов. Быстрый ответ заключается в том, что вы сейчас проводите гораздо более строгое сравнение, и некоторые крайние случаи проваливаются. Вы, вероятно, будете в порядке с $ result == true

http://php.net/manual/en/language.operators.comparison.php

1 голос
/ 21 июня 2010

В вашем коде, когда есть результат, возвращаемое значение не равно нулю, поэтому оно будет иметь значение true.

=== является оператором идентификации и вернет true, когда два объекта идентичны

например. 1===1 (true) true===true (true) true===1 ( false )

== является оператором равенства и вернет true, когда два объекта равны или эквивалентны .

например. 1==1 (true) true==true (true) true==1 ( true )

findByName вернет массив или unset. unset будет равно false, а массив будет равен true.

само значение true никогда не возвращается в ваш код, поэтому === никогда не будет true.

1 голос
/ 20 июня 2010

=== означает равный И тот же тип, что и у вас равный ... но $ result содержит данные из db..так что это не логическое значение ... используйте == вместо:

if($result==true)
1 голос
/ 20 июня 2010

Грубо говоря, оператор if преобразует ваш аргумент в логическое значение и оценивает его.Таким образом, if($result) преобразует $result в true или false.С другой стороны, === фактически проверяет равенство как типа, так и значения, поэтому true === $val вернет true, только если $val - логическое значение true.===, очевидно, возвращает логическое значение, поэтому для последующей оценки в пределах if приведение не требуется.Для вас это означает, что if($result) обрабатывает блок, если $result преобразуется в true.Примерами вещей, которые становятся true, являются 1, '1' и new Object().И наоборот, if($result===true) сразу не разыгрывает $result.Он проверяет его по типу и «значению» на логическое значение true.

Если $result, скажем, 1, первая структура управления будет обрабатывать блок, а вторая - нет.

1 голос
/ 20 июня 2010

Это потому, что $result === true проверяет, является ли $result значение true.Но ваша переменная $result содержит результаты из базы данных.

...