PHP 7 Novidades

Aula 02 a 03 - Declaração de tipos escalares / Modo Strict Types
A partir do PHP 7 passamos a poder definir o tipo de parametro esperado em uma função ou método. Até então o PHP aceitava que se declarasse se o parametro era um objeto, um array ou uma função (callable). A partir de agora podemos declarar o tipo como string, int, float ou bool.
Por padrão o PHP trabalha no modo coercivo ou seja, sempre que for possível converter o tipo de um item naquele definido o PHP fará a conversão.
Quando desejamos trabalhar de modo rígido (sem a coerção) devemos utilizar no início do código:
declare(strict_types=1);
Aula 04 - Declaração de tipos de retorno
Podemos também declarar os tipos de retorno esperados nas funções e métodos. Para isso basta declarar o tipo após os () da função ou método precedidos por ':'.
Aula 05 a 07 - Operador Null Coalescing / Operador Spaceship / Definição de constante com Arrays
O Null Coalescing facilita o teste para verificar se um valor está definido ou não. Com esse operador não precisamos fazer um operador ternário com a função isset() para verificar se a variável foi definida. Basta declarar a variável que queremos testar e apontar um valor para o caso de ela não ter sido definida.
Com operador ternário:
$a = isset($_GET['a']) ? $_GET['a'] : 'teste A';
Com null coalescing:
$b = $_GET['b'] ?? 'teste B';
Já o Operador de Comparação Combinada ou Spaceship retorna '0', '-1' ou '1' de acordo com o resultado da comparação de dois valores, utilizando o operador '<=>'.
Esse operador pode ser utilizado com int, float, string e array. Abaixo uma comparação entre uma função com operador ternário e com o spaceship:
function intCompare(int $a, int $b): int
{
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}
function intSpaceship(int $a, int $b): int
{
return $a <=> $b;
}
Com o PHP 7 passou a ser permitido criar constantes com valores em array:
define('ANIMALS', ['Cavalo', 'Burro', 'Mula', 'Jegue']);
Aula 08 - Classes anonimas
Antes da alteração do PHP 7 ao criarmos uma interface era necessário implentá-la em uma classe para depois exportar os dados para outra classe.
interface Logger
{
public function log(string $msg);
}

class App
{
private $logger;
public function getLogger(): Logger
{
return $this->logger;
}
public function setLogger(Logger $logger)
{
$this->logger = $logger;
}
}

class Log implements Logger
{
public function log(string $msg)
{
echo $msg;
}
}

$app = new App;
$app->setLogger(new Log);
var_dump($app->getLogger());
No PHP 7 podemos implementar a classe de forma anonima diretamente como parametro no método:
interface Logger
{
public function log(string $msg);
}

class App
{
private $logger;
public function getLogger(): Logger
{
return $this->logger;
}
public function setLogger(Logger $logger)
{
$this->logger = $logger;
}
}

$app = new App;
$app->setLogger(new class implements Logger
{
public function log(string $msg)
{
echo $msg;
}
});
var_dump($app->getLogger());
Aula 09 a 12 - Closure Call / Unserialize filtrada / Declaração de namespaces / intdiv
O Closure Call passou a facilitar o acesso a valores de classes utilizando o método call() ao invés de bindTo()
Já o unserialize pode ser filtrado atravé de um array com o seguinte formato:
["allowed_classes" => ["classe"]]
ou
["allowed_classes" => true/false].
O interessante nessa aula foi a função que cria arquivos. Utilizamos a função file_put_contents() para criar uma arquivo com os dados dos objetos de forma serializada com a função serialize().
$user = new User;
$user->email = 'jean@jean';
echo $user;

$blog = new Blog;
$blog->title = 'SON';
$blog->description = 'PHP 7 novidades';

file_put_contents("data.save", serialize([$user, $blog]));
Com issso criamos uma arquivo com os dados serializados dos dois objetos.
Para recuperar os dados utilizamos a função file_get_contents('data.save')
A declaração de namespace também foi simplificada. Anteriormente deviamos declarar cada elemento separadamente. Com a nova sintaxe podemos declarar vários elementos em uma mesma operação:
use namespace\{ClassA, ClassB, ClassC}
A função intdiv() calcula o resultado em inteiro da divisão de dois números.
Aula 13 - Nova arquitetura para Exception e Error
Com o PHP 7 podemos criar algumas classes para tratar as mensagens de erro.
Essas classes são Throwable, Exception e Error. A classe Throwable deve extender uma outra classe e as classes Exception e Error devem extender uma outra classe e devem implemetar a classe criada para o Throwable.
interface MyPackageThrowable extends Throwable { }
class MyPackageException extends Exception implements MyPackageThrowable { }
class MyPackageError extends Error implements MyPackageThrowable { }