PHP 7 nuevas características

Scalars Type hints:

PHP 7 agrega los type hints int, float, string y bool a los que ya existian que era Objetos y array.

function sendEmail(string $email, int $times, float $number, bool $sendNow = TRUE) {
    //..
}

Esta declaración no fuerza la comprobación, solo intenta convertir el valor al tipo declarado. Si agregamos la directiva declare(strict_types=1); al principio del archivo, si forzaremos la comprobación, pero solo en ese archivo.

Return type hints

Tambien podemos utilizar los mismos para el retorno de funciones o métodos

function sayHello(string $name) : string {
    return 'Hello '.$name;
}

Si retornamos otro valor, recibiremos un error \TypeError.

Anonymous classes:

Las clases anónimas son iguales a las clases «nombradas». Salvo que no se pueden serializar

$obj = new class($a, $b) {
    private $a;
    private $b;
    
    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }
};

Generator:

Un generador nos permite iterar sobre datos sin crear un array. Los generadores son como una función que van produciendo valores, en vez de retornar solo uno.

function par() {
    for ($i = 1; $i <= 10; $i++) {
        if ($i % 2 == 0) {
            yield $i;
        }
    }
}



foreach(par() as $par) {
    echo $par;
}
// 2 4 6 8 10

function numeros() { 
    yield 1; 
    yield 3; 
}
foreach(numeros() as $num) {
   echo $num;
}
//1 3

Return en un Generator

function numeros() { 
    yield 1; 
    yield 3;
    return 5; 
}

foreach(numeros() as $num) {
    echo $num;
}
//1 3

echo numeros()->getReturn();
// 5

Cuando iteramos solo se produciran los valores con yield. Luego podemos invocar a return. Si invocamos a return antes de iterar, obtenemos una excepción.

The null coalesce operator:

Este nuevo operador (??) nos permite escribir expresiones más cortas.

$name = $_GET['name'] ?? 'N/A';

Retorna el valor del primer operando si existe y es distinto de null sino, devuelve el segundo operando.

The spaceship operator:

Nos permite hacer comparaciones de «3 vías», es decir que el resultado de la comparación puede ser true, false y otro valor más. (expr) <=> (expr)
Este operador retorna:
A. 0 si los operandos son iguales
B. 1 si el operando de la izquierda es mayor
C. -1 si el operando de la derecha es mayor

Constant arrays

// Constante de clase
class MyApp {
    const APP = [
        'name' => 'MyApp',
        'edition' => 'Beta',
        'version' => '2.1.2',
        'licence' => 'MIT'
        ];
}

interface MyApp {
    const APP = [
        'name' => 'MyApp',
        'edition' => 'Beta',
        'version' => '2.1.2',
        'licence' => 'MIT'
        ];
}
// Constante utilizando define
define('APP', [
        'name' => 'MyApp',
        'edition' => 'Beta',
        'version' => '2.1.2',
        'licence' => 'MIT'
        ];
}

Throwables:

Podemos tratar como excepciones a errores en un try catch

try {
    $mailer = new Mailer($transport); -> esta linea devuelve un \Error no un \Exception
} catch (\Throwable $e) {
     echo 'Error!';
} finally {
     echo 'continuar!';
}

Nullable types

function nombre(?string $nombre) {
    echo $name;
}
nombre(); // invalido
nombre(null); // valido

function nombre2(?string $nombre = null) {
    echo $name;
}
nombre2(); // valido
nombre2(null); // valido
nombre2('John'); // valido

Void return types

function A(): void {
    // valido
}
function B(): void {
     return; // valido
}
function C(): void {
    return null; // invalido
}
function D(): void {
    return 1; // invalido
}