Volver al índiceOperaciones lógicas

Las operaciones lógicas son expresiones matemáticas cuyo resultado es un valor booleano (verdadero o falso true o false). Estas expresiones se utilizan principalmente en las estructuras de control.


Comparaciones

Las comparaciones permiten comparar variables o expresiones entre sí o con valores concretos. El resultado de la comparación es un valor booleano (true o false).

Ejemplo Nombre Resultado
$a == $b Igual true si $a es igual a $b.
$a === $b Idéntico true si $a es igual a $b, y son del mismo tipo. (a partir de PHP 4)
$a != $b Diferente true si $a no es igual a $b.
$a <> $b
$a !== $b No idénticos true si $a no es igual a $b, o si no son del mismo tipo. (a partir de PHP 4)
$a < $b Menor que true si $a es estrictamente menor que $b.
$a > $b Mayor que true si $a es estrictamente mayor que $b.
$a <= $b Menor o igual que true si $a es menor o igual que $b.
$a >= $b Mayor o igual que true si $a es mayor o igual que $b.

<?php
$nombre = "Pepe";

if ($nombre == "Juan") {
  print "<p>Tu nombre es Juan.</p>\n";
}

if ($nombre != "Juan") {
  print "<p>Tu nombre no es Juan.</p>\n";
}
?>
<p>Tu nombre no es Juan.</p>
<?php
$nombrePadre = "Pepe";
$nombreHijo  = "Pepe";

if ($nombrePadre == $nombreHijo) {
  print "<p>El hijo se llama como el padre.</p>\n";
}

if ($nombrePadre != $nombreHijo) {
  print "<p>El hijo no se llama como el padre.</p>\n";
}
?>
<p>El hijo se llama como el padre.</p>

Un error típico cuando se empieza a programar es confundir el operador comparación (==) con el operador de asignación (=), lo que produce resultados inesperados, como en el ejemplo siguiente:

<?php
$nombre = "Pepe";

if ($nombre = "Juan") {
  print "<p>Tu nombre es Juan.</p>\n";
}

if ($nombre != "Juan") {
  print "<p>Tu nombre no es Juan.</p>\n";
}

?>
<p>Tu nombre es Juan.</p>

Al escribir = en vez de ==, PHP no compara el valor de la variable $nombre con la cadena "Juan", sino que cambia el valor de $nombre a "Juan". Como la asignación no da error, PHP le asigna el valor booleano true, y escribe que el nombre es Juan.

Al no producir mensaje de error, este error puede ser difícil de localizar en programas largos o complejos.


Volver al principio de la página


Operadores lógicos

Los operadores lógicos permiten combinar expresiones simples en expresiones más complejas.

Ejemplo Nombre Resultado
$a && $b Y true si los dos, $a y $b, son true.
$a and $b
$a || $b O true si uno de los dos, $a o $b, es true.
$a or $b
$a xor $b O exclusivo (Xor) true si sólo uno de los dos, $a o $b, es true, pero no ambos.
! $a Negación true si $a no es true.

Al escribir expresiones en las que se combinan varias comparaciones mediante operadores lógicos es conveniente utilizar paréntesis, aunque en muchos casos no sean necesarios porque las comparaciones tienen precedencia sobre los operadores lógicos.

Diferencia entre and y && y entre or y ||

Los operadores and y && y los operadores or y || no son completamente equivalentes, ya que no tienen la misma precedencia. Concretamente, && y || tienen mayor prioridad que and y or. Como además el operador de asignación = tiene una prioridad intermedia, se pueden producir situaciones inesperadas, como muestran los siguientes ejemplos.

El ejemplo siguiente muestra el resultado esperado:

<?php
$var1 = true;
$var2 = false;
$todo = $var1 && $var2; if ($todo) { print "<p>verdadero</p>\n"; } else { print "<p>falso</p>\n"; } ?>
<p>falso</p>

La variable $todo sólo tomaría el valor true si tanto $var1 como $var2 fueran true, pero como $var2 es false, $todo toma el valor false.

Sin embargo si se utiliza el operador and en vez de &&, el resultado no es el esperado:

<?php
$var1 = true;
$var2 = false;
$todo = $var1 and $var2;
if ($todo) {
    print "<p>verdadero</p>\n";
} else {
    print "<p>falso</p>\n";
} 
?>
<p>verdadero</p>

¿Por qué se produce ese resultado? Porque el operador de asignación = tiene precedencia sobre el operador and. Eso quiere decir que PHP realiza antes la asignación que la operación lógica, es decir, como si la expresión estuviese escrita así:

($todo = $var1) and $var2;
<p>verdadero</p>

En esa expresión, la variable $todo almacena el valor de la variable $var1 (true), por lo que $todo toma el valor true. La operación lógica and no modifica el valor de $todo.

Si se quiere obtener el mismo resultado con and que con &&, se deben utilizar paréntesis, para forzar que la operación lógica and se realice antes de la asignación:

<?php
$var1 = true;
$var2 = false;
$todo = ($var1 and $var2);
if ($todo) {
    print "<p>verdadero</p>\n";
} else {
    print "<p>falso</p>\n";
} 
?>
<p>falso</p>

Volver al principio de la página

Última modificación de esta página: 24 de octubre de 2013

Licencia Creative Commons
Páginas web con PHP por Bartolomé Sintes Marco
se distribuye bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0).