НовыС возмоТности

ΠžΠ±Π½ΡƒΠ»ΡΠ΅ΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹

Π’ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ стали обнуляСмыми. Π’ΠΈΠΏ становится обнуляСмым, Ссли ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° ΡƒΠΊΠ°Π·Π°Π»ΠΈ Π²ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ. Π—Π½Π°ΠΊ вопроса ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚, ΠΈΠ»ΠΈ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null.

<?php

function testReturnA(): ?string
{
return
'elePHPant';
}

var_dump(testReturnA());

function
testReturnB(): ?string
{
return
null;
}

var_dump(testReturnB());

function
test(?string $name)
{
var_dump($name);
}

test('elePHPant');
test(null);
test();

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

string(9) "elePHPant"
NULL
string(9) "elePHPant"
NULL
Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in...

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° значСния

Для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏ void. Π’ функциях с Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° void потрСбуСтся Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ return, Π»ΠΈΠ±ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡƒΡΡ‚ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ return, Π±Π΅Π· значСния. Из void-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ нСльзя Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null.

<?php

function swap(&$left, &$right): void
{
if (
$left === $right) {
return;
}

$tmp = $left;
$left = $right;
$right = $tmp;
}

$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

null
int(2)
int(1)

ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ void-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ вычисляСтся ΠΊΠ°ΠΊ null, Π±Π΅Π· Π²Ρ‹Π΄Π°Ρ‡ΠΈ прСдупрСТдСния. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Ρ‚Π°ΠΊΠΎΠ³ΠΎ повСдСния состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ прСдупрСТдСния ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ»ΠΈ Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΎΠ±Ρ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка с void-функциями.

БиммСтричная дСструктуризация массива

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ синтаксис массивов [] Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ доступСн для дСструктуризации массивов ΠΈ присваивания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π² Ρ‚ΠΎΠΌ числС Π² Ρ†ΠΈΠΊΠ»Π°Ρ… foreach. ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ синтаксис появился ΠΊΠ°ΠΊ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° языковой конструкции list(), которая ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ поддСрТиваСтся.

<?php

$data
= [
[
1, 'Tom'],
[
2, 'Fred'],
];

// ДСструктуризация массива Π² стилС языковой конструкции list()
list($id1, $name1) = $data[0];

// ДСструктуризация массива Π² стилС ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ³ΠΎ синтаксиса массивов []
[$id1, $name1] = $data[0];

// ДСструктуризация Ρ‡Π΅Ρ€Π΅Π· list()
foreach ($data as list($id, $name)) {
// Π’ этом мСстС примСняСм Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ $id ΠΈ $name
}

// ДСструктуризация Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ синтаксис []
foreach ($data as [$id, $name]) {
// Π’ этом мСстС примСняСм Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ $id ΠΈ $name
}

?>

Π’ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ констант класса

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ классов Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ области видимости.

<?php

class ConstDemo
{
const
PUBLIC_CONST_A = 1;
public const
PUBLIC_CONST_B = 2;
protected const
PROTECTED_CONST = 3;
private const
PRIVATE_CONST = 4;
}

?>

ΠŸΡΠ΅Π²Π΄ΠΎΡ‚ΠΈΠΏ iterable

БСмСйство псСвдотипов, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ относится Ρ‚ΠΈΠΏ callable, пополнилось Π½ΠΎΠ²Ρ‹ΠΌ псСвдотипом с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ iterable. Новый псСвдотип доступСн ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ массивы ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ интСрфСйс Traversable. Π’ вопросах подтипирования, Ρ‚ΠΈΠΏΠ°ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… классов доступно Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° array ΠΈΠ»ΠΈ Traversable Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса Π΄ΠΎ Ρ‚ΠΈΠΏΠ° iterable. Π’ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… Ρ‚ΠΈΠΏΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ классам Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΡΡƒΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° с iterable Π΄ΠΎ array ΠΈΠ»ΠΈ Traversable.

<?php

function iterator(iterable $iter)
{
foreach (
$iter as $val) {
//
}
}

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π°Π±ΠΎΡ€Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ catch

Π‘Π»ΠΎΠΊΠΈ catch Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‡Π΅Ρ€Π΅Π· символ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π΅Ρ€Ρ‚Ρ‹ |. Π­Ρ‚ΠΎ приносит ΠΏΠΎΠ»ΡŒΠ·Ρƒ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΉ классов трСбуСтся ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ.

<?php

try {
// Какой-Ρ‚ΠΎ ΠΊΠΎΠ΄
} catch (FirstException | SecondException $e) {
// ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
}

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π² языковой конструкции list()

Языковая конструкция list() ΠΈ Π΅Ρ‘ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ синтаксис [] Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΊΠ»ΡŽΡ‡ΠΈ. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π΄Π΅ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массивы с нСчисловыми ΠΈΠ»ΠΈ Π½Π΅ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ.

<?php

$data
= [
[
"id" => 1, "name" => 'Tom'],
[
"id" => 2, "name" => 'Fred'],
];

// ДСструктуризация массива Π² стилС языковой конструкции list()
list("id" => $id1, "name" => $name1) = $data[0];

// ДСструктуризация массива Π² стилС ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ³ΠΎ синтаксиса массивов []
["id" => $id1, "name" => $name1] = $data[0];

// ДСструктуризация Π² стилС list()
foreach ($data as list("id" => $id, "name" => $name)) {
// ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… $id ΠΈ $name
}

// ДСструктуризация Π² стилС ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ³ΠΎ синтаксиса []
foreach ($data as ["id" => $id, "name" => $name]) {
// ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… $id ΠΈ $name
}

?>

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… смСщСний Π² строках

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ смСщСния, ΠΈ Π² Ρ€Π°Π±ΠΎΡ‚Ρƒ с символами строки ΠΏΠΎ индСксу Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ синтаксис массива [] ΠΈΠ»ΠΈ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки {} Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… смСщСний Π² строках. Π’ функциях ΠΈ ΠΏΡ€ΠΈ доступС ΠΊ символам строки ΠΏΠΎ индСксу ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ смСщСния ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ смСщСния ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ†Π° строки.

<?php

var_dump
("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

string (1) "e"
int(3)

ΠžΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ смСщСния Π² строках ΠΈ массивах Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² простом синтаксисС Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ строк.

<?php

$string
= 'bar';
echo
"ПослСдний символ Π² строкС '$string' β€” '$string[-1]'.\n";

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

ПослСдний символ Π² строкС 'bar' β€” 'r'.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π΅ΠΆΠΈΠΌΠ° AEAD Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ OpenSSL

Π—Π° счёт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ openssl_encrypt() ΠΈ openssl_decrypt() Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ AEAD-Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² GCM ΠΈ CCM.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с Ρ‚ΠΈΠΏΠΎΠΌ callable Π² Ρ‚ΠΈΠΏ Closure ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Closure::fromCallable()

Π’ класс Closure Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ значСния с Ρ‚ΠΈΠΏΠΎΠΌ callable Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса Closure.

<?php

class Test
{
public function
exposeFunction()
{
return
Closure::fromCallable([$this, 'privateFunction']);
}

private function
privateFunction($param)
{
var_dump($param);
}
}

$privFunc = (new Test)->exposeFunction();
$privFunc('Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅');

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

string(16) "Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅"

Асинхронная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сигналов

Для асинхронной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов Π² ядро PHP Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pcntl_async_signals(). Новая функция Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ‚ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы.

<?php

pcntl_async_signals
(true); // Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ асинхронныС сигналы

pcntl_signal(SIGHUP, function($sig) {
echo
"SIGHUP\n";
});

posix_kill(posix_getpid(), SIGHUP);

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

SIGHUP

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° HTTP/2 Server Push Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ cURL

Π’ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ cURL Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Server Push. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° трСбуСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° cURL вСрсия 7.46 ΠΈ Π²Ρ‹ΡˆΠ΅. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π·Π°Π±Π»Π°Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ curl_multi_setopt() с Π½ΠΎΠ²ΠΎΠΉ константой CURLMOPT_PUSHFUNCTION. Π’ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ константы CURL_PUSH_OK ΠΈ CURL_PUSH_DENY, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄ΠΎΠ±Ρ€ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Server Push Π² клиСнтской callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°

Π’ контСкст ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ tcp_nodelay.

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 2 notes

up
78
DYM ΒΆ
8 years ago
<?php
function swap( &$a, &$b ): void
  { [ $a, $b ] = [ $b, $a ]; }
?>
up
28
unti1x ΒΆ
8 years ago
Note that declaring nullable return type does not mean that you can skip return statement at all. For example:

php > function a(): ?string { }
php > a();
PHP Warning:  Uncaught TypeError: Return value of a() must be of the type string or null, none returned in php shell code:2

php > function b(): ?string { return; }
PHP Fatal error:  A function with return type must return a value (did you mean "return null;" instead of "return;"?) in php shell code on line 2