Consulte la PHP type comparison tables del manual. Es muy útil tenerlo a mano hasta que lo hayas internalizado y haya sido inestimable para mi comprensión de qué es exactamente lo que se evaluará como verdadero y cuándo.
Otros ya han respondido al núcleo de la pregunta, pero creo que es importante decir que en PHP, la única cadena no vacía que no se evalúa como "verdadera" con el operador == es "0" como PHP trata cualquier cadena que contenga solo números como un entero o float.
La razón de esto es que PHP está bastante tipeado e intenta permitir que enteros, cadenas, flotantes y valores booleanos sean intercambiables. Un ejemplo real y extremadamente común de esto es que si está utilizando las funciones de mysql o PDO, las cadenas se devuelven para todo, incluso si la columna subyacente es un número entero.
Consideremos el siguiente código SQL:
CREATE TABLE `test`.`pants` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`some_other_int` INT NOT NULL
) ENGINE = InnoDB;
INSERT INTO `test`.`pants` (`id`, `some_other_int`)
VALUES ('1', '1'), ('2', '0');
Y el siguiente código: "! X campo no era una cadena"
<?php
$c = mysql_connect('127.0.0.1', 'user', 'password');
mysql_select_db('test', $c);
$r = mysql_query('SELECT * FROM pants', $c);
while ($row = mysql_fetch_assoc($r)) {
var_dump($row);
foreach($row as $k=>$v) {
if (!is_string($v))
echo "field {$v} was not a string!\n";
}
}
El mensaje es nunca impreso, aunque cada columna en la base de datos es un número entero. Supongamos que quiere usar realmente la segunda fila en esa tabla.
<?php
$id = 2;
$r = mysql_query(sprintf('SELECT * FROM pants WHERE id=%s', mysql_real_esacpe_string($id)), $c);
$row = mysql_fetch_assoc($r);
// this is the important bit
if (0 == $row['some_other_int']) {
echo "It was zero!";
}
Si la cadena "0" no se ha entendido como el número entero 0 para la comparación, el código anterior nunca se imprime "Fue cero!". El programador debería asumir la responsabilidad de hacer malabares con el tipo del valor que sale de la base de datos. Esto no es deseable para un lenguaje poco tipado.
La igualdad estricta, incluido el tipo, se prueba con el operador "Es realmente, verdaderamente, honesto con Dios igual a", que se representa con el símbolo "===".
Al igual que en Javascript, las comparaciones entre los diferentes tipos pueden no ser transitivas. Ese es el horror de la coerción tipo. – JAL