## Novas Funcionalidades

### Núcleo do PHP

#### Prefixo de Inteiro Literal Octal

Inteiros octais agora podem usar um prefixo `0o`/`0O` explícito em inteiros literais, similar à inteiros literais binários e hexadecimais.

    <?php
    014;  // Literal octal não-prefixado
    0o14; // Literal octal prefixado
    ?>

#### Desempacotamento de Array com chaves String

Adicionado suporte para desmontagem de arrays com chave string

    <?php
    $arr1 = [1, 'a' => 'b'];
    $arr2 = [...$arr1, 'c' => 'd']; //[1, 'a' => 'b', 'c' => 'd']
    ?>

#### Argumentos Nomeados Após Desempacotamento de Argumentos

Agora é possível especificar argumentos nomeados após um desempacotamento de argumentos. ex. foo(...$args, nomeado: $arg).

#### Chave do Caminho Completo para Upload de Arquivos

Upload de arquivos agora fornece uma chave adicional `full_path`, que contém o caminho completo (em vez de apenas o nome base) do arquivo carregado. Isso destina-se ao uso em conjunto com "upload webkitdirectory".

#### Enumerações

Suporte para Enumerações foi adicionado.

#### Fibers

Suporte para Fibers foi adicionado.

#### Sintaxe de Chamáveis de Primeira Classe

Closures para chamáveis agora podem ser criadas usando a sintaxe `myFunc(...)`, que é idêntica à `Closure::fromCallable('myFunc')`.

> Nota: O `...` é parte da sintaxe, e não uma omissão.

#### Tipos de Intersecção

Suporte a tipos de intersecção foi adicionado.

Cuidado

Tipos de Intersecção não podem ser usados em conjunto com tipos de união

#### Tipo never

Um novo tipo never de retorno apenas foi adicionado. Isso indica que a função exit(), lança uma exceção, ou não termina.

#### `new` em Inicializadores

Agora é possível usar expressões `new ClassName()` como o valor padrão de um parâmetro, variável estática, inicializadores de constante global, e como argumentos de atributo. Objetos também podem ser passados para define() agora.

#### Propriedades somente leitura

Suporte para propriedades readonly foi adicionado.

#### Constantes de classe finais

Adicionado suporte ao modificador final para constantes de classe. Além disso, as constantes de interface podem ser sobrescritas.

### CURL

Adicionada a opção `CURLOPT_DOH_URL`.

Adicionadas opções para certificado blob quando libcurl >= 7.71.0:

- `CURLOPT_ISSUERCERT_BLOB`
- `CURLOPT_PROXY_ISSUERCERT`
- `CURLOPT_PROXY_ISSUERCERT_BLOB`
- `CURLOPT_PROXY_SSLCERT_BLOB`
- `CURLOPT_PROXY_SSLKEY_BLOB`
- `CURLOPT_SSLCERT_BLOB`
- `CURLOPT_SSLKEY_BLOB`

Adicionada CURLStringFile, que pode ser usada para postar um arquivo a partir de uma string em vez de um arquivo:

    <?php
    $file = new CURLStringFile($data, 'filename.txt', 'text/plain');
    curl_setopt($curl, CURLOPT_POSTFIELDS, ['file' => $file]);
    ?>

### FPM

Adicionado status de formato openmetrics. Ele pode ser usado pelo Prometheus para buscar métricas do FPM.

Adicionada nova opção de pool para o gerenciador de processo dinâmico chamada `pm.max_spawn_rate`. Ela permite iniciar uma série de filhos em um ritmo mais rápido quando pm dinâmico está selecionado. O valor padrão é `32` que era o valor codificado anterior.

### GD

Suporte Avif agora está disponível através de imagecreatefromavif() e imageavif(), se a libgd foi compilada com suporte Avif.

### Hash

As seguintes funções hash(), hash_file(), e hash_init() agora suportam um argumento opcional `options` adicional, que pode ser utilizado para passar dados específicos do algoritmo.

#### MurmurHash3

Adicionado suporte a `MurmurHash3` com suporte a fluxos. As seguintes variantes estão implementadas:

- murmur3a, hash 32-bit
- murmur3c, hash 128-bit para x86
- murmur3f, hash 128-bit para x64

O estado de hash inicial pode ser passado através da chave `seed` no array `options`, por exemplo:

    <?php
    $h = hash("murmur3f", $data, options: ["seed" => 42]);
    echo $h, "\n";
    ?>

Um valor semente válido está no intervalo de `0` até o `UINT_MAX` definido pela plataforma, geralmente `4294967295`.

#### xxHash

Adicionado suporte a `xxHash`. As seguintes variantes estão implementadas:

- xxh32, hash 32-bit
- xxh64, hash 64-bit
- xxh3, hash 64-bit
- xxh128, hash 128-bit

O estado inicial de hash pode ser passado através da chave `seed` no array `options`, por exemplo:

    <?php
    $h = hash("xxh3", $data, options: ["seed" => 42]);
    echo $h, "\n";
    ?>

O uso de segredo é suportado através da passagem do chave `secret` no array `options`, também:

    <?php
    $h = hash("xxh3", $data, options: ["secret" => "Segredo de pelo menos 136 bytes aqui"]);
    echo $h, "\n";
    ?>

A qualidade do segredo personalizado é crucial para a qualidade do hash resultante. É altamente recomendado usar a melhor entropia possível para o segredo.

### MySQLi

#### Nova diretiva INI `mysqli.local_infile_directory`

A diretiva INI mysqli.local_infile_directory foi adicionada, que pode ser usada para especificar um diretório a partir do qual os arquivos podem ser carregados. Só é significativo se mysqli.allow_local_infile não estiver habilitada, já que todos os diretórios são permitidos nesse caso.

#### Ligar parâmetros no execute

Agora é possível ligar parâmetros passando-os como um array para o mysqli_stmt::execute(). Todos os valores serão ligados como strings. Apenas arrays de lista são permitidos. Essa nova funcionalidade não está disponível quando MySQLi é compilado com libmysqlclient.

    <?php
    $stmt = $mysqli->prepare('INSERT INTO users(id, name) VALUES(?,?)');
    $stmt->execute([1, $username]);
    ?>

#### Novo método mysqli_result::fetch_column()

mysqli_result::fetch_column() foi adicionado para permitir buscar um único valor escalar do conjunto de resultados. O novo método aceita um parâmetro opcional baseado em 0 `column` do tipo int especificando de qual coluna buscar.

    <?php
    $result = $mysqli->query('SELECT username FROM users WHERE id = 123');
    echo $result->fetch_column();
    ?>

### PDO

O atributo `PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY` foi adicionado, que pode ser usado para especificar um diretório no qual os arquivos podem ser carregados. É significante apenas se `PDO::MYSQL_ATTR_LOCAL_INFILE` não estiver habilitada, já que todos os diretórios são permitidos nesse caso.

### PDO_SQLite

A sintaxe DSN `"file:"` do SQLite agora é suportada, que permite especificar flags adicionais. Essa funcionalidade não está disponível se open_basedir estiver definido.

    <?php
    new PDO('sqlite:file:caminho/para/sqlite.db?mode=ro')
    ?>

### POSIX

Adicionadas as constantes `POSIX_RLIMIT_KQUEUES` e `POSIX_RLIMIT_NPTS`. Esses "rlimits" estão disponíveis apenas no FreeBSD.

### Standard

fputcsv() agora aceita um novo argumento `eol` que permite a definição de uma sequência de fim de linha personalizada, o padrão continua o mesmo e é `"\n"`.

### SPL

SplFileObject::fputcsv() agora aceita um novo argumento `eol` que permite a definição de uma sequência de fim de linha personalizada, o padrão continua o mesmo e é `"\n"`.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open