1 of 34

PHP Basics I:�Tipado estricto y novedades PHP 7.4

2 of 34

Sergio Carracedo

sergiocarracedo

https://github.com/sergiocarracedo

https://sergiocarracedo.es

3 of 34

Tipado estricto en PHP

4 of 34

Tipado estricto en PHP

¿Qué es el tipado?

Es el proceso de verificación que hace el lenguaje del tipo contenido en una variable.

5 of 34

Tipado estricto en PHP

Tipos de tipado

6 of 34

Tipado estricto en PHP

Estático vs dinámico

El tipado estático comprueba los tipos en el proceso de compilación.

El tipado dinámico comprueba los tipos en tiempo de ejecución

7 of 34

Tipado estricto en PHP

Fuerte vs débil

Un lenguaje fuertemente tipado no permite violaciones de los tipos de datos.

Un lenguaje no tipado o débilmente tipado no controlan el tipo de datos

(En PHP 5.0 ya se podían especificar clases o interfaces como tipos de entrada�En 5.1 se podía especificar array

En 5.4 se podía especificar callable)

7.0+

8 of 34

Tipado estricto en PHP

declare(strict_types=1);

  • Disponible a partir de PHP 7.0.0
  • Se aplica a todo el código que sigue al declare, incluso a los archivos incluidos

9 of 34

Tipado estricto en PHP

Podremos capturar la excepción de tipo TypeError

<?php

function add(int $a, int $b) : int {

return $a + $b;

}

$a = 1; //int

$b = “2”; // string

var_dump(add($a, $b)); // int(3)

<?php

declare(strict_types=1);

function add(int $a, int $b) : int {

return $a + $b;

}

$a = 1;

$b = "2";

var_dump(add($a, $b)); // Fatal error

10 of 34

Tipado estricto en PHP

Esto convierte a PHP en un lenguaje híbrido, puesto que podemos seguir sin especificar los tipos en algunas variables.

<?php

declare(strict_types=1);

function add(int $a, $b){

return $a + $b;

}

$a = 1;

$b = “2”;

var_dump(add($a, $b)); // int(3)

<?php

declare(strict_types=1);

function add(int $a, $b) {

return $a + $b;

}

$a = “1”;

$b = “2”;

var_dump(add($a, $b)); // Fatal error

11 of 34

Tipado estricto en PHP

Tipos nativos

  • array
  • callable
  • bool boolean
  • float
  • int integer
  • string
  • self

12 of 34

Tipado estricto en PHP

Otros tipos

  • Nombre de una clase o interface: El valor de la variable debe cumplir que sea un instanceof del nombre de la clase o interfaz dada

13 of 34

Tipado estricto en PHP

<?php

class Numero {

private $val;

public function __construct(float $number) {

$this->val = $number;

}

public function value() : float {

return $this->val;

}

public function add(self $b) : self {

$this->val += $b->value();

return $this;

}

}

$a = new Numero(1);

$b = new Numero(2);

var_dump($a->add($b)->value()); // float(3)

var_dump($a->add(3)->value()); // Exception TypeError

14 of 34

Tipado estricto en PHP

instanceof

Vamos a definir que es instancia de

<?php

class ClaseA {}

class ClaseB {}

$a = new ClaseA();

var_dump($a instanceof ClaseA); // true

var_dump($a instanceof ClaseB); // false

<?php

class ClaseA {}

class ClaseB extends ClaseA{}

$a = new ClaseA();

$b = new ClaseB();

var_dump($a instanceof ClaseA); // true

var_dump($a instanceof ClaseB); // false

var_dump($b instanceof ClaseA); // true

var_dump($b instanceof ClaseB); // true

15 of 34

Tipado estricto en PHP

instanceof (2)

<?php

interface InterfazA {}

class ClaseA implements InterfazA {}

$a = new ClaseA();

var_dump($a instanceof ClaseA); // true

var_dump($a instanceof InterfazA); // true

class ClaseB {

public function hazAlgo(InterfazA $valor) {

///Hace algo

}

}

$a = new ClaseA();

$b = new ClaseB();

$b->hazAlgo($a); //

16 of 34

Tipado estricto en PHP

Nullable types

¿Y si necesitamos que un valor pueda tener valor null?

<?php

declare(strict_types=1);

function add(int $a, int $b) : int {

return !empty($b) ? $a + $b : $a;

}

$a = 1;

$b = null;

var_dump(add($a, $b)); // Fatal error

17 of 34

Tipado estricto en PHP

Nullable types (2)

Desde PHP 7.1 podemos definir tipos nullables añadiendo ? antes del tipo

<?php

declare(strict_types=1);

function add(int $a, ?int $b) : int {

return !empty($b) ? $a + $b : $a;

}

$a = 1;

$b = null;

var_dump(add($a, $b)); // int(1)

18 of 34

Tipado estricto en PHP

Union Types v2

¿Y si necesitamos que un valor pueda tener varios tipos?

Seguirá (aprox) la sintaxis de PHPDoc� Lo veremos en PHP 8

<?php

class ClaseA {

public int|float $valor;

public string|int|null $otroValor;

public ?int $otroMasValor; // es un alias de int|null

}

https://github.com/nikic/php-rfcs/blob/union-types/rfcs/0000-union-types-v2.md

https://wiki.php.net/rfc/union_types_v2

RFC

19 of 34

Tipado estricto en PHP

Splat Operator

Permite obtener los parámetros de una función como un Array sin depender de func_get_args()

También podemos indicar el tipo de cada uno de los parámetros

<?php

declare(strict_types=1);

function add(int ...$values): int {

return array_reduce($values, function($carry, $item) {

return $carry += $item;

});

}

var_dump(add(1,2,3,4,5,6)); // int(21)

20 of 34

Tipado estricto en PHP

Retorno vacío (void)

También desde PHP 7.1 indicar que una función o método no puede devolver un valor

OJO, null no es un valor de retorno válido para una función void

<?php

declare(strict_types=1);

function add(int $a, ?int $b) : void {

echo !empty($b) ? $a + $b : $a;

return; // Se puede obviar el return

}

$a = 1;

$b = null;

add($a, $b); // Imprime en pantalla 1

21 of 34

Tipado estricto en PHP

¿Donde podemos aplicar los tipos estrictos?

  • Por el momento en los parámetros de funciones y métodos y en los valores de retorno.

  • Pero no en las propiedades de una clase 😓

22 of 34

Tipado estricto en PHP

¿Donde podemos aplicar los tipos estrictos? (2)

  • En PHP 7.4+ podremos declarar tipos en las propiedades de una clase 🤗

<?php

class ClaseA {

public int $valor;

public string $cadena;

}

23 of 34

Tipado estricto en PHP

Ventajas

24 of 34

Novedades PHP 7.4

25 of 34

Novedades PHP7.4

Nuevas características:�Propiedades tipadas

¿Y si necesitamos que un valor pueda tener valor null?

<?php

class ClaseA {

public int $valor;

public ?string $cadena;

}

26 of 34

Novedades PHP7.4

Nuevas características:�Arrow Functions

Nos dan una forma sintaxis sencilla para definir funciones (con binding scope)

<?php

$factor = 10;

$nums = array_map(

fn($n) => $n * $factor,

[1, 2, 3, 4]

); // array(10, 20, 30, 40)

27 of 34

Novedades PHP7.4

Nuevas características:�Arrow Functions (2)

Funcionan de forma muy similar a las de javascript

<?php

array_filter(

$valores,

function($v) use ($valoresPermitidos) {

return in_array($v, $valoresPermitidos);

}

);

<?php

array_filter(

$valores,

fn($v) => in_array($v, $valoresPermitidos)

);

28 of 34

Tipado estricto en PHP

Nuevas características:�Arrow Functions (3)

¿Por qué no usar la misma notación que en javascript?

¿Array de funciones arrow o un array asociativo?

<?php

$array = [

$a => $a + $b,

$x => $x * $y,

];

29 of 34

Novedades PHP7.4

Nuevas características:�Operador de coalescencia de asignación nula

$a[‘key’] solo toma el valor 1 si no tenía valor previamente

<?php

if (!isset($a[‘key’])) {

$a[‘key’] = 1;

}

<?php

$a[‘key’] ??= 1;

30 of 34

Novedades PHP7.4

Nuevas características:�Desempaquetado en arrays

Similar al operador spread de javascript

⚠️ No funciona en arrays asociativos

<?php

$a = [‘php’, ‘vigo’];

$b = [‘meetup’, …$a, ‘hoy’];

// [‘meetup’, ‘php’, ‘vigo’, ‘hoy’]

31 of 34

Novedades PHP7.4

Nuevas características:�Separador numérico literal

Mejora la lectura de constantes para humanos, pero afecta al valor real.

<?php

6.674_083e-11; // float

299_792_458; // decimal

0xCAFE_F00D; // hexadecimal

0b0101_1111; // binary�� const ASTRONOMICAL_UNIT = 149597870700;

const ASTRONOMICAL_UNIT = 149_597_870_700;

32 of 34

Novedades PHP7.4

Nuevas características:�FFI

Es una nueva extensión que permite hacer llamadas a funciones, variables nativas y acceder a estructuras de datos definidas en librerías C

Un importante ejemplo:�https://github.com/dstogov/php-tensorflow

33 of 34

Novedades PHP7.4

Nuevas características:�y mucho más...

https://www.php.net/manual/en/migration74.new-features.php��https://www.slideshare.net/nikita_ppv/typed-properties-and-more-whats-coming-in-php-74

34 of 34

Sergio Carracedo

sergiocarracedo

https://github.com/sergiocarracedo

https://sergiocarracedo.es