PHP 8.1 é uma atualização importante da linguagem PHP.
Ela contem muitas funcionalidades novas, incluindo enums, propriedades somente leitura, sintaxe de chamáveis de primeira classe, fibras, tipos de interseção, melhorias de performance e mais.
Use enum em vez de um conjunto de constantes e obtenha validação de forma transparente.
Propriedades somente leitura não podem ser alteradas após a inicialização, ou seja, após um valor ser atribuido a elas.
Elas são uma ótima maneira de modelar objetos de valor (Value Objects) e objetos de transferência de dados (DTO).
class BlogData
{
private Status $status;
public function __construct(Status $status)
{
$this->status = $status;
}
public function getStatus(): Status
{
return $this->status;
}
}Agora é possível obter a referência de qualquer função – isso é chamado de sintaxe de callable de primeira classe.
Objetos agora podem ser usados como valor padrão de parâmetros, variáveis estáticas, e constantes globais, bem como em argumentos de atributos.
Isso efetivamente torna possível usar atributos aninhados.
class Service
{
private Logger $logger;
public function __construct(
?Logger $logger = null,
) {
$this->logger = $logger ?? new NullLogger();
}
}class Service
{
private Logger $logger;
public function __construct(
Logger $logger = new NullLogger(),
) {
$this->logger = $logger;
}
}class User
{
/**
* @Assert\All({
* @Assert\NotNull,
* @Assert\Length(min=5)
* })
*/
public string $name = '';
}class User
{
#[\Assert\All(
new \Assert\NotNull,
new \Assert\Length(min: 5))
]
public string $name = '';
}Use tipos de interseção quando um valor precisa satisfazer múltiplas restrições de tipo ao mesmo tempo.
Atualmente não é possível misturar tipos de interseção e união como A&B|C.
function count_and_iterate(Iterator $value) {
if (!($value instanceof Countable)) {
throw new TypeError('value must be Countable');
}
foreach ($value as $val) {
echo $val;
}
count($value);
}Uma função ou método declarada com o tipo never indica que ela não irá retornar um valor e irá lançar uma exceção ou terminar a execução do script com uma chamada de die(), exit(), trigger_error(), ou algo similar.
function redirect(string $uri) {
header('Location: ' . $uri);
exit();
}
function redirectToLoginPage() {
redirect('/login');
echo 'Hello'; // <- dead code
}É possível declarar constantes de classe como final, de forma que elas não possam ser sobrescritas em classes filhas.
Agora é possível escrever números octais com o prefixo explícito 0o.
Fibras são primitivos para implementar concorrência cooperativa leve. Elas são meios de criar blocos de código que podem ser pausados e retomados como Geradores, mas de qualquer lugar da pilha de execução. Fibras em si não fornecem concorrência magicamente, um laço de eventos ainda é necessário. No entanto, elas permitem que implementações bloqueantes e não bloqueantes compartilhem a mesma API.
Fibras permitem livrar-se de código boilerplate visto anteriormente com Promise::then() ou corrotinas baseadas em Geradores. Bibliotecas geralmente constróem abstrações adicionais em torno das Fibras, então não há necessidade de interagir com elas diretamente.
$httpClient->request('https://example.com/')
->then(function (Response $response) {
return $response->getBody()->buffer();
})
->then(function (string $responseBody) {
print json_decode($responseBody)['code'];
});PHP já suportava o desempacotamento dentro de arrays através do operador de espalhamento, mas somente se o array tivesse chaves de inteiro. Agora também é possível desempacotar arrays com chaves string.
#[ReturnTypeWillChange].fsync e fdatasync.array_is_list.Serializable depreciada.$GLOBALS.file_info migrados para objetos finfo existentes.IMAP\Connection.FTP\Connection.GdFont.LDAP\Connection, LDAP\Result, e LDAP\ResultEntry.PgSql\Connection, PgSql\Result, e PgSql\Lob objects.PSpell\Dictionary e PSpell\Config.