Author: Sergey Panteleev (saundefined)
Committer: GitHub (web-flow)
Pusher: saundefined
Date: 2022-12-07T17:48:50+03:00

Commit: 
https://github.com/php/web-php/commit/2f88bae3192d33f091eae5eeb74de93731faf275
Raw diff: 
https://github.com/php/web-php/commit/2f88bae3192d33f091eae5eeb74de93731faf275.diff

Preview PHP 8.2 Release page (#675)

Co-authored-by: Roman Pronskiy <ro...@pronskiy.com>
Co-authored-by: Tim Düsterhus <timwo...@googlemail.com>
Co-authored-by: Alexey Pyltsyn <lex61...@gmail.com>

Changed paths:
  A  images/php8/logo_php8_2.svg
  A  images/php8/php_8_2_released.png
  A  releases/8.2/common.php
  A  releases/8.2/en.php
  A  releases/8.2/index.php
  A  releases/8.2/languages/en.php
  A  releases/8.2/languages/ru.php
  A  releases/8.2/release.inc
  A  releases/8.2/ru.php
  M  styles/php8.css


Diff:

diff --git a/images/php8/logo_php8_2.svg b/images/php8/logo_php8_2.svg
new file mode 100644
index 0000000000..5bfb8df725
--- /dev/null
+++ b/images/php8/logo_php8_2.svg
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.2, SVG Export Plug-In . SVG Version: 
6.00 Build 0)  -->
+<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; x="0px" y="0px"
+        viewBox="0 0 451 127" style="enable-background:new 0 0 451 127;" 
xml:space="preserve">
+<style type="text/css">
+       .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
+       .st1{fill:#FFFFFF;}
+       .st2{fill:#0F0F0F;}
+</style>
+<path class="st0" 
d="M21.8,125.8h-21l18.7-96.1h40.3c12.1,0,21,3.2,26.5,9.5c5.6,6.4,7.2,15.2,5,26.7c-0.9,4.7-2.5,9-4.6,12.9
+       
c-2.2,3.9-5,7.5-8.5,10.7c-4.2,3.9-8.8,6.7-13.9,8.4c-5.1,1.7-11.6,2.5-19.6,2.5h-18L21.8,125.8z
 M67.7,49.2
+       
c-2.7-2.9-8-4.4-15.9-4.4H37.5l-7.8,40.3h12.7c8.4,0,14.7-1.6,18.9-4.8c4.1-3.2,6.9-8.5,8.4-15.9C71,57.2,70.3,52.2,67.7,49.2z"/>
+<path class="st1" 
d="M106.6,4.1h20.8l-5,25.6h18.5c11.7,0,19.7,2,24.1,6.1c4.4,4.1,5.8,10.7,4,19.8l-8.7,44.8h-21.1l8.3-42.6
+       
c0.9-4.8,0.6-8.1-1-9.9c-1.6-1.8-5.1-2.6-10.4-2.6h-16.6l-10.7,55.1H87.9L106.6,4.1z"/>
+<path class="st0" 
d="M185.2,125.8h-21l18.7-96.1h40.4c12.1,0,21,3.2,26.5,9.5c5.6,6.4,7.2,15.2,5,26.7c-0.9,4.7-2.5,9-4.6,12.9
+       
c-2.2,3.9-5,7.5-8.5,10.7c-4.2,3.9-8.8,6.7-13.9,8.4c-5.1,1.7-11.6,2.5-19.6,2.5h-18L185.2,125.8z
 M231.2,49.2
+       
c-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.8c4.1-3.2,6.9-8.5,8.4-15.9C234.4,57.2,233.8,52.2,231.2,49.2
+       z"/>
+<path class="st1" 
d="M317.5,48.5c-5.7-13.6-10.5-25.4-5.8-33.6c1.8-2.5,3.8-3.8,6-3.8c4.5,0,8.6,4.9,8.6,4.9l5.7,6.9l-3.6-8.2
+       
c-0.2-0.3-6.3-14.2-17.2-14.2c-3.8,0-7.8,1.7-11.7,5.1l-0.1,0.1c-9.5,11-0.2,31.8,8.1,50.1l6.1,14.2c0,0,0.6,0.5,0,0
+       
c2.8,7.3,5.6,16,3.9,22.4c-2.6,10-11.5,16.8-11.6,16.9l-5.7,4.4l6.9-2.2c0.7-0.2,16-5.2,19.7-18.5c2.3-10.9-0.6-21.8-3.5-30.2
+       c0.4-0.3-0.4,0.3,0,0L318,49.1"/>
+<path class="st2" 
d="M334.4,9.9l-7.1-7.8l5.1,9.3c0.1,0.1,6.3,11.7-1.6,25.2c-2.9,4.2-7.4,8.4-13.1,12.6l-10.3,6.7
+       
c-0.1-0.2-0.1-0.1,0,0l-0.4,0.3h0.1H307c-11.5,6.6-22.2,10.6-22.4,10.7c-15.9,7.1-25.9,18.1-27.3,30.3c-1.1,9.2,3.2,18.2,11.6,24.5
+       
l0.1,0.1c5.3,3.2,11,4.8,17,4.8c15.7,0,28-10.9,28.5-11.4l7.7-6.9l-9.1,4.8c-0.1,0-7.7,4-15.6,4c-7.1,0-12.1-3.1-15.1-9.4
+       
c-3.8-13.4,9.5-22.6,24.8-33.2c2-1.4,4.1-2.9,6.2-4.3l0.1-0.1l9.1-6.8c0.1-0.2,0.4-0.4,0.4-0.4c7.5-6.2,17.4-15.9,19.7-29.5
+       C344.5,21.1,334.8,10.4,334.4,9.9z"/>
+<path class="st1" d="M345.4,83h19.5l-3.5,17.7h-19.5L345.4,83z"/>
+<path class="st1" 
d="M432.8,67.2c13.2-10.1,18.1-17.8,18.1-28.6c0-14.2-10.7-23.7-26.7-23.7c-11.4,0-21.4,5.2-29.5,15.3l-0.5,0.7
+       
l11.4,13l0.8-0.8c6.7-7.1,11.7-9.9,17.2-9.9c5.4,0,8.4,2.7,8.4,7.5c0,4.6-3.1,8.8-10.6,14.5l-39.2,29.6l0,0l-3.1,15.7h61.4l3.4-17.7
+       h-31.8L432.8,67.2z"/>
+</svg>
diff --git a/images/php8/php_8_2_released.png b/images/php8/php_8_2_released.png
new file mode 100644
index 0000000000..357e322cb8
Binary files /dev/null and b/images/php8/php_8_2_released.png differ
diff --git a/releases/8.2/common.php b/releases/8.2/common.php
new file mode 100644
index 0000000000..966ca97d04
--- /dev/null
+++ b/releases/8.2/common.php
@@ -0,0 +1,75 @@
+<?php declare(strict_types=1);
+
+namespace releases\php82;
+
+include_once __DIR__ . '/../../include/prepend.inc';
+
+function language_redirect(string $currentLang): void {
+    // We don't use the general language selection of php.net,
+    // so soldier on with this one.
+    return;
+}
+
+function common_header(string $description): void {
+    global $MYSITE;
+
+    $meta_image_path = \htmlspecialchars(
+        \filter_var($MYSITE . 'images/php8/php_8_2_released.png', 
\FILTER_VALIDATE_URL));
+    $meta_description = \htmlspecialchars($description);
+
+    \site_header("PHP 8.2.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.2 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.2 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 {
+    $LANGUAGES = [
+        'en' => 'English',
+        'ru' => 'Russian',
+    ];
+
+    // 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.2/en.php b/releases/8.2/en.php
new file mode 100644
index 0000000000..aa9133cd7a
--- /dev/null
+++ b/releases/8.2/en.php
@@ -0,0 +1,5 @@
+<?php
+
+$lang = 'en';
+
+include_once __DIR__ . '/release.inc';
\ No newline at end of file
diff --git a/releases/8.2/index.php b/releases/8.2/index.php
new file mode 100644
index 0000000000..9e2d99f8ef
--- /dev/null
+++ b/releases/8.2/index.php
@@ -0,0 +1,5 @@
+<?php
+ $_SERVER['BASE_PAGE'] = 'releases/8.2/index.php';
+include (__DIR__ . '/../../include/site.inc');
+
+mirror_redirect('/releases/8.2/en.php');
diff --git a/releases/8.2/languages/en.php b/releases/8.2/languages/en.php
new file mode 100644
index 0000000000..39add58800
--- /dev/null
+++ b/releases/8.2/languages/en.php
@@ -0,0 +1,40 @@
+<?php
+
+return [
+    'common_header' => 'PHP 8.2 is a major update of the PHP language. 
Readonly classes, null, false, and true as stand-alone types, deprecated 
dynamic properties, performance improvements and more',
+    'documentation' => 'Doc',
+    'main_title' => 'To be released tomorrow!',
+    'main_subtitle' => 'PHP 8.2 is a major update of the PHP language.<br 
class="display-none-md">It contains many new features, including readonly 
classes, null, false, and true as stand-alone types, deprecated dynamic 
properties, performance improvements and more.',
+    'upgrade_now' => 'Upgrade to PHP 8.2 now!',
+    'readonly_classes_title' => 'Readonly classes',
+    'dnf_types_title' => 'Disjunctive Normal Form (DNF) Types',
+    'dnf_types_description' => 'DNF types allow us to combine <a 
href="/manual/en/language.types.type-system.php#language.types.type-system.composite.union">union</a>
 and <a 
href="/manual/en/language.types.type-system.php#language.types.type-system.composite.intersection">intersection</a>
 types, following a strict rule: when combining union and intersection types, 
intersection types must be grouped with brackets.',
+    'null_false_true_types_title' => 'Allow <code>null</code>, 
<code>false</code>, and <code>true</code> as stand-alone types',
+    'random_title' => 'New "Random" extension',
+    'random_description' => '<p>The "random" extension provides a new 
object-oriented API to random number generation. Instead of relying on a 
globally seeded random number generator (RNG) using the Mersenne Twister 
algorithm the object-oriented API provides several classes ("Engine"s) 
providing access to modern algorithms that store their state within objects to 
allow for multiple independent seedable sequences.</p>
+        <p>The <code>\Random\Randomizer</code> class provides a high level 
interface to use the engine\'s randomness to generate a random integer, to 
shuffle an array or string, to select random array keys and more.</p>',
+    'constants_in_traits_title' => 'Constants in traits',
+    'constants_in_traits_description' => 'You cannot access the constant 
through the name of the trait, but, you can access the constant through the 
class that uses the trait.',
+    'deprecate_dynamic_properties_title' => 'Deprecate dynamic properties',
+    'deprecate_dynamic_properties_description' => '<p>The creation of dynamic 
properties is deprecated to help avoid mistakes and typos, unless the class 
opts in by using the <code>#[\AllowDynamicProperties]</code> attribute. 
<code>stdClass</code> allows dynamic properties.</p>
+        <p>Usage of the <code>__get</code>/<code>__set</code> magic methods is 
not affected by this change.</p>',
+    'new_classes_title' => 'New Classes, Interfaces, and Functions',
+    'new_mysqli' => 'New <a 
href="/manual/en/mysqli.execute-query.php"><code>mysqli_execute_query</code></a>
 function and <a 
href="/manual/en/mysqli.execute-query.php"><code>mysqli::execute_query</code></a>
 method.',
+    'new_attributes' => 'New <a 
href="/manual/en/class.allow-dynamic-properties.php"><code>#[\AllowDynamicProperties]</code></a>
 and <a 
href="/manual/en/class.sensitive-parameter.php"><code>#[\SensitiveParameter]</code></a>
 attributes.',
+    'new_zip' => 'New <a 
href="/manual/en/ziparchive.getstreamindex.php"><code>ZipArchive::getStreamIndex</code></a>,
 <a 
href="/manual/en/ziparchive.getstreamname.php"><code>ZipArchive::getStreamName</code></a>,
 and <a 
href="/manual/en/ziparchive.clearerror.php"><code>ZipArchive::clearError</code></a>
 methods.',
+    'new_reflection' => 'New <a 
href="/manual/en/reflectionfunction.isanonymous.php"><code>ReflectionFunction::isAnonymous</code></a>
 and <a 
href="/manual/en/reflectionmethod.hasprototype.php"><code>ReflectionMethod::hasPrototype</code></a>
 methods.',
+    'new_functions' => 'New <a 
href="/manual/en/function.curl_upkeep.php"><code>curl_upkeep</code></a>, <a 
href="/manual/en/function.memory-reset-peak-usage.php"><code>memory_reset_peak_usage</code></a>,
 <a 
href="/manual/en/function.ini-parse-quantity.php"><code>ini_parse_quantity</code></a>,
 <a 
href="/manual/en/function.libxml-get-external-entity-loader.php"><code>libxml_get_external_entity_loader</code></a>,
 <a 
href="/manual/en/function.sodium-crypto-stream-xchacha20-xor-ic.php"><code>sodium_crypto_stream_xchacha20_xor_ic</code></a>,
 <a 
href="/manual/en/function.openssl-cipher-key-length.php"><code>openssl_cipher_key_length</code></a>
 functions.',
+    'bc_title' => 'Deprecations and backward compatibility breaks',
+    'bc_string_interpolation' => 'Deprecated <code>${}</code> string 
interpolation.',
+    'bc_utf8' => 'Deprecated <a 
href="/manual/en/function.utf8-encode.php"><code>utf8_encode</code></a> and <a 
href="/manual/en/function.utf8-decode.php"><code>utf8_decode</code></a> 
functions.',
+    'bc_datetime' => 'Methods <a 
href="/manual/en/datetime.createfromimmutable.php"><code>DateTime::createFromImmutable</code></a>
 and <a 
href="/manual/en/datetimeimmutable.createfrommutable.php"><code>DateTimeImmutable::createFromMutable</code></a>
 has a tentative return type of <code>static</code>.',
+    'bc_odbc' => 'Extensions <code>ODBC</code> and <code>PDO_ODBC</code> 
escapes the username and password.',
+    'bc_str_locale_sensitive' => 'Functions <a 
href="/manual/en/function.strtolower.php"><code>strtolower</code></a> and <a 
href="/manual/en/function.strtoupper.php"><code>strtoupper</code></a> are no 
longer locale-sensitive.',
+    'bc_spl_enforces_signature' => 'Methods <a 
href="/manual/en/splfileobject.getcsvcontrol.php"><code>SplFileObject::getCsvControl</code></a>,
 <a 
href="/manual/en/splfileobject.fflush.php"><code>SplFileObject::fflush</code></a>,
 <a 
href="/manual/en/splfileobject.ftell.php"><code>SplFileObject::ftell</code></a>,
 <a 
href="/manual/en/splfileobject.fgetc.php"><code>SplFileObject::fgetc</code></a>,
 and <a 
href="/manual/en/splfileobject.fpassthru.php"><code>SplFileObject::fpassthru</code></a>
 enforces their signature.',
+    'bc_spl_false' => 'Method <a 
href="/manual/en/splfileobject.haschildren.php"><code>SplFileObject::hasChildren</code></a>
 has a tentative return type of <code>false</code>.',
+    'bc_spl_null' => 'Method <a 
href="/manual/en/splfileobject.getchildren.php"><code>SplFileObject::getChildren</code></a>
 has a tentative return type of <code>null</code>.',
+    'bc_spl_deprecated' => 'The internal method 
<code>SplFileInfo::_bad_state_ex</code> has been deprecated.',
+    'footer_title' => 'Better performance, better syntax, improved type 
safety.',
+    'footer_description' => '<p>For source downloads of PHP 8.2 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_2">ChangeLog</a>.</p>
+        <p>The <a href="/manual/en/migration82.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.2/languages/ru.php b/releases/8.2/languages/ru.php
new file mode 100644
index 0000000000..6cbb51d636
--- /dev/null
+++ b/releases/8.2/languages/ru.php
@@ -0,0 +1,40 @@
+<?php
+
+return [
+    'common_header' => 'PHP 8.2 — большое обновление языка PHP. 
Readonly-классы, самостоятельные типы null, false и true, устаревшие 
динамические свойства, улучшение производительности и многое другое.',
+    'documentation' => 'Документация',
+    'main_title' => 'будет выпущен завтра!',
+    'main_subtitle' => 'PHP 8.2 — большое обновление языка PHP.<br 
class="display-none-md">Оно содержит множество новых возможностей, включая 
readonly-классы, самостоятельные типы null, false и true, устаревшие 
динамические свойства, улучшение производительности и многое другое.',
+    'upgrade_now' => 'Переходите на PHP 8.2!',
+    'readonly_classes_title' => 'Readonly-классы',
+    'dnf_types_title' => 'Типы в виде дизъюнктивной нормальной формы (ДНФ)',
+    'dnf_types_description' => 'ДНФ позволяет совместить <a 
href="/manual/ru/language.types.type-system.php#language.types.type-system.composite.union">объединение</a>
 и <a 
href="/manual/ru/language.types.type-system.php#language.types.type-system.composite.intersection">пересечение</a>
 типов, при этом обязательно типы пересечения следует сгруппировать скобками.',
+    'null_false_true_types_title' => 'Самостоятельные типы <code>null</code>, 
<code>false</code> и <code>true</code>',
+    'random_title' => 'Новый модуль "Random"',
+    'random_description' => '<p>Модуль "random" предлагает новый 
объектно-ориентированный API для генерации случайных чисел. Вместо 
использования глобального генератора случайных чисел (ГСЧ) на базе алгоритма 
вихря Мерсенна, в объектно-ориентированном API доступно несколько ГСЧ, 
представленных отдельными классами (как реализации интерфейса Engine), которые 
хранят внутреннее состояние, позволяя создавать несколько независимых 
последовательностей случайных чисел.</p>
+        <p>Класс <code>\Random\Randomizer</code> представляет высокоуровневый 
интерфейс по использованию движков для генерации случайного целого числа, 
перемешивания массива или строки, выбора случайных ключей массива и многое 
другое.</p>',
+    'constants_in_traits_title' => 'Константы в трейтах',
+    'constants_in_traits_description' => 'Нельзя получить доступ к константе 
через имя трейта, но можно через класс, который использует этот трейт.',
+    'deprecate_dynamic_properties_title' => 'Динамические свойства объявлены 
устаревшими',
+    'deprecate_dynamic_properties_description' => '<p>Чтобы помочь избежать 
ошибок и опечаток, больше не рекомендуется определять динамические свойства, 
только если сам класс явно не разрешит это при помощи атрибута 
<code>#[\AllowDynamicProperties]</code>. В экземплярах <code>stdClass</code> 
по-прежнему можно использовать динамические свойства.</p>
+        <p>Это изменение не влияет на использование магических методов 
<code>__get</code>/<code>__set</code>.</p>',
+    'new_classes_title' => 'Новые классы, интерфейсы и функции',
+    'new_mysqli' => 'Новая функция <a 
href="/manual/ru/mysqli.execute-query.php"><code>mysqli_execute_query</code></a>
 и метод <a 
href="/manual/ru/mysqli.execute-query.php"><code>mysqli::execute_query</code></a>.',
+    'new_attributes' => 'Новые атрибуты <a 
href="/manual/ru/class.allow-dynamic-properties.php"><code>#[\AllowDynamicProperties]</code></a>
 и <a 
href="/manual/ru/class.sensitive-parameter.php"><code>#[\SensitiveParameter]</code></a>.',
+    'new_zip' => 'Новые методы <a 
href="/manual/ru/ziparchive.getstreamindex.php"><code>ZipArchive::getStreamIndex</code></a>,
 <a 
href="/manual/ru/ziparchive.getstreamname.php"><code>ZipArchive::getStreamName</code></a>
 и <a 
href="/manual/ru/ziparchive.clearerror.php"><code>ZipArchive::clearError</code></a>.',
+    'new_reflection' => 'Новые методы <a 
href="/manual/ru/reflectionfunction.isanonymous.php"><code>ReflectionFunction::isAnonymous</code></a>
 и <a 
href="/manual/ru/reflectionmethod.hasprototype.php"><code>ReflectionMethod::hasPrototype</code></a>.',
+    'new_functions' => 'Новые функции <a 
href="/manual/ru/function.curl_upkeep.php"><code>curl_upkeep</code></a>, <a 
href="/manual/ru/function.memory-reset-peak-usage.php"><code>memory_reset_peak_usage</code></a>,
 <a 
href="/manual/ru/function.ini-parse-quantity.php"><code>ini_parse_quantity</code></a>,
 <a 
href="/manual/ru/function.libxml-get-external-entity-loader.php"><code>libxml_get_external_entity_loader</code></a>,
 <a 
href="/manual/ru/function.sodium-crypto-stream-xchacha20-xor-ic.php"><code>sodium_crypto_stream_xchacha20_xor_ic</code></a>,
 <a 
href="/manual/ru/function.openssl-cipher-key-length.php"><code>openssl_cipher_key_length</code></a>.',
+    'bc_title' => 'Устаревшая функциональность и изменения в обратной 
совместимости',
+    'bc_string_interpolation' => 'Интерполяции строк вида <code>${}</code> 
следует избегать.',
+    'bc_utf8' => 'Не рекомендуется использовать функции <a 
href="/manual/ru/function.utf8-encode.php"><code>utf8_encode</code></a> и <a 
href="/manual/ru/function.utf8-decode.php"><code>utf8_decode</code></a>.',
+    'bc_datetime' => 'У методов <a 
href="/manual/ru/datetime.createfromimmutable.php"><code>DateTime::createFromImmutable</code></a>
 и <a 
href="/manual/ru/datetimeimmutable.createfrommutable.php"><code>DateTimeImmutable::createFromMutable</code></a>
 задан предварительный тип возвращаемого значения <code>static</code>.',
+    'bc_odbc' => 'Модули <code>ODBC</code> и <code>PDO_ODBC</code> экранирует 
имя пользователя и пароль.',
+    'bc_str_locale_sensitive' => 'При работе функции <a 
href="/manual/ru/function.strtolower.php"><code>strtolower</code></a> и <a 
href="/manual/ru/function.strtoupper.php"><code>strtoupper</code></a> теперь не 
учитывают локаль.',
+    'bc_spl_enforces_signature' => 'Методы <a 
href="/manual/ru/splfileobject.getcsvcontrol.php"><code>SplFileObject::getCsvControl</code></a>,
 <a 
href="/manual/ru/splfileobject.fflush.php"><code>SplFileObject::fflush</code></a>,
 <a 
href="/manual/ru/splfileobject.ftell.php"><code>SplFileObject::ftell</code></a>,
 <a 
href="/manual/ru/splfileobject.fgetc.php"><code>SplFileObject::fgetc</code></a> 
и <a 
href="/manual/ru/splfileobject.fpassthru.php"><code>SplFileObject::fpassthru</code></a>
 усиливают свою сигнатуру.',
+    'bc_spl_false' => 'У метода <a 
href="/manual/ru/splfileobject.haschildren.php"><code>SplFileObject::hasChildren</code></a>
 предварительный тип возвращаемого значения задан как <code>false</code>.',
+    'bc_spl_null' => 'У метода <a 
href="/manual/ru/splfileobject.getchildren.php"><code>SplFileObject::getChildren</code></a>
 предварительный тип возвращаемого значения задан как <code>null</code>.',
+    'bc_spl_deprecated' => 'Внутренний метод 
<code>SplFileInfo::_bad_state_ex</code> объявлен устаревшим.',
+    'footer_title' => 'Выше производительность, лучше синтаксис, надёжнее 
система типов.',
+    'footer_description' => '<p>Для загрузки исходного кода PHP 8.2 посетите 
страницу <a href="/downloads">Downloads</a>. Бинарные файлы Windows находятся 
на сайте <a href="https://windows.php.net/download";>PHP for Windows</a>. Список 
изменений перечислен на странице <a 
href="/ChangeLog-8.php#PHP_8_2">ChangeLog</a>.</p>
+        <p><a href="/manual/ru/migration82.php">Руководство по миграции</a> 
доступно в разделе документации. Ознакомьтесь с ним, чтобы узнать обо всех 
новых возможностях и изменениях, затрагивающих обратную совместимость.</p>',
+];
diff --git a/releases/8.2/release.inc b/releases/8.2/release.inc
new file mode 100644
index 0000000000..dcab6314fb
--- /dev/null
+++ b/releases/8.2/release.inc
@@ -0,0 +1,426 @@
+<?php
+
+use function releases\php82\common_header;
+use function releases\php82\language_chooser;
+use function releases\php82\language_redirect;
+use function releases\php82\message;
+
+if (!isset($lang)) {
+    $lang = 'en';
+}
+
+$_SERVER['BASE_PAGE'] = 'releases/8.2/' . $lang . '.php';
+
+include_once __DIR__ . '/common.php';
+
+language_redirect($lang);
+
+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_2.svg" alt="PHP 8.2" 
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="readonly_classes">
+                <?= message('readonly_classes_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/readonly_classes";>RFC</a>
+                <a class="php8-rfc"
+                   href="/manual/<?= $lang 
?>/language.oop5.basic.php#language.oop5.basic.class.readonly"><?= message(
+                        'documentation',
+                        $lang
+                    ) ?></a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.2</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class BlogData
+{
+    public readonly string $title;
+
+    public readonly Status $status;
+
+    public function __construct(string $title, Status $status)
+    {
+        $this->title = $title;
+        $this->status = $status;
+    }
+}
+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.2</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+readonly class BlogData
+{
+    public string $title;
+
+    public Status $status;
+
+    public function __construct(string $title, Status $status)
+    {
+        $this->title = $title;
+        $this->status = $status;
+    }
+}
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="dnf_types">
+                <?= message('dnf_types_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/dnf_types";>RFC</a>
+                <a class="php8-rfc"
+                   href="/manual/<?= $lang 
?>/migration82.new-features.php#migration82.new-features.core.type-system"><?= 
message(
+                        'documentation',
+                        $lang
+                    ) ?></a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.2</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class Foo {
+    public function bar(mixed $entity) {
+        if ($entity === null) {
+            return null;
+        }
+
+        if (($entity instanceof A) && ($entity instanceof B)) {
+            return $entity;
+        }
+
+        throw new Exception('Invalid entity');
+    }
+}
+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.2</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class Foo {
+    public function bar((A&B)|null $entity) {
+        if ($entity === null) {
+            return null;
+        }
+
+        return $entity;
+    }
+}
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="php8-compare__content">
+            <?= message('dnf_types_description', $lang) ?>
+        </div>
+
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="null_false_true_types">
+                <?= message('null_false_true_types_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/null-false-standalone-types";>RFC</a>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/true-type";>RFC</a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.2</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class Falsy
+{
+    public function almostFalse(): string|bool { /* ... */ *}
+
+    public function almostTrue(): string|bool { /* ... */ *}
+
+    public function almostNull(): string|null { /* ... */ *}
+}
+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.2</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class Falsy
+{
+    public function alwaysFalse(): false { /* ... */ *}
+
+    public function alwaysTrue(): true { /* ... */ *}
+
+    public function alwaysNull(): null { /* ... */ *}
+}
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="random_extension">
+                <?= message('random_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/rng_extension";>RFC</a>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/random_extension_improvement";>RFC</a>
+                <a class="php8-rfc" href="/manual/<?= $lang 
?>/book.random.php"><?= message('documentation', $lang ) ?></a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="example-contents example-contents-full">
+                    <div class="php8-compare__label 
php8-compare__label_new">PHP 8.2</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+use Random\Engine\Xoshiro256StarStar;
+use Random\Randomizer;
+
+$blueprintRng = new Xoshiro256StarStar(
+    hash('sha256', "Example seed that is converted to a 256 Bit string via 
SHA-256", true)
+);
+
+$fibers = [];
+for ($i = 0; $i < 8; $i++) {
+       $fiberRng = clone $blueprintRng;
+       // Xoshiro256**'s 'jump()' method moves the blueprint ahead 2**128 
steps, as if calling
+       // 'generate()' 2**128 times, giving the Fiber 2**128 unique values 
without needing to reseed.
+       $blueprintRng->jump();
+
+       $fibers[] = new Fiber(function () use ($fiberRng, $i): void {
+               $randomizer = new Randomizer($fiberRng);
+
+               echo "{$i}: " . $randomizer->getInt(0, 100), PHP_EOL;
+       });
+}
+
+// The randomizer will use a CSPRNG by default.
+$randomizer = new Randomizer();
+
+// Even though the fibers execute in a random order, they will print the same 
value
+// each time, because each has its own unique instance of the RNG.
+$fibers = $randomizer->shuffleArray($fibers);
+foreach ($fibers as $fiber) {
+       $fiber->start();
+}
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="php8-compare__content">
+            <?= message('random_description', $lang) ?>
+        </div>
+
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="constants_in_traits">
+                <?= message('constants_in_traits_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/constants_in_traits";>RFC</a>
+                <a class="php8-rfc"
+                   href="/manual/<?= $lang 
?>/migration82.new-features.php#migration82.new-features.core.constant-in-traits"><?=
 message(
+                        'documentation',
+                        $lang
+                    ) ?></a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.2</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+trait Foo
+{
+    public const CONSTANT = 1;
+
+    public function bar(): int
+    {
+        return self::CONSTANT; // Fatal error
+    }
+}
+
+class Bar
+{
+    use Foo;
+}
+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.2</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+trait Foo
+{
+    public const CONSTANT = 1;
+
+    public function bar(): int
+    {
+        return self::CONSTANT; // Fatal error
+    }
+}
+
+class Bar
+{
+    use Foo;
+}
+
+var_dump(Bar::CONSTANT); // 1
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="php8-compare__content">
+            <?= message('constants_in_traits_description', $lang) ?>
+        </div>
+
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="deprecate_dynamic_properties">
+                <?= message('deprecate_dynamic_properties_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/deprecate_dynamic_properties";>RFC</a>
+                <a class="php8-rfc"
+                   href="/manual/<?= $lang 
?>/migration82.deprecated.php#migration82.deprecated.core.dynamic-properties"><?=
 message(
+                        'documentation',
+                        $lang
+                    ) ?></a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.2</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class User
+{
+    public $name;
+}
+
+$user = new User();
+$user->last_name = 'Doe';
+
+$user = new stdClass();
+$user->last_name = 'Doe';
+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.2</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class User
+{
+    public $name;
+}
+
+$user = new User();
+$user->last_name = 'Doe'; // Deprecated notice
+
+$user = new stdClass();
+$user->last_name = 'Doe'; // Still allowed
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="php8-compare__content">
+            <?= message('deprecate_dynamic_properties_description', $lang) ?>
+        </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_mysqli', $lang) ?></li>
+                    <li><?= message('new_attributes', $lang) ?></li>
+                    <li><?= message('new_zip', $lang) ?></li>
+                    <li><?= message('new_reflection', $lang) ?></li>
+                    <li><?= message('new_functions', $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_string_interpolation', $lang) ?></li>
+                    <li><?= message('bc_utf8', $lang) ?></li>
+                    <li><?= message('bc_datetime', $lang) ?></li>
+                    <li><?= message('bc_odbc', $lang) ?></li>
+                    <li><?= message('bc_str_locale_sensitive', $lang) ?></li>
+                    <li><?= message('bc_spl_enforces_signature', $lang) ?></li>
+                    <li><?= message('bc_spl_false', $lang) ?></li>
+                    <li><?= message('bc_spl_null', $lang) ?></li>
+                    <li><?= message('bc_spl_deprecated', $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.2/ru.php b/releases/8.2/ru.php
new file mode 100644
index 0000000000..4aefaf9a8c
--- /dev/null
+++ b/releases/8.2/ru.php
@@ -0,0 +1,5 @@
+<?php
+
+$lang = 'ru';
+
+include_once __DIR__ . '/release.inc';
diff --git a/styles/php8.css b/styles/php8.css
index 9de2cb73c1..e10d230bf5 100644
--- a/styles/php8.css
+++ b/styles/php8.css
@@ -285,6 +285,7 @@
   }
 }
 
+.php8-h2 code,
 .php8-compare__content code {
   color: rgba(39, 40, 44, 0.7);
   background-color: rgba(39, 40, 44, 0.05);
@@ -435,3 +436,8 @@
   color: rgba(39, 40, 44, 0.7);
   line-height: 1.33;
 }
+
+.example-contents-full {
+  width: 100%;
+  position: relative;
+}

-- 
PHP Webmaster List Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


Reply via email to