PHP 8.4.1 Released!

Novos Recursos

PHP Core

Propriedades tipadas

As propriedades de classe agora suportam declarações de tipo.

<?php
class User {
public
int $id;
public
string $name;
}
?>
O exemplo acima reforçará que $user->id pode ser atribuído apenas com valores int e $user->name somente com valores de string.

Arrow functions

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);
?>

Covariância do tipo de retorno limitado e contravariância do tipo de argumento

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 {}
}
?>
O suporte completo à variação só está disponível se o carregamento automático for usado. Dentro de um único arquivo, apenas as referências de tipo não cíclico são possíveis, porque todas as classes precisam estar disponíveis antes de serem referenciadas.

Operador de atribuição de coalescência nula

<?php
$array
['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
?>

Descompactando dentro de arrays

<?php
$parts
= ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
?>

Separador literal numérico

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

Referências fracas permitem que o programador mantenha uma referência a um objeto que não impede que o objeto seja destruído.

Permitir exceções de __toString()

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.

CURL

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.

Filter

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

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.

GD

Adicionado o filtro de imagem IMG_FILTER_SCATTER para aplicar um filtro de dispersão às imagens.

Hash

Adicionado o hash crc32c usando o polinômio de Castagnoli. Essa variante CRC32 é usada por sistemas de armazenamento, como iSCSI, SCTP, Btrfs e ext4.

Multibyte String

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.

Expressões Regulares (Compatíveis com Perl)

As funções preg_replace_callback() e preg_replace_callback_array() agora aceitam um argumento flags adicional, com suporte para as constantes 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.

PDO

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 (?).

PDO_OCI

PDOStatement::getColumnMeta() agora está disponível.

PDO_SQLite

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().

SQLite3

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.

Standard

strip_tags() com array de nomes de tags

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']).

Serialização de objetos personalizados

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;
?>
O novo mecanismo de serialização substitui a interface Serializable, que será descontinuada no futuro.

Funções de mesclagem de array sem argumentos

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).

Função proc_open()

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);
?>

argon2i(d) sem libargon

password_hash() agora possui as implementações argon2i e argon2id da extensão sodium quando o PHP é compilado sem libargon.

adicione uma nota

Notas Enviadas por Usuários (em inglês) 2 notes

up
98
Rain
4 years ago
It should be noted that typed properties internally are never initialized to a default null. Unless of course you initialize them to null yourself. That's why you will always going to encounter this error if you try to access them before initialization.

**Typed property foo::$bar must not be accessed before initialization**

<?php
class User
{
public
$id;
public
string $name; // Typed property (Uninitialized)
public ?string $age = null; // Typed property (Initialized)
}

$user = new User;
var_dump(is_null($user->id)); // bool(true)
var_dump(is_null($user->name)); // PHP Fatal error: Typed property User::$name must not be accessed before initialization
var_dump(is_null($user->age));// bool(true)
?>

Another thing worth noting is that it's not possible to initialize a property of type object to anything other than null. Since the evaluation of properties happens at compile-time and object instantiation happens at runtime. One last thing, callable type is not supported due to its context-dependent behavior.
up
7
wow-apps.pro
4 years ago
<?php

// How to get property type? For example for testing:

class Foo
{
private
int $num;
private
bool $isPositive;
private
$notes;
}

$reflection = new \ReflectionClass(Foo::class);
$classProperties = $reflection->getProperties(\ReflectionProperty::IS_PRIVATE);
foreach (
$classProperties as $classProperty) {
var_dump((string) $classProperty->getType());
}

/**
* Result:
* "int"
* "bool"
* ""
*/
To Top