LINUX.ORG.RU

PHP 7.0.0

 , ,


4

5

Команда разработчиков PHP рада сообщить о релизе PHP 7.0.

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

Abstract Syntax Tree

Наиболее крупным изменением является введение абстрактного синтаксического дерева (AST). Разделение парсера и компилятора позволило избавиться от ряда хаков и сделало реализацию более сопровождаемой и понятной. Кроме того, это позволило реализовать синтаксис, который ранее не был возможным при однопроходном процессе компиляции.

PHPNG

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

Scalar Type Hints

Добавлены четыре новые декларации для скалярных типов: int, float, string и bool. По умолчанию используется нестрогий режим проверки и данные будут приводиться к тому типу, что указан в декларации:

function add(int $a, int $b) {
    // is_int($a) - true
    // is_int($b) - true
    return $a + $b;
}

add("1", "2");

С помощью новой директивы declare(strict_types=1); можно включить режим строгой проверки. Режим распространяется на тот файл, где вызван declare, а не тот, где была определена вызываемая функция. Если типы не совпадут, это приведет к ошибке:

declare(strict_types=1);

function add(int $a, int $b) {
    return $a + $b;
}

add(1.5, 2.5);
// Catchable fatal error: Argument 1 passed to add() must be of the type integer, float given

В дополнение к пользовательским функциями, cтрогий режим проверки типа также влияет на функции стандартной библиотеки и расширений:

declare(strict_types=1);

$foo = substr(52, 1);
// Catchable fatal error: substr() expects parameter 1 to be string, integer given

Return Type Declarations

Добавлена возможность объявить тип возвращаемого значения для функций, генераторов и методов.

Краткий пример синтаксиса в действии:

function foo(): array {
    return [];
}

Здесь так же, как и для type-hint, можно объявить строгий режим. Дополнительные примеры можно найти в RFC.

Uniform Variable Syntax

Введён единый синтаксис переменных. Благодаря этому изменению следующие выражения стали корректными:

// support missing combinations of operations
$foo()['bar']()
[$obj1, $obj2][0]->prop
getStr(){0}

// support nested ::
$foo['bar']::$baz
$foo::$bar::$baz
$foo->bar()::baz()

// support nested ()
foo()()
$foo->bar()()
Foo::bar()()
$foo()()

// support operations on arbitrary (...) expressions
(...)['foo']
(...)->foo
(...)->foo()
(...)::$foo
(...)::foo()
(...)()

// two more practical examples for the last point
(function() { ... })()
($obj->closure)()

// support all operations on dereferencable scalars (not very useful)
"string"->toLower()
[$obj, 'method']()
'Foo'::$bar

Но не обошлось и без потери обратной совместимости:

                        // old meaning            // new meaning
$$foo['bar']['baz']     ${$foo['bar']['baz']}     ($$foo)['bar']['baz']
$foo->$bar['baz']       $foo->{$bar['baz']}       ($foo->$bar)['baz']
$foo->$bar['baz']()     $foo->{$bar['baz']}()     ($foo->$bar)['baz']()
Foo::$bar['baz']()      Foo::{$bar['baz']}()      (Foo::$bar)['baz']()

Generator Return Expressions

Добавлена возможность возвращать значения из генераторов.

function gen() {
    yield "Hello";
    yield " ";
    yield "Sun!";

    return "Goodbye Moon!";
}

$gen = gen();

foreach ($gen as $value) {
    echo $value;
}
// Hello Sun!

echo $gen->getReturn(); // Goodbye Moon!

Generator Delegation

Введён новый синтаксис yield from <expr>, позволяющий генераторам делегировать операции Traversable объектам и массивам.

function hello() {
     yield "Hello";
     yield " ";
     yield "Sun!";
     yield " ";

     yield from goodbye();
}

function goodbye() {
     yield "Goodbye";
     yield " ";
     yield "Moon!";
}

$gen = hello();
foreach ($gen as $value) {
     echo $value;
}

// Hello Sun! Goodbye Moon!

Anonymous classes

Добавлена поддержка анонимных классов.

Они могут быть использованы вместо полного определения класса для одноразовых объектов:

(new class extends ConsoleProgram {
    public function main() {
       /* ... */
    }
})->bootstrap();

Closure::call

PHP7 добавляет легкий способ переопределить $this для анонимной функции прямо во время вызова с помощью Closure::call().

class A {
    private $x = 1;
}

// Pre PHP 7 code
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
echo $getX();

// PHP 7+ code
$getX = function() {return $this->x;};
echo $getX->call(new A);

Throwable Interface

Изменена иерархия исключений. А именно, введён интерфейс Throwable, который реализуют два базовых исключения: Exception и Error. Пользовательские классы не могут реализовывать этот интерфейс.

Таким образом, новая иерархия выглядит вот так:

  • interface Throwable
    • Exception implements Throwable
      • ...
    • Error implements Throwable
      • TypeError extends Error
      • ParseError extends Error
      • AssertionError extends Error

Unicode Codepoint Escape Syntax

Добавлен новый экранирующий символ \u, который позволяет указывать специфические unicode-символы внутри PHP-строк:

echo "\u{aa}"; // ª
echo "\u{0000aa}"; // ª (same as before but with optional leading 0's)
echo "\u{9999}"; // 香

Combined Comparison (Spaceship) Operator

Добавлен новый оператор комбинированного сравнения: (expr) <=> (expr). Он возвращает 0, если оба операнда равны, 1 в случае, когда левый операнд больше правого и -1, если правый больше левого.

echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

Group Use Declarations

Добавлена возможность группировки use деклараций.

// Before:
use Doctrine\Common\Collections\Expr\Comparison;
use Doctrine\Common\Collections\Expr\Value;
use Doctrine\Common\Collections\Expr\CompositeExpression;

// After:
use Doctrine\Common\Collections\Expr\{ Comparison, Value, CompositeExpression };

Null coalesce operator

Ещё один новый оператор — ??, который возвращает левый операнд, если тот не имеет значение NULL, в противном случае возвращается правый операнд. В отличии от короткого тернарного оператора ?:, он работает как isset().

// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalesces can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

Прочие изменения

Особо стоит отметить, что из PHP была удалена вся функциональность помеченная устаревшей в версиях 5.x.x, включая расширения ereg и mysql.

Следующие возможности объявлены устаревшими и будут удалены в будущих версиях:

  • Конструкторы классов в стиле PHP 4.
  • Статические вызовы нестатических методов.
  • Опция salt для password_hash().
  • Опция capture_session_meta для SSL context.

>>> Руководство по миграции с PHP 5.6.x

>>> Исходники для загрузки

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

★★★★★

Проверено: maxcom ()
Последнее исправление: cetjs2 (всего исправлений: 3)

Приятно читать хорошо написанную новость, даже если тебе PHP совершенно не интересен.

anonymous
()

Ну я так и знала, набегут пэхэпэшники и будут падать в обморок от восторга ))) Может мне кто-нибудь объяснит в чем состоит ваш бурный восторг? )))

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

Восторг от того, что много букв кода и это круто, даже если не шаришь в этом...

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

Да, да я почитала, у меня только один маленький вопрос? Почему имя переменной начинается с $ )) И когда это безобразие закончится? ))

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

Почему имя переменной начинается с $

потому что миром правят нефтедоллары

когда это безобразие закончится?

сразу как рубль станет резервной валютой

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

Считывать эмоции, но не понимать текст - удел собачек, а не людей.

)))

Подобными знаками на картинках обозначают вибрацию предметов. Или, например, виляние хвоста.

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

А то, что в баше оно тоже с $, не смущает?

hobbit ★★★★★
()

Наконец-то, что же, 7 хорошее число, лучше 6-ти :-D

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

Почему имя переменной начинается с $

Потому что так было принято в Perl, Tcl, разных *sh и т.п. Т.е. при появлении PHP — в подавляющем большинстве скриптовых языков.

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

какой-то джаваскрипт получился

Анонимные функции и замыкания ещё в 5.3 появились, 6+ лет назад.

Но JS делают не они, а прототипная объектная модель. В PHP, напротив, модель объектов классическая с наследованием и классами.

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

какой-то джаваскрипт получился

Он уже давно такой, ИМХО. Даже Spring свой есть

Хм. Где JS и где Spring? :)

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

Мне всё-таки кажется, что он подразумевал Java =)

Хм. Тогда не знаю :)

KRoN73 ★★★★★
()

то что они добавили в гите tag еще не значит что релизнулось. На официальной странице пока что пусто
Да и

tagged this 2 days ago · 965 commits to master since this tag

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

То есть это плохо сконструированный язык, который повторил недостатки своих предшественников. Вот так и надо сказать.

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

Как раз таки наоборот. Всё остальное формальности. Если нужны подписанные тарболлы, то это сюда.

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

Почему имя переменной начинается с $

Теперь представь, что не начинается. Напиши аналог вот такого:

echo "Value is '$str' (string)";

и такого:
$r=$$module->$action($para);
А в скриптовых языках такое бывает часто, особенно первое.

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

ээ, новости еще нет на php.net

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

набегут пэхэпэшники и будут падать в обморок от восторга )))

Завидуешь?

почему имя переменной начинается с $ ))

По историческим причинам.

И когда это безобразие закончится?

Надеюсь, что никогда.

no-such-file ★★★★★
()
Ответ на: комментарий от Kroz

Напиши аналог вот такого

Запросто - обычное использование без $, при интерполяции внутри строки {var}, вместо $$var - $var. Придумать-то можно, но зачем?

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

Команда разработчиков PHP рада сообщить о релизе PHP 7.0

ну напейтесь вы наконец

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

еще очень долго жить

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

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

Запросто - обычное использование без $, при интерполяции внутри строки {var}, вместо $$var - $var. Придумать-то можно, но зачем?

Не понял ответа.

Если написать аналог без доллара, то получится такое:

echo "Value is '" + str + "' (string)";

и очень кумарит постоянно делать вот эти " + + " в языках типа Си или vimscript. Я уже молчу о читаемости кода.

Так что там, где такие конструкции частые, (а это работа с текстом) доллар перед переменной must-have.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 3)
Ответ на: комментарий от yanka

Да, да я почитала, у меня только один маленький вопрос? Почему имя переменной начинается с $ )) И когда это безобразие закончится? ))

У функций и методов свои признаки.

Без такого признака у переменных тяжело вводить новое не ломая совместимость. Посмотри на Си, как там изгаляются вводя новые ключевые слова. Имеющие знак переменной нацелены на развитие. Не имеющие об этом не задумываются.

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

Выравнивание данных. Для этого в язык добавили спецификатор _Alignas

Поддержка многопоточности, для этого в стандарт добавили спецификатор типа _Thread_local

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

А что мешает реализовать интерполяцию через $, а в остальных случаях обойтись без него?

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

А что мешает реализовать интерполяцию через $, а в остальных случаях обойтись без него?

Опыт разработки tcl. Там была куча проблем с разруливанием интерполяций, пока не пришли к решению.

x86_64 ★★★
()

Не пишу на пхп, но релиз выглядит достойно. Аж захотелось потыкать :D

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

Что значит «ещё»?

Ну я к тому, что основные конкуренты не развиваются быстрее, начиная с 5.3 внесли очень много крутых штук и активно тюнят производительность, осталось внести жит и нормальную неумираемость (опционально для совместимости) и будет жить еще до следующего поколения языков

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

echo «Value is {str}»; же

Или

"test%-4s" % "t"
Выведет: test   t

Или

"test%.2f" % 0.12345
Выведет: test0.12

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

А вообще большая часть такой работы с текстом должна быть в движке шаблонов.

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

потому что некоторое говно работает нормально на 5.3, на 5.4 начинает сыпать ошибками, а на 5.5 вообще не желает запускаться.

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

У меня есть кусок гуано (пых-пых+zend) который ни заменить, ни отказаться от него не предсталяется возможным. На других вериях оно не работает. (Активный продукт фирмы, которую я не хочу называть.)

beastie ★★★★★
()

Не взлетит. Потому что ломает совместимость и крошечный мозг похапешников. Они лет 10 осиливали ООП, а тут ещё генераторов каких-то насовали, замыканий. И всё это конечно страшное как ядерная война.

anonymous
()

Но не обошлось и без потери обратной совместимости

Вот он и фейл. История третьего питона ничему не научила?

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