Talented minds - Mentes talentosas
Marzo 9, 2015 - Yésica Ramirez

Ahora que Drupal 8 y Drupal 7 pueden funcionar sobre la misma versión de PHP, en este case 5.5, es hora de darle un repaso a las novedades que nos trae esta versión, para aprovecharlas y afinar nuestros conocimientos.

finally

Desde PHP 5.5 se puede utilizar un bloque finally después de los bloques catch. El código dentro del bloque finally siempre se ejecutará después de los bloques try y catch, independientemente de que se haya lanzado una excepción o no, y antes de que el flujo normal de ejecución continúe.

Los bloques try-catch ahora definen un nuevo bloque de código bajo la palabra clave finally. El código encerrado dentro de finally se ejecuta siempre, independientemente de las excepciones que se produzcan.

Concluimos que finally es muy útil ya que en ocasiones, se requiere código que se ejecute cuando ocurra un error esperado o no (Algo por fuera del tipo de error Exception) o si ocurre un break o return. Si por ejemplo dentro del try hay un "return" que elimine el comportamiento o un continue/break que se salte el try, el finally siempre se ejecutará.

Ejemplo:

   <?php
   function myGetFileContent($path)
   {
   try {

    // Intentamos obtener el contenido del archivo.
    // En caso que no exista el archivo se ejecutará el bloque catch.
    $content = getFileContent($path);
    return $content 

    } catch (Exception $e) {

     // Como no existe el archivo, creamos el archivo.
     createFile($path, "Nuevo texto");

     // Obtenemos el contenido del archivo.
     $content = getFileContent($path);
     return $content;

   }
   finally{
     closeFile($path);
   }
  }
 ?>

Tenga en cuenta que aunque el bloque try devuelve un valor, el bloque finally se seguirá llamando antes que se ejecute la return.

La función emty()

La función empty() soporta como argumento cualquier tipo de expresión ya que incluye funciones y no sólo variables.

<?php
if (empty(function () { return false; })) {
  echo "El valor pasado es vacío.";
}
?>

empty() determina si una variable es considerada vacía. Una variable se considera vacía si no existe o si su valor es igual a FALSE, además no genera una advertencia si la variable no existe.

Las siguientes expresiones son consideradas como vacías:

  • "" (una cadena vacía)

  • 0 (0 como un entero)

  • "0" (0 como una cadena)

  • NULL

  • FALSE

  • array() (un array vacío)

  • var $var; (una variable declarada, pero sin un valor en una clase)

De esta manera, no devolverá FALSE en caso de que tenga un valor vacío y diferente de cero.

<?php
function stock($producto)
{
  $arr = array(
      'chompas' => 4,
      'pantalones' => 1,
      'camisas' => 3,
      'zapatos' => 0 
  );
  return $arr[$producto];
}
if (empty(stock('zapatos'))) {
  echo "No hay este producto en stock \n";
} else{
  echo "Aún hay productos en stock";
}
?>

Generadores

Los generadores son una de las novedades más importantes y útiles introducidas por PHP 5.5.

Los generadores simplifican drásticamente la creación de iteradores; un iterador es un objeto que permite recorrer los valores almacenados en un contenedor.

Técnicamente, un generador es muy parecido a una función. La principal diferencia es que en vez de usar la palabra reservada return para devolver un valor, el generador utiliza la palabra reservada yield para devolver uno a uno todos sus valores.

La sentencia yield es parecida a la sentencia return, excepto en que en vez de detener la ejecución de la función y devolver un valor, yield facilita el valor al bucle que itera sobre el generador y pausa la ejecución de la función generadora.

Un generador no puede retornar un valor: hacerlo resultaría en un error de compilación. Un return vacío es válido en cuanto a sintaxis dentro de un generador y terminará el generador.

Aquí un ejemplo ilustrativo:

<?php
// Array de números. 

$numeros = array(1,2,3,4,5,6,7,8,9,10); 

// Generador.

function generador_pares($arr)
{
  foreach ($arr as $value) {
    if ($value % 2 == 0 ) {
      yield $value + 10;
    }
  }
}

foreach (generador_pares($numeros) as $numero) {
  echo "$numero \n";
}
?>

Referencias.

Exceptions manual PHP: http:
http://php.net/manual/es/language.exceptions.php
Introducción y sintaxis a los Generadores:
http://php.net/manual/es/language.generators.overview.php
Los generadores de PHP 5.5:
http://librosweb.es/tutorial/los-generadores-de-php-55/

Añadir nuevo comentario