Exprimiendo los tipos de PHP7 馃悩

En las 煤ltimas versiones de PHP se han introducido mejoras en cuanto al soporte de tipos. A pesar de que estamos conmocionados por ser el 煤ltimo d铆a de la promoci贸n 3x1 para CodelyTV Pro, en este v铆deo veremos c贸mo sacarle provecho. Al final del post tienes las instrucciones para entrar en el sorteo de la entrada a la Polycon!

Tipos din谩micos

Un lenguaje es din谩micamente tipado cuando es 茅l quien deduce el tipo de datos de las variables y no se lo tenemos que indicar nosotros. En el siguiente ejemplo vemos como PHP estar铆a deduciendo el tipo resultante de sumar un int y un string que contiene un entero:

var_dump(1 + "1"); // Output: int(2)

Al ser din谩micamente tipado, adem谩s de interpretado, PHP no tiene un proceso de compilaci贸n, si no que es en tiempo de ejecuci贸n cuando PHP valida si una determinada variable tiene un determinado m茅todo, o no. Esto se conoce como Duck Typing:

function greeting($from, $to)
{
    return $from->name() . " says hello to " . $to->name();
}

echo greeting("Rafa", "Javi"); // Output \*en run-time\*: Fatal error: Uncaught Error: Call to a member function name() on string

final class Person
{
    private $name;

    public function \_\_construct($name)
    {
        $this->name = $name;
    }

    public function name()
    {
        return $this->name;
    }
}

$rafa = new Person("Rafa");
$javi = new Person("Javi");

echo greeting($rafa, $javi); // Output: Rafa says hello to Javi

Dicho esto, vamos a hacer un repaso por la evoluci贸n de PHP al respecto de los tipos:

Type Declaration (antes llamado Type Hinting)

A partir de PHP 5.0 tenemos la posibilidad de especificar el tipo de datos que contiene una determinada variable al ser recibida como argumento. Esto aporta cierta robustez a los contratos de nuestros m茅todos y deja atr谩s la posibilidad del Duck Typing tal y como antes ve铆amos: A pesar de ser un avance, segu铆a teniendo sus limitaciones: S贸lo se pod铆an especificar clases o interfaces, en ning煤n caso tipos primitivos del lenguaje.

  • PHP 5.1 introdujo la posibilidad de especificar array como tipo de entrada
  • PHP 5.4 introdujo soporte a callable permitiendo asegurarnos que recib铆amos una funci贸n de primer y mo valor
  • PHP 7.0 introdujo soporte a primitivos como bool, string, int, y float
  • PHP 7.1 introduce soporte a iterable entendiendo que esto acepta tanto implementaciones de Treaversable, como arrays primitivos

Con lo cu谩l, tenemos que podemos refactorizar la funci贸n anterior a algo como:

function greeting(Person $from, Person $to)
{
    return $from->name() . " says hello to " . $to->name();
}

echo greeting("Rafa", "Javi"); // Output \*en run-time\*: Fatal error: Uncaught TypeError: Argument 1 passed to greeting() must be an instance of Person, string given

$rafa = new Person("Rafa");
$javi = new Person("Javi");

echo greeting($rafa, $javi); // Output: Rafa says hello to Javi

Return Type

PHP 7.0 introduce la posibilidad de a帽adir tipos de retorno en nuestras funciones, haciendo que finalmente ganen la robustez que merecen. Ahora s铆 podemos declarar interfaces que expresen de forma expl铆cita en el contrato toda la informaci贸n necesaria para las implementaciones, y los clientes de estas interfaces tendr谩n toda la informaci贸n necesaria:

function greeting(Person $from, Person $to): string
{
    return $from->name() . " says hello to " . $to->name();
}

Adem谩s, en PHP 7.1 se introduce la opci贸n de especificar void como tipo de retorno. Con lo cu谩l, de esta manera podemos hacer expl铆cito el hecho de que una determinada funci贸n no retorna ning煤n valor y, por lo tanto, esa funci贸n tiene el prop贸sito de producir un side-effect como los ejemplos que comentamos en el v铆deo. A煤n a d铆a de hoy debemos indicar las excepciones que pueden ser lanzadas por un m茅todo a trav茅s de documentaci贸n, mientras que en otros lenguajes se pueden especificar a modo de contrato tambi茅n (annotations de Java).

Strict Types

Otra funcionalidad al respecto de tipos incorporada en PHP 7.0 es la sentencia declare(strict_types=1);. Esta sentencia evita castings autom谩ticos que hace PHP en caso de no especificar esta sentencia:

<?php

function greeting(string $fromName, string $toName): string
{
    return $fromName . " says hello to " . $toName;
}

echo greeting("Rafa", 123); // Output: Rafa says hello to 123

Como vemos a continuaci贸n, si especificamos esta sentencia a pesar de que haya un casting disponible de int(123) a string("123"), PHP no lo realiza y lanza un Fatal error:

<?php

declare(strict\_types=1);

function greeting(string $fromName, string $toName): string
{
    return $fromName . " says hello to " . $toName;
}

echo greeting("Rafa", 123); // Output: Fatal error: Uncaught TypeError: Argument 2 passed to greeting() must be of the type string, integer given

Lo ideal al respecto de la declaraci贸n de tipos estricta hubiera sido poder declararla a nivel de proyecto. No obstante, dado que si definimos algo as铆 en el php.ini, afectar铆a al c贸digo de nuestras dependencias, prefirieron ser conservadores y definirlo a nivel de proyecto. A pesar de esto, teniendo en cuenta la madurez de Composer en el ecosistema PHP, quiz谩 se podr铆a haber aprovechado para declararlo dentro del composer.json, o para no mezclar, en un archivo espec铆fico tipo strict_types.json, que permitiese definir reglas de exclusi贸n en base a directorios. En cualquier caso, esto no es as铆. Con lo que os recomendamos que os modifiqu茅is la plantilla "New PHP Class" de vuestro IntelliJ/PhpStorm para que incluya por defecto esta declaraci贸n.

Nullable Type

PHP 7.1 introduce la posibilidad de especificar de forma expl铆cita que un determinado tipo puede ser null. Esto va muy bien para los casos pr谩cticos que comentamos en el v铆deo, pero siguiendo con el ejemplo del post, permitir铆a cosas como:

<?php

declare(strict\_types=1);

function greeting(string $fromName, ?string $toName): ?string
{
    if (is\_null($toName)) {
        return null;
    }

    return $fromName . " says hello to " . $toName;
}

echo greeting("Rafa", "Javi"); // Output: Rafa says hello to Javi
echo greeting("Rafa", null); // Output: "" (vac铆o)
echo greeting(null, "Javi"); // Output: Fatal error: Uncaught TypeError: Argument 1 passed to greeting() must be of the type string, null given

Conclusi贸n sobre tipos y PHP

Como hemos podido ver, la evoluci贸n del soporte a tipos de PHP desde la versi贸n 5 hasta la 7.1 ha sido notable. A pesar de que esto no supone ninguna mejora con respecto a las funcionalidades disponibles en otros lenguajes, al menos actualiza y pone un poco al d铆a el lenguaje para permitir un estilo de programaci贸n con el que, al menos nosotros, nos sentimos mucho m谩s c贸modos 馃檪 Por 煤ltimo, recordarte que hoy es el 煤ltimo d铆a para aprovechar la oferta del 3x1 para Codely TV Pro. La plataforma de cursos de CodelyTV 馃

Sorteo entrada Polycon 2017 馃師锔忦煄煇

Este 6 y 7 de Octubre tiene lugar en Barcelona la conferencia de ingenier铆a de Software Polycon. Es una conferencia agn贸stica de lenguajes de programaci贸n que se celebra por primera vez este a帽o y ya cuenta con ponentes internacionales de primer nivel. Se hablar谩 desde Arquitectura Hexagonal hasta Event Sourcing pasando por Microservicios, novedades de Symfony 4, bases de datos en grafos como Neo4j, y mucho m谩s. Si quer茅is m谩s informaci贸n aqu铆 ten茅is la web oficial de Polycon. Son muy buena gente y nos han cedido una entrada para que la sorteemos entre los seguidores de CodelyTV, as铆 que simplemente ten茅is que hacer 3 sencillos pasos para entrar en el sorteo:

Con esto entrar谩s en el sorteo de la entrada valorada en 84鈧 y el martes 19 de Septiembre anunciaremos el ganador. 隆Mucha suerte! 馃檪

Individuos

24,91鈧/ mes 路 pago anual299鈧 al a帽o
  • 馃捇Acceso a todos los cursos
  • 馃弲Contenido de calidad
  • 馃鈥嶐煆Profesionales con amplia experiencia
  • 馃殌Nuevo contenido cada semana
  • 馃鈥嶐煠濃嶐煣Acceso a la comunidad CodelyTV
  • 馃鈥嶐煄Certificados al completar cursos
  • 馃捀12 meses por el precio de 10
SIN PERMANENCIA M脥NIMASuscr铆bete

Empresas

驴Crees que puede interesar a m谩s miembros del equipo?

  • 馃捀Descuento de hasta un 40%
  • Gesti贸n centralizada de cuentas
  • 馃鈥嶐煆Profesionales con amplia experiencia
  • 馃捈Facturas a nombre de empresa
  • 馃搱Reportes y anal铆tica