3

¿Para qué se utiliza el operador "==" y en que se diferencia de "=" o de "===" en PHP?

¿Por qué no funciona bien el siguiente código? (Siempre aplica el descuento)

$cantidad = 0;
foreach ($productos as $producto){
  ...
  $cantidad = $cantidad + 1;
  if ($cantidad = 10){
    echo "Se aplicará un descuento";
  }
}
Dev. Joel
  • 23,229
  • 3
  • 25
  • 44
juananruiz
  • 356
  • 1
  • 15
  • 2
    Pregunta relacionada [Diferencias entre == y === (comparaciones en JavaScript)](https://es.stackoverflow.com/questions/331) – the-breaker Jun 25 '18 at 15:50

3 Answers3

10

El operador = es el operador de asignación, se usa para dar un valor a una variable (podrían haber usado dos puntos o una flecha pero cogieron este).

$dedos = 5; // Ahora la variable dedos contiene el valor 5

No tiene nada que ver con == que es un operador de comparación:

if ($dedos == 5) { echo "Eso es una mano humana"; }

Estás preguntado si dedos contiene el valor 5, la expresión devuelve true o false

Y ahora cuidado porque si escribes

if ($dedos = 10) {...}

No estás comparando sino que estás asignando 10 a la variable dedos.

Para colmo, cuando se asigna un valor a una variable esa expresión devuelve true, con lo que el código anterior siempre devuelve true, pongas lo que pongas a la derecha de la asignación, lo cual enmascara el error un poquito más y encima te vas a quedar con 10 dedos en una mano.

Esto a dado tantos dolores de cabeza, que algunos programadores prefieren escribir las comparaciones al revés, para que si por error ponen un sólo igual el error salte en cuanto se intente ejecutar el programa.

if (10 == $dedos) //esto funciona bien y comprueba si $dedos vale 10
if (10 = $dedos) //esto va a dar un error porque no se puede cambiar el valor de 10

Y hay otro operador más, que es la igualdad absoluta === que no se conforma con que el valor sea igual, sino también el tipo de la variable.

En PHP el tipo de una variable no está predeterminado, una variable puede contener un entero (10) ahora y una cadena "pepe" más tarde. Cuando haces una comparación normal PHP se pone en modo optimista e intenta hacer la vista gorda, así:

$a = 10; // variable tipo número entero
$b = "10"; //variable tipo cadena
$a == $b;  //devuelve true porque convierte la cadena "10" al entero 10 y entonces el valor es el mismo.
$a === $b; //devuelve false, porque los tipos son distintos
the-breaker
  • 5,332
  • 3
  • 17
  • 38
juananruiz
  • 356
  • 1
  • 15
2

PHP cuenta con un importante número de operadores, se puede ver una lista de los operadores discponibles aquí.

En concreto si hablamos de los operadoresde de conparación PHP cuenta con 11 diferentes.

OPERADOR       | NOMBRE
---------------+------------
$a == $b       | Igual
$a === $b      | Idéntico
$a != $b       | Diferente
$a <> $b       | Diferente
$a !== $b      | No idéntico
$a < $b        | Menor que 
$a > $b        | Mayor que 
$a <= $b       | Menor o igual que
$a >= $b       | Mayor o igual que
$a <=> $b      | Nave espacial
$a ?? $b ?? $c | Fusión de null

Si nos fijamos el Operador = es de asignación (es decir para asignar un valor) y no esta en la tabla de los operadores de comparación, ya que su función no es comparar.

¿Qué esta sucediendo cuando hacemos if($cantidad = 10) {}?

Cuando tenemos asignaciones (=) dentro de un condicional, estas son evaluadas antes de evaluar el condicional, es decir, primero se asigna y luego se evalua, es algo completamente válido aun que puede ser confuso, por eso no es raro encontrar código donde se asigna y evalua simultáneamente en la misma línea, aun que se desaconseja.

Ejemplos:

// esto
if($cantidad = 10) {}

// es lo mismo que esto
$cantidad = 10; // asignar valor
if($cantidad) {} // evaluar valor, var_dump((bool)  $cantidad); //true

¿Cómo funciona operador de igualdad estandar ==?

El operador de igualdad estandar compara si los valores a ambos lados del operador son iguales realizando la conversión de tipos si es necesario (tipos de variables php), podemos ver los siguientes ejemplos para entenderlo mejor:

// si alguno es numérico, convierte ambos a numérico
var_dump(1 == "1hjfitujghb"); // 1 == 1 -> true
var_dump(0 == "a"); // 0 == 0 -> true
var_dump('a' == 0); // 0 == 0 -> true
// si ambos son string numéricos, convierte ambos a numérico
var_dump("1" == "01"); // 1 == 1 -> true
// si ambos son string pero alguno no es numérico, no se realizan conversiones
var_dump("1" == "1hjf"); // 1 == 1hjf -> false
// si alguno es null o boleano, se convierten ambos lados a booleano
var_dump(null == "1hjfitujghb"); // false == true -> false
var_dump(true == "1hjfitujghb"); // true == true -> true
var_dump(false == "0"); // false == false -> true

¿Cómo funciona el operador de igualda estricto ===?

El operador de igualdad (idéntico) comprueba que además de ser iguales los valores también sean del mismo tipo de variable (tipos de variables php). Veamos como quedan los ejemplos anteriores:

// Todos son FALSE
var_dump(1 === "1hjfitujghb"); // false
var_dump(0 === "a"); // false
var_dump('a' === 0); // false
var_dump("1" === "01"); // false
var_dump("1" === "1hjf"); // false
var_dump(null === "1hjfitujghb"); // false
var_dump(true === "1hjfitujghb"); // false
var_dump(false === "0"); // false
Xerif
  • 7,283
  • 3
  • 17
  • 41
1

Cada símbolo u operador tiene su propia función, en este caso los 3 operadores que mencionas funcionan de esta manera:

=   -> asigna, 
       ejemplo: $cantidad = 0; 
       aquí asignas el valor 0 a la variable $cantidad.

==  -> igual, 
       ejemplo: $cantidad == 10; 
       aquí compara si el valor de $cantidad es igual a 10.

=== -> idéntico, 
       ejemplo: $cantidad === "0"; 
       aquí compara si el valor de $cantidad es idéntico a "0". 
       Con idéntico se refiere al mismo tipo de variable y al mismo valor.
Levi Arista
  • 2,742
  • 2
  • 12
  • 24
kracko
  • 11
  • 2