Шкарбатов Дмитрий

Руководитель департамента

разработки кассовых продуктов

История PHP

PHP/FI

В 1995 году датский программист Расмус Лердорф создал набор скриптов на Perl/CGI для вывода и учёта посетителей его онлайн-резюме. Лердорф назвал набор Personal Home Page (Личная Домашняя Страница).

Вскоре функциональности и быстроты Perl — интерпретатора скриптов — перестало хватать, и Лердорф разработал с использованием языка C новый интерпретатор шаблонов PHP/FI (Personal Home Page / Forms Interpreter).

В 1997 году после длительного бета-тестирования вышла вторая версия обработчика, написанного на C — PHP/FI 2.0. Её использовали около 1 % (приблизительно 50 тысяч) всех интернет-доменов мира.

PHP3

В 1997 году два израильских программиста, Энди Гутманс и Зеев Сураски, полностью переписали код интерпретатора. PHP/FI 2.0 был сочтён ими непригодным для разработки приложения электронной коммерции, над которым они в то время работали. Для совместной работы над PHP 3.0 с помощью базы разработчиков PHP/FI 2.0 Энди, Расмус и Зеев решили объединиться и объявить PHP 3.0 официальным преемником PHP/FI, разработка же PHP/FI была практически полностью прекращена. После 9 месяцев публичного тестирования, PHP 3.0 был официально выпущен в июне 1998 года.

К концу 1998 года PHP использовался десятками тысяч пользователей. Сотни тысяч веб-сайтов сообщали об использовании языка программирования PHP. В то время PHP 3.0 был установлен приблизительно на 10 % веб-серверов Интернета.

PHP4

К зиме 1998 года, Энди Гутманс и Зеев Сураски начали переработку ядра PHP. В задачи входило увеличение производительности сложных приложений и улучшение модульности базиса кода PHP. Расширения дали PHP 3.0 возможность успешно работать с набором баз данных и поддерживать большое количество различных API и протоколов, но PHP 3.0 не имел качественной поддержки модулей и приложения работали неэффективно.

Новый движок, названный Zend Engine (от имён создателей, Зива и Энди, также основателей Zend Technologies), успешно справлялся с поставленными задачами и впервые был представлен в середине 1999 года. PHP 4.0, основанный на этом движке и принёсший с собой набор дополнительных функций, официально вышел в мае 2000 года. В дополнение к улучшению производительности, PHP 4.0 имел ещё несколько ключевых нововведений, таких как поддержка сессий, буферизация вывода, более безопасные способы обработки вводимой пользователем информации и несколько новых языковых конструкций.

PHP5

Пятая версия PHP была выпущена разработчиками 13 июля 2004 года. Изменения включают обновление ядра Zend. Введена поддержка языка разметки XML. Полностью переработаны функции ООП, которые стали во многом схожи с моделью, используемой в Java. В частности, введён деструктор, открытые, закрытые и защищённые члены и методы, окончательные члены и методы, интерфейсы и клонирование объектов. Нововведения, однако, были сделаны с расчётом сохранить наибольшую совместимость с кодом на предыдущих версиях языка. На данный момент последней стабильной веткой является PHP 5.6, которая содержит ряд изменений и дополнений:

Увеличена скорость работы, примерно на 10-20%
Введено пространство имён
Позднее статическое связывание и специальный метод __callStatic()
Лямбда-функции и замыкания
Добавление расширений: intl, phar, fileinfo и sqlite3
Опциональный сборщик мусора
и другое.

PHP6

Шестая версия PHP находилась в стадии разработки с октября 2006 года. В ней уже были сделаны множество нововведений, как, например, исключение из ядра регулярных выражений POSIX и «длинных» суперглобальных массивов, удаление директив safe_mode, magic_quotes_gpc и register_globals из конфигурационного файла php.ini. Основные усилия были сосредоточены на поддержке Юникода.

Постойте, а где же PHP 6?

Поддержка юникода на уровне ядра

2005-2010

Этим в принципе все сказано

Каждый мажорный релиз PHP добавляет ряд новых возможностей, некоторые из которых действительно имеют значение. Для PHP 5.3 — это были пространства имен и анонимные функции. Для PHP 5.4 — трейты. Для PHP 5.5 — генераторы. Для 5.6 — списки аргументов переменной длины.

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

PHP5.6 vs HHVM3.7 vs PHP7

PHP5.6 vs HHVM3.7 vs PHP7

PHP5.6 vs HHVM3.7 vs PHP7

PHP5.6 vs HHVM3.7 vs PHP7

Да, да, да PHP7 быстрее!

Синтаксический сахар в PHP 7

Синтаксический сахар — это такие конструкции языка программирования, которые совершенно не нужны компилятору.Синтаксический сахар нужен программисту для чтения и понимания программ.

Примеры синтаксического сахара: точка с запятой; «THEN» после «IF»; «DO» перед «WHILE».

Группировка объявлений импорта

use Framework\Module\Foo;
use Framework\Module\Bar;
use Framework\Module\Baz;


// В PHP 7 можно написать:
use Framework\Module\{Foo, Bar, Baz};


// Или же, если вы предпочитаете многострочный стиль:
use Framework\Module{
    Foo,
    Bar,
    Baz
};

Null-коалесцентный оператор

// До PHP 7:
if (isset($foo)) {
    $bar = $foo;
} else {
    $bar = 'default'; // присваиваем $bar значение 'default' если $foo равен NULL
}


// В PHP 7:
$bar = $foo ?? 'default';


// Можно использовать с цепочкой переменных:
$bar = $foo ?? $baz ?? 'default';

Оператор “космический корабль”

Оператор “космический корабль” <=> позволяет проводить трехуровневое сравнение
двух значений, позволяя понимать не только их равенство или неравенство, но и то,
которое из них больше при неравенстве, возвращая 1,0 или -1.

В этом случае мы можем предпринимать различные действия в зависимости от того,
как различаются значения:

switch ($bar <=> $foo) {
    case 0:
        echo '$bar и $foo равны';
    case -1:
        echo '$foo больше';
    case 1:
        echo '$bar больше';
}

Новое в PHP 7

Типы скалярных параметров и подсказки по возвращаемым типам

В PHP 7 расширили ранее существовавшее объявление параметров в методах (классах,
интерфейсах и массивах) путем добавления четырех скалярных типов — целого (int),
с плавающей запятой (float), логического (bool) и строкового (string) в качестве
возможного типа параметра.

Кроме того, опционально мы можем указать тип результата, возвращаемого функцией
или методом. Поддерживаются типы bool, int, float, string, array, callable,
имя класса или интерфейса и parent (для методов класса).

class Calculator
{
    // объявляем, что параметры имеют целый тип integer
    public function addTwoInts(int $x, int $y): int { 
        // явно объявляем, что метод возвращает целое
        return $x + $y;
    }
}

Если мы передаем значение “3” в функцию, имеющую объявленный параметр типа int,
интерпретатор будет рассматривать его как целое и не сгенерирует ошибку. Если
вас не устраивает такое поведение, вы можете работать в строгом режиме —
strict mode — путем добавки соответствующей директивы.

declare(strict_types=1);

Исключения движка

// До PHP 7 такой код привел бы к фатальной ошибке исполнения скрипта:
try {
    thisFunctionDoesNotEvenExist(); // Функция не существует

} catch (\EngineException $e) {
    // Подчищаем за собой и записываем информацию об ошибке в лог
    echo $e->getMessage();
}

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

Анонимные классы

// До PHP 7:
class MyLogger {

  public function log($msg) {
    print_r($msg . "\n");
  }
}

$pusher->setLogger( new MyLogger() );


// PHP7 Использование анонимного класса:
$pusher->setLogger(new class {

  public function log($msg) {
    print_r($msg . "\n");
  }
});

Функции CSPRNG


Две новых функции для генерации крипографически безопасной
строки и целых.

// Первая возвращает случайную строку длиной $len:
random_bytes(int $len);


// Вторая возвращает число в диапазоне $min… $max.
random_int(int $min, int $max);

Синтаксис Escape-кода для Unicode

В отличие от многих других языков, до PHP версии 7, в PHP не было способа указать в строке escape-последовательность для Unicode символа. Теперь с помощью escape-последовательности \u можно генерировать такие символы с помощью их кода из набора UTF-8.


echo "\u{1F602}"; // выводит смайлик 😂

Помните, что код, ранее работавший и использовавший пару символов \u, не будет корректно работать в версии 7 из-за изменившегося поведения.

Обновленные генераторы

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

function genA() {
    yield 2;
    yield 3;
    yield 4;
}

function genB() {
    yield 1;
    yield from genA(); // 'genA' вызывается и отрабатывает в этом месте
    yield 5;
    return 'success'; // финальный результат, который мы позже можем проверить
}

foreach (genB() as $val) {
    echo "\n $val"; // выдаст значения от 1 до 5
}

$genB()->getReturn(); // вернет 'success' при отсутствии ошибок

Ожидания (expectations) — улучшение функции assert() с сохранением обратной совместимости.


zend.assertions
     1: генерируем и выполняем код (режим разработки) (значение по умолчанию)
     0: генерирует код, но обходит его во время выполнения
    -1: не генерирует код, делая его кодом с нулевой стоимостью (режим рабочего кода)

assert.exception
     1: генерируется при ошибке утверждения путем создания соответствующего объекта
        исключения или же путем генерации объекта AssertionError, если такой объект
        не был создан
     0: использует или генерирует Throwable так, как было описано выше, но
        генерируется только предупреждение (warning) на базе того объекта, а
        не генерация исключения с его помощью (поведение, совместимое с PHP 5)

Ожидания (expectations)

Переход от PHP 5 к PHP 7

PHP 5 => PHP 7

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

 

Для старых приложений необходимо взвешенное решение — стоят ли потраченные усилия полученных возможностей или же лучше и вовсе не обновляться.


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

Старые SAPI и расширения

Были убраны старые и ненужные SAPI, такие как расширение mysql.

Полный список расширений и возможностей, которые были удалены, вы можете посмотреть здесь и здесь

Некорректные имена для классов, интерфейсов, трейтов

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

bool
int
float
string
null
true
false

Однообразный синтаксис описания переменных


                        // старый смысл           // новый смысл
$$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']()

Убраны тэги в старом стиле


<% ... %>, <%= ... %>, <script language="php"> ... </script>

Миграция на PHP 7.0.x

Совместимость программного обеспечения с PHP 7

Известные CMS типа WordPress, Joomla и Drupal уже добавили поддержку PHP 7. Основные фреймворки, такие как Symfony, Laravel, Yii тоже сделали это.

Однако пришло время предостережений. Эта поддержка не распространяется на код третьих лиц в виде дополнений, плагинов, пакетов и т.п., к чему обращается ваш CMS или фреймворк. Проблемы могут быть, и ваша задача заключается в том, чтобы убедиться — всё готово для работы под PHP 7.

Для активных, поддерживающихся репозиториев, это не должно быть проблемой. Но заброшенные репозитории без поддержки PHP 7 могут сделать всё ваше приложение непригодным к использованию.

Ubuntu 16.04 LTS

(Xenial Xerus)

default PHP package - PHP7

Зачем переходить на PHP7?

Badoo перешли на PHP7 и сэкономили $1M

Распределение времён ответа:

RUsage (CPU time):

Memory usage:

CPU load (%) на всём кластере:

Вопросы?

Немного статистики

Процентное соотношение офферов по популярным языкам программирования 

относительно работы на фриланс-бирже upwork.com

Всем спасибо

PHP7

By James Jason

PHP7

  • 894