Diferencia entre revisiones de «Plantilla:ManuelRomero/PHP/OperadoresExpresiones»

De WikiEducator
Saltar a: navegación, buscar
(Tabla de Operadores Lógicos)
 
(11 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 482: Línea 483:
 
====Notas Importantes====
 
====Notas Importantes====
  
1. **Cortocircuito:**
+
1. ''Cortocircuito:''
  * Si la primera condición de un operador como `&&` o `||` determina el resultado, las demás no se evalúan.   
+
    Si la primera condición de un operador como `&&` o `||` determina el resultado, las demás no se evalúan.   
 
     Ejemplo:
 
     Ejemplo:
 
     <source lang=php>
 
     <source lang=php>
Línea 490: Línea 491:
 
     </source>
 
     </source>
  
2. **Diferencia entre `and` y `&&`, `or` y `||`:**
+
2. ''Diferencia entre `and` y `&&`, `or` y `||`:''
  * `&&` y `||` tienen '''mayor precedencia''' que `and` y `or`.
+
    `&&` y `||` tienen '''mayor precedencia''' que `and` y `or`.
  * Esto afecta cómo se agrupan las expresiones:
+
    Esto afecta cómo se agrupan las expresiones:
 
     <source lang=php>
 
     <source lang=php>
 
     $a = false || true; // Actúa como: $a = (false || true)
 
     $a = false || true; // Actúa como: $a = (false || true)
Línea 500: Línea 501:
 
     </source>
 
     </source>
  
3. **`xor`:**
+
3. ''`xor`:''
  * Es exclusivo: Devuelve `true` si sólo uno de los operandos es `true`. Si ambos son `true` o ambos son `false`, devuelve `false`.
+
    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====
 
====Ejemplos de Diferencia de Preferencia====
  
1. **Ejemplo con `and` vs `&&`:**
+
1. '''Ejemplo con `and` vs `&&`:'''
 
   <source lang=php>
 
   <source lang=php>
 
   $x = true && false; // Actúa como: $x = (true && false)
 
   $x = true && false; // Actúa como: $x = (true && false)
Línea 513: Línea 515:
 
   </source>
 
   </source>
  
2. **Ejemplo con `or` vs `||`:**
+
2. '''Ejemplo con `or` vs `||`:'''
 
   <source lang=php>
 
   <source lang=php>
 
   $x = false || true; // Actúa como: $x = (false || true)
 
   $x = false || true; // Actúa como: $x = (false || true)
Línea 521: Línea 523:
 
   </source>
 
   </source>
  
====Actividad Práctica====
+
===Operadores de Control de Errores===
  
1. Escribe un programa en PHP que utilice los operadores `&&`, `||`, `and`, y `or`.
+
*El operador '''@''' permite suprimir mensajes de error (si no es fatal, o sea de warning) que puedan generarse al evaluar una expresión.  
2. Evalúa los resultados cambiando la agrupación de las condiciones para observar la diferencia de precedencia.
+
*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====
  
'''Plantilla de Ejemplo:'''
 
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
// Operadores con precedencia diferente
+
// Intentar abrir un archivo que no existe
$a = (true && false); // true && false -> false
+
  $rtdo = @ (5+"25pepe")
$b = (true and false); // (true) and false -> true and false -> false
+
  echo $rtdo
 +
?>
 +
</source>
  
// Operadores con cortocircuito
+
En este ejemplo:
$c = (false || foo()); // foo() nunca se ejecuta
+
* Se produce un warning, ya que uno de los operadores no es un entero (pero puedo convertirlo parcialmente).
$d = (true or foo()); // foo() tampoco se ejecuta
+
<source lang=php>
 +
<?php
 +
// Intentar abrir un archivo que no existe
 +
  $rtdo = @(5+"pepe")
 +
  echo $rtdo
 +
?>
 +
</source>
  
function foo() {
+
En este ejemplo:
     echo "foo ejecutado<br>";
+
* 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>
 +
<?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í.";
 
}
 
}
  
// Mostrar resultados
+
 
var_dump($a, $b, $c, $d);
+
 
?>
 
?>
 
</source>
 
</source>
 +
 +
{{Notas|
 +
*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===
 
===Operadores Bit a Bit===
Línea 647: Línea 708:
 
</source>
 
</source>
  
===Resumen===
+
=== Operadores de Ejecución (``)===
* Los operadores básicos asignan valores directamente.
+
* Los operadores combinados simplifican las expresiones cuando la misma variable participa en la operación.
+
* La asignación por referencia permite que múltiples variables compartan un mismo valor sin duplicarlo.
+
  
===Actividad Práctica===
+
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).
  
'''Objetivo:''' Practicar con operadores de asignación básicos, combinados y por referencia.
+
====Funcionamiento====
  
1. Escribe un programa que utilice al menos dos operadores básicos y dos combinados.
+
* Los comandos dentro de las comillas invertidas '''``''' se ejecutan en el sistema operativo, y el resultado se devuelve como una cadena de texto.
2. Implementa un ejemplo de asignación por referencia.
+
* Es útil para interactuar con el sistema desde un script PHP, pero debe usarse con precaución, especialmente en entornos de producción.
3. Evalúa el resultado e incluye una breve explicación.
+
  
'''Plantilla de Ejemplo:'''
+
====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
// 1. Operadores básicos
+
$Discos = `df`; // Ejecuta el comando `df`
$x = 10;
+
echo "<pre>$Discos</pre>"; // Muestra el resultado en un formato legible
$y = "Hola";
+
 
+
// 2. Operadores combinados
+
$x += 5; // $x es ahora 15
+
$y .= ", ¿Qué tal?"; // $y es ahora "Hola, ¿Qué tal?"
+
 
+
// 3. Asignación por referencia
+
$z = &$x; // $z apunta a la misma referencia que $x
+
$z = 20; // Cambiar $z también afecta a $x
+
 
+
// Muestra los resultados
+
echo "Valor de x: $x\n"; // Debería mostrar 20
+
echo "Valor de y: $y\n"; // Debería mostrar "Hola, ¿Qué tal?"
+
echo "Valor de z: $z\n"; // Debería mostrar 20
+
 
?>
 
?>
 
</source>
 
</source>
  
 
+
El código anterior generará una salida similar a esta (en sistemas Linux):
 
+
 
+
 
+
 
+
 
+
====Operadores con asignación en una misma variable====
+
*Cuando la variable donde asignamos el resultado de la expresión forma parte de la expresión, la podemos simplificar
+
*Veamos el siguiente ejemplo
+
 
<source lang=php>
 
<source lang=php>
$a=$a*5;
+
Filesystem    1K-blocks    Used Available Use% Mounted on
</source>
+
/dev/sda5      86378608  6072360  75895384  8% /
*Es igual que hacer
+
none                  4        0        4  0% /sys/fs/cgroup
<source lang=php>
+
udev            4023720        4  4023716  1% /dev
$a*=5;
+
tmpfs            806904    1384    805520  1% /run
 +
none                5120        0      5120  0% /run/lock
 +
none            4034504    6588  4027916  1% /run/shm
 +
none              102400      28    102372  1% /run/user
 +
/dev/sda7      101797224 40480360  56122728  42% /home
 
</source>
 
</source>
*Esto lo podemos hacer  con cualquiera de los operadores aritméticos
 
  
 +
====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:
<div class="slide">
+
 
+
====Operadores comparación (==,<,>,>=,<=,<>,!=,===,!==)====
+
:Este tipo de operadores genera un booleano como resultado de evaluar la expresión
+
{{MRM_Puntos clave|
+
*'''''<nowiki>==</nowiki>''''' operador de comparación '''''igual que''''' (mismo valor)
+
*'''''<nowiki>===</nowiki>''''' operador de comparación '''''exactamente igual que''''' (mismo valor y tipo)
+
}}
+
</div>
+
 
+
<div class="slide">
+
=====Operador == Vs === =====
+
 
<source lang=php>
 
<source lang=php>
$num=1;
+
<?php
if ($num==true)
+
$Discos = shell_exec('df'); // También ejecuta el comando `df`
    echo '$num es igual a true<br>';
+
echo "<pre>$Discos</pre>";
if ($num===true){
+
?>
    echo "esto nunca se ejecutará";
+
}else
+
    echo '$num no es exactamente igual a true';
+
 
</source>
 
</source>
</div>
 
  
<div class="slide">
+
====Notas Importantes====
;Operador == vs ===
+
  
*El código anterior generaría  la siguiente salida
+
1. '''Restricciones del sistema:'''
<source lang=php>
+
  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á.
$num es igual a true
+
  Este operador sólo es funcional en entornos donde PHP tiene permisos para ejecutar comandos del sistema.
$num no es exactamente igual a true
+
</source>
+
*Ver la sección '''''comparación de tipos''''' de la página oficial
+
http://php.net/manual/es/language.operators.comparison.php
+
</div>
+
  
<div class="slide">
+
2. '''Compatibilidad con el sistema operativo:'''
====operadores de concatenacón( .) concatena cadena de caracteres.====
+
  En sistemas Linux/Unix, puedes usar comandos como `ls`, `df`, `cat`, etc.
:El operador + no está sobre cargado, observa el siguiente código
+
  En sistemas Windows, usa comandos como `dir`, `type`, etc.
<source lang=php>
+
$nombre="Maria";
+
$apellido = " de la Oh";
+
  
$nombreCompleto = $nombre.$apellido;
+
3. '''Precauciones de seguridad:'''
echo "el valor de nombre completo es $nombreCompleto ---<br>";
+
  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.
  
$nombreCompleto = $nombre+$apellido;
+
====Actividad Práctica====
echo "el valor de nombre completo es $nombreCompleto --<br>";
+
</source>
+
</div>
+
  
<div class="slide">
+
1. Escribe un programa que use el operador `` para listar los archivos del directorio actual (Linux: `ls`, Windows: `dir`).
;La salida del código anterior sería
+
2. Modifica el programa para mostrar el contenido de un archivo específico.
<source lang=php>
+
3. Usa [escapeshellcmd()](http://php.net/manual/es/function.escapeshellcmd.php) para proteger las entradas del usuario.
el valor de nombre completo es Maria de la Oh ---
+
el valor de nombre completo es 0 --
+
</source>
+
</div>
+
  
<div class="slide">
+
'''Plantilla de Ejemplo:'''
====Operadores de asignación (= , =>)====
+
:Se pueden combinar con los aritméticos (+=, *=, ...)  y con los de concatenación (.=)
+
:En este caso el valor de la variable de la izquierda se toma como primero operando
+
;Operador de asignación
+
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
$b=1;
+
// Listar archivos en el directorio actual
for ($a=0;$a<10;$a++){
+
$listado = `ls -al`; // En Linux/Unix
    $b*=10;
+
// $listado = `dir`; // En Windows
    echo 'valor de $b ='.$b.'<br>';
+
echo "<pre>$listado</pre>";
}
+
?>
+
</source>
+
</div>
+
  
<div class="slide">
+
// Mostrar contenido de un archivo (protegido)
*El código anterior genera la siguiente salida
+
$archivo = escapeshellcmd("archivo.txt");
<source lang=php>
+
$contenido = `cat $archivo`; // En Linux/Unix
valor de $b =10
+
// $contenido = `type $archivo`; // En Windows
valor de $b =100
+
echo "<pre>$contenido</pre>";
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>
+
</div>
+
 
+
<div class="slide">
+
==== Operadores de ejecución (``)====
+
:PHP proporciona un operador especial que permite ejecutar sentencias
+
*Observa el siguiente código
+
<source lang=php>
+
<?php
+
$Discos = `df`;
+
echo "<pre>$Discos</pre>";
+
 
?>
 
?>
 
</source>
 
</source>
</div>
 
 
<div class="slide">
 
*El código anterior generará la siguiente salida
 
<source lang=php>
 
Filesystem    1K-blocks    Used Available Use% Mounted on
 
/dev/sda5      86378608  6072360  75895384  8% /
 
none                  4        0        4  0% /sys/fs/cgroup
 
udev            4023720        4  4023716  1% /dev
 
tmpfs            806904    1384    805520  1% /run
 
none                5120        0      5120  0% /run/lock
 
none            4034504    6588  4027916  1% /run/shm
 
none              102400      28    102372  1% /run/user
 
/dev/sda7      101797224 40480360  56122728  42% /home
 
</source>
 
</div>
 
 
<div class="slide">
 
;Invocando funciones del sistema
 
*El operador anterior (comillas invertidas) es igual que la función '''''shell_exec()'''''
 
http://php.net/manual/es/function.shell-exec.php
 
</div>
 
 
<div class="slide">
 
==== Operadores lógicos (and,&&, or, ||, xor !)====
 
http://php.net/manual/es/language.operators.logical.php
 
:Funcionan por cortocircuito
 
:El operador  '''''xor''''' da verdad si los operando son de diferente valor uno true y el otro false
 
:La notación '''''and''''' y '''''&&''''' representan el mismo operador, igual ocurre con '''''or''''' y '''''||'''''
 
*La diferencia entre los operadores es la prioridad
 
http://php.net/manual/es/language.operators.precedence.php
 
</div>
 

Última revisión de 18:28 29 nov 2024

Operadores y expresiones




Icon define.gif
¿Qué es una expresión?

Una expresión es una parte esencial de las frases en un lenguaje de programación.



Icon define.gif
Definición técnica de expresión
Es un conjunto de operadores y operandos
que, al evaluarse, producen un valor.
Este valor puede ser usado dentro de otras instrucciones o asignado a variables.



Icon key points.gif

Notas importantes sobre expresiones en PHP


  • Una expresión tiene un tipo asociado. Este tipo depende del resultado de su evaluación.
  • En PHP, el operador determina el tipo de la expresión en muchos casos.
  • Los operandos intentan adaptarse al tipo esperado por el operador mediante conversiones automáticas (casting implícito).
  • Una expresión no es una instrucción completa, sino parte de ella. Por ejemplo:
//Instruccion:
 $resultado = 5+3;
 // Expresión =>  5+3
 // Operador =>  +
 // Operandos =>  el 5 y el 3
 // Resultado => 8
 //Tipo de expresión => Aritmética, lo marca el operador


(Comment.gif: Las expresiones son piezas fundamentales en cualquier lenguaje de programación. Es importante identificar sus partes (operadores y operandos) para entender cómo funciona el código. )


Operadores

Los operadores son símbolos que realizan acciones sobre operandos y generan un resultado. Existen diferentes tipos de operadores en función del tipo de operandos y el resultado esperado.


OPERADORES HABITUALES EN PHP
Tipo de Operador Operador Tipo de Expresión
Operadores aritméticos + - * / % ** Numérica
Operadores lógicos AND OR && || ! Lógica
Operadores de comparación == != < > <= >= <=> ?? Lógica
Operadores de auto incremento/decremento ++$a $a++ --$a $a-- Numérica o String
Operadores de string (concatenación) . .= String
OTROS OPERADORES MENOS HABITUALES
Tipo de Operador Operador Tipo de Expresión
Operadores de asignación simple = Valor asignado
Operadores de asignación compuesta += -= *= /= %= **= .= Numérica
Operadores de asignación por referencia & Valor referenciado
Operadores bit a bit & | ^ ~ << >> Numérica
Operador de control de errores @ Silencia errores
Operador de ejecución `comando` Resultado del comando ejecutado



Icon key points.gif

Notas importantes

Notas importantes
  • Algunos operadores, como los de control de errores (@), deben usarse con cuidado, ya que pueden ocultar errores importantes en el código.
  • Los operadores de asignación compuesta permiten realizar operaciones y asignar el resultado en un solo paso.
  • El operador de ejecución (` `) se utiliza para ejecutar comandos del sistema y devolver su salida.



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

Precedencia y Asociatividad de Operadores en PHP
Asociatividad Operadores
No asociativo `clone`, `new`
Izquierda `[`
Derecha `**`
Derecha `++`, `--`, `~`, `(int)`, `(float)`, `(string)`, `(array)`, `(object)`, `(bool)`, `@`
No asociativo `instanceof`
Derecha `!`
Izquierda `*`, `/`, `%`
Izquierda `+`, `-`, `.`
Izquierda `<<`, `>>`
No asociativo `<`, `<=`, `>`, `>=`
No asociativo `==`, `!=`, `===`, `!==`, `<>`
Izquierda `&`
Izquierda `^`
Izquierda `
Izquierda `&&`
Izquierda ` `
Izquierda `?:`
Derecha `=`, `+=`, `-=`, `*=`, `**=`, `/=`, `.=`, `%=`, `&=`, `/=`, `^=`, `<<=`, `>>=`, `=>`
Izquierda `and`
Izquierda `xor`
Izquierda `or`
Izquierda `,`

Operadores Aritméticos

Los operadores aritméticos en PHP son similares a los de las matemáticas y realizan operaciones básicas.

Operadores Aritméticos
Operación Representación Descripción
Suma
$x + $y
Devuelve la suma de $x y $y.
Resta
$x - $y
Devuelve la diferencia entre $x y $y.
Multiplicación
$x * $y
Devuelve el producto de $x y $y.
División
$x / $y
Devuelve el cociente de $x dividido por $y. Si ambos son divisibles, devuelve un entero; de lo contrario, un flotante.
Módulo
$x % $y
Devuelve el resto de dividir $x entre $y. Si $x o $y son flotantes, se transforman en enteros antes de la operación.
Exponenciación
$x ** $y
Eleva $x a la potencia de $y.
Negación
-$x
Cambia el signo de $x.

Notas importantes:

  • En módulo, el signo del resultado dependerá del dividendo.
Ejemplo:
-5 % 3
devolverá
-2
.
  • El exponente eleva un número a otro. Ejemplo:
    2 ** 3
    devolverá
    8
    .

Ejemplos Prácticos

1. Preferencia de Operadores:

$num = 5 + 6 * 8 - 4 / 2;
// Mejor usar paréntesis para mayor claridad:
$num = 5 + (6 * 8) - (4 / 2);

Ejecución paso a paso:

$num = 5 + 48 - 2;
$num = 53 - 2;
$num = 51;

2. Uso del módulo:


Icon activity.jpg
Actividad
Buscar los números divisibles por 3 entre 1 y 100.




3. Exponenciación:


Icon activity.jpg
Actividad
Calcular las potencias de 2 del 1 al 15




---

Operadores de Incremento y Decremento

Los operadores de incremento y decremento permiten aumentar o reducir en 1 el valor de una variable.

Incremento y Decremento
Tipo Representación Descripción
Pre-incremento
++$a
Incrementa el valor de $a antes de usarlo.
Post-incremento
$a++
Usa el valor de $a y luego lo incrementa.
Pre-decremento
--$a
Decrementa el valor de $a antes de usarlo.
Post-decremento
$a--
Usa el valor de $a y luego lo decrementa.

Ejemplo de Diferencias entre Pre y Post:

// Pre-incremento
$a = 5;
echo "Pre-incremento: " . ++$a; // Muestra 6
 
// Post-incremento
$a = 5;
echo "Post-incremento: " . $a++; // Muestra 5
echo "Nuevo valor: " . $a; // Muestra 6


(Comment.gif: 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

Tabla de Operadores de Asignación en PHP
Categoría Operador Ejemplo Descripción
Asignación básica =
$x = 10;
Asigna el valor de la derecha a la variable de la izquierda.
Asignación básica (arrays) =>
$array = ["clave" => "valor"];
Asigna un valor a una clave en un array asociativo.
Asignación por referencia &
$y = &$x;
Asigna una referencia a otra variable, ambas apuntan al mismo valor.
Asignación compuesta +=
$x += 5;
Suma 5 al valor de $x y asigna el resultado a $x.
Asignación compuesta -=
$x -= 3;
Resta 3 al valor de $x y asigna el resultado a $x.
Asignación compuesta *=
$x *= 2;
Multiplica $x por 2 y asigna el resultado a $x.
Asignación compuesta /=
$x /= 4;
Divide $x entre 4 y asigna el resultado a $x.
Asignación compuesta  %=
$x %= 3;
Asigna a $x el resto de la división de $x entre 3.
Asignación compuesta (concatenación) .=
$y .= " mundo";
Concatena " mundo" al valor de $y y asigna el resultado a $y.
Asignación compuesta (exponenciación) **=
$x **= 3;
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:

//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

En el caso de los **arrays**, el operador "=>" se utiliza para asignar valores a claves nombradas:

$array = ["clave1" => "valor1", "clave2" => "valor2"];
echo $array["clave1"]; // Mostrará: valor1

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:

$x = 3;
$x += 5; // Suma 5 a $x, 
$x=$x+3; //Esto es la misma acción que la instrucción anterior
echo $x; // Mostrará: 8

Esto es equivalente a:

$x = $x + 5;

Otros operadores combinados:

$y = "Hola";
$y .= ", ¿Qué tal?"; // Concatenación
echo $y; // Mostrará: Hola, ¿Qué tal?

Ejemplo con Operadores de Asignación Combinados

$b = 1;
for ($a = 0; $a < 10; $a++) {
    $b *= 10; // Multiplica $b por 10 en cada iteración
    echo "Valor de \$b = " . $b . "<br>";
}

Salida del código anterior:

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

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:

$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


(Comment.gif: 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

Operadores de Comparación
Ejemplo Nombre Resultado
$x == $y
Igual Devuelve `true` si $x y $y tienen el mismo valor, independientemente del tipo.
$x === $y
Idéntico Devuelve `true` sólo si $x y $y tienen el mismo valor y el mismo tipo.
$x != $y
Distinto Devuelve `true` si $x y $y son diferentes, independientemente del tipo.
$x <> $y
Distinto Igual que `!=`.
$x !== $y
No idéntico Devuelve `true` si $x y $y no son iguales o no son del mismo tipo.
$x < $y
Menor que Devuelve `true` si $x es menor que $y.
$x > $y
Mayor que Devuelve `true` si $x es mayor que $y.
$x <= $y
Menor o igual que Devuelve `true` si $x es menor o igual que $y.
$x >= $y
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:

$num = 1;
 
if ($num == true) {
    echo '$num es igual a true<br>';
}
 
if ($num === true) {
    echo "Esto nunca se ejecutará";
} else {
    echo '$num no es exactamente igual a true';
}

Salida esperada:

$num es igual a true
$num no es exactamente igual a true

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.

Comparación Entre Tipos
$x $y Resultado
_null_ o _string_ _string_ _null_ se convierte en `""`, luego se compara numéricamente o léxicamente.
_bool_ o _null_ cualquiera Ambos valores se convierten a booleanos. `false` < `true`.
_object_ _object_ Dos objetos son iguales si tienen los mismos atributos y valores. Son idénticos si además apuntan a la misma instancia.
_string_, _resource_ o _number_ _string_, _resource_ o _number_ Se convierten a números y se comparan matemáticamente.
_array_ _array_ Se comparan elemento por elemento. Si los arrays tienen distinto número de elementos o claves no coincidentes, son incomparables.
_object_ cualquiera Los objetos son siempre mayores que otros tipos.
_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

Operadores Lógicos en PHP
Operador Descripción Ejemplo Resultado
$x and $y
Devuelve `true` si ambos $x y $y son `true`.
(true and false)
`false`
$x or $y
Devuelve `true` si al menos uno de $x o $y es `true`.
(true or false)
`true`
$x xor $y
Devuelve `true` si sólo uno de $x o $y es `true`.
(true xor false)
`true`
!$x
Devuelve `true` si $x es `false`.
(!true)
`false`
$x && $y
Igual que `and`, pero con mayor precedencia.
(true && false)
`false`
$x || $y
Igual que `or`, pero con mayor precedencia.
(true || false)
`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:
     $result = (false && foo()); // foo() nunca se ejecutará
     $result = (true || foo()); // foo() nunca se ejecutará

2. Diferencia entre `and` y `&&`, `or` y `||`:

    `&&` y `||` tienen mayor precedencia que `and` y `or`.
    Esto afecta cómo se agrupan las expresiones:
     $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

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 `&&`:

   $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

2. Ejemplo con `or` vs `||`:

   $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

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

Ejemplo Básico

<?php
// Intentar abrir un archivo que no existe
   $rtdo = @ (5+"25pepe")
   echo $rtdo
?>

En este ejemplo:

  • Se produce un warning, ya que uno de los operadores no es un entero (pero puedo convertirlo parcialmente).
<?php
// Intentar abrir un archivo que no existe
   $rtdo = @(5+"pepe")
   echo $rtdo
?>

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:**

   <?php
   $array = ["clave1" => "valor1"];
   $valor = @$array["clave_no_existe"];
   echo "El valor es: $valor"; // No genera error aunque la clave no exista
   ?>

2. Supresión de errores en funciones y expresiones:

   <?php
   @$resultado = 10 / "5hola"; // Suprime el warning de tipo 
   ?>

3. Abrir ficheros que no existen:

<?php
   // Intentar abrir un archivo que no existe
    $miArchivo = @file('archivo_que_no_existe')
 
?>


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:

<?php
// Esto no funcionará:
@function miFuncion() {
    echo "No se puede usar @ aquí.";
}
 
 
?>

Plantilla:Notas

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

Operadores Bit a Bit
Ejemplo Nombre Descripción
$x & $y
And Realiza una operación AND entre cada bit de $x y $y.
$x | $y
Or Realiza una operación OR entre cada bit de $x y $y.
$x ^ $y
Xor Realiza una operación XOR entre cada bit de $x y $y.
~$x
Not Invierte todos los bits de $x.
$x << $y
Shift left Desplaza los bits de $x hacia la izquierda $y posiciones.
$x >> $y
Shift right Desplaza los bits de $x hacia la derecha $y posiciones.

Ejemplos Prácticos

1. Operador AND (&):

   $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

2. Operador OR (|):

   $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

3. Operador XOR (^):

   $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

4. Operador NOT (~):

   $x = 6; // 6 en binario: 110
   $resultado = ~$x; // Resultado: -7 (depende de la representación complementaria a dos)
   echo "~$x = $resultado"; // Mostrará: ~6 = -7

5. Shift Left o desplazamiento a la izquierda (<<):

   $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

6. Shift Right o desplazamiento a la derecha (>>):

   $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

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:

<?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
?>

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):

<?php
$Discos = `df`; // Ejecuta el comando `df`
echo "<pre>$Discos</pre>"; // Muestra el resultado en un formato legible
?>

El código anterior generará una salida similar a esta (en sistemas Linux):

Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda5       86378608  6072360  75895384   8% /
none                   4        0         4   0% /sys/fs/cgroup
udev             4023720        4   4023716   1% /dev
tmpfs             806904     1384    805520   1% /run
none                5120        0      5120   0% /run/lock
none             4034504     6588   4027916   1% /run/shm
none              102400       28    102372   1% /run/user
/dev/sda7      101797224 40480360  56122728  42% /home

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:

<?php
$Discos = shell_exec('df'); // También ejecuta el comando `df`
echo "<pre>$Discos</pre>";
?>

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:

<?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>";
?>