Функции php 7. Убраны тэги в старом стиле

PHP - это язык программирования, который в основном применяется в веб-разработке, как правило, в части back-end. PHP имеет достаточно длинную историю - его первая версия появилась более 20 лет назад, в 1995 году. За это время было выпущено 7 версий PHP, последняя из которых появилась в декабре 2015 года. О ней и пойдет речь в этой статье.

Релиз PHP 7.0 стал в своем роде прорывом, так как он основывался на phpng - экспериментальном и активно развивающимся проекте PHP, название которого расшифровывается как “PHP Next Generation” - «Следующее поколение PHP». Данную технологию можно было использовать и в предыдущих версиях PHP, однако именно в PHP 7 она была введена как основополагающая. При ее разработке была поставлена цель повысить производительность PHP, но при этом не потерять совместимость.

Zend Engine

PHP 7 основан на третьей версии Zend Engine, в которой был развит проект phpng.

Нововведения

В первую очередь новшества в PHP 7 коснулись самых важных для разработки приложений параметров - это производительность и потребление памяти.

Основное изменение, о котором в первую очередь упоминают в разговоре о PHP 7, это улучшение производительности : показатели PHP 7 приближены к показателям HHVM (разработанной Facebook системы, которая позволяет ускорить преобразование PHP-кода в несколько раз). Не последней причиной этого стало то, что соучредитель Zend Technologies (компании-разработчика ядра PHP) Зеев Сураски рассматривает HHVM как одного из конкурентов Zend. А ведущий разработчик PHP 7 компании Zend Technologies и автор phpng Дмитрий Стогов заверяет, что разница в производительности PHP 5.0 и PHP 7 на синтетическом тесте bench.php составляет 14 раз. На практике большинство пользователей склоняются к мнению, что PHP 7 примерно в два раза быстрее предыдущей версии.

HHVM использует так называемую JIT (Just-In-Time) компиляцию для преобразования кода - несмотря на то, что JIT в 7 версии PHP не появился, PHP 7 поддерживает более хорошую миграцию, которая и позволяет улучшить производительность в разы. Именно новый уровень производительности Дмитрий Стогов выделяет в качестве главной особенности PHP 7.

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

В наше время крайне важно думать о пользователях не только стационарных, но и мобильных устройств, поэтому разработчики PHP 7 улучшили исполнения движка и снизили потребление памяти, а также добавили возможность использовать нативное локальное хранилище. К тому же PHP 7 позволяет выполнять асинхронные задачи.

Кстати, при разработке учитывались и популярные тенденции по сокращению потребления ресурсов планеты, поэтому PHP 7 имеет возможность обрабатывать больше трафика , используя все те же ресурсы сервера.

Новые функции

В PHP 7 есть множество новых функций, каждая из которых делает разработку более удобной и простой. Далее вы можете ознакомиться с некоторыми из них.

  • Два новых класса исключений (Exception и Error) - если в предыдущих версиях PHP нельзя было обрабатывать фатальные ошибки, то в новом релизе приводящие к этому действия выбрасывают исключения, то есть завершение скрипта не произойдет.
  • Анонимные классы - теперь PHP 7 поддерживает этот вид классов, который часто используют в C++ и Java для выполнения callback-функций. Эти классы в основном используются для создания простых элементов:

setLogger(new Logger()); // PHP 7+ code $util->setLogger(new class { public function log($msg) { echo $msg; } });

Анонимные классы могут быть вложенными, но при этом им не будут доступны protected или private-свойства внешнего класса.

  • Возможность указывать скалярные типы (Scalar Type Hints) - в предыдущих версиях PHP можно было указывать тип принимаемых значений; теперь вы также можете указывать и скалярные типы:

Строки (`string`), целые (`int`), числа (`float`), бульки (`bool`).

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

  • Сокращенная конструкция use - в PHP 7 появилась возможность объединять декларирование групп use , что, несомненно, положительно отразится как на скорости работы, так и на восприятии кода:
  • Новые операторы Null coalescing operator (??) и Combined Comparison Operator (<=>, также он известен как Spaceship Operator) - эти два новых оператора, которых некоторые относят к синтаксическому сахару, помогут написать более лаконичный и понятный код.

Null coalescing operator - это оператор объединения, который проверяет, существует ли переменная, и возвращает ее значение (либо значение по умолчанию):

$action = $_POST["action"] ?? "index";

Combined Comparison Operator - это оператор сравнения, который пригодится для использования в callback-функциях для usort(). Он сравнивает два значения и, в зависимости от результата, возвращает -1, 0 или 1:

Function order_func($a, $b) { return $a <=> $b; }

Приоритет данной операции равен приоритетам других операций сравнения, при этом его нельзя связать с предыдущим вызовом, т.к. это неассоциативный оператор.

  • Функция assert() - в PHP 7 эта функция обрабатывается особым образом для того, чтобы были исключены накладные расходы; вы можете использовать ее для отладки, а в дальнейшем отключать.
  • Фильтрация unserialize() - это новшество обеспечит безопасность сериализации объектов. Разработчик сам сможет определить, какие классы должны подвергнуться обработке, а какие нет.
  • Представление целых чисел в виде 64-битных в PHP 7 для Windows x64: теперь PHP поддерживает строки длиной больше 231 байт в 64-битных сборках.
  • Делегирование генераторов - при помощи сложный генератор можно разделить на несколько более мелких. Как и некоторые другие нововведения, данное новшество направлено на написание более чистого и удобного для повторного использования кода.
  • Появление нового класса IntlChar - он увеличивает набор возможностей библиотеки для локализации приложений International Components for Unicode и имеет методы класса и константы для работы с Unicode.
  • Возможность определять массивы как значения констант, которые объявляются через define().
  • Возможность присваивать зарезервированные ключевые слова именам методов.
  • Появление нового идентификатора простых значений PHP_INT_MIN.

Что касается старых функций, то часть самых невостребованных возможностей была исключена: к примеру, были удалены ASP и script-теги, а также регулярные выражения, совместимые с POSIX, и расширение ext/mysql.

PHP и веб-серверы

PHP широко применяется при написании множества веб-приложений, т.к. этот язык совместим с различными веб-серверами (Apache, Nginx, IIS), базами данных (MySQL, Postgre, MongoDB и т.д.), а также операционными системами.
Поэтому уже традиционно нововведения коснулись не только языка в целом, но и тех его сторон, которые связаны с хостингом.

В первую очередь в PHP 7 было введено Abstract syntax tree (AST) - абстрактное синтаксическое дерево, которое является промежуточным звеном в компиляционном процессе. Именно на этой модели теперь основан синтаксический анализатор. Благодаря этому теперь можно создавать более производительный операционный код.

Еще одним нововведением является Uniform Variable Syntax - универсальный синтаксис для переменных. Это позволяет, с одной стороны, решить часть несоответствий, которые связаны с вычислением значений переменных, но, с другой стороны, создает необходимость переписывать некоторые редко используемые части кода.

Еще раз вернемся к увеличению производительности PHP 7: это благоприятно отразиться на функционале всех хостингов, ведь они смогут увеличить количество своих пользователей без увеличения количества серверов или других улучшений.

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

Нельзя не сказать о некоторых проблемах обратной совместимости, которые могут возникнуть при переходе на PHP 7. Например, теперь нельзя использовать несколько выражений default в switch, т.к. в противном случае вы увидите ошибку. Однако в целом эти проблемы незначительны на фоне тех новых возможностей, которые предлагает PHP 7.

Вывод

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

По некоторым исследованиям, на нем написано около 80% всех сайтов. И это совсем не странно, ведь даже такие сетевые гиганты как ВКонтакте и Фейсбук , были созданы с помощью него. О популярности можно судить еще и потому, что запрос “” – запрашивают в поисковых системах гораздо чаще, чем другие языки. Так на один запрос хостинг perl припадает 150 – вышеупомянутого хостинг php.

Язык создан в 1994 году и изначально представлял собой набор скриптов. Со временем скрипты были переделаны в интерпретатор на С.

Главные особенности и возможности языка PHP:

  • возможность работы с различными веб-серверами (, IIS );
  • легкость в изучении и гибкость в работе;
  • поддержка работы с базами данных – , MSSQL, Oracle, Postgre, MongoDB и другими;
  • для популярных ОС существуют соответствующие пакеты PHP, тоесть можно создавать сайты на ;
  • совместимость с большинством услуг хостинга , которые предоставляются провайдерами. Вы без проблем сможете разместить сайт написанный на PHP на любом хостинге. Как обезопасить PHP на сервере? Наши советы .
  • язык PHP не стоит на месте и постоянно развивается, что привлекает к себе разработчиков со всего мира.

Какие версии PHP актуальны на данный момент?

По праву, считаются актуальными версии PHP 4 и 5. Версия 4 имеет свою популярность и используется для написания различных веб-приложений. PHP 5 имеет множество дополнительных возможностей, но в свою очередь, не полностью совместим с четвертой версией языка. Поэтому некоторые программы (написаны на PHP 4) не смогут работать в среде PHP 5 . Как дополнительные инструменты к ядру языка часто используются модули. К примеру, разработаны специальные модули для работы с графикой, или модули, которые реализуют взаимодействия с различными базами данных.

После выхода в свет 5-ой версии языка, все ожидали шестую. Но PHP 6 так и не смог себя реализовать, из-за проблем с поддержкой Юникода, поэтому в 2010 году разработка и внедрение данной версии были прекращены.

PHP 7 – новая версия с новыми возможностями.

Не так давно, 3 декабря 2015 года , вышел новый релиз популярного языка программирования – PHP 7.0.0 , что дало старт развития серии PHP 7. Язык уже успел завоевать своих поклонников за двадцатилетнюю историю существования. Скриптовый язык общего назначения используют для создания различных веб-приложений, в том числе для написания платных и бесплатных CMS. Например, Joomla!, Drupal, WordPress и тп.

Дальше поговорим о новых возможностях PHP 7 и разберемся, почему его так ждали разработчики. Ведь несмотря на частую критику данного языка, большинство хостинг-провайдеров поддерживают именно его, в том числе устанавливают самые последние версии PHP. Язык является самым востребованным по критериям использования в сети. Новая версия является по своей сути экспериментальной и базируется на основе phpng (следующее поколение PHP), в основу положен принцип увеличения производительности за счет уменьшения потребления памяти.

Язык PHP 7 разработан с добавлением новой версии Zend Engine . Если сравнивать его с предыдущей версией 5.6 (новый релиз которой появился в ноябре этого же года), то веб-разработчики языка в первую очередь отмечают улучшенную производительность новой технологии: PHP 7 в два раза шустрее предшественника .

Рассмотрим по пунктам, что же предлагает новая версия PHP :

  • полноценная поддержка 64-битности системы;
  • использования памяти намного уменьшено;
  • добавлен функционал абстрактного синтаксического дерева ;
  • большинство фатальных ошибок превращаются в исключения;
  • усовершенствованна иерархия исключений;
  • генератор случайных чисел стал более безопасным;
  • анонимные классы;
  • убраны устаревшие SAPIs и расширения (sapi/aolserver, sapi/apache sapi/apache_hooks, sapi/apache2filter, sapi/caudium, sapi/continuity, sapi/isapi, sapi/milter, sapi/nsapi, sapi/phttpd, sapi/pi3web, sapi/roxen , sapi/thttpd, sapi/tux, sapi/webjames, ext/mssql и ext/sybase_ct);
  • остановка поддержки конструкторов в стиле PHP 4, в которых имя конструктора совпадает с именем класса;
  • создан метод Closure::call() ;
  • в добавок openssl есть поддержка TLS-расширения ALPN (Application-Layer Protocol Negotiation) для согласования протоколов уровня приложений, которые используются для обеспечения защищённого соединения. Применяется в SPDY и HTTP/2;
  • оператор объединения с NULL ?? ;
  • обеспечение группировки определений в операторе use (к примеру, use DoctrineCommonCollectionsExpr{ Comparison, Value, CompositeExpression };) и многое другое.

Скачать и более детально ознакомиться со всеми преимуществами новой версии PHP можно на официальной странице , так же там можно скачать руководство по миграции. Новый релиз – не просто очередная версия языка PHP , а начало развития нового пути в языках программирования. Для ее запуска понадобилось два года усердных разработок, который и помогли создать усовершенствованный продукт.

Если Вы ищете надежный 7-ой версии, обращайтесь к нам в компанию Hyper Host наши серверы виртуального хостинга поддерживают PHP 7. Надеемся, новые возможности придутся вам по вкусу. Мы, в свою очередь, будем рады помочь!

7435 раз(а) 1 Сегодня просмотрено раз(а)

Наконец, в свет вышла PHP 7.1, новая минорная версия PHP, которая включает в себя ряд новых функций, изменений и исправления ошибок. В настоящей статье мы рассмотрим некоторые новые замечательные функции PHP 7.1, а именно:

  • Итерируемый псевдотип
  • Замыкания через функции обратного вызова
  • Синтаксис с квадратными скобками для списка ()
  • Поддержка ключей в списке
  • Видимость констант класса
  • Типы, допускающие значение null
  • Функции типа void
  • Захват исключений разных типов
  • Исключение «Слишком мало аргументов»

Для вашего удобства по ходу статьи я также буду ссылаться на соответствующие RFC.

Перед тем как мы начнем: А вы хотели бы попробовать PHP 7.1, не устраивая бардак с вашей текущей средой программирования? Тогда Docker – это ваш лучший друг! PHP 7.1 можно запросто настроить при помощи Docker, используя одно из этих образов .

Чтобы запустить контейнер 7.1:

Docker run -v /Users/apple/Workplace/php/:/php -it php:7.1-rc bash

Это позволит загрузить (если на вашем локальном устройстве уже не сохранены подобные файлы) образы Docker для php:7.1-rc , после чего запустите контейнер и зайдите в него, используя всплывающие подсказки. Перенесите карты опций -v /Users/apple/Workplace/php/:/php из директории /Users/apple/Workplace/php центрального компьютера в директорию /php внутри контейнера Docker. Таким образом, все файлы внутри /Users/apple/Workplace/php будут доступны в директории контейнера /php .
Теперь заходим в директорию /php .

Супер! Теперь мы готовы опробовать новые функции PHP 7.1.

1. Итерируемый псевдотип

Предположим, у нас есть функция getUserNames , которая принимает перечень пользователей и возвращает их имена в виде списка.

Function getUserNames($users) { return nikic\map(function($user){ return $user->name; } , $users); }

Параметр $users может быть представлен массивом или объектом с реализацией функции Traversable . До выхода PHP 7 было невозможно задать для данной функции какие-либо подсказки относительно типа, поскольку не существовало общего типа, который одновременно соответствовал бы и массиву и объекту Traversable .

Для решения данной проблемы в PHP 7.1 был реализован новый псевдотип iterable , который мы можем использовать для того, что задать значения типа для всего, что может быть итерировано с использованием foreach .

Function getUserNames(iterable $users): iterable { return nikic\map(function($user){ return $user->name; } , $users); }

Теперь данная функция может принимать массивы, итерируемые объекты и генераторы.

2. Замыкания через функции обратного вызова

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

Class MyClass { public function getCallback() { return Closure::fromCallable([$this, "callback"]); } public function callback($value) { echo $value . PHP_EOL; } } $callback = (new MyClass)->getCallback(); $callback("Hello World");

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

Улучшенный механизм исправления ошибок – При работе с Closure::fromCallable ошибки отображаются в нужном месте, а не там, где мы используем вызываемую функцию. Это значительно упрощает процесс исправления багов.

Перенос объемов – Пример выше будет нормально работать, даже если callback – это частный/защищенный (private/protected) метод MyClass .

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

3. Синтаксис с квадратными скобками для списка ()

Синтаксис коротких массивов был одной из потрясающих функций, добавленных в PHP 5.4, что сделало работу с массивами намного проще и удобнее. Теперь синтаксис краткого перечня позволяет нам использовать квадратные скобки вместо list() для присвоения массиву переменных.

//prior to php 7.1 list($firstName, $lastName) = ["John", "Doe"]; // php 7.1 [$firstName, $lastName] = ["John", "Doe"];

4. Поддержка ключей в списке

До выхода PHP7 функция list() поддерживала только проиндексированные числами массивы, индекс которых начинается с нуля. Мы не могли использовать данную функцию с ассоциативными массивами.

Теперь новый функционал позволяет нам указывать ключи при деструктуризации массивов.

$user = [ "first_name" => "John", "last_name" => "Doe"]; ["first_name" => $firstName, "last_name" => $lastName]= $user;

В качестве интересного побочного эффекта теперь мы можем присваивать только необходимые ключи из массива.

["last_name" => $lastName] = $user;

Также можно деструктурировать многомерные массивы, используя списки внутри списка.

$users = [ ["name" => "John Doe", "age" => 29], ["name" => "Sam", "age" => 36] ]; [["name" => $name1, "age" => $age1],["name" => $name2, "age" => $age2]] = $users;

5. Видимость констант класса

Константы класса помогают нам задать значимое имя для значения, которое используется в данном классе. Эти константы всегда были публичными, и доступ к ним можно было получить из внешнего класса. Но ведь мы далеко не всегда хотим выставлять их на обозрение внешнему миру, не так ли?
В версии PHP7.1 мы можем приписать константам класса модификаторы видимости точно так же, как мы делаем с методами и свойствами.

Class PostValidator { protected const MAX_LENGTH = 100; public function validateTitle($title) { if(strlen($title) > self::MAX_LENGTH) { throw new \Exception("Title is too long"); } return true; } }

Здесь константа MAX_LENGHT является внутренней константой класса PostValidator , и мы не хотим, чтобы это значение было доступно для внешнего мира.

6. Типы, допускающие значение null

Этот функционал позволяет нам задать подсказки относительно типа функции, позволяя при этом использовать значения null в качестве параметра или возврата. Мы можем задать параметру или результату тип Null , поставив знак вопроса (?) перед подсказкой типа.

Function sayHello(?string $name) { echo "Hello " . $name . PHP_EOL; } sayHello(null); // Hello sayHello("John"); //Hello John

Точно также это работает и для возврата.

Class Cookie { protected $jar; public function get(string $key) : ?string { if(isset($this->jar[$key])) { return $this->jar[$key]; } return null; } }

7. Функции типа void

Начиная с версии PHP 7, мы можем задавать тип значения, которое функция должна возвращать на выходе. Иногда бывают случаи, когда необходимо указать, что функция не должна возвращать никакого значения вообще.

Class Cookie { protected $jar; public function set(string $key, $value) : void { $this->jar[$key] = $value; } }

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

8. Захват исключений разных типов

При работе с исключениями иногда нам может потребоваться обрабатывать несколько исключений одним и тем же способом. Обычно для работы с разными типами исключений нам пришлось бы создать несколько отдельных блоков захвата.

Try { // somthing } catch(MissingParameterException $e) { throw new \InvalidArgumentException($e->getMessage()); } catch(IllegalOptionException $e) { throw new \InvalidArgumentException($e->getMessage()); }

В версии PHP 7.1 мы можем работать с множественными исключениями в рамках одного общего блока захвата.

Try { // something } catch (MissingParameterException | IllegalOptionException $e) { throw new \InvalidArgumentException($e->getMessage()); }

Множественные исключения разделяются при помощи одного символа конвейеризации. Это позволит избежать дублирования одного и того же кода для работы с различными типами исключений.

9. Исключение «Слишком мало аргументов»

Как и в PHP 7, мы можем вызвать функцию с меньшим количеством аргументов, чем фактически требуется. В таком случае среда только выдаст предупреждение об отсутствующих аргументах, но продолжит выполнение функции. Иногда это может привести к странному или неожиданному поведению функции.

В версии PHP 7.1 вызов функции без необходимых параметров приведет к срабатыванию исключения ошибки ArgumentCountError .

Function sayHello($name) { echo "Hello " . $name; } sayHello(); // Fatal error: Uncaught ArgumentCountError: Too few arguments to function sayHello(), 0 passed in...

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

Итоги

В рамках данной статьи мы обсудили некоторые важные функции, добавленные в версию PHP 7.1. Для того чтобы узнать больше о новых функциях и изменениях PHP 7.1, рекомендуем ознакомиться с официальным руководством по переходу с более ранних версий. Я пропустил какую-нибудь важную функцию? Напишите в комментариях ниже:)

Стоит ли переходить на новую версию PHP 7.0 ? – Однозначно стоит, даже не думайте - переходите!

В седьмой версии достаточно много нововведений. Основные из них:

  • в основе ядра PHP 7 используется PHPNG . Новое ядро дает прирост производительности сайтам от 40%;
  • type Hints и возвращаемые значения . Теперь при объявлении функции для каждой переменной можно указывать свой тип, а также тип данных, который вернет функция. Доступные типы: int , float , string и bool ;
  • комбинированный оператор сравнения и многое другое.

В PHP 7 были удалены некоторые расширения:

  • mysql

Уже в PHP 5.6.x использование этих расширений было нежелательным. Вместо «mysql» следует использовать «PDO», а вместо ereg → preg .

Более детально ознакомиться с новинками PHP 7 можно на официальной странице

Стоит ли переходить на PHP 7?

На данный момент самое простое, что вы можете сделать для увеличения производительности сайта, это перейти на PHP 7.0.x. Прирост скорости также зависит от того, как написан ваш проект. Если вы еще сомневаетесь, покажем некоторые сравнения:

Бенчмарки PHP 5.6 vs PHP 7 для нектоторых фреймфорков (Zend framework, Magento, Drupal, Mediawiki, WordPress, Laravel, SugarCRM и др):

По всем фреймворкам прирост производительности значительный. Давайте посмотрим, как обстоит дело с функциями и конструкциями ядра:

Бенчмарки PHP 5.6 vs PHP 7 для функций и конструкций ядра:

Если графики вас убедили, можно попробовать перенести свой сайт на новую версию PHP и ощутить прирост на реальном проекте.

Коллеги с Elasticweb рассказали, что перед запуском нового сервера с PHP 7 они запустили на нем крупный государственный проект, работающий на Laravel 5. Это был своеобразный тест производительности новой версии PHP и сервера в целом. Ранее этот проект был на сервере с PHP 5.6. После переноса сайта страницы начали открываться значительно быстрее, при этом использование ресурсов сократилось вдвое.

Для подготовки переезда на PHP 7 они использовали PHP 7 Migration Assistant Report (MAR) . Большинство популярных CMS/Framework уже обладают совместимостью с PHP 7, поэтому основная задача сводилась к тестированию custom плагинов.

WordPress 4, Drupal 8/7 и последняя версия Joomla уже готовы к PHP 7!

Ожидается, что PHP 7.3 выйдет осенью 2018 года. Однако, подготовительная работа над новой версией языка идет уже сейчас. Все обсуждения командой разработчиков ядра PHP ведутся на открытых площадках, поэтому, информация о предполагаемых нововведениях в PHP 7.3 доступна любому желающему. Так вот, на данный момент в нововведениях PHP 7.3 значатся:

  • Более гибкий синтаксис записи heredoc и nowdoc строк;
  • Получение возможности использования запятой, как завершающего символа в вызовах методов и функций;
  • Исключения при выполнении json_encode() и json_decode() ;
  • Использование ссылочных переменных в функции list() ;
  • Введение функции is_countable() .

Пройдемся по списку выше более подробно.

Более гибкий синтаксис записи heredoc и nowdoc строк

Данный способ объявления особенно удобен, когда приходится работать со строками, расположенными на нескольких строчках. Сейчас данный синтаксис имеет особо строгие требования к окончанию объявления строк таким способом. Рассмотрим строку:

$foo = <<

В ней последний идентификатор IDENTIFIER должен быть первой последовательностью символов на новой строке, также после этого идентификатора не должно располагаться каких-либо других символов, за исключением пробелов и табуляции.

С выходом PHP 7.3 требования к использованию синтаксиса heredoc и nowdoc несколько смягчатся. А именно:

  • Завершающий объявление строки идентификатор не обязательно должен являться первой последовательность символов на новой строке;
  • Завершающему объявлению строки идентификатору могут предшествовать символы пробела, либо табуляции(но не пробелы и табуляция совместно);
  • Все пробелы и табуляция, предшествующие завершающему объявлению строки будут вырезаны из объявляемой строки;
  • После завершающего идентификатора на текущей строке могут использоваться другие выражения языка.

Таким образом, следующий код не вызовет никаких ошибок:

$foo = ["foo", "bar", <<

Выведется:

Array(5) { => string(3) "foo" => string(3) "bar" => string(29) "baz - hello world! -- ahoy" => string(3) "qux" => string(4) "quux" }

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

Данное нововведения является логическим продолжением уже используемой возможности оставлять необязательные запятые при объявлении массива или используемого пространства имен:

# Currently possible use Foo\Bar\{ Foo, Bar, }; $foo = [ "foo", "bar", ];

Единственный случай, когда такая мелочь является хоть сколько-нибудь полезной - при отображении изменений в системах контроля версий (например, git) не отображается лишняя строка, как если бы пришлось добавлять оконечную запятую. Таким образом, с PHP 7.3 станет доступным следующий синтаксис:

Unset($foo, $bar, $baz,); class Foo { public function __construct(...$args) { // } public function bar(...$args) { // } public function __invoke(...$args) { // } } $foo = new Foo("constructor", "bar",); $foo->bar("method", "bar",); $foo("invoke", "bar",);

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

# Parse error function bar($a, $b,) { // }

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

RFC

Исключения при выполнении json_encode и json_decode

Предлагается ввести новую опцию JSON_THROW_ON_ERROR , которую можно передавать в функции json_encode() и json_decode() с целью их изменения поведения. На данный момент, включая PHP 7.2 если при выполнении указанных функций возникнет ошибка, то вернется false в качестве результата. Это является отличным местом для багов, поскольку не каждый разработчик анализирует ответ на наличие false , надеясь получить валидный результат. С выходом же PHP 7.3 код, обрабатывающий json, может заключаться в стандартные блоки try-catch для отлова исключений \JsonException:

Try { json_decode("{", false, 512, JSON_THROW_ON_ERROR); } catch (\JsonException $exception) { echo $exception->getMessage(); // echoes "Syntax error" }

Как по мне, данное нововведение снимет одно из самых неприятных поведений PHP, которое даже было описано в нашумевшей статье PHP: фрактал плохого дизайна. В общем, категорически приветствую данное нововведение.

RFC

Использование ссылочных переменных в функции list()

Функция list() используется для быстрого присваивания переменным значений массива. До настоящего момента, включая PHP 7.2, нет возможности присваивать переменным значения массива по ссылке. В текущих версиях PHP следующий код будет приводить к Fatal Error:

$arr = ["apple", "orange"]; list($a, &$b) = $arr; $b = "banana"; echo $arr; // Fatal error: and list() assignments cannot be by reference in .. on line ..

Напротив, с использованием PHP 7.3 такой код сработает, и из переменной $arr на экран выведется ‘banana’.

RFC

Введение функции is_countable()

В PHP 7.2 объявлено устаревшими много функций, а также вариантов использования кода. Так, при передаче функции count() переменной, не являющейся countable, PHP показывал предупреждение. Чтобы исключить показ данного предупреждения, необходимо, чтобы переменная, передаваемая в функцию count() , либо являлась массивом, либо реализовывала интерфейс \Countable:

If (is_array($foo) || $foo instanceof Countable) { // $foo is countable }

Чтобы постоянно не копипастить эти два условия, предлагается ввести функцию is_countable() , которая сочетает эти условия в себе. Код выше в PHP 7.3 может выглядеть так:

If (is_countable($foo)) { // $foo is countable }