update page now
Lançado!
PHP 8.4 é uma atualização importante da linguagem PHP.
Ela contém muitos novos recursos, como hooks de propriedade, visibilidade assimétrica, uma API DOM atualizada, melhorias de desempenho, correções de bugs e uma limpeza geral.

Hooks de Propriedade RFC Doc

PHP < 8.4
class Locale
{
    private string $languageCode;
    private string $countryCode;

    public function __construct(string $languageCode, string $countryCode)
    {
        $this->setLanguageCode($languageCode);
        $this->setCountryCode($countryCode);
    }

    public function getLanguageCode(): string
    {
        return $this->languageCode;
    }

    public function setLanguageCode(string $languageCode): void
    {
        $this->languageCode = $languageCode;
    }

    public function getCountryCode(): string
    {
        return $this->countryCode;
    }

    public function setCountryCode(string $countryCode): void
    {
        $this->countryCode = strtoupper($countryCode);
    }

    public function setCombinedCode(string $combinedCode): void
    {
        [$languageCode, $countryCode] = explode('_', $combinedCode, 2);

        $this->setLanguageCode($languageCode);
        $this->setCountryCode($countryCode);
    }

    public function getCombinedCode(): string
    {
        return \sprintf("%s_%s", $this->languageCode, $this->countryCode);
    }
}

$brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->getCountryCode()); // BR
var_dump($brazilianPortuguese->getCombinedCode()); // pt_BR
PHP 8.4
class Locale
{
    public string $languageCode;

    public string $countryCode
    {
        set (string $countryCode) {
            $this->countryCode = strtoupper($countryCode);
        }
    }

    public string $combinedCode
    {
        get => \sprintf("%s_%s", $this->languageCode, $this->countryCode);
        set (string $value) {
            [$this->languageCode, $this->countryCode] = explode('_', $value, 2);
        }
    }

    public function __construct(string $languageCode, string $countryCode)
    {
        $this->languageCode = $languageCode;
        $this->countryCode = $countryCode;
    }
}

$brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->countryCode); // BR
var_dump($brazilianPortuguese->combinedCode); // pt_BR
Hooks de Propriedade oferecem suporte para propriedades computadas que podem ser interpretadas nativamente por IDEs e ferramentas de análise estática, sem a necessidade de escrever comentários em docblocks que podem ficar desatualizados. Além disso, eles permitem o pré-processamento ou pós-processamento confiável de valores, sem precisar verificar se um getter ou setter correspondente existe na classe.

Visibilidade Assimétrica RFC Doc

PHP < 8.4
class PhpVersion
{
    private string $version = '8.3';

    public function getVersion(): string
    {
        return $this->version;
    }

    public function increment(): void
    {
        [$major, $minor] = explode('.', $this->version);
        $minor++;
        $this->version = "{$major}.{$minor}";
    }
}
PHP 8.4
class PhpVersion
{
    public private(set) string $version = '8.4';

    public function increment(): void
    {
        [$major, $minor] = explode('.', $this->version);
        $minor++;
        $this->version = "{$major}.{$minor}";
    }
}
O escopo para escrita em uma propriedade agora pode ser controlado independentemente do escopo para leitura da propriedade, reduzindo a necessidade de métodos getter redundantes para expor o valor de uma propriedade sem permitir sua modificação fora da classe.

#[\Deprecated] Atributo RFC Doc

PHP < 8.4
class PhpVersion
{
    /**
     * @deprecated 8.3 use PhpVersion::getVersion() instead
     */
    public function getPhpVersion(): string
    {
        return $this->getVersion();
    }

    public function getVersion(): string
    {
        return '8.3';
    }
}

$phpVersion = new PhpVersion();
// No indication that the method is deprecated.
echo $phpVersion->getPhpVersion();
PHP 8.4
class PhpVersion
{
    #[\Deprecated(
        message: "use PhpVersion::getVersion() instead",
        since: "8.4",
    )]
    public function getPhpVersion(): string
    {
        return $this->getVersion();
    }

    public function getVersion(): string
    {
        return '8.4';
    }
}

$phpVersion = new PhpVersion();
// Deprecated: Method PhpVersion::getPhpVersion() is deprecated since 8.4, use PhpVersion::getVersion() instead
echo $phpVersion->getPhpVersion();
O novo atributo #[\Deprecated] torna o mecanismo de descontinuação existente no PHP disponível para funções, métodos e constantes de classe definidas pelo usuário.

Novos recursos ext-dom e suporte a HTML5 RFC RFC Doc

PHP < 8.4
$dom = new DOMDocument();
$dom->loadHTML(
    <<<'HTML'
        <main>
            <article>PHP 8.4 is a feature-rich release!</article>
            <article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
        </main>
        HTML,
    LIBXML_NOERROR,
);

$xpath = new DOMXPath($dom);
$node = $xpath->query(".//main/article[not(following-sibling::*)]")[0];
$classes = explode(" ", $node->className); // Simplified
var_dump(in_array("featured", $classes)); // bool(true)
PHP 8.4
$dom = Dom\HTMLDocument::createFromString(
    <<<'HTML'
        <main>
            <article>PHP 8.4 is a feature-rich release!</article>
            <article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
        </main>
        HTML,
    LIBXML_NOERROR,
);

$node = $dom->querySelector('main > article:last-child');
var_dump($node->classList->contains("featured")); // bool(true)
Novas classes Dom\HTMLDocument, Dom\XMLDocument e métodos DOMNode::compareDocumentPosition(), DOMXPath::registerPhpFunctionNS(), DOMXPath::quote(), XSLTProcessor::registerPHPFunctionNS() estão disponíveis.

API de Objetos para BCMath RFC

PHP < 8.4
$num1 = '0.12345';
$num2 = '2';
$result = bcadd($num1, $num2, 5);

echo $result; // '2.12345'
var_dump(bccomp($num1, $num2) > 0); // false
PHP 8.4
use BcMath\Number;

$num1 = new Number('0.12345');
$num2 = new Number('2');
$result = $num1 + $num2;

echo $result; // '2.12345'
var_dump($num1 > $num2); // false

O novo objeto BcMath\Number permite o uso orientado a objetos e operadores matemáticos padrão ao trabalhar com números de precisão arbitrária.

Esses objetos são imutáveis e implementam a interface Stringable, então podem ser usados em contextos de string como echo $num.

Novas funções array_*() RFC

PHP < 8.4
$animal = null;
foreach (['dog', 'cat', 'cow', 'duck', 'goose'] as $value) {
    if (str_starts_with($value, 'c')) {
        $animal = $value;
        break;
    }
}

var_dump($animal); // string(3) "cat"
PHP 8.4
$animal = array_find(
    ['dog', 'cat', 'cow', 'duck', 'goose'],
    static fn(string $value): bool => str_starts_with($value, 'c'),
);

var_dump($animal); // string(3) "cat"
Novas funções array_find(), array_find_key(), array_any() e array_all() estão disponíveis.

Parsers SQL específicos para drivers PDO RFC

PHP < 8.4
$connection = new PDO(
    'sqlite:foo.db',
    $username,
    $password,
); // object(PDO)

$connection->sqliteCreateFunction(
    'prepend_php',
    static fn($string) => "PHP {$string}",
);

$connection->query('SELECT prepend_php(version) FROM php');
PHP 8.4
$connection = PDO::connect(
    'sqlite:foo.db',
    $username,
    $password,
); // object(Pdo\Sqlite)

$connection->createFunction(
    'prepend_php',
    static fn($string) => "PHP {$string}",
); // Does not exist on a mismatching driver.

$connection->query('SELECT prepend_php(version) FROM php');
Novas subclasses Pdo\Dblib, Pdo\Firebird, Pdo\MySql, Pdo\Odbc, Pdo\Pgsql, Pdo\Sqlite de PDO estão disponíveis.

new MyClass()->method() sem parênteses RFC Doc

PHP < 8.4
class PhpVersion
{
    public function getVersion(): string
    {
        return 'PHP 8.3';
    }
}

var_dump((new PhpVersion())->getVersion());
PHP 8.4
class PhpVersion
{
    public function getVersion(): string
    {
        return 'PHP 8.4';
    }
}

var_dump(new PhpVersion()->getVersion());
Propriedades e métodos de um objeto recém-instanciado agora podem ser acessados sem a necessidade de envolver a expressão new entre parênteses.

Novas classes, interfaces e funções

  • Novos Objetos de Inicialização Lenta.
  • Nova implementação JIT baseada no Framework IR.
  • Nova função request_parse_body().
  • Novas funções bcceil(), bcdivmod(), bcfloor() e bcround().
  • Novo Enum RoundingMode para round() com 4 novos modos de arredondamento: TowardsZero, AwayFromZero, NegativeInfinity e PositiveInfinity.
  • Novos métodos DateTime::createFromTimestamp(), DateTime::getMicrosecond(), DateTime::setMicrosecond(), DateTimeImmutable::createFromTimestamp(), DateTimeImmutable::getMicrosecond() e DateTimeImmutable::setMicrosecond().
  • Novas funções mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst() e mb_lcfirst().
  • Novas funções pcntl_getcpu(), pcntl_getcpuaffinity(), pcntl_getqos_class(), pcntl_setns() e pcntl_waitid().
  • Novos métodos ReflectionClassConstant::isDeprecated(), ReflectionGenerator::isClosed() e ReflectionProperty::isDynamic().
  • Novas funções http_get_last_response_headers(), http_clear_last_response_headers() e fpow().
  • Novos métodos XMLReader::fromStream(), XMLReader::fromUri(), XMLReader::fromString(), XMLWriter::toStream(), XMLWriter::toUri() e XMLWriter::toMemory().
  • Nova função grapheme_str_split().

Alterações obsoletas e incompatibilidades com versões anteriores

  • As extensões IMAP, OCI8, PDO_OCI e pspell foram separadas e movidas para o PECL.
  • Tipos de parâmetros implicitamente anuláveis agora estão obsoletos.
  • O uso de _ no nome da classe agora está obsoleto.
  • Elevar zero a um número negativo agora está obsoleto.
  • Passar um modo inválido para round() agora lança um ValueError.
  • As constantes de classe das extensões date, intl, pdo, reflection, spl, sqlite, xmlreader agora são tipadas.
  • A classe GMP agora é final.
  • As constantes MYSQLI_SET_CHARSET_DIR, MYSQLI_STMT_ATTR_PREFETCH_ROWS, MYSQLI_CURSOR_TYPE_FOR_UPDATE, MYSQLI_CURSOR_TYPE_SCROLLABLE e MYSQLI_TYPE_INTERVAL foram removidas.
  • As funções mysqli_ping(), mysqli_kill(), mysqli_refresh(), os métodos mysqli::ping(), mysqli::kill(), mysqli::refresh() e as constantes MYSQLI_REFRESH_* estão obsoletas.
  • stream_bucket_make_writeable() e stream_bucket_new() agora retornam uma instância de StreamBucket em vez de stdClass.
  • Alteração de comportamento no uso de exit().
  • A constante E_STRICT está obsoleta.
To Top