4.1.2. Operadores

Los operadores constituyen elementos esenciales de cualquier lenguaje de programación. Con ellos podemos asignar, unir, cambiar o comparar valores de datos, cambiar el flujo del programa, etc.

Los operadores son símbolos que representan operaciones sobre un valor. Vamos a ver a continuación los operadores admitidos por PHP agrupados según su utilidad.

Operador de asignación

El símbolo = permite asignar valores a variables:

<?php 
  $calle = 'Veracruz';
  echo $calle.' '; 
  $mi_numero = 319;
  echo $mi_numero;
?>

El operador .= agrega valores al contenido de una variable, es equivalente a $var = $var + 'nuevo valor';

<?php
  $numeros = 'uno, dos, tres';
  $numeros.= ', cuatro, cinco, seis';
  echo $numeros;
?>

Operador de concatenación

Usando el símbolo . concatenamos cadenas

<?php 
  $nombre = 'Jorge';
  $apellido = 'Perez';
  //Concatena nombre y apellido m'as un espacio
  echo 'Nombre: '.$nombre.' '.$apellido; 
?>

Operadores aritméticos

Los operadores aritméticos de PHP son similares a los de C, Java y Javascript. Los símbolos +, -, /, *, realizan operaciones de aritmética básica, el símbolo % obtiene el resto de una división (módulo).

Por ejemplo: Sea $var1 = 10 y $var2 = 5;

Operador Ejemplo Resultado
Negación -$var1 -10
Suma $var1 + $var2 15
Resta $var1 - $var2 5
Multiplicación $var1 * $var2 50
División $var1 / $var2 2
Módulo $var1 % $var2 0

Ejemplo: Uso de los operadores aritméticos. Validado con formValidation y el uso del método post de jQuery AJAX.

<!DOCTYPE html>
<html lang='es'>
<head>
  <meta charset='utf-8'>
  <meta name='viewport' content='width=device-width, initial-scale=1'>
  <meta http-equiv='x-ua-compatible' content='ie=edge'>
  <title>Operadores Aritméticos</title>
  <link href='http://netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' rel='stylesheet'>
  <link href='dist/css/formValidation.min.css' rel='stylesheet'>
</head>
<body>
<div class='container'>
  <form action='04Operadores01.php' id='defaultForm' class='form-horizontal' name='defaultForm' method="post">
    <fieldset> 
      <legend class="text-center">Operadores aritméticos</legend>
      <div class='form-group'>
        <label class='control-label col-sm-2' for='a'>a</label>
        <div class='col-sm-3'>
          <input id='a' class='form-control' name='a'>
        </div>
      </div>

      <div class='form-group'>
        <label class='control-label col-sm-2' for='b'>b</label>
        <div class='col-sm-3'>
          <input id='b' class='form-control' name='b'>
        </div>
      </div>     
      
      <div class="form-group"> 
        <div class="col-sm-offset-2 col-sm-1">
          <button type="submit" class="btn btn-primary">Calcular</button>
        </div>  
      </div>
    </fieldset>
  </form>
  <div class='row'>     
     <div class="col-sm-offset-2 col-sm-6" id="message"></div>
  </div>
</div>
<!-- Coloca aquí tu jQuery -->
</body>
</html>
<script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
  <script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js'></script>
  <script src='dist/js/formValidation.min.js'></script>
  <script src='dist/js/framework/bootstrap.min.js'></script>
  <script>
$(document).ready(function() {
  $('#defaultForm') .formValidation({
    message: 'El valor es no valido',
    icon: {
      valid: 'glyphicon glyphicon-ok',
      invalid: 'glyphicon glyphicon-remove',
      validating: 'glyphicon glyphicon-refresh'
    },
    fields: {
      a: {
        message: 'El operador no es valido',
        validators: {
		  notEmpty: { message: 'El operando es requerido y no puede ser nulo'},
          stringLength: { min: 1,
            max: 3,
            message: 'El operando debe tener de 1 a 3 dígitos'
          },
          digits: { message: 'Solo números' }
        }
      },
      b: {
        validators: {
		  notEmpty: { message: 'El operando es requerido y no puede ser nulo'},
          stringLength: { min: 1,
            max: 3,
            message: 'El operando debe tener de 1 a 3 digitos'
          },
          digits: { message: 'Solo numeros' }            }
        }
      }
    })
    .on('success.form.fv', function(e) {
      // Prevent form submission
      e.preventDefault();

      // Get the form instance
      var $form = $(e.target);

      // Get the FormValidation instance
      var bv = $form.data('formValidation');
        
      $.post('04Operadores01.php', $("#defaultForm").serializeArray(),
	          function(data) { $('#message').html(data); }
      );
    });
  });
</script>
<?php 
  $a = $_POST['a']; 
  $b = $_POST['b']; 
  $tabla = '<table class="table table-bordered table-striped">';
  $tabla.= '<caption class="text-center">Operadores Aritméticos</caption>';
  $tabla.= '<thead>';
  $tabla.= '<tr><th>Ejemplo</th><th>Resultado</th></tr>';
  $tabla.= '</thead>';  
  $tabla.= '<tr><td>a + b</td><td class="pull-right">'.($a + $b).'</td></tr>';
  $tabla.= '<tr><td>a - b</td><td class="pull-right">'.($a - $b).'</td></tr>';
  $tabla.= '<tr><td>a * b</td><td class="pull-right">'.($a * $b).'</td></tr>';
  if( $a*$b !== 0 ) {  
    $tabla.= '<tr><td>a / b</td><td class="pull-right">'.($a / $b).'</td></tr>';
  }
  $tabla.= '<tr><td>a % b</td><td class="pull-right">'.($a % $b).'</td></tr>';
  $tabla.= '</tbody></table>';
  echo $tabla;
?>

Operadores abreviados o combinados

Una forma habitual de modificar el contenido de las variables es mediante los operadores combinados. La siguiente tabla resume los operadores de asignación combinados

Operador Ejemplo Descripción
+= $variable += 10 $variable = $variable + 10;
-= $variable -= 10 $variable = $variable - 10;
*= $variable *= 10 $variable = $variable * 10;
/= $variable /= 10 $variable = $variable / 10;
%= $variable %= 10 $variable = $variable % 10;
.= $variable.= "concatenar" Concatena las cadenas $variable y "concatenar"

Ejemplo: Tabla multiplicar usando +=


<!DOCTYPE html>
<html lang='es'>
<head>
  <meta charset='utf-8'>
  <meta name='viewport' content='width=device-width, initial-scale=1'>
  <meta http-equiv='x-ua-compatible' content='ie=edge'>
  <title>Operadores abreviados</title>
  <link href='http://netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container'>
  <form  class='form-horizontal'>
    <fieldset> 
      <legend class="text-center">Operadores abreviados</legend>

      <div class='form-group'>
        <label class='control-label col-sm-2' for='n'>Tabla</label>
        <select id='n' name='n'>
          <option>Selecciona</option>
          <option value='1'>1</option>
          <option value='2'>2</option>
          <option value='3'>3</option>
          <option value='4'>4</option>
          <option value='5'>5</option>
          <option value='6'>6</option>
          <option value='7'>7</option>
          <option value='8'>8</option>
          <option value='9'>9</option>
          <option value='10'>10</option>
        </select>
      </div>     
      
    </fieldset>
  </form>
  <div class='row'>     
     <div class='col-sm-offset-2 col-sm-6' id='message'></div>
  </div>
</div>
<!-- Copia aquí el script jQuery-->
</body>
</html>
  <script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
  <script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js'></script>
  <script src='dist/js/formValidation.min.js'></script>
  <script src='dist/js/framework/bootstrap.min.js'></script>
  <script>
  $(document).ready(function() {
     $('#n').change(function(event){
	   var n = $('#n').val();
	   var url = '04Operador02.php?n='+n;
	   $('#message').load(url);	
	 });
  });
</script>
<?php
  $tabla = $_REQUEST['n'];
  if($tabla >= 1 AND $tabla <=10){
    $html= '<table class="table table-bordered table-striped">';
    $html.= '<caption class="text-center">Tabla de multiplicar</caption>';
    for ($i = 1; $i <= 10; $i++) {
      $html.= '<tr><td class="pull-right">'.$i.'</td><td class="text-center">*</td><td class="pull-right">'.$tabla.'</td>';
      $resultado += $tabla;
      $html.= '<td class="text-center">=</td><td class="pull-right">'.$resultado.'</td></tr>';
    }
    $html.= '</table>';
    echo $html;
  }
?>

Operadores de incremento - decremento

PHP ofrece soporte de operadores de pre- y post- (incremento o decremento), estilo del lenguaje C y Java. Los símbolos ++ y -- aplicados a una variable, permiten incrementar o decrementar su valor. Su efecto es distinto según se empleen precediendo o siguiendo el nombre de la variable.

Operador Ejemplo Efecto
Pre-incremento ++$a Incrementa $a en uno y después devuelve a.
Post-incremento $a++ Devuelve $a y después incrementa $a en uno.
Pre-decremento --$a Decrece el valor de $a en uno y después devuelve $a.
Post-decremento $a-- Devuelve $a y después decrece su valor en uno.

Operadores de Comparación.

Los operadores de comparación, como su nombre indica, permiten comparar dos valores.

Operador Ejemplo Cierto si:
Igualdad $a == $b $a es igual a $b.
Identidad $a === $b $a es igual a $b y además son del mismo tipo
Desigualdad $a != $b $a no es igual a $b.
$a !== $b Los operandos no son iguales o del mismo tipo
Menor que $a < $b $a es estrictamente menor que $b.
Menor o igual que $a <= $b $a es menor o igual que $b.
Mayor que $a > $b $a es estrictamente mayor que $b.
Mayor o igual que $a >= $b $a es mayor o igual que $b.

Otro operador condicional es el operador '?:' (o ternario), que funciona como en C, Java y otros muchos lenguajes:

(expr1) ? (expr2) : (expr3);

La expresión toma el valor expr2 si expr1 se evalúa a cierto, y expr3 si expr1 se evalúa a falso.

Operadores Lógicos

Los operadores lógicos o booleanos se utilizan conjuntamente con expresiones que devuelven valores lógicos. Con ellos es posible combinar condiciones y evaluarlas en una sola expresión. La sintaxis de estos operadores es la siguiente:

Operador Ejemplo Cierto si:
&& $a && $b Ambos son ciertos
and $a and $b
|| $a || $b Si uno o ambos es cierto
or $a or $b
xor $a xor $b Solo si uno de los dos es cierto.
! !$a Si $a es Falsa

Ejemplo: Clasificación de huracanes según la escala Saffir-Simpson

<!DOCTYPE html>
<html lang='es'>
<head>
  <meta charset='utf-8'>
  <meta name='viewport' content='width=device-width, initial-scale=1'>
  <meta http-equiv='x-ua-compatible' content='ie=edge'>
  <title>Operadores Aritméticos</title>
  <link href='http://netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' rel='stylesheet'>
  <link href='dist/css/formValidation.min.css' rel='stylesheet'>
</head>
<body>
<div class='container'>
  <form id='defaultForm' class='form-horizontal' name='defaultForm' method="post">
    <fieldset> 
      <legend class='text-center'>Determinación de la categoría de un huracán por su velocidad</legend>
      <div class='form-group'>
        <label class='control-label col-sm-2' for='velocidad'>Velocidad</label>
        <div class='col-sm-3'>
          <input id='velocidad' class='form-control' name='velocidad'>
        </div>
      </div>
     
      <div class="form-group"> 
        <div class="col-sm-offset-2 col-sm-1">
          <button type="submit" class="btn btn-primary">Definir</button>
        </div>  
      </div>
    </fieldset>
  </form>
  <div class='row'>     
     <div class="col-sm-offset-2 col-sm-6" id="message"></div>
  </div>
</div>
</body>
</html>
  <script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
  <script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js'></script>
  <script src='dist/js/formValidation.min.js'></script>
  <script src='dist/js/framework/bootstrap.min.js'></script>
  <script>
$(document).ready(function() {
  $('#defaultForm') .formValidation({
    message: 'El valor es no valido',
    icon: {
      valid: 'glyphicon glyphicon-ok',
      invalid: 'glyphicon glyphicon-remove',
      validating: 'glyphicon glyphicon-refresh'
    },
    fields: {
      velocidad: {
        validators: {
          greaterThan: {
            value: 119,
            message: 'El valor dene ser mayor o igual que 119'
          }
        }
      }
    }
  })
  .on('success.form.fv', function(e) {
      // Prevent form submission
      e.preventDefault();

      // Get the form instance
      var $form = $(e.target);

      // Get the FormValidation instance
      var bv = $form.data('formValidation');
        
      $.post('04Operadores03.php', $("#defaultForm").serializeArray(),
	          function(data) { $('#message').html(data); }
      );
    });
  });
  </script>
<?php
  function damages($i) {
	$damage = array();
	$damage[1] = 'No daño efectivo a edificios <br> Daños a remolques y arboles<br>';
	$damage[1].= 'Inundaciones en zonas costeras <br> Daños en muelles';
    $damage[2] = 'Daño en tejados, puertas y ventanas <br> Daños a vegetacion,remolques y muelles<br>';
    $damage[2].= 'Inundaciones de carreteras costeras a 2 o 4 hrs del huracán<br>Pequeñas embarcaciones';
    $damage[2].= ' rompen amarras'; 
    $damage[3] = 'Daños estructurales a pequeñas residencias <br> Destrucción de casas rodantes <br>';
    $damage[3].= 'Los terrenos llanos por debajo de 1.5 m pueden resultar inundados hasta 13 ';
    $damage[3].= 'km de la costa o más<br>';
    $damage[4] = 'Fisuras en muros de revestimiento, derrumbe de techos<br>Erosión importante de la playa<br>';
    $damage[4].= 'Daños graves en pisos de estructuras cercanas a la costa<br>Inundaciones de ';
	$damage[4].= 'terrenos por debajo de los 3 mts hasta 10 kms de la costa<br>';
    $damage[5] = 'Derrumbe total de techos en residencias y edificios industriales <br> Edificios caidos y ';
	$damege[5].= 'con derrumbes parciales<br>';
	$damage[5] .= 'Daños graves en pisos de todas las estructuras a menos de 4.6m sobre el nivel del mar a ';
	$damage[5] .= '460 mts de la costa<br>';
	return $damage[$i];
  }
  
  function mensaje() {
     $titulo = '<h2>Escala Saffir Simpson</h2>';
     $titulo.= '<p>La escala Saffir-Simpson se ha convertido en ';
     $titulo.= 'una forma popular de categorizar los huracanes y es muy ú';
     $titulo.= 'til para estimar la cantidad de daños que pueden ocurrir ';
     $titulo.= 'a causa de un huracán. Fue nombrada así por los ';
     $titulo.= 'científicos que la desarrollaron</p>';
     $titulo.= '<p>Categoría 1: de 119 a 153 km/h.</p>';
     $titulo.= '<p>Categoría 2: de 154 a 177 km/h.</p>';
     $titulo.= '<p>Categoría 3: de 178 a 209 km/h.</p>';
     $titulo.= '<p>Categoría 4: de 210 a 249 km/h.</p>';
     $titulo.= '<p>Categoría 5: 250 km/h o más</p>';
     $titulo.= '<table  class="table-bordered table-striped">';
     $titulo.= '<thead><tr>';
     $titulo.= '<th>Velocidad</th>';
     $titulo.= '<th>Categoría</th>';
     $titulo.= '<th class="text-center">Daños</th>';
     $titulo.= '<th class="text-center">Imagen</th></tr>';
     $titulo.= '</thead>';
     $titulo.= '<tbody>';
     return $titulo;  
  }
  
  $velocidad = $_POST['velocidad'];
	if(($velocidad >= 119) && ($velocidad <= 153)){
	    $categoria = 1;
	} elseif(($velocidad >= 154) && ($velocidad <= 177)){
	    $categoria = 2;
	} elseif(($velocidad >= 178) && ($velocidad <= 209)){
		$categoria = 3;
	}elseif(($velocidad >= 210) && ($velocidad <= 249)){
		$categoria = 4;
	}elseif( $velocidad >= 250){
		$categoria = 5;
	}
    $imagen = "<img  class='text-center' src='huracan/damage".$categoria.".jpg'>";
	$fila = mensaje(); 
	$fila.= '<tr><td class="text-center">'.$velocidad.'</td>';
	$fila.= '<td class="text-center">'.$categoria.'</td>'; 
	$fila.= '<td>'.damages($categoria).'</td>';
	$fila.= '<td>'.$imagen.'</td></tr>';
	$fila.= '</tbody></table>';
	echo $fila;
?>

Operador de ejecución

PHP soporta un operador de ejecución: el apóstrofe invertido (``). PHP intentará ejecutar la instrucción contenida dentro de los apóstrofes invertidos como si fuera un comando del shell; y su salida devuelta como el valor de esta expresión (i.e., no tiene por qué ser simplemente volcada como salida; puede asignarse a una variable).

Ejemplo: Operador de ejecución

Es equivalente a la función shell_exec y por defecto está inhabilitado su uso si php esta configurado para ejecutarse en safe_mode.

<?php
  $entorno = 'set';
  echo "$entorno";
  $entorno = `ls -l`;
  echo "$entorno";
?>

Precedencia de operadores

Cuando una expresión está formada por más de un operador del mismo tipo, PHP la evalúa de izquierda a derecha, pero cuando creamos expresiones que utilizan más de un operador diferente, no siempre evalúa estas expresiones de la misma forma.

La precedencia de operadores específica cómo se agrupan las expresiones para ser evaluadas. La precedencia relativa de los operadores se puede modificar mediante paréntesis en las expresiones que se desea evaluar a criterio del programador.

A continuación se presenta en la tabla la precedencia de los operadores de menor a mayor.

Asociatividad Operadores
izquierda ,
izquierda or
izquierda xor
izquierda and
derecha print
izquierda = += -= *= /= .= %= &= |= ^= ~= <<= >>=
izquierda ? :
izquierda ||
izquierda &&
izquierda |
izquierda ^
izquierda &
no asociativo == != ===
no asociativo < <= > >=
izquierda << >>
izquierda + - .
izquierda * / %
derecha ! ~ ++ -- (int) (double) (string) (array) (object) @
derecha [
no asociativo new