Diferencia entre revisiones de «Plantilla:ManuelRomero/PHP/OperadoresExpresiones»
De WikiEducator
(34 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 2: | Línea 2: | ||
==Operadores y expresiones== | ==Operadores y expresiones== | ||
+ | <br /> | ||
{{MRM_Definicion|Title=¿Qué es una expresión?| | {{MRM_Definicion|Title=¿Qué es una expresión?| | ||
Línea 39: | Línea 40: | ||
Existen diferentes '''tipos de operadores''' en función del tipo de operandos y el resultado esperado. | Existen diferentes '''tipos de operadores''' en función del tipo de operandos y el resultado esperado. | ||
− | |||
+ | {| class="wikitable" | ||
+ | |+ style="color:blue; font-size:1.25em;" | '''OPERADORES HABITUALES EN PHP''' | ||
+ | |- | ||
+ | ! style="background:#0066CC; color:white;" | '''Tipo de Operador''' || '''Operador''' || '''Tipo de Expresión''' | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Operadores aritméticos || style="background:#FFFFFF;" | + - * / % ** || Numérica | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Operadores lógicos || style="background:#FFFFFF;" | AND OR && <nowiki>||</nowiki> ! || Lógica | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Operadores de comparación || style="background:#FFFFFF;" | == != < > <= >= <=> ?? || Lógica | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Operadores de auto incremento/decremento || style="background:#FFFFFF;" | ++$a $a++ --$a $a-- || Numérica o String | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Operadores de string (concatenación) || style="background:#FFFFFF;" | . .= || String | ||
+ | |} | ||
− | {| class="wikitable | + | {| class="wikitable" |
+ | |+ style="color:blue;font-weight:bold; font-size:1.25em;" | '''OTROS OPERADORES MENOS HABITUALES''' | ||
+ | |- | ||
+ | ! style="background:#0066CC; color:white;" | '''Tipo de Operador''' || '''Operador''' || '''Tipo de Expresión''' | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Operadores de asignación simple || style="background:#FFFFFF;" | = || Valor asignado | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Operadores de asignación compuesta || style="background:#FFFFFF;" | += -= *= /= %= **= .= || Numérica | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Operadores de asignación por referencia || style="background:#FFFFFF;" | & || Valor referenciado | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Operadores bit a bit || style="background:#FFFFFF;" | & | ^ ~ << >> || Numérica | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Operador de control de errores || style="background:#FFFFFF;" | @ || Silencia errores | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Operador de ejecución || style="background:#FFFFFF;" | `comando` || Resultado del comando ejecutado | ||
+ | |} | ||
− | MRM_Puntos clave|Title=Notas importantes| | + | {{MRM_Puntos clave|Title=Notas importantes| |
;Notas importantes: | ;Notas importantes: | ||
Línea 52: | Línea 83: | ||
}} | }} | ||
− | === | + | ===Precedencia de Operadores en PHP=== |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | { | + | * La '''precedencia''' de los operadores define el orden en que se evalúan cuando hay múltiples operadores en una expresión. |
− | ===== | + | * Sigue las reglas básicas de las matemáticas: |
− | < | + | - La '''multiplicación''' y '''división''' tienen mayor prioridad que la '''suma''' y la '''resta'''. |
− | ; | + | - Los '''paréntesis''' siempre tienen la mayor precedencia. |
− | + | * Cuando varios operadores tienen la misma precedencia, la '''asociatividad''' determina cómo se agrupan: | |
+ | - Ejemplo (asociatividad izquierda): `1 + 2 + 3` se evalúa como `(1 + 2) + 3`. | ||
+ | - Ejemplo (asociatividad derecha): `$x = $y = $z` se evalúa como `$x = ($y = $z)`. | ||
+ | * Algunos operadores no tienen asociatividad y no pueden combinarse directamente. | ||
+ | - Ejemplo incorrecto: `1 < 2 > 1`. | ||
+ | |||
+ | '''Nota importante:''' Usar paréntesis puede hacer que las expresiones sean más legibles, aunque no sean necesarios. | ||
+ | |||
+ | ===Tabla de Precedencia de Operadores=== | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |+ style="color:blue; font-size:1.25em;" | '''Precedencia y Asociatividad de Operadores en PHP''' | ||
+ | |- | ||
+ | ! style="background:#0066CC; color:white;" | '''Asociatividad''' || '''Operadores''' | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | No asociativo || `clone`, `new` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Izquierda || `[` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Derecha || `**` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Derecha || `++`, `--`, `~`, `(int)`, `(float)`, `(string)`, `(array)`, `(object)`, `(bool)`, `@` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | No asociativo || `instanceof` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Derecha || `!` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Izquierda || `*`, `/`, `%` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Izquierda || `+`, `-`, `.` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Izquierda || `<<`, `>>` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | No asociativo || `<`, `<=`, `>`, `>=` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | No asociativo || `==`, `!=`, `===`, `!==`, `<>` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Izquierda || `&` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Izquierda || `^` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Izquierda || `|` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Izquierda || `&&` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Izquierda || `||` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Izquierda || `?:` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Derecha || `=`, `+=`, `-=`, `*=`, `**=`, `/=`, `.=`, `%=`, `&=`, `/=`, `^=`, `<<=`, `>>=`, `=>` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Izquierda || `and` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Izquierda || `xor` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Izquierda || `or` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Izquierda || `,` | ||
+ | |} | ||
+ | |||
+ | ===Operadores Aritméticos=== | ||
+ | |||
+ | Los '''operadores aritméticos en PHP''' son similares a los de las matemáticas y realizan operaciones básicas. | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |+ style="color:blue; font-size:1.25em;" | '''Operadores Aritméticos''' | ||
+ | |- | ||
+ | ! style="background:#0066CC; color:white;" | '''Operación''' || '''Representación''' || '''Descripción''' | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Suma || <source lang=php>$x + $y</source> || Devuelve la suma de $x y $y. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Resta || <source lang=php>$x - $y</source> || Devuelve la diferencia entre $x y $y. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Multiplicación || <source lang=php>$x * $y</source> || Devuelve el producto de $x y $y. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | División || <source lang=php>$x / $y</source> || Devuelve el cociente de $x dividido por $y. Si ambos son divisibles, devuelve un entero; de lo contrario, un flotante. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Módulo || <source lang=php>$x % $y</source> || Devuelve el resto de dividir $x entre $y. Si $x o $y son flotantes, se transforman en enteros antes de la operación. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Exponenciación || <source lang=php>$x ** $y</source> || Eleva $x a la potencia de $y. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Negación || <source lang=php>-$x</source> || Cambia el signo de $x. | ||
+ | |} | ||
+ | |||
+ | '''Notas importantes:''' | ||
+ | * En '''módulo''', el signo del resultado dependerá del dividendo. | ||
+ | Ejemplo: <source lang=php>-5 % 3</source> devolverá <source lang=php>-2</source>. | ||
+ | * El '''exponente''' eleva un número a otro. Ejemplo: <source lang=php>2 ** 3</source> devolverá <source lang=php>8</source>. | ||
+ | |||
+ | ====Ejemplos Prácticos==== | ||
+ | |||
+ | '''1. Preferencia de Operadores:''' | ||
<source lang=php> | <source lang=php> | ||
− | $num = 5+6*8-4/2; | + | $num = 5 + 6 * 8 - 4 / 2; |
+ | // Mejor usar paréntesis para mayor claridad: | ||
+ | $num = 5 + (6 * 8) - (4 / 2); | ||
</source> | </source> | ||
− | + | ||
+ | '''Ejecución paso a paso:''' | ||
<source lang=php> | <source lang=php> | ||
− | $num = 5+ | + | $num = 5 + 48 - 2; |
+ | $num = 53 - 2; | ||
+ | $num = 51; | ||
</source> | </source> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | '''2. Uso del módulo:''' | ||
{{MRM_Actividad| | {{MRM_Actividad| | ||
− | ;Buscar | + | ; Buscar los números divisibles por 3 entre 1 y 100. |
− | + | ||
{{Plegable|hide|Posible solución| | {{Plegable|hide|Posible solución| | ||
<source lang=php> | <source lang=php> | ||
− | + | for ($n = 1; $n <= 100; $n++) { | |
− | for($n=1; $n<=100; $n++){ | + | if ($n % 3 == 0) { |
− | if ($n%3==0) | + | echo "$n, "; |
− | + | } | |
} | } | ||
− | |||
</source> | </source> | ||
− | ;Salida | + | ; Salida: Números divisibles por 3 con una coma al final. |
− | + | ||
}} | }} | ||
− | |||
− | |||
− | |||
}} | }} | ||
− | + | '''3. Exponenciación:''' | |
{{MRM_Actividad| | {{MRM_Actividad| | ||
− | ; | + | ; Calcular las potencias de 2 del 1 al 15: |
{{Plegable|hide|Posible solución| | {{Plegable|hide|Posible solución| | ||
<source lang=php> | <source lang=php> | ||
− | for($n=1; $n<=15; $n++){ | + | for ($n = 1; $n <= 15; $n++) { |
− | echo "2 | + | echo "2^$n = " . (2 ** $n) . "<br />"; |
} | } | ||
</source> | </source> | ||
− | |||
− | |||
}} | }} | ||
}} | }} | ||
− | + | ||
− | === | + | --- |
− | + | ||
− | + | ===Operadores de Incremento y Decremento=== | |
− | + | ||
− | + | Los operadores de '''incremento y decremento''' permiten aumentar o reducir en 1 el valor de una variable. | |
− | + | ||
− | ; | + | {| class="wikitable" |
+ | |+ color:blue; font-size:1.25em;" | '''Incremento y Decremento''' | ||
+ | |- | ||
+ | ! style="background:#0066CC; color:white;" | '''Tipo''' || '''Representación''' || '''Descripción''' | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Pre-incremento || <source lang=php>++$a</source> || Incrementa el valor de $a antes de usarlo. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Post-incremento || <source lang=php>$a++</source> || Usa el valor de $a y luego lo incrementa. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Pre-decremento || <source lang=php>--$a</source> || Decrementa el valor de $a antes de usarlo. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Post-decremento || <source lang=php>$a--</source> || Usa el valor de $a y luego lo decrementa. | ||
+ | |} | ||
+ | |||
+ | ====Ejemplo de Diferencias entre Pre y Post:==== | ||
<source lang=php> | <source lang=php> | ||
− | ++$a; | + | // Pre-incremento |
− | --$a | + | $a = 5; |
+ | echo "Pre-incremento: " . ++$a; // Muestra 6 | ||
+ | |||
+ | // Post-incremento | ||
+ | $a = 5; | ||
+ | echo "Post-incremento: " . $a++; // Muestra 5 | ||
+ | echo "Nuevo valor: " . $a; // Muestra 6 | ||
</source> | </source> | ||
− | : | + | |
+ | {{Nota| Cuando los operadores de incremento/decremento están en una instrucción más compleja, su posición (pre o post) puede afectar el resultado.}} | ||
+ | |||
+ | ===Operadores de Asignación=== | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |+ style=" color:blue; font-size:1.25em;" | '''Tabla de Operadores de Asignación en PHP''' | ||
+ | |- | ||
+ | ! style="background:#0066CC; color:white;" | '''Categoría''' || '''Operador''' || '''Ejemplo''' || '''Descripción''' | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Asignación básica || = || <source lang=php>$x = 10;</source> || Asigna el valor de la derecha a la variable de la izquierda. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Asignación básica (arrays) || => || <source lang=php>$array = ["clave" => "valor"];</source> || Asigna un valor a una clave en un array asociativo. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Asignación por referencia || & || <source lang=php>$y = &$x;</source> || Asigna una referencia a otra variable, ambas apuntan al mismo valor. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Asignación compuesta || += || <source lang=php>$x += 5;</source> || Suma 5 al valor de $x y asigna el resultado a $x. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Asignación compuesta || -= || <source lang=php>$x -= 3;</source> || Resta 3 al valor de $x y asigna el resultado a $x. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Asignación compuesta || *= || <source lang=php>$x *= 2;</source> || Multiplica $x por 2 y asigna el resultado a $x. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Asignación compuesta || /= || <source lang=php>$x /= 4;</source> || Divide $x entre 4 y asigna el resultado a $x. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Asignación compuesta || %= || <source lang=php>$x %= 3;</source> || Asigna a $x el resto de la división de $x entre 3. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | Asignación compuesta (concatenación) || .= || <source lang=php>$y .= " mundo";</source> || Concatena " mundo" al valor de $y y asigna el resultado a $y. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | Asignación compuesta (exponenciación) || **= || <source lang=php>$x **= 3;</source> || Eleva $x a la potencia de 3 y asigna el resultado a $x. | ||
+ | |} | ||
+ | |||
+ | Los '''operadores de asignación''' permiten asignar un valor a una variable. Existen dos tipos principales: | ||
+ | |||
+ | * '''Básicos:''' Usan el operador "=" para asignar un valor. | ||
+ | * '''Combinados''' Combina un operador aritmético o de concatenación con la asignación. Siempre van precedidos por el punto antes de la operador antes de la asignación. | ||
+ | |||
+ | ====Operador de Asignación Básico==== | ||
+ | |||
+ | El operador '''"="''' '''asigna un valor''', pero no actúa como un igual matemático. La asignación retorna el valor que se asignó. | ||
+ | Por ejemplo: | ||
+ | |||
<source lang=php> | <source lang=php> | ||
− | $ | + | //Simple curiosidad que tiene consecuencias en las estructuras de control |
− | $ | + | $x = 3; |
+ | // La expresión $x = 3 tiene un valor de 3 | ||
+ | echo $x; // Mostrará: 3 | ||
</source> | </source> | ||
− | + | ||
− | + | En el caso de los **arrays**, el operador "=>" se utiliza para asignar valores a claves nombradas: | |
− | + | ||
<source lang=php> | <source lang=php> | ||
− | $ | + | $array = ["clave1" => "valor1", "clave2" => "valor2"]; |
− | + | echo $array["clave1"]; // Mostrará: valor1 | |
− | echo | + | |
</source> | </source> | ||
− | + | ||
+ | ====Operadores de Asignación Combinados==== | ||
+ | |||
+ | Los operadores de asignación combinados permiten realizar una operación y asignar el resultado a la misma variable en un solo paso. | ||
+ | |||
+ | Ejemplo básico: | ||
<source lang=php> | <source lang=php> | ||
− | $ | + | $x = 3; |
− | + | $x += 5; // Suma 5 a $x, | |
− | echo | + | $x=$x+3; //Esto es la misma acción que la instrucción anterior |
+ | echo $x; // Mostrará: 8 | ||
</source> | </source> | ||
− | + | ||
− | + | Esto es equivalente a: | |
<source lang=php> | <source lang=php> | ||
− | $ | + | $x = $x + 5; |
− | + | ||
− | + | ||
</source> | </source> | ||
− | + | ||
+ | Otros operadores combinados: | ||
<source lang=php> | <source lang=php> | ||
− | $ | + | $y = "Hola"; |
− | + | $y .= ", ¿Qué tal?"; // Concatenación | |
− | echo | + | echo $y; // Mostrará: Hola, ¿Qué tal? |
</source> | </source> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ====Ejemplo con Operadores de Asignación Combinados==== | |
<source lang=php> | <source lang=php> | ||
− | + | $b = 1; | |
− | + | for ($a = 0; $a < 10; $a++) { | |
− | // | + | $b *= 10; // Multiplica $b por 10 en cada iteración |
− | + | echo "Valor de \$b = " . $b . "<br>"; | |
− | + | } | |
− | + | ||
− | + | ||
</source> | </source> | ||
− | |||
− | + | Salida del código anterior: | |
− | + | ||
<source lang=php> | <source lang=php> | ||
− | $ | + | Valor de $b = 10 |
− | + | Valor de $b = 100 | |
− | + | Valor de $b = 1000 | |
− | + | Valor de $b = 10000 | |
+ | Valor de $b = 100000 | ||
+ | Valor de $b = 1000000 | ||
+ | Valor de $b = 10000000 | ||
+ | Valor de $b = 100000000 | ||
+ | Valor de $b = 1000000000 | ||
+ | Valor de $b = 10000000000 | ||
+ | </source> | ||
− | + | ====Asignación por Referencia==== | |
− | + | La '''asignación por referencia''' permite que dos variables apunten al mismo valor, sin crear copias. Esto se realiza con el operador "&". | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Ejemplo: | |
− | + | ||
− | + | ||
<source lang=php> | <source lang=php> | ||
− | + | $x = 3; | |
− | + | $y = &$x; // $y apunta a la misma referencia que $x | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | echo "$x, $y"; // Mostrará: 3, 3 | |
− | + | ||
− | + | $x = 5; | |
− | + | echo "$x, $y"; // Mostrará: 5, 5 | |
− | $ | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</source> | </source> | ||
− | |||
+ | {{Nota| Las referencias son similares a un alias o acceso directo en el sistema de archivos.}} | ||
+ | ===Operadores de Comparación=== | ||
+ | Los '''operadores de comparación''' permiten comparar dos valores y devuelven un resultado booleano (`true` o `false`). | ||
+ | El resultado depende de los tipos de los valores comparados y de las reglas de conversión de tipos de PHP. | ||
− | + | ====Tabla de Operadores de Comparación==== | |
− | ==== | + | |
− | + | {| class="wikitable" | |
− | + | |+ style="color:blue; font-size:1.25em;" | '''Operadores de Comparación''' | |
− | + | |- | |
− | + | ! style="background:#0066CC; color:white;" | '''Ejemplo''' || '''Nombre''' || '''Resultado''' | |
− | + | |- | |
− | </ | + | | style="background:#E6F0FF;" | <source lang=php>$x == $y</source> || Igual || Devuelve `true` si $x y $y tienen el mismo valor, independientemente del tipo. |
+ | |- | ||
+ | | style="background:#FFFFFF;" | <source lang=php>$x === $y</source> || Idéntico || Devuelve `true` sólo si $x y $y tienen el mismo valor y el mismo tipo. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | <source lang=php>$x != $y</source> || Distinto || Devuelve `true` si $x y $y son diferentes, independientemente del tipo. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | <source lang=php>$x <> $y</source> || Distinto || Igual que `!=`. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | <source lang=php>$x !== $y</source> || No idéntico || Devuelve `true` si $x y $y no son iguales o no son del mismo tipo. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | <source lang=php>$x < $y</source> || Menor que || Devuelve `true` si $x es menor que $y. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | <source lang=php>$x > $y</source> || Mayor que || Devuelve `true` si $x es mayor que $y. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | <source lang=php>$x <= $y</source> || Menor o igual que || Devuelve `true` si $x es menor o igual que $y. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | <source lang=php>$x >= $y</source> || Mayor o igual que || Devuelve `true` si $x es mayor o igual que $y. | ||
+ | |} | ||
+ | |||
+ | ====Comparación Flexible (==) vs Estricta (===)==== | ||
− | + | Cuando se comparan dos valores, es importante entender la diferencia entre '''==''' (comparación flexible) y '''===''' (comparación estricta). | |
− | + | ||
+ | Ejemplo: | ||
<source lang=php> | <source lang=php> | ||
− | $num=1; | + | $num = 1; |
− | if ($num==true) | + | |
+ | if ($num == true) { | ||
echo '$num es igual a true<br>'; | echo '$num es igual a true<br>'; | ||
− | if ($num===true){ | + | } |
− | echo " | + | |
− | }else | + | if ($num === true) { |
+ | echo "Esto nunca se ejecutará"; | ||
+ | } else { | ||
echo '$num no es exactamente igual a true'; | echo '$num no es exactamente igual a true'; | ||
+ | } | ||
</source> | </source> | ||
− | |||
− | |||
− | |||
− | |||
− | + | Salida esperada: | |
<source lang=php> | <source lang=php> | ||
$num es igual a true | $num es igual a true | ||
$num no es exactamente igual a true | $num no es exactamente igual a true | ||
</source> | </source> | ||
− | |||
− | |||
− | |||
− | + | '''Notas:''' | |
− | == | + | * `==` compara valores, permitiendo conversiones de tipo. |
− | + | * `===` compara valores y tipos, sin conversiones. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ====Comparaciones Entre Tipos==== | |
− | + | ||
− | + | La forma en que PHP compara diferentes tipos puede variar dependiendo de las reglas de conversión. | |
− | + | ||
+ | {| class="wikitable" | ||
+ | |+ style="color:blue; font-size:1.25em;" | '''Comparación Entre Tipos''' | ||
+ | |- | ||
+ | ! style="background:#0066CC; color:white;" | '''$x''' || '''$y''' || '''Resultado''' | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | _null_ o _string_ || _string_ || _null_ se convierte en `""`, luego se compara numéricamente o léxicamente. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | _bool_ o _null_ || cualquiera || Ambos valores se convierten a booleanos. `false` < `true`. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | _object_ || _object_ || Dos objetos son '''iguales''' si tienen los mismos atributos y valores. Son '''idénticos''' si además apuntan a la misma instancia. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | _string_, _resource_ o _number_ || _string_, _resource_ o _number_ || Se convierten a números y se comparan matemáticamente. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | _array_ || _array_ || Se comparan elemento por elemento. Si los arrays tienen distinto número de elementos o claves no coincidentes, son incomparables. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | _object_ || cualquiera || Los objetos son siempre mayores que otros tipos. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | _array_ || cualquiera || Los arrays son siempre mayores que otros tipos. | ||
+ | |} | ||
+ | |||
+ | '''Importante:''' Las comparaciones entre tipos no numéricos pueden ser confusas. Consulta la [documentación oficial de comparación de tipos](http://php.net/manual/es/types.comparisons.php) para más detalles. | ||
+ | |||
+ | ===Operadores Lógicos=== | ||
+ | |||
+ | Los '''operadores lógicos''' permiten combinar o invertir valores booleanos. Son esenciales para construir expresiones condicionales complejas. | ||
+ | |||
+ | ====Tabla de Operadores Lógicos==== | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |+ style="color:blue; font-size:1.25em;" | '''Operadores Lógicos en PHP''' | ||
+ | |- | ||
+ | ! style="background:#0066CC; color:white;" | '''Operador''' || '''Descripción''' || '''Ejemplo''' || '''Resultado''' | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | <source lang=php>$x and $y</source> || Devuelve `true` si ambos $x y $y son `true`. || <source lang=php>(true and false)</source> || `false` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | <source lang=php>$x or $y</source> || Devuelve `true` si al menos uno de $x o $y es `true`. || <source lang=php>(true or false)</source> || `true` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | <source lang=php>$x xor $y</source> || Devuelve `true` si '''sólo uno''' de $x o $y es `true`. || <source lang=php>(true xor false)</source> || `true` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | <source lang=php>!$x</source> || Devuelve `true` si $x es `false`. || <source lang=php>(!true)</source> || `false` | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | <source lang=php>$x && $y</source> || Igual que `and`, pero con mayor precedencia. || <source lang=php>(true && false)</source> || `false` | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | <source lang=php>$x || $y</source> || Igual que `or`, pero con mayor precedencia. || <source lang=php>(true || false)</source> || `true` | ||
+ | |} | ||
+ | |||
+ | ====Notas Importantes==== | ||
+ | |||
+ | 1. ''Cortocircuito:'' | ||
+ | Si la primera condición de un operador como `&&` o `||` determina el resultado, las demás no se evalúan. | ||
+ | Ejemplo: | ||
+ | <source lang=php> | ||
+ | $result = (false && foo()); // foo() nunca se ejecutará | ||
+ | $result = (true || foo()); // foo() nunca se ejecutará | ||
+ | </source> | ||
+ | |||
+ | 2. ''Diferencia entre `and` y `&&`, `or` y `||`:'' | ||
+ | `&&` y `||` tienen '''mayor precedencia''' que `and` y `or`. | ||
+ | Esto afecta cómo se agrupan las expresiones: | ||
+ | <source lang=php> | ||
+ | $a = false || true; // Actúa como: $a = (false || true) | ||
+ | $b = false or true; // Actúa como: ($b = false) or true | ||
+ | |||
+ | var_dump($a, $b); // $a es true, $b es false | ||
+ | </source> | ||
+ | |||
+ | 3. ''`xor`:'' | ||
+ | Es Or exclusivo: Devuelve `true` si sólo uno de los operandos es `true`. Si ambos son `true` o ambos son `false`, devuelve `false`. | ||
+ | Este operador no se usa mucho. | ||
+ | |||
+ | ====Ejemplos de Diferencia de Preferencia==== | ||
+ | |||
+ | 1. '''Ejemplo con `and` vs `&&`:''' | ||
+ | <source lang=php> | ||
+ | $x = true && false; // Actúa como: $x = (true && false) | ||
+ | $y = true and false; // Actúa como: ($y = true) and false | ||
+ | |||
+ | var_dump($x, $y); // $x es false, $y es true | ||
+ | </source> | ||
+ | |||
+ | 2. '''Ejemplo con `or` vs `||`:''' | ||
+ | <source lang=php> | ||
+ | $x = false || true; // Actúa como: $x = (false || true) | ||
+ | $y = false or true; // Actúa como: ($y = false) or true | ||
+ | |||
+ | var_dump($x, $y); // $x es true, $y es false | ||
+ | </source> | ||
+ | |||
+ | ===Operadores de Control de Errores=== | ||
+ | |||
+ | *El operador '''@''' permite suprimir mensajes de error (si no es fatal, o sea de warning) que puedan generarse al evaluar una expresión. | ||
+ | *Es útil para evitar mostrar errores en ciertas situaciones, pero debe usarse con precaución. | ||
+ | |||
+ | ====Funcionamiento==== | ||
+ | |||
+ | * Cuando se coloca '''@''' antes de una expresión, cualquier error generado por esa expresión será ignorado. | ||
+ | * Si la directiva [`track_errors`](http://php.net/manual/es/errorfunc.configuration.php#ini.track-errors) está activada, el último error generado se almacenará en la variable especial '''$php_errormsg'''. | ||
+ | |||
+ | ====Ejemplo Básico==== | ||
+ | |||
+ | <source lang=php> | ||
+ | <?php | ||
+ | // Intentar abrir un archivo que no existe | ||
+ | $rtdo = @ (5+"25pepe") | ||
+ | echo $rtdo | ||
+ | ?> | ||
</source> | </source> | ||
− | |||
− | + | En este ejemplo: | |
− | + | * Se produce un warning, ya que uno de los operadores no es un entero (pero puedo convertirlo parcialmente). | |
<source lang=php> | <source lang=php> | ||
− | + | <?php | |
− | + | // Intentar abrir un archivo que no existe | |
+ | $rtdo = @(5+"pepe") | ||
+ | echo $rtdo | ||
+ | ?> | ||
</source> | </source> | ||
− | |||
− | + | En este ejemplo: | |
− | ==== | + | * Se produce un error, y por lo tanto no actúa el operador. |
− | : | + | |
− | : | + | ====Usos Típicos==== |
− | ; | + | |
+ | 1. **Acceso a claves no existentes en un array:** | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | $array = ["clave1" => "valor1"]; | ||
+ | $valor = @$array["clave_no_existe"]; | ||
+ | echo "El valor es: $valor"; // No genera error aunque la clave no exista | ||
+ | ?> | ||
+ | </source> | ||
+ | |||
+ | 2. ''Supresión de errores en funciones y expresiones:'' | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | @$resultado = 10 / "5hola"; // Suprime el warning de tipo | ||
+ | ?> | ||
+ | </source> | ||
+ | |||
+ | 3. ''Abrir ficheros que no existen:'' | ||
<source lang=php> | <source lang=php> | ||
<?php | <?php | ||
− | $ | + | // Intentar abrir un archivo que no existe |
− | + | $miArchivo = @file('archivo_que_no_existe') | |
− | + | ||
− | + | ?> | |
+ | </source> | ||
+ | |||
+ | |||
+ | ====Limitaciones del Operador @==== | ||
+ | |||
+ | * El operador **@** sólo funciona con expresiones (variables, llamadas a funciones, constantes, etc.). | ||
+ | * No puede usarse en estructuras de control como `if`, `foreach`, o definiciones de clases o funciones. | ||
+ | |||
+ | '''Ejemplo Inválido:''' | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | // Esto no funcionará: | ||
+ | @function miFuncion() { | ||
+ | echo "No se puede usar @ aquí."; | ||
} | } | ||
+ | |||
+ | |||
?> | ?> | ||
</source> | </source> | ||
− | |||
− | + | {{Notas| | |
− | *El | + | *1. Usar **@** puede dificultar la depuración, ya que los errores se suprimen y pueden pasar desapercibidos. |
+ | *2. En entornos de producción, es preferible manejar los errores mediante [manejo de excepciones](http://php.net/manual/es/language.exceptions.php) o configuraciones de registro de errores. | ||
+ | *3. Aunque útil en algunos casos, **@** debe evitarse en código crítico o de gran complejidad. | ||
+ | }} | ||
+ | |||
+ | ===Operadores Bit a Bit=== | ||
+ | |||
+ | Los '''operadores bit a bit''' permiten la evaluación y manipulación de bits específicos dentro de un número entero (`integer`). | ||
+ | |||
+ | ====Tabla de Operadores Bit a Bit==== | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |+ style="color:blue; font-size:1.25em;" | '''Operadores Bit a Bit''' | ||
+ | |- | ||
+ | ! style="background:#0066CC; color:white;" | '''Ejemplo''' || '''Nombre''' || '''Descripción''' | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | <source lang=php>$x & $y</source> || And || Realiza una operación AND entre cada bit de $x y $y. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | <source lang=php>$x | $y</source> || Or || Realiza una operación OR entre cada bit de $x y $y. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | <source lang=php>$x ^ $y</source> || Xor || Realiza una operación XOR entre cada bit de $x y $y. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | <source lang=php>~$x</source> || Not || Invierte todos los bits de $x. | ||
+ | |- | ||
+ | | style="background:#E6F0FF;" | <source lang=php>$x << $y</source> || Shift left || Desplaza los bits de $x hacia la izquierda $y posiciones. | ||
+ | |- | ||
+ | | style="background:#FFFFFF;" | <source lang=php>$x >> $y</source> || Shift right || Desplaza los bits de $x hacia la derecha $y posiciones. | ||
+ | |} | ||
+ | |||
+ | ====Ejemplos Prácticos==== | ||
+ | |||
+ | 1. '''Operador AND (&):''' | ||
+ | <source lang=php> | ||
+ | $x = 6; // 6 en binario: 110 | ||
+ | $y = 3; // 3 en binario: 011 | ||
+ | $resultado = $x & $y; // Resultado: 2 (010 en binario) | ||
+ | echo "$x & $y = $resultado"; // Mostrará: 6 & 3 = 2 | ||
+ | </source> | ||
+ | |||
+ | 2. '''Operador OR (|):''' | ||
+ | <source lang=php> | ||
+ | $x = 6; // 6 en binario: 110 | ||
+ | $y = 3; // 3 en binario: 011 | ||
+ | $resultado = $x | $y; // Resultado: 7 (111 en binario) | ||
+ | echo "$x | $y = $resultado"; // Mostrará: 6 | 3 = 7 | ||
+ | </source> | ||
+ | |||
+ | 3. '''Operador XOR (^):''' | ||
+ | <source lang=php> | ||
+ | $x = 6; // 6 en binario: 110 | ||
+ | $y = 3; // 3 en binario: 011 | ||
+ | $resultado = $x ^ $y; // Resultado: 5 (101 en binario) | ||
+ | echo "$x ^ $y = $resultado"; // Mostrará: 6 ^ 3 = 5 | ||
+ | </source> | ||
+ | |||
+ | 4. '''Operador NOT (~):''' | ||
+ | <source lang=php> | ||
+ | $x = 6; // 6 en binario: 110 | ||
+ | $resultado = ~$x; // Resultado: -7 (depende de la representación complementaria a dos) | ||
+ | echo "~$x = $resultado"; // Mostrará: ~6 = -7 | ||
+ | </source> | ||
+ | |||
+ | 5. '''Shift Left o desplazamiento a la izquierda (<<):''' | ||
+ | <source lang=php> | ||
+ | $x = 2; // 2 en binario: 10 | ||
+ | $resultado = $x << 1; // Desplaza los bits hacia la izquierda 1 posición: 100 (4 en decimal) | ||
+ | echo "$x << 1 = $resultado"; // Mostrará: 2 << 1 = 4 | ||
+ | </source> | ||
+ | |||
+ | 6. '''Shift Right o desplazamiento a la derecha (>>):''' | ||
+ | <source lang=php> | ||
+ | $x = 4; // 4 en binario: 100 | ||
+ | $resultado = $x >> 1; // Desplaza los bits hacia la derecha 1 posición: 10 (2 en decimal) | ||
+ | echo "$x >> 1 = $resultado"; // Mostrará: 4 >> 1 = 2 | ||
+ | </source> | ||
+ | |||
+ | ====Notas Importantes==== | ||
+ | |||
+ | * Los operadores bit a bit trabajan directamente sobre la representación binaria de los números. | ||
+ | * Los desplazamientos (`<<` y `>>`) pueden ser útiles para operaciones de bajo nivel como optimización de cálculos o manejo de banderas. | ||
+ | * El operador `~` puede producir resultados inesperados debido a la representación de enteros en PHP (complemento a dos). | ||
+ | |||
+ | ====Actividad Práctica==== | ||
+ | |||
+ | '''Objetivo:''' Escribir un programa que: | ||
+ | 1. Realice operaciones AND, OR, XOR y NOT con dos números. | ||
+ | 2. Desplace un número hacia la izquierda y hacia la derecha. | ||
+ | |||
+ | '''Plantilla de Ejemplo:''' | ||
<source lang=php> | <source lang=php> | ||
− | + | <?php | |
− | + | // 1. Operaciones bit a bit | |
− | + | $a = 5; // 101 en binario | |
− | + | $b = 3; // 011 en binario | |
− | + | ||
− | + | echo "$a & $b = " . ($a & $b) . "<br>"; // AND | |
− | + | echo "$a | $b = " . ($a | $b) . "<br>"; // OR | |
− | + | echo "$a ^ $b = " . ($a ^ $b) . "<br>"; // XOR | |
− | + | echo "~$a = " . (~$a) . "<br>"; // NOT | |
− | + | ||
+ | // 2. Desplazamiento | ||
+ | echo "$a << 1 = " . ($a << 1) . "<br>"; // Shift left | ||
+ | echo "$a >> 1 = " . ($a >> 1) . "<br>"; // Shift right | ||
+ | ?> | ||
</source> | </source> | ||
− | |||
− | + | === Operadores de Ejecución (``)=== | |
− | + | ||
− | + | El operador '''``''' permite ejecutar comandos del sistema directamente desde PHP. Es equivalente a usar la función [shell_exec()](http://php.net/manual/es/function.shell-exec.php). | |
− | * | + | |
+ | ====Funcionamiento==== | ||
+ | |||
+ | * Los comandos dentro de las comillas invertidas '''``''' se ejecutan en el sistema operativo, y el resultado se devuelve como una cadena de texto. | ||
+ | * Es útil para interactuar con el sistema desde un script PHP, pero debe usarse con precaución, especialmente en entornos de producción. | ||
+ | |||
+ | ====Ejemplo Básico==== | ||
+ | |||
+ | El siguiente código ejecuta el comando `df` (para mostrar información sobre discos y particiones en sistemas Linux): | ||
+ | |||
<source lang=php> | <source lang=php> | ||
<?php | <?php | ||
− | $Discos = `df`; | + | $Discos = `df`; // Ejecuta el comando `df` |
− | echo "<pre>$Discos</pre>"; | + | echo "<pre>$Discos</pre>"; // Muestra el resultado en un formato legible |
?> | ?> | ||
</source> | </source> | ||
− | |||
− | + | El código anterior generará una salida similar a esta (en sistemas Linux): | |
− | + | ||
<source lang=php> | <source lang=php> | ||
Filesystem 1K-blocks Used Available Use% Mounted on | Filesystem 1K-blocks Used Available Use% Mounted on | ||
Línea 343: | Línea 740: | ||
/dev/sda7 101797224 40480360 56122728 42% /home | /dev/sda7 101797224 40480360 56122728 42% /home | ||
</source> | </source> | ||
− | |||
− | + | ====Equivalencia con shell_exec()==== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | < | + | El operador de comillas invertidas '''``''' es funcionalmente igual a usar la función [shell_exec()](http://php.net/manual/es/function.shell-exec.php). |
− | ==== | + | |
− | + | Por ejemplo: | |
− | + | <source lang=php> | |
− | + | <?php | |
− | : | + | $Discos = shell_exec('df'); // También ejecuta el comando `df` |
− | + | echo "<pre>$Discos</pre>"; | |
− | + | ?> | |
− | </ | + | </source> |
+ | |||
+ | ====Notas Importantes==== | ||
+ | |||
+ | 1. '''Restricciones del sistema:''' | ||
+ | Si [safe_mode](http://php.net/manual/es/ini.sect.safe-mode.php#ini.safe-mode) está activado o la función `shell_exec()` está deshabilitada, el operador de ejecución no funcionará. | ||
+ | Este operador sólo es funcional en entornos donde PHP tiene permisos para ejecutar comandos del sistema. | ||
+ | |||
+ | 2. '''Compatibilidad con el sistema operativo:''' | ||
+ | En sistemas Linux/Unix, puedes usar comandos como `ls`, `df`, `cat`, etc. | ||
+ | En sistemas Windows, usa comandos como `dir`, `type`, etc. | ||
+ | |||
+ | 3. '''Precauciones de seguridad:''' | ||
+ | Nunca uses entradas del usuario directamente dentro del operador de ejecución. | ||
+ | Usa funciones como [escapeshellcmd()](http://php.net/manual/es/function.escapeshellcmd.php) para evitar inyecciones de comandos. | ||
+ | |||
+ | ====Actividad Práctica==== | ||
+ | |||
+ | 1. Escribe un programa que use el operador `` para listar los archivos del directorio actual (Linux: `ls`, Windows: `dir`). | ||
+ | 2. Modifica el programa para mostrar el contenido de un archivo específico. | ||
+ | 3. Usa [escapeshellcmd()](http://php.net/manual/es/function.escapeshellcmd.php) para proteger las entradas del usuario. | ||
+ | |||
+ | '''Plantilla de Ejemplo:''' | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | // Listar archivos en el directorio actual | ||
+ | $listado = `ls -al`; // En Linux/Unix | ||
+ | // $listado = `dir`; // En Windows | ||
+ | echo "<pre>$listado</pre>"; | ||
+ | |||
+ | // Mostrar contenido de un archivo (protegido) | ||
+ | $archivo = escapeshellcmd("archivo.txt"); | ||
+ | $contenido = `cat $archivo`; // En Linux/Unix | ||
+ | // $contenido = `type $archivo`; // En Windows | ||
+ | echo "<pre>$contenido</pre>"; | ||
+ | ?> | ||
+ | </source> |