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