PHP Basics I:�Tipado estricto y novedades PHP 7.4
Sergio Carracedo
sergiocarracedo
https://github.com/sergiocarracedo
https://sergiocarracedo.es
Tipado estricto en PHP
Tipado estricto en PHP
¿Qué es el tipado?
Es el proceso de verificación que hace el lenguaje del tipo contenido en una variable.
Tipado estricto en PHP
Tipos de tipado
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
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+
Tipado estricto en PHP
declare(strict_types=1);
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
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
Tipado estricto en PHP
Tipos nativos
Tipado estricto en PHP
Otros tipos
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
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
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); //
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
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)
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
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)
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
Tipado estricto en PHP
¿Donde podemos aplicar los tipos estrictos?
Tipado estricto en PHP
¿Donde podemos aplicar los tipos estrictos? (2)
<?php
class ClaseA {
public int $valor;
public string $cadena;
}
Tipado estricto en PHP
Ventajas
Novedades PHP 7.4
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;
}
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)
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)
);
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,
];
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;
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’]
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;
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
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
Sergio Carracedo
sergiocarracedo
https://github.com/sergiocarracedo
https://sergiocarracedo.es