Лог ошибки в php

У меня есть код, который выглядит так:

$log->error( 'addToWatch=['.$addToWatchPage.'] success=['.$success.']' );           
if( ( $success == 1 ) and ( $addToWatchPage == true ) ) {
   $log->error( 'adding to watch page' );           
} else {
   $log->error( 'NOT added to watch page' );        
}

Когда я запускаю его, я всегда вхожу в оператор if и никогда в оператор else, даже если $addToWatchPage ложно. Смотрите мой вывод журнала ниже:

Sat Jan 26, 2013 @ 6:02 addToWatch=[false] success=[1] 
Sat Jan 26, 2013 @ 6:02 adding to watch page.

Кто-нибудь может объяснить, почему это сломано?


person jth41    schedule 12.12.2013    source источник
comment
Является ли $addToWatchPage строкой false или фактическим значением false? var_dump($addToWatchPage)   -  person showdev    schedule 13.12.2013
comment
предоставленный вами код не воспроизводит ошибку   -  person Iłya Bursov    schedule 13.12.2013


Ответы (4)


Вероятно, $addToWatchPage — это строка, содержащая false, иначе ваше результирующее первое сообщение журнала будет выглядеть так:

Sat Jan 26, 2013 @ 6:02 addToWatch=[] success=[1]

Это приведет к тому, что $addToWatchPage == true будет оцениваться как true, поскольку 'false' == true является истинным выражением (на самом деле любая непустая строка, кроме '0', становится истинной при приведении к логическому значению).

Убедитесь, что $addToWatchPage является логическим значением, а не строкой.

$addToWatchPage = false; // correct
$addToWatchPage = 'false'; // wrong
person Guilherme Sehn    schedule 12.12.2013

Вам нужно будет предоставить идентичный оператор '===' для инструкции $addToWatchPage. Ваш текущий код с '==' в основном спрашивает, содержит ли что-нибудь $assToWatchPage. Я бы также удалил дополнительные скобки, но я не уверен на 100%, имеет ли это значение? Я бы также использовал && вместо и, хотя кто-то может объяснить приоритет оператора.

Здесь:

    $log->error( 'addToWatch=['.$addToWatchPage.'] success=['.$success.']' );           
if( $success == 1  &&  $addToWatchPage === true ) {
   $log->error( 'adding to watch page' );           
} else {
   $log->error( 'NOT added to watch page' );        
}

См. эту запись в блоге о Triple Equals.

person Chris Hopkins    schedule 12.12.2013

Вы должны использовать === вместо == ширины $addToWatch

person Michael Villeneuve    schedule 12.12.2013

Я предполагаю, что это проблема строки:

if('false' == true)echo 'wtf';

Попробуйте кастинг:

$log->error("addToWatch=[$addToWatchPage] success=[$success]");           
if((int)$success === 1 && (string)$addToWatchPage === 'true') {
  $log->error('adding to watch page');           
}
else{
  $log->error('NOT added to watch page');        
}
person StackSlave    schedule 12.12.2013