mirror of
https://github.com/php/web-php.git
synced 2026-03-23 23:02:13 +01:00
PHP 8.5 release page (#1454)
Co-authored-by: Tim Düsterhus <tim@bastelstu.be> Co-authored-by: Borislav Kosun <kosun.b@yandex.com> Co-authored-by: Theodore Brown <theodorejb@outlook.com>
This commit is contained in:
8
images/php8/anchor-white.svg
Normal file
8
images/php8/anchor-white.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="21" height="16" viewBox="0 0 21 16">
|
||||
<g fill="#ffffff" fill-rule="evenodd">
|
||||
<path d="M18.914 1.328c-1.771-1.77-4.643-1.77-6.414 0L8 5.828l1.414 1.414 4.5-4.5c.99-.99 2.596-.99 3.586 0 .99.99.99 2.596 0 3.586l-4.5 4.5 1.414 1.414 4.5-4.5c1.77-1.771 1.77-4.643 0-6.414z"
|
||||
transform="translate(-622 -1049) translate(622 1049)"/>
|
||||
<path d="M6.328 12.5c-.64.643-1.574.894-2.45.66-.877-.234-1.561-.919-1.796-1.795-.234-.876.018-1.81.66-2.45l4.5-4.5L5.828 3l-4.5 4.5c-1.77 1.771-1.77 4.643 0 6.414 1.772 1.771 4.643 1.771 6.414 0l4.5-4.5L10.828 8l-4.5 4.5z"
|
||||
transform="translate(-622 -1049) translate(622 1049)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 716 B |
9
images/php8/logo_php8_5.svg
Normal file
9
images/php8/logo_php8_5.svg
Normal file
@@ -0,0 +1,9 @@
|
||||
<svg width="467" height="133" viewBox="0 0 467 133" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.7998 125.799H0.799805L19.4998 29.6992H59.7998C71.8998 29.6992 80.7998 32.8992 86.2998 39.1992C91.8998 45.5992 93.4998 54.3992 91.2998 65.8992C90.3998 70.5992 88.7998 74.8992 86.6998 78.7992C84.4998 82.6992 81.6998 86.2992 78.1998 89.4992C73.9998 93.3992 69.3998 96.1992 64.2998 97.8992C59.1998 99.5992 52.6998 100.399 44.6998 100.399H26.6998L21.7998 125.799ZM67.6998 49.1992C64.9998 46.2992 59.6998 44.7992 51.7998 44.7992H37.4998L29.6998 85.0992H42.3998C50.7998 85.0992 57.0998 83.4992 61.2998 80.2992C65.3998 77.0992 68.1998 71.7992 69.6998 64.3992C70.9998 57.1992 70.2998 52.1992 67.6998 49.1992Z" fill="white"/>
|
||||
<path d="M106.6 4.09961H127.4L122.4 29.6996H140.9C152.6 29.6996 160.6 31.6996 165 35.7996C169.4 39.8996 170.8 46.4996 169 55.5996L160.3 100.4H139.2L147.5 57.7996C148.4 52.9996 148.1 49.6996 146.5 47.8996C144.9 46.0996 141.4 45.2996 136.1 45.2996H119.5L108.8 100.4H87.9004L106.6 4.09961Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M185.2 125.799H164.2L182.9 29.6992H223.3C235.4 29.6992 244.3 32.8992 249.8 39.1992C255.4 45.5992 257 54.3992 254.8 65.8992C253.9 70.5992 252.3 74.8992 250.2 78.7992C248 82.6992 245.2 86.2992 241.7 89.4992C237.5 93.3992 232.9 96.1992 227.8 97.8992C222.7 99.5992 216.2 100.399 208.2 100.399H190.2L185.2 125.799ZM231.2 49.1992C228.5 46.2992 223.2 44.7992 215.3 44.7992H200.9L193.1 85.0992H205.8C214.2 85.0992 220.5 83.4992 224.7 80.2992C228.8 77.0992 231.6 71.7992 233.1 64.3992C234.4 57.1992 233.8 52.1992 231.2 49.1992Z" fill="white"/>
|
||||
<path d="M317.5 48.5C311.8 34.9 307 23.1 311.7 14.9C313.5 12.4 315.5 11.1 317.7 11.1C322.2 11.1 326.3 16 326.3 16L332 22.9L328.4 14.7C328.2 14.4 322.1 0.5 311.2 0.5C307.4 0.5 303.4 2.2 299.5 5.6L299.4 5.7C289.9 16.7 299.2 37.5 307.5 55.8L313.6 70C316.4 77.3 319.2 86 317.5 92.4C314.9 102.4 306 109.2 305.9 109.3L300.2 113.7L307.1 111.5C307.8 111.3 323.1 106.3 326.8 93C329.1 82.1 326.2 71.2 323.3 62.8C323.7 62.5 322.9 63.1 323.3 62.8L318 49.1" fill="white"/>
|
||||
<path d="M334.4 9.89961L327.3 2.09961L332.4 11.3996C332.5 11.4996 338.7 23.0996 330.8 36.5996C327.9 40.7996 323.4 44.9996 317.7 49.1996L307.4 55.8996C307.3 55.7996 307.3 55.6996 307.4 55.8996L307 56.1996C295.5 62.7996 284.8 66.7996 284.6 66.8996C268.7 73.9996 258.7 84.9996 257.3 97.1996C256.2 106.4 260.5 115.4 268.9 121.7L269 121.8C274.3 125 280 126.6 286 126.6C301.7 126.6 314 115.7 314.5 115.2L322.2 108.3L313.1 113.1C313 113.1 305.4 117.1 297.5 117.1C290.4 117.1 285.4 114 282.4 107.7C278.6 94.2996 291.9 85.0996 307.2 74.4996C309.2 73.0996 311.3 71.5996 313.4 70.1996L313.5 70.0996L322.6 63.2996C322.7 63.0996 323 62.8996 323 62.8996C330.5 56.6996 340.4 46.9996 342.7 33.3996C344.5 21.0996 334.8 10.3996 334.4 9.89961Z" fill="#0F0F0F"/>
|
||||
<path d="M345.4 83H364.9L361.4 100.7H341.9L345.4 83Z" fill="white"/>
|
||||
<path d="M375.68 86.24H417.44C419.28 86.32 421.04 86.2 422.72 85.88C424.4 85.48 425.96 84.92 427.4 84.2C428.76 83.48 429.96 82.4 431 80.96C432.04 79.52 432.84 77.72 433.4 75.56C434.04 73.4 434.2 71.6 433.88 70.16C433.64 68.72 433.04 67.64 432.08 66.92C431.04 66.2 429.76 65.68 428.24 65.36C426.8 64.96 425.12 64.76 423.2 64.76L381.56 64.64L394.88 14.84H466.52L462.56 29.6H410L404.6 49.88H435.44C439.44 49.96 442.88 50.56 445.76 51.68C448.64 52.8 450.96 54.44 452.72 56.6C454.48 58.76 455.52 61.44 455.84 64.64C456.16 67.76 455.76 71.4 454.64 75.56C453.36 80.36 451.52 84.44 449.12 87.8C446.8 91.08 444 93.64 440.72 95.48C437.36 97.32 433.76 98.72 429.92 99.68C426.08 100.56 422 101 417.68 101H371.84L375.68 86.24Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
BIN
images/php8/php_8_5_released.png
Normal file
BIN
images/php8/php_8_5_released.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
@@ -59,6 +59,7 @@
|
||||
|
||||
</div><!-- layout -->
|
||||
|
||||
<?php if(!isset($config['footer']) || $config['footer']): ?>
|
||||
<footer>
|
||||
<div class="container footer-content">
|
||||
<div class="row-fluid">
|
||||
@@ -87,7 +88,7 @@ if (!empty($_SERVER['BASE_PAGE'])
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<?php endif; ?>
|
||||
<?php
|
||||
// if elephpants enabled, insert placeholder nodes
|
||||
// to be populated with images via javascript.
|
||||
|
||||
@@ -182,6 +182,16 @@ if (!isset($config["languages"])) {
|
||||
</div>
|
||||
|
||||
<div class="navbar__right">
|
||||
<?php if (!empty($config['language_switcher'])) { ?>
|
||||
<div class="navbar__languages">
|
||||
<select onchange="location = this.value">
|
||||
<?php foreach ($config['language_switcher'] as $item) { ?>
|
||||
<option value="<?= $item['url'] ?>"<?= $item['selected'] ? ' selected' : ''?>><?= $item['name'] ?></option>
|
||||
<?php } ?>
|
||||
</select>
|
||||
</div>
|
||||
<?php } ?>
|
||||
|
||||
<?php
|
||||
// https://feathericons.com search
|
||||
$searchIcon = <<<SVG
|
||||
@@ -243,6 +253,20 @@ if (!isset($config["languages"])) {
|
||||
Search docs
|
||||
</button>
|
||||
|
||||
<?php if (isset($config['theme_switcher']) && $config['theme_switcher']) { ?>
|
||||
<button type="button" class="navbar__theme js-theme-switcher">
|
||||
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20" class="">
|
||||
<path fill="currentColor" d="M9.52734 16.7852h1.24996v2.5195H9.52734v-2.5195Zm-3.62304-1.501-1.78125 1.7812-.88477-.8838.44238-.4414.89746-.8984.44239-.4414.88379.8838Zm9.8223-.4424 1.3388 1.3398-.8838.8838-1.7812-1.7812.8838-.8838.4424.4414ZM6.61621 6.61621c1.95259-1.95249 5.11869-1.9524 7.07129 0 1.9526 1.95264 1.9526 5.11869 0 7.07129-1.9526 1.9527-5.11863 1.9527-7.07129 0-1.95241-1.9526-1.95253-5.11871 0-7.07129ZM12.8037 7.5C11.3393 6.03577 8.96445 6.03565 7.5 7.5c-1.46441 1.46444-1.46424 3.8393 0 5.3037 1.46451 1.4645 3.8393 1.4645 5.3037 0 1.4645-1.4644 1.4645-3.8392 0-5.3037ZM3.51953 9.52734v1.24996H1V9.52734h2.51953Zm15.78517 0v1.24996h-2.5195V9.52734h2.5195ZM5.9043 5.02051l-.88379.88379-1.78223-1.78223.88379-.88379L5.9043 5.02051Zm11.1611-.89746L15.2842 5.9043l-.8838-.88379.4414-.44239.8984-.89746.4414-.44238.8838.88477ZM9.52734 1h1.24996v2.51953H9.52734V1Z"></path>
|
||||
</svg>
|
||||
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20" class="hidden">
|
||||
<path fill="currentColor" fill-rule="evenodd" d="M16.3206 11.5837c-.5616.1539-1.1526.2361-1.7622.2361-3.6772 0-6.65822-2.98106-6.65822-6.6583 0-.60954.08215-1.20052.23597-1.76214-2.85657.76023-4.96116 3.36465-4.96116 6.4606 0 3.69204 2.99298 6.68504 6.68499 6.68504 3.09602 0 5.70042-2.1046 6.46062-4.9613Zm.2115-1.3049c-.6124.2364-1.2779.366-1.9737.366-3.0283 0-5.48323-2.45498-5.48323-5.4833 0-.69574.12956-1.36121.36589-1.9736.11523-.29842.25567-.58423.41892-.8548.06807-.11277.14002-.22291.21582-.33019C10.004 2.00097 9.93212 2 9.85998 2c-.41211 0-.81677.03172-1.21172.09283C4.88261 2.67555 2 5.93113 2 9.85996 2 14.2009 5.51904 17.72 9.85998 17.72c3.92892 0 7.18452-2.8826 7.76722-6.6483.0611-.395.0928-.7996.0928-1.21174 0-.07214-.001-.14413-.003-.2158-.1073.07575-.2174.14773-.3302.2158-.2706.16324-.5563.30374-.8547.41884Z" clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20" class="hidden">
|
||||
<path fill="currentColor" fill-rule="evenodd" d="M16.541 9.86c0 3.6898-2.9912 6.681-6.681 6.681V3.179c3.6898 0 6.681 2.99119 6.681 6.681ZM9.86 17.72c4.3409 0 7.86-3.5191 7.86-7.86C17.72 5.51904 14.2009 2 9.86 2 5.51904 2 2 5.51904 2 9.86c0 4.3409 3.51904 7.86 7.86 7.86Z" clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<?php } ?>
|
||||
|
||||
<!-- Mobile default items -->
|
||||
<a
|
||||
id="navbar__search-link"
|
||||
|
||||
30
js/common.js
30
js/common.js
@@ -838,3 +838,33 @@ function getLanguage() {
|
||||
});
|
||||
});
|
||||
})(jQuery);
|
||||
|
||||
const savedTheme = localStorage.theme || 'system';
|
||||
const prefersDark = matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
const isDark = savedTheme === 'dark' || (savedTheme === 'system' && prefersDark);
|
||||
|
||||
if (isDark) document.documentElement.classList.add('dark');
|
||||
|
||||
const themeOrder = ['light', 'dark', 'system'];
|
||||
|
||||
const btn = document.querySelector('button.js-theme-switcher');
|
||||
|
||||
btn?.addEventListener('click', () => {
|
||||
const current = localStorage.theme || 'system';
|
||||
const nextIndex = (themeOrder.indexOf(current) + 1) % themeOrder.length;
|
||||
const newTheme = themeOrder[nextIndex];
|
||||
localStorage.theme = newTheme;
|
||||
applyTheme(newTheme);
|
||||
});
|
||||
|
||||
function applyTheme(theme) {
|
||||
const prefersDark = matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
const isDark = theme === 'dark' || (theme === 'system' && prefersDark);
|
||||
|
||||
document.documentElement.classList.toggle('dark', isDark);
|
||||
|
||||
const icons = [btn?.querySelector('svg:nth-of-type(1)'), btn?.querySelector('svg:nth-of-type(2)'), btn?.querySelector('svg:nth-of-type(3)')];
|
||||
icons.forEach((icon, i) => icon?.classList.toggle('hidden', themeOrder[i] !== theme));
|
||||
}
|
||||
|
||||
applyTheme(savedTheme)
|
||||
|
||||
File diff suppressed because one or more lines are too long
64
releases/8.5/common.php
Normal file
64
releases/8.5/common.php
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace releases\php85;
|
||||
|
||||
include_once __DIR__ . '/../../include/prepend.inc';
|
||||
|
||||
const LANGUAGES = [
|
||||
'en' => 'English',
|
||||
'ru' => 'Русский',
|
||||
];
|
||||
|
||||
function common_header(string $description): void {
|
||||
global $MYSITE, $lang;
|
||||
|
||||
$meta_image_path = \htmlspecialchars(
|
||||
\filter_var($MYSITE . 'images/php8/php_8_5_released.png', \FILTER_VALIDATE_URL));
|
||||
$meta_description = \htmlspecialchars($description);
|
||||
|
||||
$languages = [];
|
||||
foreach (LANGUAGES as $code => $text) {
|
||||
$languages[] = ['name' => $text, 'selected' => $lang === $code, 'url' => '/releases/8.5/' . $code . '.php'];
|
||||
}
|
||||
|
||||
\site_header("PHP 8.5 Release Announcement", [
|
||||
'current' => 'php85',
|
||||
'css' => ['prism.css', 'php85.css'],
|
||||
'js_files' => ['js/ext/prism.js'],
|
||||
'language_switcher' => $languages,
|
||||
'theme_switcher' => true,
|
||||
'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.5 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.5 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 message($code, $language = 'en', array $interpolations = [])
|
||||
{
|
||||
$original = require __DIR__ . '/languages/en.php';
|
||||
if (($language !== 'en') && file_exists(__DIR__ . '/languages/' . $language . '.php')) {
|
||||
$translation = require __DIR__ . '/languages/' . $language . '.php';
|
||||
}
|
||||
|
||||
$message = $translation[$code] ?? $original[$code] ?? $code;
|
||||
|
||||
foreach ($interpolations as $name => $value) {
|
||||
$message = str_replace("{{$name}}", $value, $message);
|
||||
}
|
||||
|
||||
return $message;
|
||||
}
|
||||
5
releases/8.5/en.php
Normal file
5
releases/8.5/en.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
$lang = 'en';
|
||||
|
||||
include_once __DIR__ . '/release.inc';
|
||||
13
releases/8.5/index.php
Normal file
13
releases/8.5/index.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
use phpweb\LangChooser;
|
||||
use const releases\php85\LANGUAGES;
|
||||
|
||||
$_SERVER['BASE_PAGE'] = 'releases/8.5/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.5/$lang.php");
|
||||
79
releases/8.5/languages/en.php
Normal file
79
releases/8.5/languages/en.php
Normal file
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'common_header' => 'PHP 8.5 is a major update of the PHP language, with new features including the URI Extension, Pipe Operator, and support for modifying properties while cloning.',
|
||||
'main_title' => 'Smarter, Faster, Built for Tomorrow.',
|
||||
'main_subtitle' => '<p><strong>PHP 8.5 is a major update of the PHP language.</strong> It contains <strong>many new features</strong>, such as the new <strong>URI extension</strong>, support for <strong>modifying properties while cloning</strong>, the <strong>Pipe operator</strong>, performance improvements, bug fixes, and general cleanup.</p>',
|
||||
|
||||
'whats_new' => 'What\'s new in 8.5',
|
||||
'upgrade_now' => 'Upgrade to PHP 8.5',
|
||||
'old_version' => 'PHP 8.4 and older',
|
||||
'badge_new' => 'NEW',
|
||||
'documentation' => 'Doc',
|
||||
'released' => 'Released Nov 20, 2025',
|
||||
'key_features' => 'Key Features in PHP 8.5',
|
||||
'key_features_description' => '<p><strong>Faster</strong>, <strong>cleaner</strong>, and <strong>built for developers</strong>.</p>',
|
||||
|
||||
'features_pipe_operator_title' => 'Pipe Operator',
|
||||
'features_pipe_operator_description' => '<p>The <code>|></code> operator enables chaining callables left-to-right, passing values smoothly through multiple functions without intermediary variables.</p>',
|
||||
'features_persistent_curl_share_handles_title' => 'Persistent cURL Share Handles',
|
||||
'features_persistent_curl_share_handles_description' => '<p>Handles can now be persisted across multiple PHP requests, avoiding the cost of repeated connection initialization to the same hosts.</p>',
|
||||
'features_clone_with_title' => 'Clone With',
|
||||
'features_clone_with_description' => '<p>Clone objects and update properties with the new <code>clone()</code> syntax, making the "with-er" pattern simple for <code>readonly</code> classes.</p>',
|
||||
'features_uri_extension_title' => 'URI Extension',
|
||||
'features_uri_extension_description' => '<p>PHP 8.5 adds a built-in URI extension to parse, normalize, and handle URLs following <em>RFC 3986</em> and <em>WHATWG URL</em> standards.</p>',
|
||||
'features_no_discard_title' => '#[\NoDiscard] Attribute',
|
||||
'features_no_discard_description' => '<p>The <code>#[\NoDiscard]</code> attribute warns when a return value isn’t used, helping prevent mistakes and improving overall API safety.</p>',
|
||||
'features_fcc_in_const_expr_title' => 'Closures and First-Class Callables in Constant Expressions',
|
||||
'features_fcc_in_const_expr_description' => '<p>Static closures and first-class callables can now be used in constant expressions, such as attribute parameters.</p>',
|
||||
|
||||
'pipe_operator_title' => 'Pipe Operator',
|
||||
'pipe_operator_description' => '<p>The pipe operator allows chaining function calls together without dealing with intermediary variables. This enables replacing many "nested calls" with a chain that can be read forwards, rather than inside-out.</p><p>Learn more about the backstory of this feature in <a href="https://thephp.foundation/blog/2025/07/11/php-85-adds-pipe-operator/" target="_blank" rel="noopener noreferrer">The PHP Foundation’s blog</a>.</p>',
|
||||
|
||||
'array_first_last_title' => 'array_first() and array_last() functions',
|
||||
'array_first_last_description' => '<p>The <code>array_first()</code> and <code>array_last()</code> functions return the first or last value of an array, respectively. If the array is empty, <code>null</code> is returned (making it easy to compose with the <code>??</code> operator).</p>',
|
||||
|
||||
'clone_with_title' => 'Clone With',
|
||||
'clone_with_description' => '<p>It is now possible to update properties during object cloning by passing an associative array to the <code>clone()</code> function. This enables straightforward support of the "with-er" pattern for <code>readonly</code> classes.</p>',
|
||||
|
||||
'uri_extension_title' => 'URI Extension',
|
||||
'uri_extension_description' => '<p>The new always-available URI extension provides APIs to securely parse and modify URIs and URLs according to the RFC 3986 and the WHATWG URL standards.</p><p>Powered by the <a href="https://uriparser.github.io/">uriparser</a> (RFC 3986) and <a href="https://lexbor.com/">Lexbor</a> (WHATWG URL) libraries.</p><p>Learn more about the backstory of this feature in <a href="https://thephp.foundation/blog/2025/10/10/php-85-uri-extension/" target="_blank" rel="noopener noreferrer">The PHP Foundation’s blog</a>.</p>',
|
||||
|
||||
'no_discard_title' => '#[\NoDiscard] Attribute',
|
||||
'no_discard_description' => '<p>By adding the <code>#[\NoDiscard]</code> attribute to a function, PHP will check whether the returned value is consumed and emit a warning if it is not. This allows improving the safety of APIs where the returned value is important, but it\'s easy to forget using the return value by accident.</p><p>The associated <code>(void)</code> cast can be used to indicate that a value is intentionally unused.</p>',
|
||||
|
||||
'persistent_curl_share_handles_title' => 'Persistent cURL Share Handles',
|
||||
'persistent_curl_share_handles_description' => '<p>Unlike <code>curl_share_init()</code>, handles created by <code>curl_share_init_persistent()</code> will not be destroyed at the end of the PHP request. If a persistent share handle with the same set of share options is found, it will be reused, avoiding the cost of initializing cURL handles each time.</p>',
|
||||
|
||||
'fcc_in_const_expr_title' => 'Closures and First-Class Callables in Constant Expressions',
|
||||
'fcc_in_const_expr_description' => '<p>Static closures and first-class callables can now be used in constant expressions. This includes attribute parameters, default values of properties and parameters, and constants.</p>',
|
||||
|
||||
'new_classes_title' => 'Additional features and improvements',
|
||||
'fatal_error_backtrace' => 'Fatal Errors (such as an exceeded maximum execution time) now include a backtrace.',
|
||||
'const_attribute_target' => 'Attributes can now target constants.',
|
||||
'override_attr_properties' => '{0} attribute can now be applied to properties.',
|
||||
'deprecated_traits_constants' => '{0} attribute can be used on traits and constants.',
|
||||
'asymmetric_static_properties' => 'Static properties now support asymmetric visibility.',
|
||||
'final_promoted_properties' => 'Properties can be marked as <code>final</code> using constructor property promotion.',
|
||||
'closure_getCurrent' => 'Added <code>Closure::getCurrent()</code> method to simplify recursion in anonymous functions.',
|
||||
'partitioned_cookies' => '{0} and {1} now support the "partitioned" key.',
|
||||
'get_set_error_handler' => 'New {0} and {1} functions are available.',
|
||||
'new_dom_element_methods' => 'New {0} and {1} methods are available.',
|
||||
'grapheme_levenshtein' => 'Added {0} function.',
|
||||
'delayed_target_validation' => 'New {0} attribute can be used to suppress compile-time errors from core and extension attributes that are used on invalid targets.',
|
||||
|
||||
'bc_title' => 'Deprecations and backward compatibility breaks',
|
||||
'bc_backtick_operator' => 'The backtick operator as an alias for {0} has been deprecated.',
|
||||
'bc_non_canonical_cast_names' => 'Non-canonical cast names <code>(boolean)</code>, <code>(integer)</code>, <code>(double)</code>, and <code>(binary)</code> have been deprecated. Use <code>(bool)</code>, <code>(int)</code>, <code>(float)</code>, and <code>(string)</code> instead, respectively.',
|
||||
'bc_disable_classes' => 'The {0} INI setting has been removed as it causes various engine assumptions to be broken.',
|
||||
'bc_semicolon_after_case' => 'Terminating <code>case</code> statements with a semicolon instead of a colon has been deprecated.',
|
||||
'bc_null_array_offset' => 'Using <code>null</code> as an array offset or when calling {0} is now deprecated. Use an empty string instead.',
|
||||
'bc_class_alias_names' => 'It is no longer possible to use "array" and "callable" as class alias names in {0}.',
|
||||
'bc_sleep_wakeup' => 'The {0} and {1} magic methods have been soft-deprecated. The {2} and {3} magic methods should be used instead.',
|
||||
'bc_casting_nan' => 'A warning is now emitted when casting {0} to other types.',
|
||||
'bc_non_array_destructuring' => 'Destructuring non-array values (other than <code>null</code>) using {0} or {1} now emits a warning.',
|
||||
'bc_casting_non_int_floats' => 'A warning is now emitted when casting floats (or strings that look like floats) to <code>int</code> if they cannot be represented as one.',
|
||||
|
||||
'footer_title' => 'Better syntax, improved performance and type safety.',
|
||||
'footer_description' => '<p class="first-paragraph">The full list of changes is recorded in the <a href="/ChangeLog-8.php#PHP_8_5" target="_blank">ChangeLog</a>.</p><p>Please consult the <a href="/manual/en/migration85.php" target="_blank">migration guide</a> for a detailed list of new features and backward-incompatible changes.</p>',
|
||||
];
|
||||
79
releases/8.5/languages/ru.php
Normal file
79
releases/8.5/languages/ru.php
Normal file
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'common_header' => 'PHP 8.5 — большое обновление языка PHP с новыми возможностями, включая модуль URI, оператор Pipe и поддержку изменения свойств при клонировании.',
|
||||
'main_title' => 'Лучше, быстрее, надолго.',
|
||||
'main_subtitle' => '<p><strong>PHP 8.5 — большое обновление языка PHP.</strong> Оно содержит <strong>множество новых возможностей</strong>, таких как <strong>модуль URI</strong>, поддержка <strong>изменения свойств при клонировании</strong>, <strong>оператор Pipe</strong>, улучшена производительность, исправлены ошибки и многое другое.</p>',
|
||||
|
||||
'whats_new' => 'Что нового в 8.5',
|
||||
'upgrade_now' => 'Переходите на PHP 8.5!',
|
||||
'old_version' => 'PHP 8.4 и ранее',
|
||||
'badge_new' => 'Новинка',
|
||||
'documentation' => 'Документация',
|
||||
'released' => 'Выпущен 20 ноября 2025',
|
||||
'key_features' => 'Основные функции PHP 8.5',
|
||||
'key_features_description' => '<p><strong>Быстрее</strong>, <strong>лучше</strong>, <strong>доступнее для разработчиков</strong>.</p>',
|
||||
|
||||
'features_pipe_operator_title' => 'Оператор Pipe',
|
||||
'features_pipe_operator_description' => '<p>Оператор <code>|></code> позволяет связывать вызываемые объекты слева направо, передавая значения через несколько функций без промежуточных переменных.</p>',
|
||||
'features_persistent_curl_share_handles_title' => 'Постоянные дескрипторы cURL Share',
|
||||
'features_persistent_curl_share_handles_description' => '<p>Теперь дескрипторы могут сохраняться между несколькими запросами PHP, что позволяет избежать затрат на повторную инициализацию соединения с одними и теми же хостами.</p>',
|
||||
'features_clone_with_title' => 'Clone With',
|
||||
'features_clone_with_description' => '<p>Клонируйте объекты и обновляйте свойства с помощью нового синтаксиса <code>clone()</code>, который упрощает использование шаблона «with-er» для классов <code>readonly</code>.</p>',
|
||||
'features_uri_extension_title' => 'Модуль URI',
|
||||
'features_uri_extension_description' => '<p>В PHP 8.5 добавлен модуль URI для анализа, нормализации и обработки URL-адресов в соответствии со стандартами <em>RFC 3986</em> и <em>WHATWG URL</em>.</p>',
|
||||
'features_no_discard_title' => 'Атрибут #[\NoDiscard]',
|
||||
'features_no_discard_description' => '<p>Атрибут <code>#[\NoDiscard]</code> выдаёт предупреждение, если возвращаемое значение не используется, что помогает предотвратить ошибки и повысить общую безопасность API.</p>',
|
||||
'features_fcc_in_const_expr_title' => 'Замыкания и вызовы первого класса в константных выражениях',
|
||||
'features_fcc_in_const_expr_description' => '<p>Статические замыкания и вызываемые объекты первого класса теперь могут использоваться в константных выражениях, таких как параметры атрибутов.</p>',
|
||||
|
||||
'pipe_operator_title' => 'Оператор Pipe',
|
||||
'pipe_operator_description' => '<p>Оператор Pipe позволяет связывать вызовы функций в цепочку без использования промежуточных переменных. Позволяет заменить множество «вложенных вызовов» цепочкой.</p><p>Узнайте больше об этой функции в <a href="https://thephp.foundation/blog/2025/07/11/php-85-adds-pipe-operator/" target="_blank" rel="noopener noreferrer">блоге PHP Foundation</a>.</p>',
|
||||
|
||||
'array_first_last_title' => 'Функции array_first() и array_last()',
|
||||
'array_first_last_description' => '<p>Функции <code>array_first()</code> и <code>array_last()</code> возвращают первое или последнее значение массива, соответственно. Если массив пустой, возвращается <code>null</code> (что упрощает работу с оператором <code>??</code>).</p>',
|
||||
|
||||
'clone_with_title' => 'Clone With',
|
||||
'clone_with_description' => '<p>Теперь можно обновлять свойства во время клонирования объектов, передавая ассоциативный массив в функцию <code>clone()</code>. Это позволит напрямую поддерживать паттерн «with-er» для классов <code>readonly</code>.</p>',
|
||||
|
||||
'uri_extension_title' => 'Модуль URI',
|
||||
'uri_extension_description' => '<p>Встроенный модуль URI предоставляет API для безопасного анализа и изменения URI и URL в соответствии со стандартами RFC 3986 и WHATWG URL.</p><p>Работает на базе библиотек <a href="https://uriparser.github.io/">uriparser</a> (RFC 3986) и <a href="https://lexbor.com/">Lexbor</a> (WHATWG URL). </p><p>Узнайте больше об этой функции в <a href="https://thephp.foundation/blog/2025/10/10/php-85-uri-extension/" target="_blank" rel="noopener noreferrer">блоге PHP Foundation</a>.</p>',
|
||||
|
||||
'no_discard_title' => 'Атрибут #[\NoDiscard]',
|
||||
'no_discard_description' => '<p>Добавив атрибут <code>#[\NoDiscard]</code> к функции, PHP будет проверять, используется ли возвращаемое значение, и выдавать предупреждение, если это не так. Позволяет повысить безопасность API, где возвращаемое значение важно, но про него можно легко забыть.</p><p>Связанное приведение типов <code>(void)</code> может использоваться для указания, что значение намеренно не используется.</p>',
|
||||
|
||||
'persistent_curl_share_handles_title' => 'Постоянные дескрипторы cURL Share',
|
||||
'persistent_curl_share_handles_description' => '<p>В отличие от <code>curl_share_init()</code>, дескрипторы, созданные с помощью <code>curl_share_init_persistent()</code>, не будут уничтожены в конце запроса PHP. Если найден постоянный дескриптор с тем же набором параметров, он будет использован повторно, что позволит избежать затрат на повторную инициализацию дескрипторов cURL при каждом запросе.',
|
||||
|
||||
'fcc_in_const_expr_title' => 'Замыкания и вызовы первого класса в константных выражениях',
|
||||
'fcc_in_const_expr_description' => '<p>Статические замыкания и вызываемые объекты первого класса теперь могут использоваться в константных выражениях. Сюда входят параметры атрибутов, значения по умолчанию свойств и параметров, а также константы.</p>',
|
||||
|
||||
'new_classes_title' => 'Дополнительные функции и улучшения',
|
||||
'fatal_error_backtrace' => 'Фатальные ошибки (такие как превышение максимального времени выполнения) теперь содержат обратную трассировку.',
|
||||
'const_attribute_target' => 'Атрибуты теперь можно использовать с константами.',
|
||||
'override_attr_properties' => 'Атрибут {0} теперь может использоваться со свойствами.',
|
||||
'deprecated_traits_constants' => 'Атрибут {0} теперь может использоваться с трейтами и константами.',
|
||||
'asymmetric_static_properties' => 'Статические свойства теперь поддерживают асимметричную видимость.',
|
||||
'final_promoted_properties' => 'Свойства могут быть помечены окончательными (<code>final</code>) с помощью свойств в конструкторе.',
|
||||
'closure_getCurrent' => 'Добавлен метод <code>Closure::getCurrent()</code> для упрощения рекурсии в анонимных функциях.',
|
||||
'partitioned_cookies' => 'Функции {0} и {1} теперь поддерживают ключ <code>"partitioned"</code>.',
|
||||
'get_set_error_handler' => 'Добавлены функции {0} и {1}.',
|
||||
'new_dom_element_methods' => 'Добавлены методы {0} и {1}.',
|
||||
'grapheme_levenshtein' => 'Добавлена фукнция {0}.',
|
||||
'delayed_target_validation' => 'Добавлен атрибут {0}, который можно использовать для подавления ошибок компиляции атрибутов ядра и модулей, которые используются на недопустимых целях.',
|
||||
|
||||
'bc_title' => 'Устаревшая функциональность и изменения в обратной совместимости',
|
||||
'bc_backtick_operator' => 'Обратный апостроф (<code>`</code>) как псевдоним для {0} больше не поддерживается.',
|
||||
'bc_non_canonical_cast_names' => 'Неканонические имена типов <code>(boolean)</code>, <code>(integer)</code>, <code>(double)</code> и <code>(binary)</code> больше не поддерживаются. Вместо них используйте соответственно <code>(bool)</code>, <code>(int)</code>, <code>(float)</code> и <code>(string)</code>.',
|
||||
'bc_disable_classes' => 'INI-настройка {0} была удалена, так как она приводила к нарушению различных допущений движка.',
|
||||
'bc_semicolon_after_case' => 'Завершение операторов <code>case</code> точкой с запятой вместо двоеточия больше не поддерживается.',
|
||||
'bc_null_array_offset' => 'Использование <code>null</code> в качестве смещения массива или при вызове {0} объявлено устаревшим. Вместо этого используйте пустую строку.',
|
||||
'bc_class_alias_names' => 'В {0} больше нельзя использовать массивы и замыкания в качестве псевдонимов классов.',
|
||||
'bc_sleep_wakeup' => 'Магические методы {0} и {1} были мягко объявлены устаревшими. Вместо них следует использовать магические методы {2} и {3}.',
|
||||
'bc_casting_nan' => 'Теперь при преобразовании {0} в другие типы выдаётся предупреждение.',
|
||||
'bc_non_array_destructuring' => 'Деструктуризация значений, не являющихся массивами (кроме <code>null</code>), с помощью {0} или {1} теперь выдаёт предупреждение.',
|
||||
'bc_casting_non_int_floats' => 'Теперь выдаётся предупреждение при преобразовании чисел с плавающей точкой (или строк, похожих на числа с плавающей точкой) в целые числа (<code>int</code>), если они не могут быть представлены в виде целого числа.',
|
||||
|
||||
'footer_title' => 'Выше производительность, лучше синтаксис, надёжнее система типов.',
|
||||
'footer_description' => '<p>Список изменений перечислен на странице <a href="/ChangeLog-8.php#PHP_8_5">ChangeLog</a>.</p><p><a href="/manual/ru/migration85.php">Руководство по миграции</a> доступно в разделе документации. Ознакомьтесь с ним, чтобы узнать обо всех новых возможностях и изменениях, затрагивающих обратную совместимость.</p>',
|
||||
];
|
||||
800
releases/8.5/release.inc
Normal file
800
releases/8.5/release.inc
Normal file
@@ -0,0 +1,800 @@
|
||||
<?php
|
||||
|
||||
use function releases\php85\common_header;
|
||||
use function releases\php85\message;
|
||||
|
||||
if (!isset($lang)) {
|
||||
$lang = 'en';
|
||||
}
|
||||
if (!isset($documentation)) {
|
||||
$documentation = $lang;
|
||||
}
|
||||
|
||||
$_SERVER['BASE_PAGE'] = 'releases/8.5/' . $lang . '.php';
|
||||
|
||||
include_once __DIR__ . '/common.php';
|
||||
|
||||
common_header(message('common_header', $lang));
|
||||
?>
|
||||
<!-- hero -->
|
||||
<section class="js-hero hero">
|
||||
<svg viewBox="0 0 100 100" preserveAspectRatio="xMidYMid slice" class="hero-bg">
|
||||
<defs>
|
||||
<radialGradient id="Gradient1" cx="50%" cy="50%" fx="0.441602%" fy="50%" r=".5"><animate attributeName="fx" dur="34s" values="0%;3%;0%" repeatCount="indefinite"></animate><stop offset="0%" stop-color="rgba(210, 203, 255, 1)"></stop><stop offset="100%" stop-color="rgba(51, 63, 124, 0)"></stop></radialGradient>
|
||||
<radialGradient id="Gradient2" cx="50%" cy="50%" fx="2.68147%" fy="50%" r=".5"><animate attributeName="fx" dur="23.5s" values="0%;3%;0%" repeatCount="indefinite"></animate><stop offset="0%" stop-color="rgba(133, 109, 255, 1)"></stop><stop offset="100%" stop-color="rgba(51, 63, 124, 0)"></stop></radialGradient>
|
||||
<radialGradient id="Gradient3" cx="50%" cy="50%" fx="0.836536%" fy="50%" r=".5"><animate attributeName="fx" dur="21.5s" values="0%;3%;0%" repeatCount="indefinite"></animate><stop offset="0%" stop-color="rgba(210, 203, 255, 1)"></stop><stop offset="100%" stop-color="rgba(51, 63, 124, 0)"></stop></radialGradient>
|
||||
</defs>
|
||||
<rect x="13.744%" y="1.18473%" width="100%" height="100%" fill="url(#Gradient1)" transform="rotate(334.41 50 50)"><animate attributeName="x" dur="20s" values="25%;0%;25%" repeatCount="indefinite"></animate><animate attributeName="y" dur="21s" values="0%;25%;0%" repeatCount="indefinite"></animate><animateTransform attributeName="transform" type="rotate" from="0 50 50" to="360 50 50" dur="7s" repeatCount="indefinite"></animateTransform></rect>
|
||||
<rect x="-2.17916%" y="35.4267%" width="100%" height="100%" fill="url(#Gradient2)" transform="rotate(255.072 50 50)"><animate attributeName="x" dur="23s" values="-25%;0%;-25%" repeatCount="indefinite"></animate><animate attributeName="y" dur="24s" values="0%;50%;0%" repeatCount="indefinite"></animate><animateTransform attributeName="transform" type="rotate" from="0 50 50" to="360 50 50" dur="12s" repeatCount="indefinite"></animateTransform></rect>
|
||||
<rect x="9.00483%" y="14.5733%" width="100%" height="100%" fill="url(#Gradient3)" transform="rotate(139.903 50 50)"><animate attributeName="x" dur="25s" values="0%;25%;0%" repeatCount="indefinite"></animate><animate attributeName="y" dur="12s" values="0%;25%;0%" repeatCount="indefinite"></animate><animateTransform attributeName="transform" type="rotate" from="360 50 50" to="0 50 50" dur="9s" repeatCount="indefinite"></animateTransform></rect>
|
||||
</svg>
|
||||
|
||||
<!-- hero background pattern -->
|
||||
<svg aria-hidden="true" class="hero-pattern">
|
||||
<defs>
|
||||
<pattern id="hero-pattern" width="32" height="64" patternUnits="userSpaceOnUse" x="-1" y="-1">
|
||||
<path d="M0,28 L20,28 L20,16 L16,16 L16,24 L4,24 L4,4 L32,4 L32,32 L28,32 L28,8 L8,8 L8,20 L12,20 L12,12 L24,12 L24,32 L0,32 L0,28 Z M12,36 L32,36 L32,40 L16,40 L16,64 L0,64 L0,60 L12,60 L12,36 Z M28,48 L24,48 L24,60 L32,60 L32,64 L20,64 L20,44 L32,44 L32,56 L28,56 L28,48 Z M0,36 L8,36 L8,56 L0,56 L0,52 L4,52 L4,40 L0,40 L0,36 Z"
|
||||
fill="none" stroke-dasharray="0"></path>
|
||||
</pattern>
|
||||
</defs>
|
||||
<rect width="100%" height="100%" stroke-width="0" fill="url(#hero-pattern)"></rect>
|
||||
</svg>
|
||||
|
||||
<div class="hero-content">
|
||||
<div class="hero-badge">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2"
|
||||
stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m4.5 12.75 6 6 9-13.5"/>
|
||||
</svg>
|
||||
<?= message('released', $lang) ?>
|
||||
</div>
|
||||
<svg class="hero-php-logo" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 467 133">
|
||||
<path fill="currentColor" fill-rule="evenodd"
|
||||
d="M21.8 125.8H.8l18.7-96.1h40.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.5-19.6 2.5h-18l-4.9 25.4Zm45.9-76.6c-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.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="currentColor"
|
||||
d="M106.6 4.1h20.8l-5 25.6h18.5c11.7 0 19.7 2 24.1 6.1 4.4 4.1 5.8 10.7 4 19.8l-8.7 44.8h-21.1l8.3-42.6c.9-4.8.6-8.1-1-9.9-1.6-1.8-5.1-2.6-10.4-2.6h-16.6l-10.7 55.1H87.9l18.7-96.3Z"/>
|
||||
<path fill="currentColor" fill-rule="evenodd"
|
||||
d="M185.2 125.8h-21l18.7-96.1h40.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.5-19.6 2.5h-18l-5 25.4Zm46-76.6c-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="currentColor"
|
||||
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="#6b58ff"
|
||||
d="m334.4 9.9-7.1-7.8 5.1 9.3c.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.2 3.2 18.2 11.6 24.5l.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.4 9.5-22.6 24.8-33.2 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.5Z"/>
|
||||
<path fill="currentColor" d="M345.4 83h19.5l-3.5 17.7h-19.5l3.5-17.7Z"/>
|
||||
<path fill="currentColor"
|
||||
d="M375.68 86.24h41.76c1.84.08 3.6-.04 5.28-.36 1.68-.4 3.24-.96 4.68-1.68 1.36-.72 2.56-1.8 3.6-3.24a16 16 0 0 0 2.4-5.4c.64-2.16.8-3.96.48-5.4a4.85 4.85 0 0 0-1.8-3.24 10.46 10.46 0 0 0-3.84-1.56c-1.44-.4-3.12-.6-5.04-.6l-41.64-.12 13.32-49.8h71.64l-3.96 14.76H410l-5.4 20.28h30.84c4 .08 7.44.68 10.32 1.8a16.46 16.46 0 0 1 6.96 4.92 14.73 14.73 0 0 1 3.12 8.04c.32 3.12-.08 6.76-1.2 10.92a37.48 37.48 0 0 1-5.52 12.24 25.56 25.56 0 0 1-8.4 7.68 45.2 45.2 0 0 1-10.8 4.2 54.68 54.68 0 0 1-12.24 1.32h-45.84l3.84-14.76Z"/>
|
||||
</svg>
|
||||
|
||||
<h1><?= message('main_title', $lang) ?></h1>
|
||||
<?= message('main_subtitle', $lang) ?>
|
||||
|
||||
<div class="hero-actions">
|
||||
<a href="#features" class="button-primary"><?= message('whats_new', $lang) ?></a>
|
||||
<a href="/downloads" class="button-secondary"><?= message('upgrade_now', $lang) ?></a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- new features -->
|
||||
<section class="features">
|
||||
<svg aria-hidden="true" width="100%" height="100%" class="features-pattern">
|
||||
<defs>
|
||||
<pattern id="features-pattern" width="13" height="13" patternUnits="userSpaceOnUse">
|
||||
<rect x="5.5" y="5.5" width="1" height="1" fill="currentColor"></rect>
|
||||
</pattern>
|
||||
</defs>
|
||||
<rect width="100%" height="100%" fill="url(#features-pattern)"></rect>
|
||||
</svg>
|
||||
|
||||
<div class="features-title">
|
||||
<h2 id="features"><?= message('key_features', $lang) ?></h2>
|
||||
<?= message('key_features_description', $lang) ?>
|
||||
</div>
|
||||
|
||||
<div class="features-grid-container">
|
||||
<div class="features-grid">
|
||||
<div class="features-col features-first-col">
|
||||
<div class="features-col-container">
|
||||
<div class="features-col-spacing">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M12 21a9.004 9.004 0 0 0 8.716-6.747M12 21a9.004 9.004 0 0 1-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 0 1 7.843 4.582M12 3a8.997 8.997 0 0 0-7.843 4.582m15.686 0A11.953 11.953 0 0 1 12 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0 1 21 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0 1 12 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 0 1 3 12c0-1.605.42-3.113 1.157-4.418"/>
|
||||
</svg>
|
||||
|
||||
<a href="#new-uri-extension"><span></span><?= message('features_uri_extension_title', $lang) ?>
|
||||
</a>
|
||||
<?= message('features_uri_extension_description', $lang) ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="features-col">
|
||||
<div class="features-col-container">
|
||||
<div class="features-col-spacing">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M19.5 12c0-1.232-.046-2.453-.138-3.662a4.006 4.006 0 0 0-3.7-3.7 48.678 48.678 0 0 0-7.324 0 4.006 4.006 0 0 0-3.7 3.7c-.017.22-.032.441-.046.662M19.5 12l3-3m-3 3-3-3m-12 3c0 1.232.046 2.453.138 3.662a4.006 4.006 0 0 0 3.7 3.7 48.656 48.656 0 0 0 7.324 0 4.006 4.006 0 0 0 3.7-3.7c.017-.22.032-.441.046-.662M4.5 12l3 3m-3-3-3 3"/>
|
||||
</svg>
|
||||
|
||||
<a href="#pipe-operator"><span></span><?= message('features_pipe_operator_title', $lang) ?>
|
||||
</a>
|
||||
<?= message('features_pipe_operator_description', $lang) ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="features-col features-third-col">
|
||||
<div class="features-col-container">
|
||||
<div class="features-col-spacing">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75"/>
|
||||
</svg>
|
||||
|
||||
<a href="#clone-with"><span></span><?= message('features_clone_with_title', $lang) ?></a>
|
||||
<?= message('features_clone_with_description', $lang) ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="features-col features-fourth-col">
|
||||
<div class="features-col-container">
|
||||
<div class="features-col-spacing">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"/>
|
||||
</svg>
|
||||
|
||||
<a href="#no-discard-attribute"><span></span><?= message('features_no_discard_title', $lang) ?>
|
||||
</a>
|
||||
<?= message('features_no_discard_description', $lang) ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="features-col">
|
||||
<div class="features-col-container">
|
||||
<div class="features-col-spacing">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M6 13.5V3.75m0 9.75a1.5 1.5 0 0 1 0 3m0-3a1.5 1.5 0 0 0 0 3m0 3.75V16.5m12-3V3.75m0 9.75a1.5 1.5 0 0 1 0 3m0-3a1.5 1.5 0 0 0 0 3m0 3.75V16.5m-6-9V3.75m0 3.75a1.5 1.5 0 0 1 0 3m0-3a1.5 1.5 0 0 0 0 3m0 9.75V10.5"/>
|
||||
</svg>
|
||||
|
||||
<a href="#closures-in-const-expr"><span></span><?= message('features_fcc_in_const_expr_title', $lang) ?>
|
||||
</a>
|
||||
<?= message('features_fcc_in_const_expr_description', $lang) ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="features-col features-sixth-col">
|
||||
<div class="features-col-container">
|
||||
<div class="features-col-spacing">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M3.75 6A2.25 2.25 0 0 1 6 3.75h2.25A2.25 2.25 0 0 1 10.5 6v2.25a2.25 2.25 0 0 1-2.25 2.25H6a2.25 2.25 0 0 1-2.25-2.25V6ZM3.75 15.75A2.25 2.25 0 0 1 6 13.5h2.25a2.25 2.25 0 0 1 2.25 2.25V18a2.25 2.25 0 0 1-2.25 2.25H6A2.25 2.25 0 0 1 3.75 18v-2.25ZM13.5 6a2.25 2.25 0 0 1 2.25-2.25H18A2.25 2.25 0 0 1 20.25 6v2.25A2.25 2.25 0 0 1 18 10.5h-2.25a2.25 2.25 0 0 1-2.25-2.25V6ZM13.5 15.75a2.25 2.25 0 0 1 2.25-2.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-2.25A2.25 2.25 0 0 1 13.5 18v-2.25Z"/>
|
||||
</svg>
|
||||
|
||||
<a href="#persistent-curl-share-handles"><span></span><?= message('features_persistent_curl_share_handles_title', $lang) ?>
|
||||
</a>
|
||||
<?= message('features_persistent_curl_share_handles_description', $lang) ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- new-uri-extension -->
|
||||
<section class="before-and-after-container">
|
||||
<div class="before-and-after-title-and-description">
|
||||
<h2 id="new-uri-extension"><?= message('uri_extension_title', $lang) ?></h2>
|
||||
<?= message('uri_extension_description', $lang) ?>
|
||||
</div>
|
||||
|
||||
<div class="before-and-after-code-container">
|
||||
<div class="before-and-after-code">
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span><?= message('old_version', $lang) ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
$components = parse_url('https://php.net/releases/8.4/en.php');
|
||||
|
||||
var_dump($components['host']);
|
||||
// string(7) "php.net"
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span>PHP 8.5</span>
|
||||
<span class="badge-green"><?= message('badge_new', $lang) ?></span>
|
||||
<a target="_blank" href="https://wiki.php.net/rfc/url_parsing_api">RFC <span>↗</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
use Uri\Rfc3986\Uri;
|
||||
|
||||
$uri = new Uri('https://php.net/releases/8.5/en.php');
|
||||
|
||||
var_dump($uri->getHost());
|
||||
// string(7) "php.net"
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- pipe-operator -->
|
||||
<section class="before-and-after-container">
|
||||
<div class="before-and-after-title-and-description">
|
||||
<h2 id="pipe-operator"><?= message('pipe_operator_title', $lang) ?></h2>
|
||||
<?= message('pipe_operator_description', $lang) ?>
|
||||
</div>
|
||||
|
||||
<div class="before-and-after-code-container">
|
||||
<div class="before-and-after-code">
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span><?= message('old_version', $lang) ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
$title = ' PHP 8.5 Released ';
|
||||
|
||||
$slug = strtolower(
|
||||
str_replace('.', '',
|
||||
str_replace(' ', '-',
|
||||
trim($title)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
var_dump($slug);
|
||||
// string(15) "php-85-released"
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span>PHP 8.5</span>
|
||||
<span class="badge-green"><?= message('badge_new', $lang) ?></span>
|
||||
<a target="_blank" href="https://wiki.php.net/rfc/pipe-operator-v3">RFC <span>↗</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
$title = ' PHP 8.5 Released ';
|
||||
|
||||
$slug = $title
|
||||
|> trim(...)
|
||||
|> (fn($str) => str_replace(' ', '-', $str))
|
||||
|> (fn($str) => str_replace('.', '', $str))
|
||||
|> strtolower(...);
|
||||
|
||||
var_dump($slug);
|
||||
// string(15) "php-85-released"
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- clone-with -->
|
||||
<section class="before-and-after-container">
|
||||
<div class="before-and-after-title-and-description">
|
||||
<h2 id="clone-with"><?= message('clone_with_title', $lang) ?></h2>
|
||||
<?= message('clone_with_description', $lang) ?>
|
||||
</div>
|
||||
|
||||
<div class="before-and-after-code-container">
|
||||
<div class="before-and-after-code">
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span><?= message('old_version', $lang) ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
readonly class Color
|
||||
{
|
||||
public function __construct(
|
||||
public int $red,
|
||||
public int $green,
|
||||
public int $blue,
|
||||
public int $alpha = 255,
|
||||
) {}
|
||||
|
||||
public function withAlpha(int $alpha): self
|
||||
{
|
||||
$values = get_object_vars($this);
|
||||
$values['alpha'] = $alpha;
|
||||
|
||||
return new self(...$values);
|
||||
}
|
||||
}
|
||||
|
||||
$blue = new Color(79, 91, 147);
|
||||
$transparentBlue = $blue->withAlpha(128);
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span>PHP 8.5</span>
|
||||
<span class="badge-green"><?= message('badge_new', $lang) ?></span>
|
||||
<a target="_blank" href="https://wiki.php.net/rfc/clone_with_v2">RFC <span>↗</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
readonly class Color
|
||||
{
|
||||
public function __construct(
|
||||
public int $red,
|
||||
public int $green,
|
||||
public int $blue,
|
||||
public int $alpha = 255,
|
||||
) {}
|
||||
|
||||
public function withAlpha(int $alpha): self
|
||||
{
|
||||
return clone($this, [
|
||||
'alpha' => $alpha,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$blue = new Color(79, 91, 147);
|
||||
$transparentBlue = $blue->withAlpha(128);
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- no-discard-attribute -->
|
||||
<section class="before-and-after-container">
|
||||
<div class="before-and-after-title-and-description">
|
||||
<h2 id="no-discard-attribute"><?= message('no_discard_title', $lang) ?></h2>
|
||||
<?= message('no_discard_description', $lang) ?>
|
||||
</div>
|
||||
|
||||
<div class="before-and-after-code-container">
|
||||
<div class="before-and-after-code">
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span><?= message('old_version', $lang) ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
function getPhpVersion(): string
|
||||
{
|
||||
return 'PHP 8.4';
|
||||
}
|
||||
|
||||
getPhpVersion(); // No warning
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span>PHP 8.5</span>
|
||||
<span class="badge-green"><?= message('badge_new', $lang) ?></span>
|
||||
<a target="_blank" href="https://wiki.php.net/rfc/marking_return_value_as_important">RFC
|
||||
<span>↗</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
#[\NoDiscard]
|
||||
function getPhpVersion(): string
|
||||
{
|
||||
return 'PHP 8.5';
|
||||
}
|
||||
|
||||
getPhpVersion();
|
||||
// Warning: The return value of function getPhpVersion() should
|
||||
// either be used or intentionally ignored by casting it as (void)
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- fcc-in-const-expr -->
|
||||
<section class="before-and-after-container">
|
||||
<div class="before-and-after-title-and-description">
|
||||
<h2 id="closures-in-const-expr"><?= message('fcc_in_const_expr_title', $lang) ?></h2>
|
||||
<?= message('fcc_in_const_expr_description', $lang) ?>
|
||||
</div>
|
||||
|
||||
<div class="before-and-after-code-container">
|
||||
<div class="before-and-after-code">
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span><?= message('old_version', $lang) ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
final class PostsController
|
||||
{
|
||||
#[AccessControl(
|
||||
new Expression('request.user === post.getAuthor()'),
|
||||
)]
|
||||
public function update(
|
||||
Request $request,
|
||||
Post $post
|
||||
): Response {
|
||||
// ...
|
||||
}
|
||||
}
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span>PHP 8.5</span>
|
||||
<span class="badge-green"><?= message('badge_new', $lang) ?></span>
|
||||
<a target="_blank" href="https://wiki.php.net/rfc/closures_in_const_expr">RFC <span>↗</span></a>
|
||||
<a target="_blank" href="https://wiki.php.net/rfc/fcc_in_const_expr">RFC <span>↗</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
final class PostsController
|
||||
{
|
||||
#[AccessControl(static function (
|
||||
Request $request,
|
||||
Post $post,
|
||||
): bool {
|
||||
return $request->user === $post->getAuthor();
|
||||
})]
|
||||
public function update(
|
||||
Request $request,
|
||||
Post $post
|
||||
): Response {
|
||||
// ...
|
||||
}
|
||||
}
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- persistent-curl-share-handles -->
|
||||
<section class="before-and-after-container">
|
||||
<div class="before-and-after-title-and-description">
|
||||
<h2 id="persistent-curl-share-handles"><?= message('persistent_curl_share_handles_title', $lang) ?></h2>
|
||||
<?= message('persistent_curl_share_handles_description', $lang) ?>
|
||||
</div>
|
||||
|
||||
<div class="before-and-after-code-container">
|
||||
<div class="before-and-after-code">
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span><?= message('old_version', $lang) ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
$sh = curl_share_init();
|
||||
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
|
||||
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
|
||||
|
||||
$ch = curl_init('https://php.net/');
|
||||
curl_setopt($ch, CURLOPT_SHARE, $sh);
|
||||
|
||||
curl_exec($ch);
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span>PHP 8.5</span>
|
||||
<span class="badge-green"><?= message('badge_new', $lang) ?></span>
|
||||
<a target="_blank" href="https://wiki.php.net/rfc/curl_share_persistence">RFC <span>↗</span></a>
|
||||
<a target="_blank" href="https://wiki.php.net/rfc/curl_share_persistence_improvement">RFC
|
||||
<span>↗</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
$sh = curl_share_init_persistent([
|
||||
CURL_LOCK_DATA_DNS,
|
||||
CURL_LOCK_DATA_CONNECT,
|
||||
]);
|
||||
|
||||
$ch = curl_init('https://php.net/');
|
||||
curl_setopt($ch1, CURLOPT_SHARE, $sh);
|
||||
|
||||
// This may now reuse the connection from an earlier SAPI request
|
||||
curl_exec($ch);
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- array-first-and-last-functions -->
|
||||
<section class="before-and-after-container last">
|
||||
<div class="before-and-after-title-and-description">
|
||||
<h2 id="array-first-and-last-functions"><?= message('array_first_last_title', $lang) ?></h2>
|
||||
<?= message('array_first_last_description', $lang) ?>
|
||||
</div>
|
||||
|
||||
<div class="before-and-after-code-container">
|
||||
<div class="before-and-after-code">
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span><?= message('old_version', $lang) ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
$lastEvent = $events === []
|
||||
? null
|
||||
: $events[array_key_last($events)];
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="code-container">
|
||||
<div class="header">
|
||||
<div>
|
||||
<span>PHP 8.5</span>
|
||||
<span class="badge-green"><?= message('badge_new', $lang) ?></span>
|
||||
<a target="_blank" href="https://wiki.php.net/rfc/array_first_last">RFC <span>↗</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="language-php">
|
||||
<code class="language-php">
|
||||
$lastEvent = array_last($events);
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- release-notes -->
|
||||
<section class="release-notes">
|
||||
<div class="release-notes-grid-container">
|
||||
<div class="release-notes-grid">
|
||||
<div>
|
||||
<h2><?= message('new_classes_title', $lang) ?></h2>
|
||||
<ul class="new">
|
||||
<li><?= message('fatal_error_backtrace', $lang) ?></li>
|
||||
<li><?= message('const_attribute_target', $lang) ?></li>
|
||||
<li><?= message('override_attr_properties', $lang, ['<a href="/manual/' . $documentation . '/class.override.php"><code>#[\Override]</code></a>']) ?></li>
|
||||
<li><?= message('deprecated_traits_constants', $lang, ['<a href="/manual/' . $documentation . '/class.deprecated.php"><code>#[\Deprecated]</code></a>']) ?></li>
|
||||
<li><?= message('asymmetric_static_properties', $lang) ?></li>
|
||||
<li><?= message('final_promoted_properties', $lang) ?></li>
|
||||
<li><?= message('closure_getCurrent', $lang) ?></li>
|
||||
<li><?= message('partitioned_cookies', $lang, [
|
||||
'<a href="/manual/' . $documentation . '/function.setcookie.php"><code>setcookie()</code></a>',
|
||||
'<a href="/manual/' . $documentation . '/function.setrawcookie.php"><code>setrawcookie()</code></a>',
|
||||
]) ?></li>
|
||||
<li><?= message('get_set_error_handler', $lang, [
|
||||
'<a href="/manual/' . $documentation . '/function.get-error-handler.php"><code>get_error_handler()</code></a>',
|
||||
'<a href="/manual/' . $documentation . '/function.get-exception-handler.php"><code>get_exception_handler()</code></a>',
|
||||
]) ?></li>
|
||||
<li><?= message('new_dom_element_methods', $lang, [
|
||||
'<code>Dom\Element::getElementsByClassName()</code>',
|
||||
'<code>Dom\Element::insertAdjacentHTML()</code>',
|
||||
]) ?></li>
|
||||
<li><?= message('grapheme_levenshtein', $lang, ['<code>grapheme_levenshtein()</code>']) ?></li>
|
||||
<li><?= message('delayed_target_validation', $lang, ['<code>#[\DelayedTargetValidation]</code>']) ?></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h2><?= message('bc_title', $lang) ?></h2>
|
||||
<ul class="old">
|
||||
<li><?= message('bc_backtick_operator', $lang, [
|
||||
'<a href="/manual/' . $documentation . '/function.shell-exec.php"><code>shell_exec()</code></a>'
|
||||
]) ?></li>
|
||||
<li><?= message('bc_non_canonical_cast_names', $lang) ?></li>
|
||||
<li><?= message('bc_disable_classes', $lang, ['<code>disable_classes</code>']) ?></li>
|
||||
<li><?= message('bc_semicolon_after_case', $lang) ?></li>
|
||||
<li><?= message('bc_null_array_offset', $lang, [
|
||||
'<a href="/manual/' . $documentation . '/function.array-key-exists.php"><code>array_key_exists()</code></a>'
|
||||
]) ?></li>
|
||||
<li><?= message('bc_class_alias_names', $lang, [
|
||||
'<a href="/manual/' . $documentation . '/function.class-alias.php"><code>class_alias()</code></a>'
|
||||
]) ?></li>
|
||||
<li><?= message('bc_sleep_wakeup', $lang, [
|
||||
'<a href="/manual/' . $documentation . '/language.oop5.magic.php#object.sleep"><code>__sleep()</code></a>',
|
||||
'<a href="/manual/' . $documentation . '/language.oop5.magic.php#object.wakeup"><code>__wakeup()</code></a>',
|
||||
'<a href="/manual/' . $documentation . '/language.oop5.magic.php#object.serialize"><code>__serialize()</code></a>',
|
||||
'<a href="/manual/' . $documentation . '/language.oop5.magic.php#object.unserialize"><code>__unserialize()</code></a>',
|
||||
]) ?></li>
|
||||
<li><?= message('bc_casting_nan', $lang, ['<code>NAN</code>']) ?></li>
|
||||
<li><?= message('bc_non_array_destructuring', $lang, ['<code>[]</code>', '<code>list()</code>']) ?></li>
|
||||
<li><?= message('bc_casting_non_int_floats', $lang) ?></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- pre footer -->
|
||||
<section class="cta-footer">
|
||||
<svg aria-hidden="true">
|
||||
<defs>
|
||||
<pattern id="cta-pattern" width="12" height="12" patternUnits="userSpaceOnUse" x="-1" y="-1">
|
||||
<path d="M.5 12V.5H12" fill="none" stroke-dasharray="0"></path>
|
||||
</pattern>
|
||||
</defs>
|
||||
<rect width="100%" height="100%" stroke-width="0" fill="url(#cta-pattern)"></rect>
|
||||
</svg>
|
||||
|
||||
<div class="cta-footer-content">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 16 16">
|
||||
<path fill="currentColor"
|
||||
d="M0 12.2v-.7a.5.5 0 0 1 1 0v.8c0 .2.1.3.3.5l.7.2.8-.2.2-.6V5c0-2 1.7-4 4.1-4 2.4 0 4 1.4 4.4 3 1 .1 2 .4 3 1.1l1 1.4c.3.5.5 1 .5 1.5v5.5c0 .3-.2.5-.5.5h-8a.5.5 0 0 1-.5-.5v-4c0-.2.1-.4.3-.5a6 6 0 0 0 2.4-1.5c.5-.7.9-1.6.8-3 0-1-1.2-2.5-3.3-2.5A3.1 3.1 0 0 0 4 5v7.2c0 .6-.2 1-.6 1.3-.3.4-.8.5-1.4.5-.5 0-1-.2-1.3-.4-.4-.3-.6-.7-.7-1.2v-.2ZM11.5 5a5 5 0 0 1-1 3.1C9.8 9 8.9 9.4 8 9.8V13h3v-2.5a.5.5 0 0 1 1 0V13h3V8c0-.2 0-.6-.3-1-.2-.4-.5-.8-.9-1.1a5 5 0 0 0-2.3-.9ZM7 5a1 1 0 1 1 2 0 1 1 0 0 1-2 0Z"/>
|
||||
</svg>
|
||||
|
||||
<h2><?= message('footer_title', $lang) ?></h2>
|
||||
|
||||
<div class="cta-footer-button-container">
|
||||
<a href="/downloads" class="button-primary"><?= message('upgrade_now', $lang) ?></a>
|
||||
</div>
|
||||
|
||||
<?= message('footer_description', $lang) ?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer>
|
||||
<div class="footer-container">
|
||||
<div class="footer-grid">
|
||||
<div>
|
||||
<a href="/" class="footer-logo">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -1 100 50" fill="currentColor">
|
||||
<path d="m7.579 10.123 14.204 0c4.169 0.035 7.19 1.237 9.063 3.604 1.873 2.367 2.491 5.6 1.855 9.699-0.247 1.873-0.795 3.71-1.643 5.512-0.813 1.802-1.943 3.427-3.392 4.876-1.767 1.837-3.657 3.003-5.671 3.498-2.014 0.495-4.099 0.742-6.254 0.742l-6.36 0-2.014 10.07-7.367 0 7.579-38.001 0 0m6.201 6.042-3.18 15.9c0.212 0.035 0.424 0.053 0.636 0.053 0.247 0 0.495 0 0.742 0 3.392 0.035 6.219-0.3 8.48-1.007 2.261-0.742 3.781-3.321 4.558-7.738 0.636-3.71 0-5.848-1.908-6.413-1.873-0.565-4.222-0.83-7.049-0.795-0.424 0.035-0.83 0.053-1.219 0.053-0.353 0-0.724 0-1.113 0l0.053-0.053"></path>
|
||||
<path d="m41.093 0 7.314 0-2.067 10.123 6.572 0c3.604 0.071 6.289 0.813 8.056 2.226 1.802 1.413 2.332 4.099 1.59 8.056l-3.551 17.649-7.42 0 3.392-16.854c0.353-1.767 0.247-3.021-0.318-3.763-0.565-0.742-1.784-1.113-3.657-1.113l-5.883-0.053-4.346 21.783-7.314 0 7.632-38.054 0 0"></path>
|
||||
<path d="m70.412 10.123 14.204 0c4.169 0.035 7.19 1.237 9.063 3.604 1.873 2.367 2.491 5.6 1.855 9.699-0.247 1.873-0.795 3.71-1.643 5.512-0.813 1.802-1.943 3.427-3.392 4.876-1.767 1.837-3.657 3.003-5.671 3.498-2.014 0.495-4.099 0.742-6.254 0.742l-6.36 0-2.014 10.07-7.367 0 7.579-38.001 0 0m6.201 6.042-3.18 15.9c0.212 0.035 0.424 0.053 0.636 0.053 0.247 0 0.495 0 0.742 0 3.392 0.035 6.219-0.3 8.48-1.007 2.261-0.742 3.781-3.321 4.558-7.738 0.636-3.71 0-5.848-1.908-6.413-1.873-0.565-4.222-0.83-7.049-0.795-0.424 0.035-0.83 0.053-1.219 0.053-0.353 0-0.724 0-1.113 0l0.053-0.053"></path>
|
||||
</svg>
|
||||
</a>
|
||||
|
||||
<p>The PHP Foundation is a collective of people and organizations, united in the mission to ensure
|
||||
the
|
||||
long-term prosperity of the PHP language.</p>
|
||||
|
||||
<div class="social-icons">
|
||||
<a href="https://www.linkedin.com/company/phpnet/" target="_blank" rel="noopener noreferrer">
|
||||
<span class="sr-only">Linkedin</span>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd"
|
||||
d="M11.9428 1.75H12.0572C14.2479 1.74999 15.9686 1.74998 17.312 1.93059C18.6886 2.11568 19.7809 2.50271 20.6391 3.36091C21.4973 4.21911 21.8843 5.31137 22.0694 6.68802C22.25 8.03144 22.25 9.75214 22.25 11.9428V12.0572C22.25 14.2479 22.25 15.9686 22.0694 17.312C21.8843 18.6886 21.4973 19.7809 20.6391 20.6391C19.7809 21.4973 18.6886 21.8843 17.312 22.0694C15.9686 22.25 14.2479 22.25 12.0572 22.25H11.9428C9.7521 22.25 8.03144 22.25 6.68802 22.0694C5.31137 21.8843 4.21911 21.4973 3.36091 20.6391C2.50272 19.7809 2.11568 18.6886 1.93059 17.312C1.74998 15.9686 1.74999 14.2479 1.75 12.0572V12.0572V11.9428V11.9428C1.74999 9.75211 1.74998 8.03144 1.93059 6.68802C2.11568 5.31137 2.50272 4.21911 3.36091 3.36091C4.21911 2.50271 5.31137 2.11568 6.68802 1.93059C8.03143 1.74998 9.75214 1.74999 11.9428 1.75ZM8.00195 10.5C8.00195 9.94771 7.55424 9.5 7.00195 9.5C6.44967 9.5 6.00195 9.94771 6.00195 10.5L6.00195 17C6.00195 17.5523 6.44967 18 7.00195 18C7.55424 18 8.00195 17.5523 8.00195 17L8.00195 10.5ZM11.002 9C11.4073 9 11.7564 9.2412 11.9134 9.58791C12.5213 9.215 13.2365 9 14.002 9C16.2111 9 18.002 10.7909 18.002 13V17C18.002 17.5523 17.5542 18 17.002 18C16.4497 18 16.002 17.5523 16.002 17V13C16.002 11.8954 15.1065 11 14.002 11C12.8974 11 12.002 11.8954 12.002 13L12.002 17C12.002 17.5523 11.5542 18 11.002 18C10.4497 18 10.002 17.5523 10.002 17L10.002 10C10.002 9.44771 10.4497 9 11.002 9ZM8.25977 7C8.25977 7.69036 7.70012 8.25 7.00977 8.25H7.00078C6.31043 8.25 5.75078 7.69036 5.75078 7C5.75078 6.30964 6.31043 5.75 7.00078 5.75H7.00977C7.70012 5.75 8.25977 6.30964 8.25977 7Z"
|
||||
fill="currentColor"></path>
|
||||
</svg>
|
||||
</a>
|
||||
<a href="https://fosstodon.org/@php" target="_blank" rel="noopener noreferrer">
|
||||
<span class="sr-only">@php@fosstodon.org</span>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
|
||||
<path fill="currentColor"
|
||||
d="M21.5 6.5c-.3-2.2-2.3-3.9-4.6-4.2-.4 0-1.9-.3-5.3-.3s-4.2.2-4.6.3c-2.2.3-4.3 1.9-4.8 4C2 7.6 2 8.8 2 9.9a38.5 38.5 0 0 0 .8 7.9c.4 2 2.4 3.5 4.2 4.2a11.6 11.6 0 0 0 7 .1l1.5-.6v-1.6a19 19 0 0 1-4.1.4c-2.3 0-3-1-3.2-1.5a4.7 4.7 0 0 1-.2-1.3c1.3.3 2.7.5 4 .5h1c1.3 0 2.7-.1 4-.4h.2a5 5 0 0 0 4.3-4.8V6.5Zm-3.3 7.9H16V9c0-1.1-.4-1.7-1.4-1.7-1 0-1.6.7-1.6 2v3h-2.2v-3c0-1.3-.5-2-1.6-2-1 0-1.4.6-1.4 1.7v5.3H5.6V8.9c0-1.1.3-2 .9-2.6a3 3 0 0 1 2.3-1c1.2 0 2 .4 2.6 1.2l.5 1 .6-1c.5-.8 1.4-1.2 2.5-1.2 1 0 1.8.3 2.4 1 .6.6.8 1.5.8 2.6v5.5Z"></path>
|
||||
</svg>
|
||||
</a>
|
||||
<a href="https://github.com/php/" target="_blank" rel="noopener noreferrer">
|
||||
<span class="sr-only">GitHub</span>
|
||||
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
||||
<path d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
|
||||
clip-rule="evenodd" fill-rule="evenodd"></path>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<a href="https://thephp.foundation/sponsor/" target="_blank" class="button-primary">Donate</a>
|
||||
</div>
|
||||
<div class="footer-links-container">
|
||||
<div class="footer-links-grid">
|
||||
<div>
|
||||
<h3>PHP</h3>
|
||||
<ul role="list">
|
||||
<li><a href="/my.php">My PHP.net</a></li>
|
||||
<li><a href="/downloads.php">Downloads</a></li>
|
||||
<li><a href="/contact.php">Contact</a></li>
|
||||
<li><a href="/sites.php">Other PHP.net sites</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h3>Learn</h3>
|
||||
<ul role="list">
|
||||
<li><a href="/docs.php">Documentation</a></li>
|
||||
<li><a href="/get-involved.php">Get Involved</a></li>
|
||||
<li><a href="/support.php">Help</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer-links-grid">
|
||||
<div>
|
||||
<h3>The PHP Foundation</h3>
|
||||
<ul role="list">
|
||||
<li><a href="https://thephp.foundation/" target="_blank" rel="noopener noreferrer">About
|
||||
the
|
||||
Foundation</a></li>
|
||||
<li><a href="https://thephp.foundation/sponsor/" target="_blank"
|
||||
rel="noopener noreferrer">Sponsor</a>
|
||||
</li>
|
||||
<li><a href="https://thephp.foundation/contact/" target="_blank"
|
||||
rel="noopener noreferrer">Contact</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h3>Legal</h3>
|
||||
<ul role="list">
|
||||
<li><a href="/privacy.php">Privacy policy</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer-credits">
|
||||
<p>Copyright © 2001-<?= date('Y') ?> The PHP Group.</p>
|
||||
<p>Created as part of
|
||||
<a href="https://thephp.foundation/blog/2025/11/05/design-contest-results/" target="_blank">The PHP
|
||||
Foundation Design Contest</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- noise -->
|
||||
<svg class="noise" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" preserveAspectRatio="none">
|
||||
<defs>
|
||||
<filter id="noise-filter">
|
||||
<feTurbulence type="turbulence" baseFrequency="1" numOctaves="1" stitchTiles="stitch" result="noise"></feTurbulence>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" result="coloredNoise"></feColorMatrix>
|
||||
</filter>
|
||||
</defs>
|
||||
<rect width="100%" height="100%" filter="url(#noise-filter)"></rect>
|
||||
</svg>
|
||||
|
||||
<script>
|
||||
Prism.highlightAll()
|
||||
</script>
|
||||
<?php
|
||||
|
||||
site_footer(['footer' => false]);
|
||||
5
releases/8.5/ru.php
Normal file
5
releases/8.5/ru.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
$lang = 'ru';
|
||||
|
||||
include_once __DIR__ . '/release.inc';
|
||||
4029
styles/php85.css
Normal file
4029
styles/php85.css
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
/* PrismJS 1.30.0
|
||||
https://prismjs.com/download#themes=prism&languages=bash+powershell&plugins=line-numbers+show-language+remove-initial-line-feed+toolbar+copy-to-clipboard */
|
||||
https://prismjs.com/download#themes=prism&languages=markup+bash+markup-templating+php+powershell&plugins=line-numbers+show-language+remove-initial-line-feed+toolbar+copy-to-clipboard */
|
||||
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
|
||||
pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}
|
||||
div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none}
|
||||
div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none}
|
||||
|
||||
@@ -1112,3 +1112,45 @@ div.elephpants img:focus {
|
||||
.replaceable {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.navbar__languages {
|
||||
border: 1px solid #6a78be;
|
||||
outline: none;
|
||||
color: hsla(230, 72%, 84%);
|
||||
opacity: 1;
|
||||
max-width: 300px;
|
||||
padding: 8px 8px;
|
||||
background-color: rgba(64, 79, 130, 0.7);
|
||||
border-radius: 8px;
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
.navbar__languages:hover {
|
||||
border-color: #94a3ed;
|
||||
}
|
||||
|
||||
.navbar__languages select {
|
||||
color: hsla(230, 72%, 84%);
|
||||
}
|
||||
|
||||
.navbar__languages option {
|
||||
color: rgba(39, 40, 44, 0.7);
|
||||
}
|
||||
|
||||
.navbar__theme {
|
||||
margin-left: 12px;
|
||||
border: 1px solid #6a78be;
|
||||
color: hsla(230, 72%, 84%);
|
||||
background-color: #404f82;
|
||||
border-radius: 8px;
|
||||
margin-right: 12px;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.navbar__theme:hover {
|
||||
border-color: #94a3ed;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user