1 – Aritmética de strings
O PHP, por normalmente lidar com a web e os valores costumam chegar ao servidor em geral como sequência de caracteres, permitia a execução de cálculos entre valores string, como abaixo demonstrado:
// PHP 5.6 var_dump("1" + "2"); //int(3) var_dump("1" + "string"); //int(1) var_dump("1" + "2 e string"); //int(3)
No entanto este comportamento foi alterado, conforme exemplo abaixo:
// PHP 7.1 var_dump("1" + "2"); //int(3) var_dump("1" + "string"); //int(1) - Warning: A non-numeric value encountered in index.php on line 2 var_dump("1" + "2 e string"); //int(3) - Notice: A non well formed numeric value encountered in index.php on line 3
2 – Catching múltiplos tipos de exceções
Foi adicionado a feature que permite tratar múltiplas exceções de tipos diferentes num mesmo catch. Abaixo, uma demonstração de como utilizar este novo recurso:
try { $classe->metodo($variavel); } catch (TipoException | OutroTipoException $ex) { DB::rollBack(); return $ex->getMessage(); }
3 – Adicionado visibilidade para const de classes
Alteração aparentemente pequena, mas muito significativa para manter a coerência estrutural de visibilidade de atributos, métodos, etc de classes PHP.
class Drall{ private const SITE = "https://www.drall.com.br"; protected const DEVBLOG = "https://devblog.drall.com.br"; }
4 – Adicionado suporte ao tipo de retorno void para funções
Adicionado o novo tipo de retorno de funções, void, onde uma função passa a ser obrigada a não retornar nada.
function salvar_no_log($msg): void { file_put_contents("arquivo_de.log",$msg."\n",FILE_APPEND); }
5 – Closure de funções Callable
O novo método fromCallable fornece uma maneira eficiente e compacta de criar objetos Clojures a partir de callables. Abaixo um exemplo:
$callback = Closure::fromCallable([$this, 'funcao']);
6 – Tipo Iterable
O pseudo-tipo Iterable foi incluído para unir o tipo primitivo do array e a interface Traversable que é usada para tornar um valor iterável. O código abaixo é um exemplo:
// PHP 5.6 function dump(array $items) { var_dump($items); } dump([2, 3, 4]); dump(new Collection()); //Output /* array(3) { [0]=> int(2) [1]=> int(3) [2]=> int(4) } Catchable fatal error: Argument 1 passed to dump() must be of the type array, object given... */
Neste caso, a função não aceitará um valor iterável e irá lançar um erro. A modificação feita no PHP 7.1 permite que seja use iterable para descrever um valor iterável em vez de definí-lo manualmente.
// PHP 7.1 function dump(iterable $items) { var_dump($items); } dump([2, 3, 4]); dump(new Collection()); //Output /* array(3) { [0]=> int(2) [1]=> int(3) [2]=> int(4) } object(Collection)#2 (0) { } */
7 – Destructuring Arrays
//PHP 5.6 list($a, $b, $c) = [1, 2, 3]; var_dump($a, $b, $c); // int(1) int(2) int(3) list($a, $b, $c) = ["a" => 1, "b" => 2, "c" => 3]; var_dump($a, $b, $c); // NULL NULL NULL
Mas na nova versão do PHP, foi adicionado maior controle sobre a estrutura do array, como podemos ver abaixo:
list("a" => $a, "b" => $b, "c" => $c) = ["a" => 1, "b" => 2, "c" => 3]; var_dump($a, $b, $c); // int(1) int(2) int(3) ["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3]; var_dump($a, $b, $c); // int(1) int(2) int(3)] //Multi-dimension arrays [[$a, $b], [$c, $d]] = [[1, 2], [3, 4]]; var_dump($a, $b, $c, $d); // int(1) int(2) int(3) int(4) [["b" => $b], ["c" => $c]] = [["a" => 1, "b" => 2], ["c" => 3, "d" => 4]]; var_dump($b, $c); // int(2) int(3)
8 – Nullable Types
Foi adicionado a possibilidade tipar returnos de função e seus parâmetros como pertencentes a um tipo e também a nulo. Antes não existia esta possibilidade. Para isto, basta utilizar o operador ‘?’ antes do tipo, como nos exemplos abaixo:
function sum(int $a, int $b): ?int { return $a + $b; } function sum(?int $a, ?int $b): ?int { if ($a == null || $b == null) { return null; } return $a + $b; }
Atenção apenas que null não significa que o paramêtro pode ser ignorado, conforme demonstrado pelo exemplo abaixo:
var_dump(sum(null, null)); // NULL var_dump(sum()); // throw ArgumentCountError exception
9 – ArgumentCountError Exception
Observe o comportamento do código abaixo:
// PHP 5.6 function sum($a, $b) { return $a + $b; } sum(); // Warning: Missing argument 1 for sum() // Warning: Missing argument 2 for sum() sum(3); // Warning: Missing argument 2 for sum() sum(3, 4);
Warnings não são úteis neste caso, e o desenvolvedor deverá verificar se todos os argumentos estão definidos corretamente. No PHP 7.1, esses avisos foram convertidos em uma exceção ArgumentCountError.
// PHP 7.1 function sum($a, $b) { return $a + $b; } sum(); // Fatal error: Uncaught ArgumentCountError: Too few arguments to function sum(), 0 passed in index.php on line 14 and exactly 2 expected in /index.php:7 sum(3); // skipped sum(3, 4); // skipped