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

Можете считать это не частью названия, а эдаким оператором. Вот невозможность использовать ключевые слова в качестве названий переменных — куда большее безобразие, ограничивающее развитие языка. И вообще, напоминает запрещённые имена файлов в DOS/Windows (CON и т. д.) Вы, небось, виндузятница? Идите дальше любуйтесь на свой сисярп и не загаживайте тут эфир.

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

Это mysql_-то редко используется? Да куча школьников взвоет хотя бы из-за того, что старый код нельзя будет просто скопипастить и запустить. Да, mysqli_ очень похож, но там порядок параметров местами другой, т. ч. просто автозаменить тоже не получится.

contra_sperm_spero
()
Ответ на: комментарий от I-Love-Microsoft

Можете засунуть свой оценкомёт себе в жопу и тыкать свои быдлолайки туда, всё равно он тут не работает.

contra_sperm_spero
()
Ответ на: комментарий от I-Love-Microsoft

А программированием вообще? Сабж, например, и в CLI вполне себе используется, есть даже извращенцы, которые всякие биндинги к GTK юзают. На контроллерах пыхпых не нужен, это да, а так вполне себе универсальный язычок, и во многих аспектах годный, но репутация, особенно тяжёлое наследие третьей-четвёртой версии типа кидания GET/POST в глобальный скоуп, отталкивают истеричек в сторону всяких пыхтонов и прочих модных рубей с жабоскриптами.

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

Но разве это проблема языка?

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

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

Тот же js. Он быстрее(node.js), асинхронен, может работать 24/7.

Не забудь только супервизор поставить на проде, а то эта хрень течет пуще твоей мамки, так что 24/7 там и не пахло. Да babel подключить, потому что обновляется стандарт языка раз в 3 месяца.

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

Он даже не умеет многие вещи, которые требуются современному вебу(асинхронность), чего уж тут говорить.

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

Да что тут говорить, никто не делает серьезные проекты на php уже давно.

Делают. Вот Symfony 2 показатель роста цивилизованного сообщества PHP. Джанги-хуянги уже начинают посасывать. А с приходом PHP 7 вообще отсосут по полной.

Примеры 10-летней давности, что якобы фейсбуки и вконтатики работают на php - эти аргументы всегда дико доставляли.

потому что язык для детей пистон на хайлоуде не взлетит. и все вменяемые люди это знают.

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

Вот Symfony 2 показатель роста цивилизованного сообщества PHP
Джанги-хуянги уже начинают посасывать
А с приходом PHP 7 вообще отсосут по полной.

Ахахахахах. Ты сделал мой день :D

потому что язык для детей пистон на хайлоуде не взлетит. и все вменяемые люди это знают.

Ещё раз сделал мой день :D

php до хайлоада не доживает, а Python же из коробки ещё держит. В общем, ладно. Фанатики такие фанатики. Чего с вами спорить?

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

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

th3m3 ★★★★★
()

Ну это,

Да говно это пехопе, всем понятно. Все на Golang!!

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

И что? Было бы не php - выдержало бы ещё больше, на менее мощном железе. Там же не голое php держит. Куча оптимизаций. Ещё варнишь стоит. Без всего этого давно бы сервер лежал.

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

И что?

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

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

Там же не голое php держит

Может если хайлоад на голом питоне/php/чем угодно без кэша, лоад балансера и оптимизаций, то это не совсем хайлоад?

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

Сейчас уже давно ничего не течёт.

Ой не ври. Хорошо хоть цикличные ссылки нода научилась разбирать. До этого вообще шлак был. Но наделать в обычном коде на ноде утечек все-равно еще остается вагон и маленькая тележка. Я уж не говорю про «особенности» языка, где массив можно прибавить к объекту, помножить на undefined и получить хз что, причем сделать это не специально, а просто в ходе работы приложения. Или прототипы, пользоваться которыми умеют видимо только сами их разработчики, судя по собеседованиям и реальному коду. Ну а про неявное привидение строк к объектам в ходе изменения прототипа пока вообще на собеседованиях никто не ответил нормально.

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

Ошибки могут быть у всех. Я говорю - вообщем - всё уже давно хорошо с утечками. Это в первых версиях была проблема.

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

это частая проблема в node.js-приложениях (не обязательно в рантайме, библиотеки этим тоже страдают). регулярно вижу как текущие, так не текущие приложения на ноде.

что характерно — переписывание на другом языке куда-то убирает эти утечки, да и не считая их памяти оно есть начинает меньше раз в 10.

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

но сам подход: рубануть деприкейтед в миноре....

ыхыхы, тут в соседнем треде говорят, что после обновления на 2.7.11 с 2.7.10 перестало celery работать.

anonymous
()

Ужас

Какая же всё-таки мерзость - этот ПХП! И каждый раз добавляют ещё новые хаки, чтобы ещё и ещё больше старых сайтиков переставало работать, а быдлоадминам приходилось учить всё больше и больше синтаксических извратов. Хватит.

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