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 ★★★★★ ()
Ответ на: комментарий от Weres

Большинство юзающих PHP даже не знают что такой void и iterable.

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

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

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

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

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

istepan ()

Когда в него уже статическую типизацию завезут?

anonymous ()

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

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

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

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

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

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

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

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

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

Жаль что не используют. Но тогда да, всё хорошо.

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

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

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

Sectoid ★★★★★ ()

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

Sectoid ★★★★★ ()

PHP

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

slon ()

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

Venediktov ()

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

Там, что, и этого не было?

buddhist ★★★★★ ()
Ответ на: комментарий от 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 ()
Ответ на: комментарий от silver-bullet-bfg

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

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

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

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

которые заставляют людей хоть как-то следовать определённым правилам.

Каким?

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

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

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

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

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

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

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

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

istepan ()

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

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

loz ★★★★★ ()

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

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

denton ★★★★★ ()
Ответ на: комментарий от 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 ()
Ответ на: комментарий от silver-bullet-bfg

Angular не нужен, есть Polymer и Ember

полимер не нужен, есть riotjs

anonymous ()

Nullable типы

Неплохо.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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