-
Notifications
You must be signed in to change notification settings - Fork 0
/
php_8_3.php
192 lines (142 loc) · 5.22 KB
/
php_8_3.php
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
<?php
//Типизированные константы классов
//PHP < 8.3
interface I {
//we may naively assume that the PHP constant is always a string.
const PHP = '8.2';
}
class Foo implements I {
// But implementing classes may define it as an array.
const PHP = [];
}
//PHP 8.3
interface I {
const string PHP = 'PHP 8.3';
}
class Foo implements I {
const string PHP = [];
}
// Fatal error: Cannot use array as value for class constant
// Foo::PHP of type string
//Динамическое получение констант класса
//PHP < 8.3
class Foo {
const PHP = 'PHP 8.2';
}
$searchableConstant = 'PHP';
var_dump(constant(FOO::class . "::{$searchableConstant}"));
//PHP 8.3
class Foo {
const PHP = 'PHP 8.3';
}
$searchableConstant = 'PHP';
var_dump(Foo::{$searchableConstant});
//Новый атрибут #[\Override]
//PHP < 8.3
use PHPUnit\Framework\TestCase;
final class MyTest extends TestCase {
protected $logFile;
protected function setUp(): void {
$this->logFile = fopen('/tmp/logfile', 'w');
}
protected function taerDown(): void {
fclose($this->logFile);
unlink('tmp/logfile');
}
}
// The log file will never be removed, because the
// method name waw mistyped (taerDown vs tearDown)
//PHP 8.3
use PHPUnit\Framework\TestCase;
final class MyTest extends TestCase {
protected $logFile;
protected function setUp(): void {
$this->logFile = fopen('/tmp/logfile', 'w');
}
#[\Override]
protected function taerDown(): void {
fclose($this->logFile);
unlink('tmp/logfile');
}
}
//Fatal error: MyTest::taerDown has #[\Override] attribute,
// but no matching parent method exists
// Если добавить методу атрибут #[\Override], то PHP убедится, что методс
// таким же именем существует в родительском классе или в реализованноминтерфейсе.
// Добавление атрибута даёт понять, что переопределение родительскогометода является
// намеренным, а также упрощает рефакторинг, поскольку удаление переопределённого
// родительского метода будет обнаружено.
//Глубокое клонирование readonly-свойств
//PHP < 8.3
class PHP
{
public string $version = '8.2';
}
readonly class Foo
{
public function __construct(
public PHP $php
) {
}
public function __clone(): void
{
$this->php = clone $this->php;
}
}
$instance = new Foo(new PHP());
$cloned = clone $instance;
//Fatal error: cannot modify readonly property Foo::$php
//PHP 8.3
//... тот же класс Foo и PHP
$cloned->php->version = '8.3';
//Свойства, доступные только для чтения (readonly) теперь могут быть
// изменены один раз с помощью магического метода __clone для обеспечения
// возможности глубокого клонирования readonly-свойств.
//Новая функция json_validate()
//PHP < 8.3
//самописная функция
function json_validate(string $string): bool {
json_decode($string);
return json_last_error() === JSON_ERROR_NONE;
}
var_dump(json_validate('{ "test": { "foo": "bar"} }')); //true
//PHP 8.3
//встроенная в язык функция
var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true
// Функция json_validate() позволяет проверить, является ли строка синтаксически
// корректным JSON, при этом она более эффективна, чем функция json_decode().
//Новый метод Randomizer::getBytesFromString()
//PHP < 8.3
//This function needs to be manually implemented
function getBytesFromString(string $string, int $length) {
$stringLength = strlen($string);
$result = '';
for ($i = 0, $i < $length, $i++) {
// random_int is not seedable for testing, but secure.
$result .= $string[random_int(0, $stringLength -1)];
}
return $result;
}
$randomDomain = sprintf(
"%s.example.com",
getBytesFromString(
'abcdefghijklmnopqrstuvwxyz0123456789',
16,
),
);
echo $randomDomain;
//PHP 8.3
//A \Random\Engine may be passed for seeding,
// the default is the secure engine.
$randomizer = new \Random\Randomizer();
$randomDomain = sprintf(
"%s.example.com",
$randomizer->getBytesFromString(
'abcdefghijklmnopqrstuvwxyz0123456789',
16,
),
);
echo $randomDomain;
// Модуль Random, добавленный в PHP 8.2, был дополнен новым методом генерации случайных
// строк, состоящих только из определённых байтов. Этот метод позволяет легко генерировать
// случайные идентификаторы, например, имена доменов и числовые строки произвольной длины.