LINUX.ORG.RU

PHP 7.1

 


1

4

Состоялся релиз PHP 7.1.

Новые возможности

Nullable типы

Декларации типов параметров и возвращаемых значений теперь могут быть отмечены как nullable с помощью префикса ?.

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

var_dump(testReturn());

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

var_dump(testReturn());

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

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

/*
Output:

string(10) "elePHPant"
NULL
string(10) "elePHPant"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...
*/

Тип возвращаемого значения void

Функции с таким типом не должны ничего возвращать, а именно не должны содержать ни одного оператора return либо использовать его без параметра. При использовании возвращаемого значения оно будет приведено к null без предупреждения.

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);

/*
Output:

null
int(2)
int(1)
*/

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

Добавлена поддержка короткого синтаксиса массивов ([]) при их деструктуризации (в том числе и для foreach) как альтернатива функции list().

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

// list() style
list($id1, $name1) = $data[0];

// [] style
[$id1, $name1] = $data[0];

// list() style
foreach ($data as list($id, $name)) {
    // logic here with $id and $name
}

// [] style
foreach ($data as [$id, $name]) {
    // logic here with $id and $name
}

Поддержка ключей в list()

Теперь можно указывать ключи в функции list() так же, как и в альтернативном варианте ([]).

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

list("id" => $id1, "name" => $name1) = $data[0];

["id" => $id1, "name" => $name1] = $data[0];

foreach ($data as list("id" => $id, "name" => $name)) {
    // logic here with $id and $name
}

foreach ($data as ["id" => $id, "name" => $name]) {
    // logic here with $id and $name
}

Модификаторы доступа для констант класса

Добавлена поддержка задания области видимости для констант классов.

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

Iterable

Введён новый псевдотип iterable. Он может использоваться как в декларациях типов параметров, так и в качестве возвращаемого значения там, где используется массив или объект, реализующий интерфейс Traversable.

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

Обработка нескольких исключений одновременно

В блоке catch теперь можно обрабатывать несколько исключений, перечисляя их через вертикальную черту (|).

try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
}

Поддержка отрицательных индексов для строк

При индексации строк с помощью [] или {} стало возможным указание отрицательных индексов. Это изменение также распространяется на функции для работы со строками.

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

/*
Output:

string (1) "e"
int(3)
*/

Отрицательные индексы для строк и массивов теперь также поддерживаются и при интерполяции строк.

$string = 'bar';
echo "The last character of '$string' is '$string[-1]'.\n";

/*
Output:

The last character of 'bar' is 'r'.
*/

Преобразование callable в Closure с помощью Closure::fromCallable()

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

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

$privFunc = (new Test)->exposeFunction();
$privFunc('some value');

/*
Output:

string(10) "some value"
*/

Асинхронная обработка сигналов

Новая функция pcntl_async_signals() позволяет реализовать асинхронную обработку сигналов без использования тиков (производящих много накладных расходов).

pcntl_async_signals(true);

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

posix_kill(posix_getpid(), SIGHUP);

/*
Output:

SIGHUP
*/

Изменения, нарушающие обратную совместимость

  • При передаче пользовательской функции недостаточного количества аргументов вместо предупреждения выбрасывается исключение.
  • void и iterable больше нельзя использовать в именах классов, интерфейсов и типажей.
  • rand() и srand() теперь являются синонимами для mt_rand() и mt_srand().
  • Символ удаления ASCII (0x7F) больше нельзя использовать в идентификаторах, не заключённых в кавычки.
  • Значение error_log изменено на syslog.
  • Следующие ini-директивы были удалены: session.entropy_file, session.entropy_length, session.hash_function, session.hash_bits_per_character.
  • Сообщение для ошибок E_RECOVERABLE изменено с «Catchable fatal error» на «Recoverable fatal error».

Функциональность, объявленная устаревшей

  • Расширение ext/mcrypt объявлено устаревшим и будет удалено из ядра в PHP 7.2. Вместо него предлагается использовать OpenSSL. Если это расширение всё же необходимо, его можно будет установить из PECL.
  • Модификатор шаблона e для функций mb_ereg_replace() и mb_eregi_replace() объявлен устаревшим.

>>> Руководство по миграции с 7.0.x на 7.1.x

>>> Исходный код

>>> Список изменений

★★★★★

Проверено: Shaman007 ()
Последнее исправление: sudopacman (всего исправлений: 6)

Ответ на: комментарий от Venediktov

Скажите, с какой версии PHP перестал теч?

Х.з. Но демон на ~5.1 у меня месяцами работал без утечек. И это при том, что нормальную сборку мусора только в 5.3, 7 лет назад сделали.

KRoN73 ★★★★★
()
Ответ на: комментарий от Weres

Очень логично и никакого хрома головного мозга

Да, как и в большинстве других языков.

KRoN73 ★★★★★
()
Ответ на: комментарий от Kilte

То же самое. Если возвращаешь void, то вызывающая функция обязана иметь соответствующий тип.
Зачем возвращать пельмени и котлеты из одной и той же функции?

ritsufag ★★★★★
()
Ответ на: комментарий от ritsufag

Я про то, что есть библиотечная функция, которая ничего не возвращает и автор библиотеки решил дописать туда void, а после обновления твой код превратился в тыкву.

Kilte ★★★★★
() автор топика
Ответ на: комментарий от Weres

Тех, кто использует php такое не напрягает?

а ты смешной :) там такой ппц, что на такие мелочи никто внимания не обращает.

это, пожалуй, аналогично тому, как больные шизофренией не думают, что они больны. такое можно только со стороны увидеть.

anonymous
()
Ответ на: комментарий от Kilte

а после обновления твой код превратился в тыкву

Он и до этого был тыквой, только ты не знал. Правда, такой шаловливый автор библиотеки сначала сам огребёт, т.к. тесты сломаются.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от istepan

Python в свое время мог вытеснить PHP, но проиграл из-за своей производительности

Ась?

dmxrand
()
Ответ на: комментарий от ritsufag

Так функция и до этого ничего не возвращала. В док-блоке, если он есть, как правило должно быть написано что-то вроде @return void

А сигнатура твоей функции выглядит допустим так: gho(callback: mixed Fn())

Kilte ★★★★★
() автор топика
Последнее исправление: Kilte (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Правда, такой шаловливый автор библиотеки сначала сам огребёт, т.к. тесты сломаются.

Это если он знает слово «тесты». А то некоторые умудряются без них обходиться. А другие ничего не подозревающие умудряются их продукцией пользоваться, пока...

anonymous
()
Ответ на: комментарий от anonymous

Это если он знает слово «тесты»

Интересно, как он пишет библиотеку без тестов? Всё равно как-то проверять нужно.

no-such-file ★★★★★
()

Функции с таким типом не должны ничего возвращать. А именно, не содержать ни одного оператора return, либо использовать его без параметра. При использовании возвращаемого значения оно будет приведено к null без предупреждения.

Оставили лазейку для логических ошибок. Вот матюгнулись бы сразу и у программера появится возможность осмыслить кусок кода, а так будет искать «а чё это программа считает не так как я написал?».

drfaust ★★★★★
()
Ответ на: комментарий от Venediktov

Он перестал течь в 5.4, а потом потек опять в 5.6, в семерке он стал глючить (пропадали данные из суперглобалов), про последний я ничего не скажу т.к. не знаю.

deep-purple ★★★★★
()
Ответ на: комментарий от anonymous

Что-бы потом этот код можно было поддерживать и не сойти с ума.
Я вот сейчас очень жалею что написал один сервис за пять дней, а не за десять, но нормально.

MrClon ★★★★★
()
Ответ на: комментарий от Kilte

в doc-блоках библиотек частенько встречается void

Точняк, я даже где-то кому-то доказывал что пых никогда не возвращает воид, на что мне говорили что вон в доках же написано, а я говорил ну так проверь вардампом и успокойся. Теперь мне стало спокойнее что я еще тогда был очень прав.

deep-purple ★★★★★
()
You may have found a problem in PHP.
This report can be automatically sent to the PHP QA team at
http://qa.php.net/reports and http://news.php.net/php.qa.reports
This gives us a better understanding of PHP's behavior.
...
Thank you for helping to make PHP better.

А ты уже помог сделать PHP лучше, $username?

saahriktu ★★★★★
()
Ответ на: комментарий от silver-bullet-bfg

Поддерживать пых нифига не просто, особенно если пишется что то реально сложное. Говорю как бекендщик, который работал и с пыхом в том числе

Это больше характеризует тебя и твои проекты на пыхе, нежели пых :)

Fafhrd
()
Ответ на: комментарий от Fafhrd

Это больше характеризует тебя и твои проекты на пыхе, нежели пых :)

Эталонного фанбоя псто.

ugoday ★★★★★
()

Длинный заголовок темы, вам не показалось? На пыхе еще кто-то пишет?

GMax
()
Ответ на: комментарий от silver-bullet-bfg

Людей с недостатком хромосом лучше не пускать в программирование.

Правильно, программировать должны те у кого их на одну больше :D

anonymous
()

не пойму зачем они постоянно что-то обьявляют устаревшим и выкидывают? им что, в кайф заниматься онанизмомрефактрингом с ваходом кажой минорной версии? блин, да на перле приложения 15 летней давности спокойно себе работают на последних версиях и не жужжат :)

Rost ★★★★★
()
Ответ на: комментарий от deep-purple

Ты просто не напарывался

Да нет, я схитрил :) Основной цикл памятью не занимался вообще, а все воркеры форкались, выполняли работу и закрывались. Память при этом системой освобождается :)

Так делал обработчики событий для Gearman'а, ботов для XMPP...

KRoN73 ★★★★★
()
Ответ на: комментарий от MrClon

Демон на PHP, месье?

Угу. Чтобы пе плодить сущности, когда демон должен работать с PHP-окружением. Например, писать сообщения на PHP-форум или публиковать новости на сайте.

KRoN73 ★★★★★
()
Ответ на: комментарий от Rost

не пойму зачем они постоянно что-то обьявляют устаревшим и выкидывают?

В разных случаях разные причины. Например, для зачистки языка от мусора. Долго тянуть с собой кривое legacy — это и провоцировать юзеров на кривой код, и утяжелять/усложнять код...

блин, да на перле приложения 15 летней давности спокойно себе работают

Так Perl и не развивался :) И не все приложения работают, мне доводилось уже исправлять свой старый код. И так радужно далеко не на всех яыках — попробуй на современном Python или Ruby запустить что-то сложнее HelloWorld из 2001 года...

KRoN73 ★★★★★
()

Как думаете, в следующий стабильный debian успеют впилить? Когда там заморозка?

MrClon ★★★★★
()
Ответ на: комментарий от Weres

Тех, кто использует php такое не напрягает?

Почти не встречаются проекты базирующиеся на свежайших версиях. Среди реальных задач 5.3, 5.4 вот это вот все

wxw ★★★★★
()
Ответ на: комментарий от ritsufag

Вообще-то оно так и есть:

function analBalls(): void {
     //Тут пека взрывается
     return "dildocatapult";
}
— вызовет fatal error.

При использовании возвращаемого значения оно будет приведено к null без предупреждения.

Означает, что:

function f(): void {…;}
$a = f();
— запишет в $a значение null, а не что внутри тела f могут быть returnʼы со значениями.

sasha1024
()
Ответ на: комментарий от MrClon

Ну ХЗ, API?

Так всё равно лишние сущности. Висит, вот, демон на Питоне, приходит событие. И ему приходится или дёргать PHP в cli (что уже оверхед тот ещё — формирование файла, запуск бинарника), или дёргать PHP по HTTP (что лучше, но всё равно как-то не то), или дёргать... демон на PHP :)

Проще (при отсутствии прочих минусов) сразу держать демон на PHP :D

...

Сейчас, правда, так вышло, что почти все аналогичные задачи у меня без демонов решаются. Чаще всего обмен информацией не реалтаймовый, а через filesync (btsync или syncthing), так что просто висит inotifywatch на приёмном каталоге и уже он запускает php-обработчик :) Так что демона в классическом смысле вообще нет. Даже обработка задач фоновая отложенная так сделана. Когда-то были демоны на MySQL или Gearman, сейчас просто постановщик задачи кладёт JSON-файл с описанием в каталог задач, а воркер забирает оттуда.

KRoN73 ★★★★★
()
Ответ на: комментарий от wxw

Почти не встречаются проекты базирующиеся на свежайших версиях. Среди реальных задач 5.3, 5.4 вот это вот все

Сейчас большинство софта (и мой в т.ч. :D — я так даже 5.4 перепрыгнул) прыгнуло на 5.5 — генераторы, правильные пароли, удобный формат записи массивов [el1, el2, ...], ::class, WebP в GD...

KRoN73 ★★★★★
()

Ничего не выйдет с voidами у них. Те, кого сильно беспокоит этот вопрос (и многие иные в php) на нём не пишут. Кого беспокоит но не сильно, привыкли как-то обходиться, привычку не пересилишь. Кому пофигу, тому пофигу. Книжеи написаны по-старому. Это как с логическим типом в Си, он вроде бы и есть, а им никто не пользуется. Чтобы этим стали пользоваться, нужно принудительно заставить всех писать void вместо того, чтобы ничего не выдавать, а весь старый функционал сломать. Но php этого не переживёт. Питон только оправился от py3k, хотя проблемы там были гораздо менее серьёзные, например, None по умолчанию был и во второй версии.

Vudod ★★★★★
()
Ответ на: комментарий от buratino

так ненавижу, что даже кушать не могу

За что? Типичный же нишевый продукт. Такие должны иметь место. 1С ничем не лучше, но свою нишу занимает. Чужие не лезут, им пофиг :-)

DeVliegendeHollander ★★
()

В нём до сих пор имена функций названы как попало? Где-то

str_*
, где-то
str*
, где-то
*str
? Если да, то закопать этот ущербный язык.

anonymous
()
Ответ на: комментарий от Weres

напрягает. хостеров. которым приходится держать целый набор минорных версий php

Ford_Focus ★★★★★
()
Последнее исправление: Ford_Focus (всего исправлений: 1)
Ответ на: комментарий от Vudod

весь старый функционал сломать
php этого не переживёт

lol

Ford_Focus ★★★★★
()
Ответ на: комментарий от silver-bullet-bfg

можно посмотреть тесты производительности

основные оппоненты, python и ruby, сильно позади. а жаль.

В РНР он мягко говоря не выразительный

до js ему всяко далеко

Поддерживать пых нифига не просто, особенно если пишется что то реально сложное

смотря что считать «реально сложным».

Ford_Focus ★★★★★
()

Обработка нескольких исключений одновременно
Модификаторы доступа для констант класса

В тему, годно

gwinn ★★★★
()
Ответ на: комментарий от buratino

за всё. ненавижу и презираю

Прямо крик души. Чем обычный продукт, который никто не заставляет использовать так насолил-то?

gwinn ★★★★
()
Ответ на: комментарий от gwinn

Прямо крик души. Чем обычный продукт, который никто не заставляет использовать так насолил-то?

он изменил человеческую цивилизацию в гораздо более худшую сторону

buratino ★★★★★
()
Ответ на: комментарий от buratino

Ну жиром то заливать тут все вокруг не надо, где цивилизация, а где твои отдельностоящие душевные муки

gwinn ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.