-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathphp_8_0.php
More file actions
201 lines (154 loc) · 7.42 KB
/
php_8_0.php
File metadata and controls
201 lines (154 loc) · 7.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
<?php
//именованные аргументы, union type, атрибуты, упрощённое определение свойств в конструкторе,
//выражение match, оператор nullsafe, JIT и улучшения в системе типов, обработке ошибок и консистентности.
//Именованные аргументы
htmlspecialchars($string, double_encode: false)
//было
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
/**
* Указывайте только необходимые параметры, пропускайте необязательные.
* Порядок аргументов не важен, аргументы самодокументируемы.
*/
//Атрибуты
class PostController
{
#[Route("/api/posts/{id}", methods: ["GET"])]
public function get($id) { /*...*/ }
}
//было
class PostController
{
/**
* @Route("/api/posts/{id}", methods={"GET"})
*/
public function get($id) { /*...*/ }
}
//Вместо аннотаций PHPDoc вы можете использовать структурные метаданные с нативным синтаксисом PHP.
//Объявления свойств в конструкторе
class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
}
//было
class Point {
public float $x;
public float $y;
public float $z;
public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}
//Меньше шаблонного кода для определения и инициализации свойств.
//Тип Union
class Number {
public function __construct(
private int|float $number
) {}
}
new Number('NaN'); // TypeError
//было
class Number {
/** @var int|float */
private $number;
/**
* @param float|int $number
*/
public function __construct($number)
{
$this->number = $number;
}
}
new Number('NaN'); //нет ошибки\
//Вместо аннотаций PHPDoc для объединённых типов вы можете использовать объявления типа union, которые проверяются во время выполнения.
//Выражение Match
echo match (8.0) {
'8.0' => 'Bruh',
8.0 => 'Nice',
};
//> Nice
//было
switch (8.0) {
case '8.0':
$result = 'Bruh';
break;
case 8.0:
$result = 'Nice';
break;
}
echo $result;
//> Bruh
//Новое выражение match похоже на оператор switch со следующими особенностями:
//Match — это выражение, его результат может быть сохранён в переменной или возвращён.
//Условия match поддерживают только однострочные выражения, для которых не требуется управляющая конструкция break;.
//Выражение match использует строгое сравнение.
//Оператор Nullsafe
$country =
$session?->user?->getAddress()?->country;
//было
$country = null;
if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}
//Вместо проверки на null вы можете использовать последовательность вызовов с новым оператором Nullsafe.
//Когда один из элементов в последовательности возвращает null,
//выполнение прерывается и вся последовательность возвращает null.
//Улучшенное сравнение строк и чисел
0 == 'foobar' //false
//было
0 == 'foobar' //true
//При сравнении с числовой строкой PHP 8 использует сравнение чисел.
//В противном случае число преобразуется в строку и используется сравнение строк.
//Ошибки согласованности типов для встроенных функций
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0
//было
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given
array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0
//Большинство внутренних функций теперь выбрасывают исключение Error, если при проверке параметра возникает ошибка.
?>
PHP 8 представляет два механизма JIT-компиляции. Трассировка JIT, наиболее перспективная из них,
на синтетических бенчмарках показывает улучшение производительности примерно в 3 раза и в 1,5–2 раза на некоторых долго работающих приложениях.
Стандартная производительность приложения находится на одном уровне с PHP 7.4.
Улучшения в системе типов и обработке ошибок
Более строгие проверки типов для арифметических/побитовых операторов RFC
Проверка методов абстрактных трейтов RFC
Правильные сигнатуры магических методов RFC
Реклассификация предупреждений движка RFC
Фатальная ошибка при несовместимости сигнатур методов RFC
Оператор @ больше не подавляет фатальные ошибки.
Наследование с private методами RFC
Новый тип mixed RFC
Возвращаемый тип static RFC
Типы для стандартных функций E-mail Тема
Непрозрачные объекты вместо ресурсов для Curl, Gd, Sockets, OpenSSL, XMLWriter, e XML расширения
Прочие улучшения синтаксиса
Разрешена запятая в конце списка параметров RFC и в списке use замыканий RFC
Блок catch без указания переменной RFC
Изменения синтаксиса переменных RFC
Имена в пространстве имен рассматриваются как единый токен RFC
Выражение Throw RFC
Добавление ::class для объектов RFC
Новые классы, интерфейсы и функции
Класс Weak Map
Интерфейс Stringable
str_contains(), str_starts_with(), str_ends_with()
fdiv()
get_debug_type()
get_resource_id()
Объектно-ориентированная функция token_get_all()
Новые API для обходения и обработки DOM