PHP7
La cosa se pone seria
¿Dónde está PHP6?
2x
rendimiento
50%
consumo de memoria
Vamos al código
Tipado
Parámetros escalares
<?php // funciones.php
function foo(int $a, int $b) {
return $a + $b;
}
function bar(float $a, float $b) {
return $a / $b;
}
function baz(string $a) {
return $a;
}
function laCuestion(bool $a) {
return $a ? "ser" : "no ser";
}
Tipado débil
<?php
include("funciones.php");
echo foo(2, 3);
// 5
echo foo(2, 3.0);
// 5
echo foo(2, "3");
// 5
echo foo(2, "3a");
// Avisa, pero nos sigue dando el resultado
// Notice: A non well formed numeric value encountered
// 5
echo foo(2, "a3");
// Tampoco nos pasemos de listos
// Fatal error
// TypeError
echo bar(10, 2);
// 5
Tipado estricto
<?php declare(strict_types=1); // Aquí viene la magia
include("funciones.php");
echo foo(2, 3);
// 5
echo foo(2, 3.0);
// TypeError
echo foo(2, "3");
// TypeError
echo foo(2, "3a");
// TypeError
echo bar(10, 2);
// 5
Tipos de retorno
<?php declare(strict_types=1);
include("funciones.php");
function diez(): float {
return 10;
}
echo bar(diez(), 2);
// 5
echo foo(diez(), 2);
// TypeError
class User {
public __construct(string $rol) {
$this->rol = $rol;
}
}
function getAdmin(): User {
return new User("administrador");
}
echo getAdmin()->rol;
// administrador
¿Rendimiento?
Operadores
Null Coalesce
??
<?php
$enemigos = "Todo el mundo";
$objetivo = $enemigos ?? "Nadie";
echo $objetivo;
// todo el mundo
$enemigos = null;
$objetivo = $enemigos ?? "Nadie";
echo $objetivo;
// nadie
Spaceship
<=>
<?php
echo 10 <=> 10;
// 0
echo 10 <=> 9;
// 1
echo 9 <=> 10;
// -1
echo "a" <=> "j";
// -1
echo 1 <=> "a";
// 1
<=>
Clases anónimas
Clases anónimas
<?php
function disparar($proyectil) {
echo "Disparando " . $proyectil->balas() . " balas";
}
disparar(new class {
public function balas() {
return rand();
}
});
// Disparando 2342342323 balas;
Clases anónimas
Con constructor
<?php
function disparar($proyectil) {
echo "Disparando " . $proyectil->balas() . " balas";
}
disparar(new class (20){
private $municion;
function __construct($municion) {
$this->municion = $municion;
}
public function balas() {
return $this->municion;
}
});
// Disparando 20 balas
class Metralleta {
protected $municion;
function __construct($municion) {
$this->municion = $municion * 100;
}
}
interface Explotable {
function explotar();
}
trait Silenciador {
public function silenciar() {
echo "Shh";
}
}
disparar(new class (20) extends Metralleta implements Explotable {
use Silenciador;
function __construct($municion) {
parent::__construct($municion);
}
public function balas() {
return $this->municion;
}
public function explotar() {
echo "Boom";
}
});
// Disparando 2000 balas
Closure::call
<?php
class Humano {
public function saludar() {
return "¡Buenos días!";
}
}
class Perro {
public function saludar() {
return "\u{1F436}";
}
}
$humano = new Humano();
$perro = new Perro();
$generarSaludo = function ($saludo) {
echo $saludo . " " . $this->saludar();
};
$generarSaludo->call($humano, "Hola");
// Hola ¡Buenos días!
$generarSaludo->call($perro, "Guau!");
// Guau! 🐶
Generadores
<?php
function contar() {
yield 1;
yield 2;
yield from mitad();
return 5;
}
function mitad() {
yield 3;
yield 4;
}
$cuenta = contar();
foreach ($cuenta as $numero) {
echo $numero . " ";
}
// 1 2 3 4
echo $cuenta->getReturn();
// 5
Agrupamiento de use
<?php // Jugador.php
namespace Equipo;
class Jugador {
}
<?php
include("Jugador.php");
include("Portero.php");
use Equipo\Jugador;
use Equipo\Portero;
new Jugador();
new Portero();
<?php // Portero.php
namespace Equipo;
class Portero {
}
Agrupamiento de use
<?php
include("Jugador.php");
include("Portero.php");
use Equipo\{Jugador, Portero};
new Jugador();
new Portero();
División de enteros
intdiv()
<?php declare(strict_types=1);
echo 10/3;
// 3.3333333333333
echo intdiv(10, 3);
// 3
Opciones de sesión
<?php
session_start([
'name' => 'Compra',
'cache_expire' => 60,
]);
¡Gracias por la atención!
@emibloque
UO231396@uniovi.es
emibloque@gmail.com
PHP
By Luis Emilio Velasco Sánchez
PHP
- 611