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

эх, раньше всё было лучше

во времена перфокат? или еще раньше?

gwinn ★★★★
()

Нинужно. Сейчас сайты можно на Rust/C++ писать без граблей. А PHP — тормознутое узкоспециализированное говно.

Говорю как разработчик на PHP.

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

Не знаю, как на счёт C++, но на Rust ещё рановато что-то серьёзное писать. По крайней мере, пока не улучшится ситуация с библиотеками.

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

И? Их всё равно недостаточно. А те, что есть, пока далеки до продакшена. Для пэт-прожектов, да, можно уже играться, я и сам не прочь. Что-то серьёзнее — нет, ещё не время. Возможно некоторые задачи уже можно решать, но далеко не все. Это если мы говорим про то, чтобы заменить PHP.

P.S. http://www.arewewebyet.org/

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

В данном случае определение «нишевый продукт» скорее годно ко всему за пределами PHP.

именно что нишевый. ца пыха - студенты, зарабатывающие на кусок хлеба и гуманитарии, играющие в программистов.

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

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

А если взять тот же PyPy? Да и как показала практика на Python3 можно писать вполне нормальные и производительные приложения. Просто его надо правильно готовить. Хотя я имел ввиду серьезные вещи вроде Elixir.

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

В смысле?) ИМХО ES6 на данный момент один из наиболее удобных и выразительных языков. Хейтеров хватает - но они как правило ничего не писали серьезного или ничего не писали серьезного на JS.

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

Приложение на 1000+ хотя бы коннектов, которое работает по соккетам и использует Redis и какую-нибудь реаляционную БД, умеет синхронизироваться с ЕРП и одинэсками и умеет модульность и кластеризацию.

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

А если взять тот же PyPy?

и он тоже

ИМХО ES6 на данный момент один из наиболее удобных и выразительных языков

прям ща все разбежались, выкинули на помойку свой существующий код и начали писать на es6

Приложение на 1000+ хотя бы коннектов, которое работает по соккетам и использует Redis и какую-нибудь реаляционную БД, умеет синхронизироваться с ЕРП и одинэсками и умеет модульность и кластеризацию.

да без проблем, дорабатывал такую гидру на php

Ford_Focus ★★★★★
()

Быстродействие

Слышал от людей, которые тестировали php7, что он оказывается в разы быстрее php5. Интересно, 7.1 будет ещё быстрее?

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

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

В разных случаях разные причины. Например, для зачистки языка от мусора.

... нет. Если постоянно, то это не зачистка от мусора, а замена одного мусора другим. «Мусор» в языке генерируют «мусорогенераторы». «Мусорогенераторы» способны только генерировать новый мусор, заменяя им старый. Такое впечатление, что сейчас смысл 90% ит-деятельности исключительно в том, чтобы что-то делать. Просто дело ради дела, чтобы «делатели» были чем-то заняты. Единственный ответ зачем нужно - «это новое». Чем заниматься изобретателям колеса, после того, как изобретено колесо? ... все другие занятия уже кажутся мелкими и неинтересными. Вот и выдумывают восьмиугольные колёса, квадратные, треугольные ... и рассказывают, что круглое колёсо давно устарело, и стронники круглого колеса являются хейиерами всего нового, неспособными идти вногу со временем, абсолютными ретроградами, которых прогресс выбросит на свалку истории ;)

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

ИМХО ES6 на данный момент один из наиболее удобных и выразительных языков

Ваганыч, родненький, ты с нами!

anonymous
()

Нахрен этот пэхопе, когда есть Golang?!

anonymous
()

Абсолютно не нужный язык, имеет ряд недостатков и кучу архитектурных проблем.

Нет полноценной поддержки ООП, а те кто называют данный язык чистым ОО очень сильно обижают Алана Кея.
Исходя из первого нет гибкости языка которую дают такие языки как Руби который на данный момент единственный(помимо Smalltalk) из всех языков который полноценно поддерживает ООП
Скорость Пыха превосходит Cpython, но я не скажу что это достижение, Пайтон гораздо выразительнее, а производительность PyPy далеко впереди от Пыха и стоит недалеко от Golang and Nodejs, от сюда исходит что язык который не является гибким, не дает хорошей производительности, не является выразительным, а при обработке текста так вообще плакать хочется, не поддерживает 10к коннектов хоть убей, покупать десяток серваков и кластеризовать все ради того что-бы запустить что-то вменяемое...
Данный язык отлично подходит для нечего, так что оставьте его негде.

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