array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'pt_BR', ), 'this' => array ( 0 => 'migration74.new-features.php', 1 => 'Novos Recursos', ), 'up' => array ( 0 => 'migration74.php', 1 => 'Migrando do PHP 7.3.x para o PHP 7.4.x', ), 'prev' => array ( 0 => 'migration74.php', 1 => 'Migrando do PHP 7.3.x para o PHP 7.4.x', ), 'next' => array ( 0 => 'migration74.new-classes.php', 1 => 'Novas Classes e Interfaces', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'pt_BR', 'path' => 'appendices/migration74/new-features.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
As propriedades de classe agora suportam declarações de tipo.
<?php
class User {
public int $id;
public string $name;
}
?>
$user->id
pode ser atribuído apenas
com valores int e $user->name
somente com valores de string.
Arrow functions fornecem uma sintaxe abreviada para definir funções com ligação implícita por valor de escopo.
<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
?>
O código a seguir agora funcionará:
<?php
class A {}
class B extends A {}
class Producer {
public function method(): A {}
}
class ChildProducer extends Producer {
public function method(): B {}
}
?>
<?php
$array['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
?>
<?php
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
?>
Literais numéricos podem conter underscores entre dígitos.
<?php
6.674_083e-11; // float
299_792_458; // decimal
0xCAFE_F00D; // hexadecimal
0b0101_1111; // binary
?>
Referências fracas permitem que o programador mantenha uma referência a um objeto que não impede que o objeto seja destruído.
Lançar exceções de __toString() agora é permitido. Antes isto resultava um erro fatal. Os erros fatais recuperáveis existentes nas conversões de string foram convertidos em exceções de Error.
CURLFile agora suporta stream wrappers, além de nomes de arquivos simples, se a extensão tiver sido criada com relação à libcurl >= 7.56.0.
O filtro FILTER_VALIDATE_FLOAT
agora suporta
as opções min_range
e max_range
com a mesma semântica que FILTER_VALIDATE_INT
.
FFI é uma nova extensão, que fornece uma maneira simples de chamar funções nativas, acessar variáveis nativas e criar/acessar estruturas de dados definidas nas bibliotecas C.
Adicionado o filtro de imagem IMG_FILTER_SCATTER
para aplicar um filtro de dispersão às imagens.
Adicionado o hash crc32c
usando o polinômio de Castagnoli.
Essa variante CRC32 é usada por sistemas de armazenamento, como
iSCSI, SCTP, Btrfs e ext4.
Adicionada a função mb_str_split(), que fornece a mesma funcionalidade que str_split(), mas operando em pontos de código em vez de bytes.
Suporte para pré-carregamento de código foi adicionado.
As funções preg_replace_callback() e preg_replace_callback_array()
agora aceitam um argumento flags
adicional, com suporte para as flags
PREG_OFFSET_CAPTURE
e PREG_UNMATCHED_AS_NULL
.
Isso influencia o formato do array de correspondências passado para a função de retorno da chamada.
O nome de usuário e a senha agora podem ser especificados como parte do PDO DSN para os drivers mysql, mssql, sybase, dblib, firebird e oci. Antes, isso era suportado apenas pelo driver pgsql. Se um nome de usuário/senha for especificado no construtor e no DSN, o construtor terá precedência.
Agora é possível escapar pontos de interrogação nas consultas SQL para evitar que
elas sejam interpretadas como espaços reservados para parâmetros. Escrever ??
permite enviar um único ponto de interrogação para o banco de dados e por exemplo, usar o
operador PostgreSQL JSON key exists (?
).
PDOStatement::getColumnMeta() agora está disponível.
PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)
permite verificar se a instrução é somente leitura, ou seja, se não modifica
o banco de dados.
PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true)
permite o uso de códigos de resultado estendidos do SQLite3 em PDO::errorInfo()
e PDOStatement::errorInfo().
Adicionado SQLite3::lastExtendedErrorCode() para buscar o último código de resultado estendido.
Adicionado SQLite3::enableExtendedResultCodes($enable = true)
,
que fará SQLite3::lastErrorCode()
retornar códigos de resultado estendidos.
strip_tags() agora também aceita um array de tags permitidas:
em vez de strip_tags($str, '<a><p>')
agora você pode escrever strip_tags($str, ['a', 'p'])
.
Um novo mecanismo para serialização de objetos personalizados foi adicionado,
que usa dois novos métodos mágicos: __serialize
e __unserialize
.
<?php
// Retorna um array contendo todo o estado necessário do objeto.
public function __serialize(): array;
// Restaura o estado do objeto a partir do array de dados fornecido.
public function __unserialize(array $data): void;
?>
array_merge() e array_merge_recursive()
agora podem ser chamados sem nenhum argumento; nesse caso, eles retornarão um array vazio.
Isso é útil em conjunto com o operador de espalhamento (spread operator), por exemplo, array_merge(...$arrays)
.
proc_open() agora aceita um array em vez de uma string para o comando. Nesse caso, o processo será aberto diretamente (sem passar por um shell) e o PHP cuidará de qualquer argumento necessário para escapar.
<?php
proc_open(['php', '-r', 'echo "Hello World\n";'], $descriptors, $pipes);
?>
proc_open() agora suporta
redirect
e descritores null
.
<?php
// Like 2>&1 on the shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);
// Like 2>/dev/null or 2>nul on the shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);
?>
password_hash() agora possui as implementações argon2i e argon2id da extensão sodium quando o PHP é compilado sem libargon.