PHPCon Poland 2024

Outras mudanças

Melhorias de desempenho

PHP Core

Um opcode VM especializado para a função array_key_exists() foi adicionado, o que melhora o desempenho desta função se ela puder ser resolvida estaticamente. No código com namespace, pode ser necessário escrever \array_key_exists() ou importar explicitamente a função.

Expressões regulares (Compatível com Perl)

Quando preg_match() no modo UTF-8 (modificador "u") é chamado repetidamente na mesma string (mas possivelmente deslocamentos diferentes), ele só será verificado para a validade UTF-8 uma vez.

Alterações na manipulação de arquivos INI

zend.exception_ignore_args é uma nova diretiva INI para incluir ou excluir argumentos de rastreamentos de pilha gerados a partir de exceções.

opcache.preload_user é uma nova diretiva INI para especificar a conta de usuário sob a qual o código de pré-carregamento é executado se, de outra forma, for executado como root (o que não é permitido por motivos de segurança).

Migração para pkg-config

Várias extensões foram migradas para usar exclusivamente pkg-config para a detecção de dependências de biblioteca. Geralmente, isso significa que, em vez de usar --with-foo-dir=DIR ou similar, apenas --with-foo é usado. Os caminhos de biblioteca personalizados podem ser especificados adicionando diretórios adicionais a PKG_CONFIG_PATH ou especificando explicitamente as opções de compilação por meio de FOO_CFLAGS e FOO_LIBS.

As seguintes extensões e SAPIs são afetadas:

  • CURL:
    • --with-curl não aceita mais um diretório.
  • Enchant:
    • --with-enchant não aceita mais um diretório.
  • FPM:
    • --with-fpm-systemd agora usa apenas pkg-config para verificações do libsystem. A versão mínima exigida do libsystemd é 209.
  • GD:
    • --with-gd torna-se --enable-gd (se para habilitar a extensão) e --with-external-gd (para optar por usar um libgd externo, em vez do empacotado).
    • --with-png-dir foi removido. libpng é obrigatório.
    • --with-zlib-dir foi removido. zlib é necessário.
    • --with-freetype-dir torna-se --with-freetype
    • --with-jpeg-dir torna-se --with-jpeg
    • --with-webp-dir torna-se --with-webp
    • --with-xpm-dir torna-se --with-xpm
  • IMAP:
    • --with-kerberos-systemd não aceita mais um diretório.
  • Intl:
    • --with-icu-dir foi removido. Se --enable-intl é passado, então libicu é sempre necessário.
  • LDAP:
    • --with-ldap-sasl não aceita mais um diretório.
  • Libxml:
    • --with-libxml-dir foi removido.
    • --enable-libxml torna-se --with-libxml.
    • --with-libexpat-dir foi renomeado para --with-expat e não aceita mais um diretório.
  • Litespeed:
    • --with-litespeed torna-se --enable-litespeed.
  • Mbstring:
    • --with-onig foi removido. A menos que --disable-mbregex foi passado, libonig é necessário.
  • ODBC:
    • --with-iodbc não aceita mais um diretório.
    • --with-unixODBC sem um diretório agora usa pkg-config (preferencial). O diretório ainda é aceito para versões antigas sem libodbc.pc.
  • OpenSSL:
    • --with-openssl não aceita mais um diretório.
  • PCRE:
    • --with-pcre-regex foi removido. Em vez disso, --with-external-pcre é fornecido para optar por usar uma biblioteca PCRE externa, em vez do pacote.
  • PDO_SQLite:
    • --with-pdo-sqlite não aceita mais um diretório.
  • Readline:
    • --with-libedit não aceita mais um diretório.
  • Sodium:
    • --with-sodium não aceita mais um diretório.
  • SQLite3:
    • --with-sqlite3 não aceita mais um diretório.
  • XSL:
    • --with-xsl não aceita mais um diretório.
  • Zip:
    • --with-libzip foi removido.
    • --enable-zip torna-se --with-zip.

CSV escaping

fputcsv(), fgetcsv(), SplFileObject::fputcsv(), SplFileObject::fgetcsv(), e SplFileObject::setCsvControl() agora aceitam uma string vazia como argumento $escape, que desativa o mecanismo de escape proprietário do PHP.

O comportamento de str_getcsv() foi ajustado adequadamente (anteriormente, uma string vazia era idêntica a usar o padrão).

SplFileObject::getCsvControl() agora também pode retornar uma string vazia para o terceiro elemento do array, adequadamente.

Filtragem de Dados

A extensão filter não expõe mais --with-pcre-dir para compilações Unix e agora pode ser construída de forma confiável como compartilhada ao usar ./configure

GD

O comportamento de imagecropauto() no pacote libgd foi sincronizado com o do sistema libgd:

  • IMG_CROP_DEFAULT não está mais voltando para IMG_CROP_SIDES
  • Threshold-cropping agora usa o algoritmo do sistema libgd

O parâmetro $mode padrão de ] imagecropauto() foi alterado para IMG_CROP_DEFAULT; passar -1 agora está descontinuado.

imagescale() agora oferece suporte à proporção preservando a escala para uma altura fixa passando -1 como $new_width.

HASH Message Digest Framework

A extensão hash não pode mais ser desativada e é sempre parte integrante de qualquer compilação do PHP, semelhante à extensão date.

Intl

A extensão intl agora requer pelo menos ICU 50.1.

ResourceBundle agora implementa Countable.

Lightweight Directory Access Protocol

O suporte para nsldap e umich_ldap foi removido.

Libxml

Todas as extensões baseadas em libxml agora requerem libxml 2.7.6 ou mais recente.

Multibyte String

A biblioteca oniguruma não é mais empacotada com o PHP, em vez disso libonig precisa estar disponível no sistema. Alternativamente, --disable-mbregex pode ser usado para desabilitar o componente mbregex.

OPcache

As opções de configuração --disable-opcache-file e --enable-opcache-file foram removidas em favor da diretiva INI opcache.file_cache.

Password Hashing

As funções password_hash() e password_needs_rehash() agora aceitam string anulável e int para o argumento $algo.

PEAR

A instalação do PEAR (incluindo PECL) não é mais habilitada por padrão. Ele pode ser ativado explicitamente usando --with-pear. Esta opção está descontinuada e pode ser removida no futuro.

Reflection

Os valores numéricos das constantes do modificador (IS_ABSTRACT, IS_DEPRECATED, IS_EXPLICIT_ABSTRACT, IS_FINAL, IS_IMPLICIT_ABSTRACT, IS_PRIVATE, IS_PROTECTED, IS_PUBLIC, e IS_STATIC) nas classes ReflectionClass, ReflectionFunction, ReflectionMethod, ReflectionObject, e ReflectionProperty foram alterados.

SimpleXML

SimpleXMLElement agora implementa Countable.

SQLite3

O pacote libsqlite foi removido. Para construir a extensão SQLite3, um sistema libsqlite3 ≥ 3.7.4 agora é necessário. Para construir a extensão PDO_SQLite, um sistema libsqlite3 ≥ 3.5.0 agora é necessário.

A serialização e desserialização de SQLite3, SQLite3Stmt e SQLite3Result agora são explicitamente proibidas. Anteriormente, a serialização de instâncias dessas classes era possível, mas a desserialização produzia objetos inutilizáveis.

A notação @param agora também pode ser usada para denotar parâmetros de consulta SQL.

Zip

A biblioteca libzip empacotada foi removida. Um sistema libzip >= 0.11 agora é necessário para construir a extensão zip.

add a note

User Contributed Notes 3 notes

up
2
Florent H (Sowapps)
4 years ago
This version brings an important changes with the directive zend.exception_ignore_args set to On by default.
In all stack traces, the args key is now missing.
All php frameworks have to handle this to report errors & exceptions.
up
1
ohcc at 163 dot com
4 years ago
As of PHP 7.4, an exception thrown within the user-defined shutdown function can be caught by the user-defined exception handler.

<?php
set_error_handler
(
function(
$level, $error, $file, $line){
if(
0 === error_reporting()){
return
false;
}
throw new
ErrorException($error, -1, $level, $file, $line);
},
E_ALL
);

register_shutdown_function(function(){
$error = error_get_last();
if(
$error){
throw new
ErrorException($error['message'], -1, $error['type'], $error['file'], $error['line']);
}
});

set_exception_handler(function($exception){
// ... more code ...
});

require
'NotExists.php';
up
0
santi at mola dot io
3 years ago
Note for internals/extensions:

Many opcode values changed between PHP 7.3 and 7.4, so most documentation resources are outdated in that regard. You can look the definitions at Zend/zend_vm_opcodes.h in php-src. For example, ZEND_ECHO changes from 40 to 136.

While opcode changes happen in a lot of PHP versions, the change in 7.4 is quite significant.
To Top