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

void и iterable больше нельзя использовать в именах классов, интерфейсов и трейтов.

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

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

И это в минорном релизе?

Да, не хорошо, но и не слишком уж страшно.

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

Я более чем уверен, что большинство обновится до новой версии без особых проблем.

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

Я как бы работал сам в этой сфере когда-то, знаю многих php программистов. Так что идите троллить дальше.

Weres ★★★ ()
Последнее исправление: Weres (всего исправлений: 1)

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

Собственно главная штука, ради которой стоит обновляться.

istepan ()

Режет глаза странный синтаксис nullable.

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

Поддерживаю. Надо щупать как оно теперь работает.

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

это с какого перепугу то? ты за себя говори давай.

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

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

Это не минорный релиз, PHP не использует semantic versioning. Так что нет, не напрягает =)

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

Жаль что не используют.

С одной стороны да, жаль. А с другой, учитывая частоту их больших релизов, и хорошо: так бы это был бы уже какой-нибудь 15.0.0.

Sectoid ★★★★★ ()

Годный релиз, обобряю. Еще бы впилили опцией стат. типизацию, был бы вообще праздник.

Sectoid ★★★★★ ()

PHP

Шутите, зачем это здесь?

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

PHP - пережиток прошлого, который порождает только очень плохих программистов. Даже Python не так плох. С ним может сравниться только по отвратительности архитектуры лишь Golang.

silver-bullet-bfg ★★ ()
Последнее исправление: silver-bullet-bfg (всего исправлений: 1)
Ответ на: комментарий от buddhist

Негласно он как бы существовал. Всё так же можно было сделать return без параметра или вообще ничего не возвращать. В этом случае также, как и сейчас при попытке использовать возвращаемое значение оно приводилось к null. В документации самого PHP (ЕМНИП) и в doc-блоках библиотек частенько встречается void. Сейчас, насколько я понимаю, просто появилась возможность задать декларацию типа. И если она есть, то вернуть что-то вместо void уже нельзя.

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

PHP - пережиток прошлого, который порождает только очень плохих программистов. Даже Python не так плох. С ним может сравниться только по отвратительности архитектуры лишь Golang.

PHP – это язык программирования, который может правильно постичь только толковый человек.
ДажеА вот Python не так плох постоянно генерализированные Дурачки в этом world засовывают куда ни попадя. После этого Python аки женский тампон – пихается часто и в одно-известное-всем-место.
С ним может сравниться только по отвратительности сфере применения архитектуры лишь Golang.

С Вас, уважаемый сударь, -7 за жир :)

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

А мне Golang очень даже нравится.

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

Скорее JS, чем PHP. Сейчас в PHP везде где можно MVC или MVVM пихают, что заставляет людей хоть как-то следовать определенным правилам.

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

В JS тоже куча MVC-фреймворков + в последнее время появляются всякие реактивные штуки, которые заставляют людей хоть как-то следовать определённым правилам.

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

В PHP достаточно написать класс и создать объект.

В JS чтоб это сделать по нормальному, нужно установить прекомпиляторы typescript, разобраться во всяких webpack, которые через пол года устаревают.

А ванильный вариант через prototype не каждому освоить дано.

Поэтому новички юзают всякие jQuery и пишут как думают в режиме реального времени.

Для того же Angular2 черт сломит ногу что и куда надо сконфигурировать, чтобы вывести «Hello world».

istepan ()

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

Люди стараются от этого избавиться, а в пхп только вводят

loz ★★★★★ ()

void и iterable больше нельзя использовать в именах классов, интерфейсов и трейтов.

Багфикс, нет?

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

Не мешать логику с представлением например.

Почему это должно быть важно при решении конкретной задачи? Вот если задача написать WEB-сервис может быть решена за 5 дней, если не следовать правилам, и за 10 дней, если делать всё по канонам и правилам, то на кой ляд правила?

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

Имеется куча статей, скринкастов. Словом, материала для обучения вагон и маленькая тележка. Бери да делай. Единственное, что может препятствовать — это то, что вся информация разбросана и приходится собирать её по крупицам, но это если не смотреть на фреймворки. В случае с фреймворками, по идее всё должно быть в документации. Могут ещё starter-kit какой-нибудь предоставить. Да и там хочешь того, или нет, фреймворк будет загонять тебя в свои рамки и наговнокодить становится немного сложнее.

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

Какой толстопузый, у меня аж жир с монитора потек. По теме есть что сказать ? Или так и дальше кудахтать будешь ?

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

От условий зависит. Если написал и забыл, то разумеется, делай как хочешь. А если с этим потом придётся работать, поддерживать и всё такое, то следование общепринятым правилам сделает жизнь проще + другим разработчикам будет легче. Очевидно же.

Kilte ★★★★★ ()

Фу, как противно. Мне нравится.

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

В PHP достаточно написать класс и создать объект.

А в ES6/JavaScript это религия не позволяет?

В JS чтоб это сделать по нормальному, нужно установить прекомпиляторы typescript

Мелкомягое поделие не нужноо. Для типизации есть flow.

разобраться во всяких webpack,

Смотря для чего, если работать с той же NodeJS - то не надо

которые через пол года устаревают.

Пишу пользуясь грюнтом. С момента выхода, не менял ни разу.

А ванильный вариант через prototype не каждому освоить дано.

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

Поэтому новички юзают всякие jQuery и пишут как думают в режиме реального времени.

Проблема в том что они не думают, а Jquery с приходом ES6 опять же не нужен

Для того же Angular2 черт сломит ногу что и куда надо сконфигурировать, чтобы вывести «Hello world».

Angular не нужен, есть Polymer и Ember. А аунгуляры придумал люди, которым плевать на пользователей и они готовы обвесить обсерверами все, что только можно и нельзя, лишь бы им потом было удобно поддерживать

silver-bullet-bfg ★★ ()
Последнее исправление: silver-bullet-bfg (всего исправлений: 2)
Ответ на: комментарий от joy4eg

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

silver-bullet-bfg ★★ ()

Nullable типы

Неплохо.

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

А почему бы просто не бить по рукам, пусть это и в рантайме?

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

А почему бы просто не бить по рукам, пусть это и в рантайме?

Как тогда в функциях высшего порядка предлагаешь это использовать?

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

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

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

И это в минорном релизе?

В PHP не страдают Хромом головного мозга :) Релизы после первой точки — мажорные. Минорные — после второй.

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

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

А с какой начал?

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

А первая цифра — для смены эпох. Мезозоя на кайнозоя. Очень логично и никакого хрома головного мозга. И семвера головного мозга. Да и вообще.

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

А в чем проблема то?
Если указано что функция ничего не возвращает

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

то бить по рукам, если не указано то ок.

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