[web-php] master: Preparing PHP 8.4 announcement page (#1079)
| From: | Sergey Panteleev via GitHub | Date: | Tue, 19 Nov 2024 17:39:00 +0000 |
| Subject: | [web-php] master: Preparing PHP 8.4 announcement page (#1079) | ||
| Groups: | php.webmaster | ||
| Request: | Send a blank email to php-webmaster+get-32282@lists.php.net to get a copy of this message | ||
Author: Sergey Panteleev (saundefined)
Committer: GitHub (web-flow)
Pusher: saundefined
Date: 2024-11-19T20:34:44+03:00
Commit: https://github.com/php/web-php/commit/039acc1453f2348f10545e58cf1bca833407e6b7
Raw diff: https://github.com/php/web-php/commit/039acc1453f2348f10545e58cf1bca833407e6b7.diff
Preparing PHP 8.4 announcement page (#1079)
Co-authored-by: Tim Düsterhus <tim@bastelstu.be>
Co-authored-by: Gina Peter Banyard <girgias@php.net>
Co-authored-by: Jorg Adam Sowa <jorg.sowa@gmail.com>
Co-authored-by: Tim Düsterhus <timwolla@googlemail.com>
Co-authored-by: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Co-authored-by: Roman Pronskiy <roman@pronskiy.com>
Co-authored-by: Theodore Brown <theodorejb@outlook.com>
Co-authored-by: Marcos Marcolin <marcos@ixcsoft.com.br>
Co-authored-by: andresayac <andresayac@gmail.com>
Co-authored-by: Marcos Marcolin <48370677+marcosmarcolin@users.noreply.github.com>
Co-authored-by: Borislav Kosun <kosun.b@yandex.com>
Changed paths:
A images/php8/logo_php8_4.svg
A images/php8/php_8_4_released.png
A releases/8.4/common.php
A releases/8.4/en.php
A releases/8.4/es.php
A releases/8.4/index.php
A releases/8.4/languages/en.php
A releases/8.4/languages/es.php
A releases/8.4/languages/nl.php
A releases/8.4/languages/pt_BR.php
A releases/8.4/languages/ru.php
A releases/8.4/nl.php
A releases/8.4/pt_BR.php
A releases/8.4/release.inc
A releases/8.4/ru.php
M tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-archive-1998-php-chromium.png
M tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-conferences-index-php-chromium.png
M tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-index-php-chromium.png
M tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-index-php-chromium.png
M tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-php5-php-chromium.png
M tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-0-index-php-chromium.png
M tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-1-index-php-chromium.png
M tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-2-index-php-chromium.png
M tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-6-php-chromium.png
M tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-index-php-chromium.png
Diff:
diff --git a/images/php8/logo_php8_4.svg b/images/php8/logo_php8_4.svg
new file mode 100644
index 0000000000..9ca76c1c05
--- /dev/null
+++ b/images/php8/logo_php8_4.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg"
width="451" height="127" fill="none" viewBox="0 0 451
127">
+ <path fill="#fff" fill-rule="evenodd" d="M21.7998
125.799h-21l18.7-96.0998h40.3c12.1 0 21 3.2 26.5 9.5 5.6 6.4 7.2 15.2 5 26.7-.9 4.7-2.5 9-4.6
12.9-2.2 3.9-5 7.5-8.5 10.7-4.2 3.9-8.8 6.7-13.9 8.4-5.1 1.7-11.6 2.4998-19.6 2.4998h-18l-4.9
25.4Zm45.9-76.5998c-2.7-2.9-8-4.4-15.9-4.4h-14.3l-7.8 40.3h12.7c8.4 0 14.7-1.6 18.9-4.8 4.1-3.2
6.9-8.5 8.4-15.9 1.3-7.2.6-12.2-2-15.2Z" clip-rule="evenodd"/>
+ <path fill="#fff" d="M106.6 4.09961h20.8l-5 25.59999h18.5c11.7 0 19.7 2 24.1
6.1 4.4 4.1 5.8 10.7 4 19.8L160.3
100.4h-21.1l8.3-42.6004c.9-4.8.6-8.1-1-9.9-1.6-1.8-5.1-2.6-10.4-2.6h-16.6L108.8 100.4H87.9004L106.6
4.09961Z"/>
+ <path fill="#fff" fill-rule="evenodd" d="M185.2
125.799h-21l18.7-96.0998h40.4c12.1 0 21 3.2 26.5 9.5 5.6 6.4 7.2 15.2 5 26.7-.9 4.7-2.5 9-4.6
12.9-2.2 3.9-5 7.5-8.5 10.7-4.2 3.9-8.8 6.7-13.9 8.4-5.1 1.7-11.6 2.4998-19.6 2.4998h-18l-5
25.4Zm46-76.5998c-2.7-2.9-8-4.4-15.9-4.4h-14.4l-7.8 40.3h12.7c8.4 0 14.7-1.6 18.9-4.8 4.1-3.2
6.9-8.5 8.4-15.9 1.3-7.2.7-12.2-1.9-15.2Z" clip-rule="evenodd"/>
+ <path fill="#fff" d="M317.5 48.5c-5.7-13.6-10.5-25.4-5.8-33.6 1.8-2.5 3.8-3.8
6-3.8 4.5 0 8.6 4.9 8.6 4.9l5.7 6.9-3.6-8.2c-.2-.3-6.3-14.2-17.2-14.2-3.8 0-7.8 1.7-11.7
5.1l-.1.1c-9.5 11-.2 31.8 8.1 50.1l6.1 14.2c2.8 7.3 5.6 16 3.9 22.4-2.6 10-11.5 16.8-11.6 16.9l-5.7
4.4 6.9-2.2c.7-.2 16-5.2 19.7-18.5 2.3-10.9-.6-21.8-3.5-30.2.4-.3-.4.3 0 0L318 49.1"/>
+ <path fill="#0F0F0F" d="m334.4 9.89961-7.1-7.8 5.1 9.29999c.1.1 6.3 11.7-1.6
25.2-2.9 4.2-7.4 8.4-13.1 12.6l-10.3 6.7c-.1-.1-.1-.2 0 0l-.4.3c-11.5 6.6-22.2 10.6-22.4 10.7-15.9
7.1-25.9 18.1-27.3 30.3-1.1 9.2004 3.2 18.2004 11.6 24.5004l.1.1c5.3 3.2 11 4.8 17 4.8 15.7 0
28-10.9 28.5-11.4l7.7-6.9-9.1 4.8c-.1 0-7.7 4-15.6 4-7.1 0-12.1-3.1-15.1-9.4-3.8-13.4004 9.5-22.6004
24.8-33.2004 2-1.4 4.1-2.9 6.2-4.3l.1-.1 9.1-6.8c.1-.2.4-.4.4-.4 7.5-6.2 17.4-15.9 19.7-29.5
1.8-12.3-7.9-23-8.3-23.49999Z"/>
+ <path fill="#fff" d="M345.4 83h19.5l-3.5 17.7h-19.5l3.5-17.7Z"/>
+ <path fill="#fff"
d="M423.85546875,50.75292969c1.28125-6.44580078,2.85058594-13.86523438,4.17089844-19.10791016h-.53613281c-3.71289062,4.95507812-7.65429688,10.38720703-11.63574219,15.09375l-16.53515625,18.59521484h49.98535156l-3.00097656,15.17285156h-70.05371094l2.71289062-13.81347656,45.89941406-51.03125h24.03125l-16.90429688,85.03613281h-17.86621094l9.73242188-49.9453125Z"/>
+</svg>
diff --git a/images/php8/php_8_4_released.png b/images/php8/php_8_4_released.png
new file mode 100644
index 0000000000..3dc88ee1b4
Binary files /dev/null and b/images/php8/php_8_4_released.png differ
diff --git a/releases/8.4/common.php b/releases/8.4/common.php
new file mode 100644
index 0000000000..3a439f2815
--- /dev/null
+++ b/releases/8.4/common.php
@@ -0,0 +1,74 @@
+<?php
+
+declare(strict_types=1);
+
+namespace releases\php84;
+
+include_once __DIR__ . '/../../include/prepend.inc';
+
+const LANGUAGES = [
+ 'en' => 'English',
+ 'ru' => 'Russian',
+ 'pt_BR' => 'Português do Brasil',
+ 'nl' => 'Nederlands',
+ 'es' => 'Spanish',
+];
+
+function common_header(string $description): void {
+ global $MYSITE;
+
+ $meta_image_path = \htmlspecialchars(
+ \filter_var($MYSITE . 'images/php8/php_8_4_released.png', \FILTER_VALIDATE_URL));
+ $meta_description = \htmlspecialchars($description);
+
+ \site_header("PHP 8.4.0 Release Announcement", [
+ 'current' => 'php8',
+ 'css' => ['php8.css'],
+ 'meta_tags' => <<<META
+<meta name="twitter:card" content="summary_large_image" />
+<meta name="twitter:site" content="@official_php" />
+<meta name="twitter:title" content="PHP 8.4 Released" />
+<meta name="twitter:description" content="{$meta_description}" />
+<meta name="twitter:creator" content="@official_php" />
+<meta name="twitter:image:src" content="{$meta_image_path}" />
+
+<meta itemprop="name" content="PHP 8.4 Released" />
+<meta itemprop="description" content="{$meta_description}" />
+<meta itemprop="image" content="{$meta_image_path}" />
+
+<meta property="og:image" content="{$meta_image_path}" />
+<meta property="og:description" content="{$meta_description}" />
+META
+ ]);
+}
+
+function language_chooser(string $currentLang): void {
+ // Print out the form with all the options
+ echo '
+ <form action="" method="get" id="changelang"
name="changelang">
+ <fieldset>
+ <label for="changelang-langs">Change language:</label>
+ <select onchange="location = this.value + \'.php\'"
name="lang" id="changelang-langs">
+';
+
+ $tab = ' ';
+ foreach (LANGUAGES as $lang => $text) {
+ $selected = ($lang === $currentLang) ? ' selected="selected"' :
'';
+ echo $tab, "<option
value='$lang'$selected>$text</option>\n";
+ }
+
+ echo ' </select>
+ </fieldset>
+ </form>
+';
+}
+
+function message($code, $language = 'en')
+{
+ $original = require __DIR__ . '/languages/en.php';
+ if (($language !== 'en') && file_exists(__DIR__ . '/languages/' .
$language . '.php')) {
+ $translation = require __DIR__ . '/languages/' . $language . '.php';
+ }
+
+ return $translation[$code] ?? $original[$code] ?? $code;
+}
diff --git a/releases/8.4/en.php b/releases/8.4/en.php
new file mode 100644
index 0000000000..7ff380e63b
--- /dev/null
+++ b/releases/8.4/en.php
@@ -0,0 +1,5 @@
+<?php
+
+$lang = 'en';
+
+include_once __DIR__ . '/release.inc';
diff --git a/releases/8.4/es.php b/releases/8.4/es.php
new file mode 100644
index 0000000000..70a1a68670
--- /dev/null
+++ b/releases/8.4/es.php
@@ -0,0 +1,5 @@
+<?php
+
+$lang = 'es';
+
+include_once __DIR__ . '/release.inc';
diff --git a/releases/8.4/index.php b/releases/8.4/index.php
new file mode 100644
index 0000000000..ee9f915c90
--- /dev/null
+++ b/releases/8.4/index.php
@@ -0,0 +1,13 @@
+<?php
+
+use phpweb\LangChooser;
+use const releases\php84\LANGUAGES;
+
+$_SERVER['BASE_PAGE'] = 'releases/8.4/index.php';
+require_once __DIR__ . '/common.php';
+require_once __DIR__ . '/../../src/autoload.php';
+
+$langChooser = new LangChooser(LANGUAGES, [], "", "");
+[$lang,] = $langChooser->chooseCode("", "",
$_SERVER['HTTP_ACCEPT_LANGUAGE']);
+
+mirror_redirect("/releases/8.4/$lang.php");
diff --git a/releases/8.4/languages/en.php b/releases/8.4/languages/en.php
new file mode 100644
index 0000000000..0db7d60915
--- /dev/null
+++ b/releases/8.4/languages/en.php
@@ -0,0 +1,55 @@
+<?php
+
+return [
+ 'common_header' => 'PHP 8.4 is a major update of the PHP language. It
contains many new features, such as property hooks, asymmetric visibility, an updated DOM API,
performance improvements, bug fixes, and general cleanup.',
+ 'documentation' => 'Doc',
+ 'main_title' => 'Released!',
+ 'main_subtitle' => 'PHP 8.4 is a major update of the PHP language.<br
class="display-none-md"> It contains many new features, such as property hooks,
asymmetric visibility, an updated DOM API, performance improvements, bug fixes, and general
cleanup.',
+ 'upgrade_now' => 'Upgrade to PHP 8.4 now!',
+
+ 'property_hooks_title' => 'Property hooks',
+ 'property_hooks_description' => 'Property hooks provide support for computed
properties that can natively be understood by IDEs and static analysis tools, without needing to
write docblock comments that might go out of sync. Furthermore, they allow reliable pre- or
post-processing of values, without needing to check whether a matching getter or setter exists in
the class.',
+ 'asymmetric_visibility_title' => 'Asymmetric Visibility',
+ 'asymmetric_visibility_description' => 'The scope to write to a property may
now be controlled independently from the scope to read the property, reducing the need for
boilerplate getter methods to expose a property’s value without allowing modification from the
outside of a class.',
+ 'deprecated_attribute_title' => '<code>#[\Deprecated]</code>
Attribute',
+ 'deprecated_attribute_description' => 'The new
<code>#[\Deprecated]</code> attribute makes PHP’s existing deprecation mechanism
available to user-defined functions, methods, and class constants.',
+ 'dom_additions_html5_title' => 'New ext-dom features and HTML5 support',
+ 'dom_additions_html5_description' => '<p>New DOM API that includes
standards-compliant support for parsing HTML5 documents, fixes several long-standing compliance bugs
in the behavior of the DOM functionality, and adds several functions to make working with documents
more convenient.</p><p>The new DOM API is available within the
<code>Dom</code> namespace. Documents using the new DOM API can be created using the
<code>Dom\HTMLDocument</code> and <code>Dom\XMLDocument</code>
classes.</p>',
+ 'new_array_find_title' => 'New <code>array_*()</code>
functions',
+ 'new_array_find_description' => 'New functions <a
href="/manual/en/function.array-find.php"><code>array_find()</code></a>,
<a
href="/manual/en/function.array-find-key.php"><code>array_find_key()</code></a>,
<a
href="/manual/en/function.array-any.php"><code>array_any()</code></a>,
and <a
href="/manual/en/function.array-all.php"><code>array_all()</code></a>
are available.',
+ 'pdo_driver_specific_parsers_title' => 'PDO Driver specific SQL
parsers',
+ 'pdo_driver_specific_parsers_description' => 'New subclasses
<code>Pdo\Dblib</code>, <code>Pdo\Firebird</code>,
<code>Pdo\MySql</code>, <code>Pdo\Odbc</code>, and
<code>Pdo\Sqlite</code> of <code>PDO</code> are available.',
+ 'new_without_parentheses_title' => '<code>new
MyClass()->method()</code> without parentheses',
+ 'new_without_parentheses_description' => 'Properties and methods of a newly
instantiated object can now be accessed without wrapping the <code>new</code> expression
in parenthesis.',
+
+ 'new_classes_title' => 'New Classes, Interfaces, and Functions',
+ 'new_jit_implementation' => 'New JIT implementation based on IR
Framework',
+ 'new_core_functions' => 'New <code>request_parse_body()</code>
function.',
+ 'new_bcmath_functions' => 'New <code>bcceil()</code>,
<code>bcdivmod()</code>, <code>bcfloor()</code>, and
<code>bcround()</code> functions.',
+ 'new_round_modes' => 'New <code>RoundingMode</code> enum for
<code>round()</code> with 4 new rounding modes <code>TowardsZero</code>,
<code>AwayFromZero</code>, <code>NegativeInfinity</code>, and
<code>PositiveInfinity</code>.',
+ 'new_date_functions' => 'New
<code>DateTime::createFromTimestamp()</code>,
<code>DateTime::getMicrosecond()</code>,
<code>DateTime::setMicrosecond()</code>,
<code>DateTimeImmutable::createFromTimestamp()</code>,
<code>DateTimeImmutable::getMicrosecond()</code>, and
<code>DateTimeImmutable::setMicrosecond()</code> methods.',
+ 'new_mb_functions' => 'New <code>mb_trim()</code>,
<code>mb_ltrim()</code>, <code>mb_rtrim()</code>,
<code>mb_ucfirst()</code>, and <code>mb_lcfirst()</code> functions.',
+ 'new_pcntl_functions' => 'New <code>pcntl_getcpu()</code>,
<code>pcntl_getcpuaffinity()</code>, <code>pcntl_getqos_class()</code>,
<code>pcntl_setns()</code>, and <code>pcntl_waitid()</code>
functions.',
+ 'new_reflection_functions' => 'New
<code>ReflectionClassConstant::isDeprecated()</code>,
<code>ReflectionGenerator::isClosed()</code>, and
<code>ReflectionProperty::isDynamic()</code> methods.',
+ 'new_standard_functions' => 'New
<code>http_get_last_response_headers()</code>,
<code>http_clear_last_response_headers()</code>, and <code>fpow()</code>
functions.',
+ 'new_xml_functions' => 'New <code>XMLReader::fromStream()</code>,
<code>XMLReader::fromUri()</code>, <code>XMLReader::fromString()</code>,
<code>XMLWriter::toStream()</code>, <code>XMLWriter::toUri()</code>, and
<code>XMLWriter::toMemory()</code> methods.',
+ 'new_grapheme_function' => 'New <code>grapheme_str_split()</code>
function.',
+
+ 'bc_title' => 'Deprecations and backward compatibility breaks',
+ 'bc_pecl' => 'The IMAP, OCI8, PDO_OCI, and pspell extensions have been
unbundled and moved to PECL.',
+ 'bc_nullable_parameter_types' => 'Implicitly nullable parameter types are now
deprecated.',
+ 'bc_classname' => 'Using <code>_</code> as a class name is now
deprecated.',
+ 'bc_zero_raised_to_negative_number' => 'Raising zero to the power of a
negative number is now deprecated.',
+ 'bc_gmp' => '<code>GMP</code> class is now final.',
+ 'bc_round' => 'Passing invalid mode to <code>round()</code>
throws <code>ValueError</code>.',
+ 'bc_typed_constants' => 'Class constants from extensions
<code>date</code>, <code>intl</code>, <code>pdo</code>,
<code>reflection</code>, <code>spl</code>, <code>sqlite</code>,
<code>xmlreader</code> are typed now.',
+ 'bc_mysqli_constants' => '<code>MYSQLI_SET_CHARSET_DIR</code>,
<code>MYSQLI_STMT_ATTR_PREFETCH_ROWS</code>,
<code>MYSQLI_CURSOR_TYPE_FOR_UPDATE</code>,
<code>MYSQLI_CURSOR_TYPE_SCROLLABLE</code>, and
<code>MYSQLI_TYPE_INTERVAL</code> constants have been removed.',
+ 'bc_mysqli_functions' => '<code>mysqli_ping()</code>,
<code>mysqli_kill()</code>, <code>mysqli_refresh()</code> functions,
<code>mysqli::ping()</code>, <code>mysqli::kill()</code>,
<code>mysqli::refresh()</code> methods, and <code>MYSQLI_REFRESH_*</code>
constants have been deprecated.',
+ 'bc_standard' => '<code>stream_bucket_make_writeable()</code> and
<code>stream_bucket_new()</code> now return an instance of
<code>StreamBucket</code> instead of <code>stdClass</code>.',
+ 'bc_core' => '<a
href="/manual/en/migration84.incompatible.php#migration84.incompatible.core.exit"><code>exit()</code>
behavioral change</a>.',
+ 'bc_warnings' => '<code>E_STRICT</code> constant has been
deprecated.',
+
+ 'footer_title' => 'Better performance, better syntax, improved type
safety.',
+ 'footer_description' => '<p>For source downloads of PHP 8.4 please
visit the <a href="/downloads">downloads</a> page. Windows binaries can be
found on the <a href="https://windows.php.net/download">PHP for
Windows</a> site. The list of changes is recorded in the <a
href="/ChangeLog-8.php#PHP_8_4">ChangeLog</a>.</p>
+ <p>The <a href="/manual/en/migration84.php">migration guide</a>
is available in the PHP Manual. Please consult it for a detailed list of new features and
backward-incompatible changes.</p>',
+];
diff --git a/releases/8.4/languages/es.php b/releases/8.4/languages/es.php
new file mode 100644
index 0000000000..2f881a8260
--- /dev/null
+++ b/releases/8.4/languages/es.php
@@ -0,0 +1,55 @@
+<?php
+
+return [
+ 'common_header' => 'PHP 8.4 es una actualización importante del lenguaje
PHP. Contiene muchas características nuevas, como hooks para propiedades, visibilidad asimétrica,
una API DOM actualizada, mejoras de rendimiento, correcciones de errores y limpieza general.',
+ 'documentation' => 'Documentación',
+ 'main_title' => '¡Lanzado!',
+ 'main_subtitle' => 'PHP 8.4 es una actualización importante del lenguaje
PHP.<br class="display-none-md"> Contiene muchas características nuevas, como hooks
para propiedades, visibilidad asimétrica, una API DOM actualizada, mejoras de rendimiento,
correcciones de errores y limpieza general.',
+ 'upgrade_now' => '¡Actualiza a PHP 8.4 ahora!',
+
+ 'property_hooks_title' => 'Hooks para Propiedades',
+ 'property_hooks_description' => 'Los hooks para propiedades proporcionan
soporte para propiedades calculadas que pueden ser comprendidas nativamente por los IDE y las
herramientas de análisis estático, sin necesidad de escribir comentarios docblock que podrían
desincronizarse. Además, permiten un preprocesamiento o postprocesamiento fiable de los valores,
sin necesidad de comprobar si existe un getter o setter coincidente en la clase.',
+ 'asymmetric_visibility_title' => 'Visibilidad asimétrica',
+ 'asymmetric_visibility_description' => 'El alcance para escribir en una
propiedad ahora se puede controlar independientemente del alcance para leer la propiedad, lo que
reduce la necesidad de métodos getter repetitivos para exponer el valor de una propiedad sin
permitir modificaciones desde fuera de una clase.',
+ 'deprecated_attribute_title' => 'Atributo
<code>#[\Deprecated]</code>',
+ 'deprecated_attribute_description' => 'El nuevo atributo
<code>#[\Deprecated]</code> hace que el mecanismo de obsolescencia existente de PHP
esté disponible para funciones, métodos y constantes de clase definidas por el usuario.',
+ 'dom_additions_html5_title' => 'Nuevas características de ext-dom y soporte
para HTML5',
+ 'dom_additions_html5_description' => '<p>Nueva API DOM que incluye
soporte conforme a los estándares para el análisis de documentos HTML5, corrige varios errores de
cumplimiento antiguos en el comportamiento de la funcionalidad DOM, y añade varias funciones para
hacer más conveniente trabajar con documentos.</p><p>La nueva API DOM está disponible
dentro del espacio de nombres <code>Dom</code>. Los documentos que utilizan la nueva API
DOM pueden ser creados utilizando las clases <code>Dom\HTMLDocument</code> y
<code>Dom\XMLDocument</code>.',
+ 'new_array_find_title' => 'Nuevas funciones
<code>array_*()</code>',
+ 'new_array_find_description' => 'Nuevas funciones disponibles: <a
href="/manual/es/function.array-find.php"><code>array_find()</code></a>,
<a
href="/manual/es/function.array-find-key.php"><code>array_find_key()</code></a>,
<a
href="/manual/es/function.array-any.php"><code>array_any()</code></a>
y <a
href="/manual/es/function.array-all.php"><code>array_all()</code></a>.',
+ 'pdo_driver_specific_parsers_title' => 'Procesadores SQL específicos para
PDO Driver',
+ 'pdo_driver_specific_parsers_description' => 'Nuevas subclases de
<code>PDO</code>: <code>Pdo\Dblib</code>,
<code>Pdo\Firebird</code>, <code>Pdo\MySql</code>,
<code>Pdo\Odbc</code>, <code>Pdo\Sqlite</code> están disponibles.',
+ 'new_without_parentheses_title' => '<code>new
MyClass()->method()</code> sin paréntesis',
+ 'new_without_parentheses_description' => 'Las propiedades y métodos de un
objeto recién instanciado ahora se pueden acceder sin envolver la expresión
<code>new</code> entre paréntesis.',
+
+ 'new_classes_title' => 'Nuevas Clases, Interfaces y Funciones',
+ 'new_jit_implementation' => 'Nueva implementación JIT basada en el marco
IR.',
+ 'new_core_functions' => 'Nueva función
<code>request_parse_body()</code>.',
+ 'new_bcmath_functions' => 'Nuevas funciones:
<code>bcceil()</code>, <code>bcdivmod()</code>,
<code>bcfloor()</code> y <code>bcround()</code>.',
+ 'new_round_modes' => 'Nuevo enum <code>RoundingMode</code> para
<code>round()</code> con 4 nuevos modos de redondeo:
<code>TowardsZero</code>, <code>AwayFromZero</code>,
<code>NegativeInfinity</code> y <code>PositiveInfinity</code>.',
+ 'new_date_functions' => 'Nuevos métodos:
<code>DateTime::createFromTimestamp()</code>,
<code>DateTime::getMicrosecond()</code>,
<code>DateTime::setMicrosecond()</code>,
<code>DateTimeImmutable::createFromTimestamp()</code>,
<code>DateTimeImmutable::getMicrosecond()</code>, y
<code>DateTimeImmutable::setMicrosecond()</code>.',
+ 'new_mb_functions' => 'Nuevas funciones: <code>mb_trim()</code>,
<code>mb_ltrim()</code>, <code>mb_rtrim()</code>,
<code>mb_ucfirst()</code>, y <code>mb_lcfirst()</code>.',
+ 'new_pcntl_functions' => 'Nuevas funciones:
<code>pcntl_getcpu()</code>, <code>pcntl_getcpuaffinity()</code>,
<code>pcntl_getqos_class()</code>, <code>pcntl_setns()</code> y
<code>pcntl_waitid()</code>.',
+ 'new_reflection_functions' => 'Nuevos métodos:
<code>ReflectionClassConstant::isDeprecated()</code>,
<code>ReflectionGenerator::isClosed()</code>, y
<code>ReflectionProperty::isDynamic()</code>.',
+ 'new_standard_functions' => 'Nuevas funciones:
<code>http_get_last_response_headers()</code>,
<code>http_clear_last_response_headers()</code> y
<code>fpow()</code>.',
+ 'new_xml_functions' => 'Nuevos métodos:
<code>XMLReader::fromStream()</code>, <code>XMLReader::fromUri()</code>,
<code>XMLReader::fromString()</code>, <code>XMLWriter::toStream()</code>,
<code>XMLWriter::toUri()</code> y <code>XMLWriter::toMemory()</code>.',
+ 'new_grapheme_function' => 'Nueva función
<code>grapheme_str_split()</code>.',
+
+ 'bc_title' => 'Deprecaciones y cambios en compatibilidad retroactiva',
+ 'bc_pecl' => 'Las extensiones IMAP, OCI8, PDO_OCI y pspell han sido
desagregadas y movidas a PECL.',
+ 'bc_nullable_parameter_types' => 'Los tipos de parámetros implícitamente
nulos ahora están en desuso.',
+ 'bc_classname' => 'Usar <code>_</code> como nombre de clase ahora
está en desuso.',
+ 'bc_zero_raised_to_negative_number' => 'Elevar cero a la potencia de un
número negativo ahora está en desuso.',
+ 'bc_gmp' => 'La clase <code>GMP</code> ahora es final.',
+ 'bc_round' => 'Pasar un modo inválido a <code>round()</code>
lanza un <code>ValueError</code>.',
+ 'bc_typed_constants' => 'Las constantes de clase de las extensiones
<code>date</code>, <code>intl</code>, <code>pdo</code>,
<code>reflection</code>, <code>spl</code>, <code>sqlite</code>,
<code>xmlreader</code> ahora tienen tipos.',
+ 'bc_mysqli_constants' => 'Los constantes
<code>MYSQLI_SET_CHARSET_DIR</code>,
<code>MYSQLI_STMT_ATTR_PREFETCH_ROWS</code>,
<code>MYSQLI_CURSOR_TYPE_FOR_UPDATE</code>,
<code>MYSQLI_CURSOR_TYPE_SCROLLABLE</code>, y
<code>MYSQLI_TYPE_INTERVAL</code> han sido eliminadas.',
+ 'bc_mysqli_functions' => 'Las funciones
<code>mysqli_ping()</code>, <code>mysqli_kill()</code>,
<code>mysqli_refresh()</code>, los métodos <code>mysqli::ping()</code>,
<code>mysqli::kill()</code>, <code>mysqli::refresh()</code>, y los
constantes <code>MYSQLI_REFRESH_*</code> están en desuso.',
+ 'bc_standard' => '<code>stream_bucket_make_writeable()</code> y
<code>stream_bucket_new()</code> ahora devuelven una instancia de
<code>StreamBucket</code> en lugar de <code>stdClass</code>.',
+ 'bc_core' => 'Cambio en el comportamiento de <a
href="/manual/es/migration84.incompatible.php#migration84.incompatible.core.exit"><code>exit()</code></a>.',
+ 'bc_warnings' => 'El constante <code>E_STRICT</code> está en
desuso.',
+
+ 'footer_title' => 'Mejor rendimiento, mejor sintaxis, mejor seguridad de
tipos.',
+ 'footer_description' => '<p>Para descargar el código fuente de PHP
8.4, por favor visita la página de <a href="/downloads">descargas</a>. Los
binarios para Windows se encuentran en el sitio <a href="https://windows.php.net/download">PHP para
Windows</a>. La lista de cambios está registrada en el <a
href="/ChangeLog-8.php#PHP_8_4">ChangeLog</a>.</p>
+ <p>La <a href="/manual/en/migration84.php">guía de
migración</a> está disponible en el Manual de PHP. Por favor, consúltala para una lista
detallada de nuevas características y cambios incompatibles con versiones
anteriores.</p>',
+];
diff --git a/releases/8.4/languages/nl.php b/releases/8.4/languages/nl.php
new file mode 100644
index 0000000000..cb2cf3505d
--- /dev/null
+++ b/releases/8.4/languages/nl.php
@@ -0,0 +1,53 @@
+<?php
+
+return [
+ 'common_header' => 'PHP 8.4 is een omvangrijke update van de PHP
programmeertaal. Het bevat veel nieuwe functionaliteit, zoals property hooks, asymmetrische
zichtbaarheid, een bijgewerkte DOM API, prestatieverbeteringen, bugfixes en meer
consistentie.',
+ 'documentation' => 'Documentatie',
+ 'main_title' => 'Beschikbaar!',
+ 'main_subtitle' => 'PHP 8.4 is een omvangrijke update van de PHP
programmeertaal.<br class="display-none-md"> Het bevat veel nieuwe functionaliteit,
zoals property hooks, asymmetrische zichtbaarheid, een bijgewerkte DOM API, prestatieverbeteringen,
bugfixes en meer consistentie.',
+ 'upgrade_now' => 'Upgrade nu naar PHP 8.4!',
+
+ 'property_hooks_title' => 'Property hooks',
+ 'property_hooks_description' => 'Property hooks geven ondersteuning voor
berekende eigenschappen. Deze worden rechtstreeks ondersteund door IDEs en statische
analyseprogramma’s, zonder dat documentatie blokken nodig zijn. Bovendien laten ze toe om waarden
voor- of achteraf te verwerken zonder gebruik te maken van een getter of setter in de klasse.',
+ 'asymmetric_visibility_title' => 'Asymmetrische zichtbaarheid',
+ 'asymmetric_visibility_description' => 'De scope voor het schrijven naar een
eigenschap kan nu onafhankelijk gecontroleerd worden ten opzichte van de scope om de eigenschap te
lezen. Dit reduceert de nood voor repetitieve getter en setter methoden om de eigenschap bloot te
stellen zonder aanpassing toe te laten buiten de klasse.',
+ 'deprecated_attribute_title' => '<code>#[\Deprecated]</code>
attribuut',
+ 'deprecated_attribute_description' => 'Het nieuwe
<code>#[\Deprecated]</code> attribuut maakt PHP’s bestaand uitfaseringsmechanisme
beschikbaar voor gebruiker gedefinieerde functies, methoden en klasseconstanten.',
+ 'dom_additions_html5_title' => 'Nieuwe ext-dom functies en HTML5
ondersteuning',
+ 'dom_additions_html5_description' => '<p>Nieuwe DOM API toe met
correcte ondersteuning voor de HTML 5 standaard, oplossingen voor verschillende lang bestaande
compliance bugs in the DOM functionaliteit, en verschillende nieuwe functies om het werken met
documenten eenvoudiger te maken.</p><p>De nieuwe DOM API is beschikbaar via de
<code>Dom</code> namespace. Documenten die de nieuwe API willen gebruiken, kunnen
aangemaakt worden via de <code>Dom\HTMLDocument</code> en
<code>Dom\XMLDocument</code> klassen.</p>',
+ 'new_array_find_title' => 'Nieuwe <code>array_*()</code>
functies',
+ 'new_array_find_description' => 'Nieuwe functies <a
href="/manual/en/function.array-find.php"><code>array_find()</code></a>,
<a
href="/manual/en/function.array-find-key.php"><code>array_find_key()</code></a>,
<a
href="/manual/en/function.array-any.php"><code>array_any()</code></a>,
en <a
href="/manual/en/function.array-all.php"><code>array_all()</code></a>
zijn nu beschikbaar.',
+ 'pdo_driver_specific_parsers_title' => 'PDO driver specifieke SQL
parsers',
+ 'pdo_driver_specific_parsers_description' => 'Nieuwe subklassen
<code>Pdo\Dblib</code>, <code>Pdo\Firebird</code>,
<code>Pdo\MySql</code>, <code>Pdo\Odbc</code>,
<code>Pdo\Sqlite</code> van <code>PDO</code> zijn nu beschikbaar.',
+ 'new_without_parentheses_title' => '<code>new
MyClass()->method()</code> zonder haakjes',
+ 'new_without_parentheses_description' => 'Eigenschappen en methoden van een
nieuw geïnstantieerd object kunnen nu opgevraagd worden zonder de <code>new</code>
expressie tussen haakjes te zetten.',
+
+ 'new_classes_title' => 'Nieuwe klassen, interfaces en functies',
+ 'new_core_functions' => 'Nieuwe <code>request_parse_body()</code>
functie.',
+ 'new_bcmath_functions' => 'Nieuwe <code>bcceil()</code>,
<code>bcdivmod()</code>, <code>bcfloor()</code>, en
<code>bcround()</code> functies.',
+ 'new_round_modes' => 'Nieuwe <code>RoundingMode</code> enum voor
<code>round()</code> met 4 nieuwe afrondingsmodi <code>TowardsZero</code>,
<code>AwayFromZero</code>, <code>NegativeInfinity</code>, en
<code>PositiveInfinity</code>.',
+ 'new_date_functions' => 'Nieuwe
<code>DateTime::createFromTimestamp()</code>,
<code>DateTime::getMicrosecond()</code>,
<code>DateTime::setMicrosecond()</code>,
<code>DateTimeImmutable::createFromTimestamp()</code>,
<code>DateTimeImmutable::getMicrosecond()</code>, en
<code>DateTimeImmutable::setMicrosecond()</code> methoden.',
+ 'new_mb_functions' => 'Nieuwe <code>mb_trim()</code>,
<code>mb_ltrim()</code>, <code>mb_rtrim()</code>,
<code>mb_ucfirst()</code>, en <code>mb_lcfirst()</code> functies.',
+ 'new_pcntl_functions' => 'Nieuwe <code>pcntl_getcpu()</code>,
<code>pcntl_getcpuaffinity()</code>, <code>pcntl_getqos_class()</code>,
<code>pcntl_setns()</code>, en <code>pcntl_waitid()</code> functies.',
+ 'new_reflection_functions' => 'Nieuwe
<code>ReflectionClassConstant::isDeprecated()</code>,
<code>ReflectionGenerator::isClosed()</code>, en
<code>ReflectionProperty::isDynamic()</code> methoden.',
+ 'new_standard_functions' => 'Nieuwe
<code>http_get_last_response_headers()</code>,
<code>http_clear_last_response_headers()</code>, en <code>fpow()</code>
functies.',
+ 'new_xml_functions' => 'Nieuwe
<code>XMLReader::fromStream()</code>, <code>XMLReader::fromUri()</code>,
<code>XMLReader::fromString()</code>, <code>XMLWriter::toStream()</code>,
<code>XMLWriter::toUri()</code>, en <code>XMLWriter::toMemory()</code>
methoden.',
+
+ 'bc_title' => 'Uitfaseringen en neerwaarts incompatibele aanpassingen',
+ 'bc_pecl' => 'De IMAP, OCI8, PDO_OCI en pspell-extensies zijn ontbundeld en
verplaatst naar PECL.',
+ 'bc_nullable_parameter_types' => 'Impliciet parameters als null definiëren
is nu uitgefaseerd.',
+ 'bc_classname' => 'Gebruik van <code>_</code> als een klassenaam
is nu uitgefaseerd.',
+ 'bc_zero_raised_to_negative_number' => 'Nul verheffen tot een negatieve macht
is nu uitgefaseerd.',
+ 'bc_gmp' => '<code>GMP</code> klasse is nu final.',
+ 'bc_round' => 'Ongeldige modus doorgeven aan <code>round()</code>
resulteert in een <code>ValueError</code>.',
+ 'bc_typed_constants' => 'Klasseconstanten van extensies
<code>date</code>, <code>intl</code>, <code>pdo</code>,
<code>reflection</code>, <code>spl</code>, <code>sqlite</code>,
<code>xmlreader</code> hebben nu types.',
+ 'bc_mysqli_constants' => '<code>MYSQLI_SET_CHARSET_DIR</code>,
<code>MYSQLI_STMT_ATTR_PREFETCH_ROWS</code>,
<code>MYSQLI_CURSOR_TYPE_FOR_UPDATE</code>,
<code>MYSQLI_CURSOR_TYPE_SCROLLABLE</code>, en
<code>MYSQLI_TYPE_INTERVAL</code> constanten zijn verwijderd.',
+ 'bc_mysqli_functions' => '<code>mysqli_ping()</code>,
<code>mysqli_kill()</code>, <code>mysqli_refresh()</code> functies,
<code>mysqli::ping()</code>, <code>mysqli::kill()</code>,
<code>mysqli::refresh()</code> methoden, en <code>MYSQLI_REFRESH_*</code>
constanten zijn uitgefaseerd.',
+ 'bc_standard' => '<code>stream_bucket_make_writeable()</code> en
<code>stream_bucket_new()</code> geven nu een instantie van
<code>StreamBucket</code> terug in plaats van <code>stdClass</code>.',
+ 'bc_core' => '<a
href="/manual/en/migration84.incompatible.php#migration84.incompatible.core.exit"><code>exit()</code>
heeft ander gedrag</a>.',
+ 'bc_warnings' => '<code>E_STRICT</code> constante is
uitgefaseerd.',
+
+ 'footer_title' => 'Betere prestaties, betere syntaxis, verbeterd type
systeem.',
+ 'footer_description' => '<p>Ga naar de <a href="http://www.php.net/downloads">downloads</a>
pagina om de PHP 8.4 code te verkrijgen. Uitvoerbare bestanden voor Windows kan je vinden op de
<a href="http://windows.php.net/download">PHP voor
Windows</a> website. De volledige lijst met wijzigingen is vastgelegd in een <a
href="http://www.php.net/ChangeLog-8.php#PHP_8_4">ChangeLog</a>.</p>
+ <p>De <a href="/manual/en/migration84.php">migratie gids</a> is
beschikbaar in de PHP Handleiding. Gebruik deze om een gedetailleerde lijst te krijgen van nieuwe
opties en neerwaarts incompatibele aanpassingen.</p>',
+];
diff --git a/releases/8.4/languages/pt_BR.php b/releases/8.4/languages/pt_BR.php
new file mode 100644
index 0000000000..1c808a19bf
--- /dev/null
+++ b/releases/8.4/languages/pt_BR.php
@@ -0,0 +1,55 @@
+<?php
+
+return [
+ 'common_header' => '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.',
+ 'documentation' => 'Doc',
+ 'main_title' => 'Lançado!',
+ 'main_subtitle' => 'PHP 8.4 é uma atualização importante da linguagem
PHP.<br class="display-none-md"> 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.',
+ 'upgrade_now' => 'Atualize para PHP 8.4 agora!',
+
+ 'property_hooks_title' => 'Hooks de Propriedade',
+ 'property_hooks_description' => '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.',
+ 'asymmetric_visibility_title' => 'Visibilidade Assimétrica',
+ 'asymmetric_visibility_description' => '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_attribute_title' => '<code>#[\Deprecated]</code>
Atributo',
+ 'deprecated_attribute_description' => 'O novo atributo
<code>#[\Deprecated]</code> torna o mecanismo de descontinuação existente no PHP
disponível para funções, métodos e constantes de classe definidas pelo usuário.',
+ 'dom_additions_html5_title' => 'Novos recursos ext-dom e suporte a
HTML5',
+ 'dom_additions_html5_description' => 'Novas classes
<code>Dom\HTMLDocument</code>, <code>Dom\XMLDocument</code> e métodos
<code>DOMNode::compareDocumentPosition()</code>,
<code>DOMXPath::registerPhpFunctionNS()</code>,
<code>DOMXPath::quote()</code>,
<code>XSLTProcessor::registerPHPFunctionNS()</code> estão disponíveis.',
+ 'new_array_find_title' => 'Novas funções
<code>array_*()</code>',
+ 'new_array_find_description' => 'Novas funções <a
href="/manual/pt_BR/function.array-find.php"><code>array_find()</code></a>,
<a
href="/manual/pt_BR/function.array-find-key.php"><code>array_find_key()</code></a>,
<a
href="/manual/pt_BR/function.array-any.php"><code>array_any()</code></a>
e <a
href="/manual/pt_BR/function.array-all.php"><code>array_all()</code></a>
estão disponíveis.',
+ 'pdo_driver_specific_parsers_title' => 'Parsers SQL específicos para drivers
PDO',
+ 'pdo_driver_specific_parsers_description' => 'Novas subclasses
<code>Pdo\Dblib</code>, <code>Pdo\Firebird</code>,
<code>Pdo\MySql</code>, <code>Pdo\Odbc</code>,
<code>Pdo\Sqlite</code> de <code>PDO</code> estão disponíveis.',
+ 'new_without_parentheses_title' => '<code>new
MyClass()->method()</code> sem parênteses',
+ 'new_without_parentheses_description' => 'Propriedades e métodos de um
objeto recém-instanciado agora podem ser acessados sem a necessidade de envolver a expressão
<code>new</code> entre parênteses.',
+
+ 'new_classes_title' => 'Novas classes, interfaces e funções',
+ 'new_jit_implementation' => 'Nova implementação JIT baseada no Framework
IR',
+ 'new_core_functions' => 'Nova função
<code>request_parse_body()</code>.',
+ 'new_bcmath_functions' => 'Novas funções <code>bcceil()</code>,
<code>bcdivmod()</code>, <code>bcfloor()</code> e
<code>bcround()</code>.',
+ 'new_round_modes' => 'Novo Enum <code>RoundingMode</code> para
<code>round()</code> com 4 novos modos de arredondamento:
<code>TowardsZero</code>, <code>AwayFromZero</code>,
<code>NegativeInfinity</code> e <code>PositiveInfinity</code>.',
+ 'new_date_functions' => 'Novos métodos
<code>DateTime::createFromTimestamp()</code>,
<code>DateTime::getMicrosecond()</code>,
<code>DateTime::setMicrosecond()</code>,
<code>DateTimeImmutable::createFromTimestamp()</code>,
<code>DateTimeImmutable::getMicrosecond()</code> e
<code>DateTimeImmutable::setMicrosecond()</code>.',
+ 'new_mb_functions' => 'Novas funções <code>mb_trim()</code>,
<code>mb_ltrim()</code>, <code>mb_rtrim()</code>,
<code>mb_ucfirst()</code> e <code>mb_lcfirst()</code>.',
+ 'new_pcntl_functions' => 'Novas funções
<code>pcntl_getcpu()</code>, <code>pcntl_getcpuaffinity()</code>,
<code>pcntl_getqos_class()</code>, <code>pcntl_setns()</code> e
<code>pcntl_waitid()</code>.',
+ 'new_reflection_functions' => 'Novos métodos
<code>ReflectionClassConstant::isDeprecated()</code>,
<code>ReflectionGenerator::isClosed()</code> e
<code>ReflectionProperty::isDynamic()</code>.',
+ 'new_standard_functions' => 'Novas funções
<code>http_get_last_response_headers()</code>,
<code>http_clear_last_response_headers()</code> e
<code>fpow()</code>.',
+ 'new_xml_functions' => 'Novos métodos
<code>XMLReader::fromStream()</code>, <code>XMLReader::fromUri()</code>,
<code>XMLReader::fromString()</code>, <code>XMLWriter::toStream()</code>,
<code>XMLWriter::toUri()</code> e <code>XMLWriter::toMemory()</code>.',
+ 'new_grapheme_function' => 'Nova função
<code>grapheme_str_split()</code>.',
+
+ 'bc_title' => 'Alterações obsoletas e incompatibilidades com versões
anteriores',
+ 'bc_pecl' => 'As extensões IMAP, OCI8, PDO_OCI e pspell foram separadas e
movidas para o PECL.',
+ 'bc_nullable_parameter_types' => 'Tipos de parâmetros implicitamente
anuláveis agora estão obsoletos.',
+ 'bc_classname' => 'O uso de <code>_</code> no nome da classe
agora está obsoleto.',
+ 'bc_zero_raised_to_negative_number' => 'Elevar zero a um número negativo
agora está obsoleto.',
+ 'bc_gmp' => 'A classe <code>GMP</code> agora é final.',
+ 'bc_round' => 'Passar um modo inválido para <code>round()</code>
agora lança um <code>ValueError</code>.',
+ 'bc_typed_constants' => 'As constantes de classe das extensões
<code>date</code>, <code>intl</code>, <code>pdo</code>,
<code>reflection</code>, <code>spl</code>, <code>sqlite</code>,
<code>xmlreader</code> agora são tipadas.',
+ 'bc_mysqli_constants' => 'As constantes
<code>MYSQLI_SET_CHARSET_DIR</code>,
<code>MYSQLI_STMT_ATTR_PREFETCH_ROWS</code>,
<code>MYSQLI_CURSOR_TYPE_FOR_UPDATE</code>,
<code>MYSQLI_CURSOR_TYPE_SCROLLABLE</code> e
<code>MYSQLI_TYPE_INTERVAL</code> foram removidas.',
+ 'bc_mysqli_functions' => 'As funções
<code>mysqli_ping()</code>, <code>mysqli_kill()</code>,
<code>mysqli_refresh()</code>, os métodos <code>mysqli::ping()</code>,
<code>mysqli::kill()</code>, <code>mysqli::refresh()</code> e as constantes
<code>MYSQLI_REFRESH_*</code> estão obsoletas.',
+ 'bc_standard' => '<code>stream_bucket_make_writeable()</code> e
<code>stream_bucket_new()</code> agora retornam uma instância de
<code>StreamBucket</code> em vez de <code>stdClass</code>.',
+ 'bc_core' => '<a
href="/manual/pt_BR/migration84.incompatible.php#migration84.incompatible.core.exit">Alteração
de comportamento no uso de <code>exit()</code></a>.',
+ 'bc_warnings' => 'A constante <code>E_STRICT</code> está
obsoleta.',
+
+ 'footer_title' => 'Melhor desempenho, sintaxe aprimorada e maior segurança
de tipos.',
+ 'footer_description' => '<p>Para baixar o código-fonte do PHP 8.4,
visite a página de <a href="/downloads">downloads</a>. Os binários para
Windows podem ser encontrados no site <a href="https://windows.php.net/download">PHP for
Windows</a>. A lista de alterações está registrada no <a
href="/ChangeLog-8.php#PHP_8_4">ChangeLog</a>.</p>
+ <p>O <a href="/manual/en/migration84.php">guia de
migração</a> está disponível no Manual do PHP. Consulte-o para uma lista detalhada de
novos recursos e mudanças incompatíveis com versões anteriores.</p>',
+];
diff --git a/releases/8.4/languages/ru.php b/releases/8.4/languages/ru.php
new file mode 100644
index 0000000000..ef4a077d80
--- /dev/null
+++ b/releases/8.4/languages/ru.php
@@ -0,0 +1,55 @@
+<?php
+
+return [
+ 'common_header' => 'PHP 8.4 — большое обновление
языка PHP. Оно содержит множество новых возможностей,
таких как хуки свойств, асимметричная область
видимости свойств, обновление DOM API, улучшена
производительность, исправлены ошибки и многое
другое.',
+ 'documentation' => 'Документация',
+ 'main_title' => 'выпущен!',
+ 'main_subtitle' => 'PHP 8.4 — большое обновление
языка PHP.<br class="display-none-md"> Оно содержит
множество новых возможностей, таких как хуки свойств,
асимметричная область видимости свойств, обновление
DOM API, улучшена производительность, исправлены ошибки и
многое другое.',
+ 'upgrade_now' => 'Переходите на PHP 8.4!',
+
+ 'property_hooks_title' => 'Хуки свойств',
+ 'property_hooks_description' => 'Хуки свойств
обеспечивают поддержку вычисляемых свойств, которые
могут быть понятны IDE и инструментам статического
анализа, без необходимости писать DocBlock-комментарии,
которые могут не совпадать. Кроме того, они позволяют
выполнять надёжную предварительную или последующую
обработку значений, без необходимости проверять,
существует ли в классе соответствующий геттер или
сеттер.',
+ 'asymmetric_visibility_title' => 'Асимметричная область
видимости свойств',
+ 'asymmetric_visibility_description' => 'Область видимости
записи свойства теперь может контролироваться
независимо от области видимости чтения свойства, что
уменьшает необходимость использования шаблонных
методов-геттеров для раскрытия значения свойства без
возможности его изменения извне класса.',
+ 'deprecated_attribute_title' => 'Атрибут
<code>#[\Deprecated]</code>',
+ 'deprecated_attribute_description' => 'Новый атрибут
<code>#[\Deprecated]</code> расширяет существующий механизм
объявления сущности устаревшей для пользовательских
функций, методов и констант классов.',
+ 'dom_additions_html5_title' => 'Новые возможности ext-dom и
поддержка HTML5',
+ 'dom_additions_html5_description' => '<p>Новый DOM API,
который поддерживает разбор HTML5-документов в
соответствии со стандартами, исправляет несколько
давних ошибок в поведении DOM и добавляет несколько
функций, делающих работу с документами более
удобной.</p><p>Новый DOM API доступен в пространстве
имён <code>Dom</code>. Документы, использующие новый DOM
API, могут быть созданы с помощью классов
<code>Dom\HTMLDocument</code> и
<code>Dom\XMLDocument</code>.</p>',
+ 'new_array_find_title' => 'Новые функции
<code>array_*()</code>',
+ 'new_array_find_description' => 'Добавлены функции <a
href="/manual/ru/function.array-find.php"><code>array_find()</code></a>,
<a
href="/manual/ru/function.array-find-key.php"><code>array_find_key()</code></a>,
<a
href="/manual/ru/function.array-any.php"><code>array_any()</code></a>
и <a
href="/manual/ru/function.array-all.php"><code>array_all()</code></a>.',
+ 'pdo_driver_specific_parsers_title' => 'SQL-парсеры,
специфичные для драйверов PDO',
+ 'pdo_driver_specific_parsers_description' => 'Добавлены
дочерние классы <code>Pdo\Dblib</code>,
<code>Pdo\Firebird</code>, <code>Pdo\MySql</code>,
<code>Pdo\Odbc</code>, <code>Pdo\Sqlite</code> драйверов,
наследующие <code>PDO</code>.',
+ 'new_without_parentheses_title' => '<code>new
MyClass()->method()</code> без скобок',
+ 'new_without_parentheses_description' => 'К свойствам и
методам только что инициализированного объекта
теперь можно обращаться, не оборачивая выражение
<code>new</code> в круглые скобки.',
+
+ 'new_classes_title' => 'Новые классы, интерфейсы и
функции',
+ 'new_jit_implementation' => 'Новая реализация JIT на
основе IR Framework',
+ 'new_core_functions' => 'Добавлена функция
<code>request_parse_body()</code>.',
+ 'new_bcmath_functions' => 'Добавлены функции
<code>bcceil()</code>, <code>bcdivmod()</code>,
<code>bcfloor()</code> и <code>bcround()</code>.',
+ 'new_round_modes' => 'Добавлено перечисление
<code>RoundingMode</code> для функции <code>round()</code> с 4
режимами: <code>TowardsZero</code>, <code>AwayFromZero</code>,
<code>NegativeInfinity</code> и <code>PositiveInfinity</code>.',
+ 'new_date_functions' => 'Добавлены методы
<code>DateTime::createFromTimestamp()</code>,
<code>DateTime::getMicrosecond()</code>,
<code>DateTime::setMicrosecond()</code>,
<code>DateTimeImmutable::createFromTimestamp()</code>,
<code>DateTimeImmutable::getMicrosecond()</code> и
<code>DateTimeImmutable::setMicrosecond()</code>.',
+ 'new_mb_functions' => 'Добавлены функции
<code>mb_trim()</code>, <code>mb_ltrim()</code>,
<code>mb_rtrim()</code>, <code>mb_ucfirst()</code> и
<code>mb_lcfirst()</code>.',
+ 'new_pcntl_functions' => 'Добавлены функции
<code>pcntl_getcpu()</code>, <code>pcntl_getcpuaffinity()</code>,
<code>pcntl_getqos_class()</code>, <code>pcntl_setns()</code> и
<code>pcntl_waitid()</code>.',
+ 'new_reflection_functions' => 'Добавлены методы
<code>ReflectionClassConstant::isDeprecated()</code>,
<code>ReflectionGenerator::isClosed()</code> и
<code>ReflectionProperty::isDynamic()</code>.',
+ 'new_standard_functions' => 'Добавлены функции
<code>http_get_last_response_headers()</code>,
<code>http_clear_last_response_headers()</code>, <code>fpow()</code>.',
+ 'new_xml_functions' => 'Добавлены методы
<code>XMLReader::fromStream()</code>, <code>XMLReader::fromUri()</code>,
<code>XMLReader::fromString()</code>, <code>XMLWriter::toStream()</code>,
<code>XMLWriter::toUri()</code> и
<code>XMLWriter::toMemory()</code>.',
+ 'new_grapheme_function' => 'Добавлена функция
<code>grapheme_str_split()</code>.',
+
+ 'bc_title' => 'Устаревшая функциональность и
изменения в обратной совместимости',
+ 'bc_pecl' => 'Модули IMAP, OCI8, PDO_OCI и pspell перенесены
из ядра в PECL.',
+ 'bc_nullable_parameter_types' => 'Типы параметров, неявно
допускающие значение <code>null</code> объявлены
устаревшими.',
+ 'bc_classname' => 'Использование <code>_</code> в
качестве имени класса объявлено устаревшим.',
+ 'bc_zero_raised_to_negative_number' => 'Возведение нуля в
степень отрицательного числа объявлено
устаревшим.',
+ 'bc_gmp' => 'Класс <code>GMP</code> теперь
является окончательным.',
+ 'bc_round' => 'Передача некорректного режима в
функцию <code>round()</code> выбрасывает ошибку
<code>ValueError</code>.',
+ 'bc_typed_constants' => 'Константы классов модулей
<code>date</code>, <code>intl</code>, <code>pdo</code>,
<code>reflection</code>, <code>spl</code>, <code>sqlite</code>
и <code>xmlreader</code> типизированы.',
+ 'bc_mysqli_constants' => 'Удалены константы
<code>MYSQLI_SET_CHARSET_DIR</code>,
<code>MYSQLI_STMT_ATTR_PREFETCH_ROWS</code>,
<code>MYSQLI_CURSOR_TYPE_FOR_UPDATE</code>,
<code>MYSQLI_CURSOR_TYPE_SCROLLABLE</code> и
<code>MYSQLI_TYPE_INTERVAL</code>.',
+ 'bc_mysqli_functions' => 'Функции
<code>mysqli_ping()</code>, <code>mysqli_kill()</code>,
<code>mysqli_refresh()</code>, методы <code>mysqli::ping()</code>,
<code>mysqli::kill()</code>, <code>mysqli::refresh()</code> и
константы <code>MYSQLI_REFRESH_*</code> объявлены
устаревшими.',
+ 'bc_standard' => 'Функции
<code>stream_bucket_make_writeable()</code> и
<code>stream_bucket_new()</code> теперь возвращают экземпляр
класса <code>StreamBucket</code> вместо
<code>stdClass</code>.',
+ 'bc_core' => '<a
href="/manual/ru/migration84.incompatible.php#migration84.incompatible.core.exit">Изменение
поведения языковой конструкции
<code>exit()</code></a>.',
+ 'bc_warnings' => 'Константа <code>E_STRICT</code>
объявлена устаревшей.',
+
+ 'footer_title' => 'Выше производительность, лучше
синтаксис, надёжнее система типов.',
+ 'footer_description' => '<p>Для загрузки исходного
кода PHP 8.3 посетите страницу <a
href="/downloads">Downloads</a>. Бинарные файлы Windows
находятся на сайте <a href="https://windows.php.net/download">PHP for
Windows</a>. Список изменений перечислен на странице <a
href="/ChangeLog-8.php#PHP_8_4">ChangeLog</a>.</p>
+ <p><a href="/manual/ru/migration84.php">Руководство по
миграции</a> доступно в разделе документации.
Ознакомьтесь с ним, чтобы узнать обо всех новых
возможностях и изменениях, затрагивающих обратную
совместимость.</p>',
+];
diff --git a/releases/8.4/nl.php b/releases/8.4/nl.php
new file mode 100644
index 0000000000..1a972eecb8
--- /dev/null
+++ b/releases/8.4/nl.php
@@ -0,0 +1,6 @@
+<?php
+
+$lang = 'nl';
+$documentation = 'en';
+
+include_once __DIR__ . '/release.inc';
diff --git a/releases/8.4/pt_BR.php b/releases/8.4/pt_BR.php
new file mode 100644
index 0000000000..be7e4f4750
--- /dev/null
+++ b/releases/8.4/pt_BR.php
@@ -0,0 +1,5 @@
+<?php
+
+$lang = 'pt_BR';
+
+include_once __DIR__ . '/release.inc';
diff --git a/releases/8.4/release.inc b/releases/8.4/release.inc
new file mode 100644
index 0000000000..4a0bb7308a
--- /dev/null
+++ b/releases/8.4/release.inc
@@ -0,0 +1,533 @@
+<?php
+
+use function releases\php84\common_header;use function releases\php84\language_chooser;use function
releases\php84\message;
+
+if (!isset($lang)) {
+ $lang = 'en';
+}
+if (!isset($documentation)) {
+ $documentation = $lang;
+}
+
+$_SERVER['BASE_PAGE'] = 'releases/8.4/' . $lang . '.php';
+
+include_once __DIR__ . '/common.php';
+
+common_header(message('common_header', $lang));
+
+?>
+ <section class="php8-section php8-section_dark php8-section_header center">
+ <div class="page-tools">
+ <div class="change-language">
+ <?php language_chooser($lang); ?>
+ </div>
+ </div>
+ <div class="php8-section__content">
+ <div class="php8-logo">
+ <img src="/images/php8/logo_php8_4.svg" alt="PHP 8.4"
height="126" width="343">
+ </div>
+ <div class="php8-title"><?= message('main_title', $lang)
?></div>
+ <div class="php8-subtitle"><?= message('main_subtitle',
$lang) ?></div>
+ <div class="php8-button-wrapper center">
+ <a class="php8-button php8-button_light"
href="/downloads"><?= message('upgrade_now', $lang) ?></a>
+ </div>
+ </div>
+ </section>
+
+ <section class="php8-section center">
+ <div class="php8-compare">
+ <h2 class="php8-h2" id="property_hooks">
+ <?= message('property_hooks_title', $lang) ?>
+ <a class="php8-rfc" href="https://wiki.php.net/rfc/property-hooks">RFC</a>
+ <a class="php8-rfc" href="/manual/<?= $documentation
?>/migration84.new-features.php#migration84.new-features.core.property-hooks"><?=
message('documentation', $lang) ?></a>
+ </h2>
+ <div class="php8-compare__main">
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label">PHP < 8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+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
+
+ ); ?>
+ </div>
+ </div>
+ <div class="php8-compare__arrow"></div>
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label php8-compare__label_new">PHP
8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+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->countryCode, $this->languageCode] = 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
+PHP
+ ); ?>
+ </div>
+ </div>
+ </div>
+ <div class="php8-compare__content">
+ <?= message('property_hooks_description', $lang) ?>
+ </div>
+ </div>
+ <div class="php8-compare">
+ <h2 class="php8-h2" id="asymmetric_visibility">
+ <?= message('asymmetric_visibility_title', $lang) ?>
+ <a class="php8-rfc" href="https://wiki.php.net/rfc/asymmetric-visibility-v2">RFC</a>
+ <a class="php8-rfc" href="/manual/<?= $documentation
?>/language.oop5.visibility.php#language.oop5.visibility-members-aviz"><?=
message('documentation', $lang) ?></a>
+ </h2>
+ <div class="php8-compare__main">
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label">PHP < 8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+class PhpVersion
+{
+ public string $version = '8.3';
+}
+
+$phpVersion = new PhpVersion();
+var_dump($phpVersion->version); // string(3) "8.3"
+$phpVersion->version = 'PHP 8.4'; // No error
+PHP
+
+ ); ?>
+ </div>
+ </div>
+ <div class="php8-compare__arrow"></div>
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label php8-compare__label_new">PHP
8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+class PhpVersion
+{
+ public private(set) string $version = '8.4';
+}
+
+$phpVersion = new PhpVersion();
+var_dump($phpVersion->version); // string(3) "8.4"
+$phpVersion->version = 'PHP 8.3'; // Visibility error
+PHP
+ ); ?>
+ </div>
+ </div>
+ </div>
+ <div class="php8-compare__content">
+ <?= message('asymmetric_visibility_description', $lang) ?>
+ </div>
+ </div>
+ <div class="php8-compare">
+ <h2 class="php8-h2" id="deprecated_attribute">
+ <?= message('deprecated_attribute_title', $lang) ?>
+ <a class="php8-rfc" href="https://wiki.php.net/rfc/deprecated_attribute">RFC</a>
+ <a class="php8-rfc" href="/manual/<?= $documentation
?>/class.deprecated.php"><?= message('documentation', $lang) ?></a>
+ </h2>
+ <div class="php8-compare__main">
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label">PHP < 8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+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
+
+ ); ?>
+ </div>
+ </div>
+ <div class="php8-compare__arrow"></div>
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label php8-compare__label_new">PHP
8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+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();
+PHP
+ ); ?>
+ </div>
+ </div>
+ </div>
+ <div class="php8-compare__content">
+ <?= message('deprecated_attribute_description', $lang) ?>
+ </div>
+ </div>
+ <div class="php8-compare">
+ <h2 class="php8-h2" id="dom_additions_html5">
+ <?= message('dom_additions_html5_title', $lang) ?>
+ <a class="php8-rfc" href="https://wiki.php.net/rfc/dom_additions_84">RFC</a>
+ <a class="php8-rfc" href="https://wiki.php.net/rfc/domdocument_html5_parser">RFC</a>
+ <a class="php8-rfc" href="/manual/<?= $documentation
?>/migration84.new-features.php#migration84.new-features.dom"><?=
message('documentation', $lang) ?></a>
+ </h2>
+ <div class="php8-compare__main">
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label">PHP < 8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+$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
+
+ ); ?>
+ </div>
+ </div>
+ <div class="php8-compare__arrow"></div>
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label php8-compare__label_new">PHP
8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+$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)
+PHP
+ ); ?>
+ </div>
+ </div>
+ </div>
+ <div class="php8-compare__content">
+ <?= message('dom_additions_html5_description', $lang) ?>
+ </div>
+ </div>
+ <div class="php8-compare">
+ <h2 class="php8-h2" id="new_array_find">
+ <?= message('new_array_find_title', $lang) ?>
+ <a class="php8-rfc" href="https://wiki.php.net/rfc/array_find">RFC</a>
+ </h2>
+ <div class="php8-compare__main">
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label">PHP < 8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+$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
+ ); ?>
+ </div>
+ </div>
+ <div class="php8-compare__arrow"></div>
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label php8-compare__label_new">PHP
8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+$animal = array_find(
+ ['dog', 'cat', 'cow', 'duck', 'goose'],
+ static function (string $value): bool {
+ return str_starts_with($value, 'c');
+ },
+);
+
+var_dump($animal); // string(3) "cat"
+PHP
+ ); ?>
+ </div>
+ </div>
+ </div>
+ <div class="php8-compare__content">
+ <?= message('new_array_find_description', $lang) ?>
+ </div>
+ </div>
+ <div class="php8-compare">
+ <h2 class="php8-h2" id="pdo_driver_specific_parsers">
+ <?= message('pdo_driver_specific_parsers_title', $lang) ?>
+ <a class="php8-rfc" href="https://wiki.php.net/rfc/pdo_driver_specific_parsers">RFC</a>
+ </h2>
+ <div class="php8-compare__main">
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label">PHP < 8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+$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
+ ); ?>
+ </div>
+ </div>
+ <div class="php8-compare__arrow"></div>
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label php8-compare__label_new">PHP
8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+$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');
+PHP
+ ); ?>
+ </div>
+ </div>
+ </div>
+ <div class="php8-compare__content">
+ <?= message('pdo_driver_specific_parsers_description', $lang) ?>
+ </div>
+ </div>
+ <div class="php8-compare">
+ <h2 class="php8-h2" id="new_without_parentheses">
+ <?= message('new_without_parentheses_title', $lang) ?>
+ <a class="php8-rfc" href="https://wiki.php.net/rfc/new_without_parentheses">RFC</a>
+ <a class="php8-rfc" href="/manual/<?= $documentation
?>/migration84.new-features.php#migration84.new-features.core.new-chaining"><?=
message('documentation', $lang) ?></a>
+ </h2>
+ <div class="php8-compare__main">
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label">PHP < 8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+class PhpVersion
+{
+ public function getVersion(): string
+ {
+ return 'PHP 8.3';
+ }
+}
+
+var_dump((new PhpVersion())->getVersion());
+PHP
+
+ ); ?>
+ </div>
+ </div>
+ <div class="php8-compare__arrow"></div>
+ <div class="php8-compare__block example-contents">
+ <div class="php8-compare__label php8-compare__label_new">PHP
8.4</div>
+ <div class="php8-code phpcode">
+ <?php highlight_php_trimmed(
+ <<<'PHP'
+class PhpVersion
+{
+ public function getVersion(): string
+ {
+ return 'PHP 8.4';
+ }
+}
+
+var_dump(new PhpVersion()->getVersion());
+PHP
+ ); ?>
+ </div>
+ </div>
+ </div>
+ <div class="php8-compare__content">
+ <?= message('new_without_parentheses_description', $lang) ?>
+ </div>
+ </div>
+
+ </section>
+
+ <section class="php8-section center php8-section_light php8-columns">
+ <div class="php8-column">
+ <h2 class="php8-h2" id="other_new_things"><?=
message('new_classes_title', $lang) ?></h2>
+ <div class="php8-compare__content php8-compare__content--block">
+ <ul>
+ <li><?= message('new_jit_implementation', $lang)
?></li>
+ <li><?= message('new_core_functions', $lang)
?></li>
+ <li><?= message('new_bcmath_functions', $lang)
?></li>
+ <li><?= message('new_round_modes', $lang) ?></li>
+ <li><?= message('new_date_functions', $lang)
?></li>
+ <li><?= message('new_mb_functions', $lang) ?></li>
+ <li><?= message('new_pcntl_functions', $lang)
?></li>
+ <li><?= message('new_reflection_functions', $lang)
?></li>
+ <li><?= message('new_standard_functions', $lang)
?></li>
+ <li><?= message('new_xml_functions', $lang) ?></li>
+ <li><?= message('new_grapheme_function', $lang)
?></li>
+ </ul>
+ </div>
+ </div>
+
+ <div class="php8-column">
+ <h2 class="php8-h2" id="deprecations_and_bc_breaks"><?=
message('bc_title', $lang) ?></h2>
+ <div class="php8-compare__content">
+ <ul>
+ <li><?= message('bc_pecl', $lang) ?></li>
+ <li><?= message('bc_nullable_parameter_types', $lang)
?></li>
+ <li><?= message('bc_classname', $lang) ?></li>
+ <li><?= message('bc_zero_raised_to_negative_number', $lang)
?></li>
+ <li><?= message('bc_round', $lang) ?></li>
+ <li><?= message('bc_typed_constants', $lang)
?></li>
+ <li><?= message('bc_gmp', $lang) ?></li>
+ <li><?= message('bc_mysqli_constants', $lang)
?></li>
+ <li><?= message('bc_mysqli_functions', $lang)
?></li>
+ <li><?= message('bc_standard', $lang) ?></li>
+ <li><?= message('bc_core', $lang) ?></li>
+ <li><?= message('bc_warnings', $lang) ?></li>
+ </ul>
+ </div>
+ </div>
+ </section>
+
+ <section class="php8-section php8-section_dark php8-section_footer
php8-footer">
+ <div class="php8-section__content">
+ <h2 class="php8-h2 center"><?= message('footer_title',
$lang) ?></h2>
+ <div class="php8-button-wrapper center">
+ <a class="php8-button php8-button_light"
href="/downloads"><?= message('upgrade_now', $lang) ?></a>
+ </div>
+ <div class="php8-footer__content"><?=
message('footer_description', $lang) ?></div>
+ </div>
+ </section>
+
+<?php
+
+site_footer();
diff --git a/releases/8.4/ru.php b/releases/8.4/ru.php
new file mode 100644
index 0000000000..4aefaf9a8c
--- /dev/null
+++ b/releases/8.4/ru.php
@@ -0,0 +1,5 @@
+<?php
+
+$lang = 'ru';
+
+include_once __DIR__ . '/release.inc';
diff --git
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-archive-1998-php-chromium.png
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-archive-1998-php-chromium.png
index 5c0adf5b91..f70a89940d 100644
Binary files
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-archive-1998-php-chromium.png and
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-archive-1998-php-chromium.png differ
diff --git
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-conferences-index-php-chromium.png
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-conferences-index-php-chromium.png
index ac740916ac..ad673ed55e 100644
Binary files
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-conferences-index-php-chromium.png and
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-conferences-index-php-chromium.png
differ
diff --git a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-index-php-chromium.png
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-index-php-chromium.png
index 694153ed96..43ba1b7978 100644
Binary files a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-index-php-chromium.png and
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-index-php-chromium.png differ
diff --git
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-index-php-chromium.png
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-index-php-chromium.png
index 17d7478f5a..c693f3c826 100644
Binary files
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-index-php-chromium.png and
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-index-php-chromium.png differ
diff --git a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-php5-php-chromium.png
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-php5-php-chromium.png
index ab87a9f7ed..272ff2b007 100644
Binary files
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-php5-php-chromium.png and
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-php5-php-chromium.png differ
diff --git
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-0-index-php-chromium.png
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-0-index-php-chromium.png
index 44d70c923a..9d1cdbc127 100644
Binary files
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-0-index-php-chromium.png and
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-0-index-php-chromium.png
differ
diff --git
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-1-index-php-chromium.png
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-1-index-php-chromium.png
index 44b746c174..e981012ffd 100644
Binary files
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-1-index-php-chromium.png and
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-1-index-php-chromium.png
differ
diff --git
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-2-index-php-chromium.png
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-2-index-php-chromium.png
index ad586e689f..9d20bcc7ad 100644
Binary files
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-2-index-php-chromium.png and
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-2-index-php-chromium.png
differ
diff --git
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-6-php-chromium.png
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-6-php-chromium.png
index c1e6f9c7c8..7816a8f59f 100644
Binary files
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-6-php-chromium.png and
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-6-php-chromium.png differ
diff --git
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-index-php-chromium.png
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-index-php-chromium.png
index 7fa7427e84..e384ec21c2 100644
Binary files
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-index-php-chromium.png and
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-index-php-chromium.png
differ