Блеск и нищета php. Эволюция языка от 4.x к 7.1

image


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


Давайте мысленно вернемся во времена php4, когда получили своё развитие wordpress, bitrix и миллионы других CMS и домашних страничек.


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


Каждый второй сайт работал с включенными галочками magic quotes. Т.е. все переменные, которые прилетали от браузера магически экранировались. Что якобы позволяло их безопасно вставлять в базу данных. На деле же универсальным CMS приходилось это дело чистить (или оставлять как есть, в зависимости от настроек в php.ini). В общем мрак. Но для новичка якобы было «удобно»: вставлять всё, что прилетело в базу и не париться.


Соответственно, порог входа был крайне низким, достаточно было выучить функцию mysql_query и htmlspecialchars. Это привело к тому, что сайты на php стали делать абсолютно все: чуть ли не каждый второй студент был членом «веб-студии».


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


Но потом появился php5


php 5.0 (2004 год)

Эта версия языка сделала огромный рывок в ООП. Появились модификаторы доступа (public, protected, private). Выделились статические методы (static). Появились интерфейсы. Деструкторы. Reflection API. Работа с исключениями. Магические методы __get и __set. Итераторы. ArrayAccess (чтобы можно было сделать объект, имитирующий массив). И многое-многое другое. По большому счету парни взяли, и многое скопировали из java, включая даже названия ключевых слов (extends, implements, try, catch и т.д.). Т.е. получилась динамически типизированная джава. Правда без неймспейсов.
Насчет типизации тоже был сделан шаг вперед, а именно type hinting. Т.е. в аргументах методов стало можно указать имя класса (или интерфейса), таким образом стал проверяться тип (хоть где-то!).
Появилось расширение SPL (набор интерфейсов и классов для решения стандартных задач).


После релиза у многих разработчиков случился форменный разрыв шаблонов, так как люди внезапно стали резко разделяться на два лагеря: те, кто умеют ООП и те, кто не умеют ООП и костылируют старые вордпрессы. Понятно, что многие и раньше (еще на php4) пытались работать с тем ООП что было, но тот велосипед с квадратными колесами не позволял по-настоящему развернуться.


Также в php5 раза в два выросла скорость. Короче, php5 — это был тупо отдельный новый язык.


php 5.1 и 5.2 (2006–2009 годы)

5.1 и 5.2 не принесли много изменений в сам язык, их было всего парочка: магические методы __isset и __unset (в дополнение к __get и __set).
К type hinting добавился еще и array. Т.е. еще один шаг к чуть более статической типизации. Хочу заметить, что с каждым релизом, похоже, идет попытка избавиться от магии.
Добавился встроенный интерфейс Serializable.
Некоторые улучшения в SPL и Reflection


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


Очень важной фичей было включение PDO по-умолчанию. Всё меньше и меньше людей используют mysql_query и SQL-инъекции в них.


php 5.3 (2009 год)

А вот версия 5.3 стала очередным прорывом в языке.
Самое главное — появились неймспейсы (аналог package в java). Это дало большой толчок к развитию различных библиотек и фреймворков. Через пару лет после релиза начал зарождаться менеджер зависимостей composer.


Появились лямбды и замыкания. К примеру, в java лямбды появились на 5 лет позже.
(а в c# они к тому времени уже 5 лет как были)


Появился оператор goto


Сокращенный тернарный оператор ?:


Появился оператор static для позднего статического связывания и магический метод __callStatic


php-fpm включен в ядро


php 5.4 (2012 год)

Здесь наконец-то полностью выпилены магические кавычки и register_globals. Т.е. с какой-то версии они были deprecated, а начиная с 5.4 их наконец-то грохнули. Кстати, интересный факт: на одной конференции Расмус Лердорф (создатель php) сказал, что голосовал против выпиливания magic_quotes, что на мой взгляд очень странно. Мне казалось, что все уже давно наелись этой магией по горло.


Также в этой версии было еще очень важное изменение: появились примеси (traits).


Добавлена короткая запись массивов, т.е. вместо Array(1,2,3) стало можно писать [1,2,3]


Также можно отметить появление разыменования массивов


foo()[0]

и возможность сделать так:


(new foo)->bar()

В type hint стало возможно исползьовать callable


php 5.5 (2013 год)

В 5.5 появились генераторы и ключевое слово «finally».


А также рызыменование литералов массива и строки:


echo [1, 2, 3][0];
echo 'PHP'[0];

Оператор ::class для получения имени класса вместе с неймспейсом.


php 5.6 (2014 год)

Стало можно использовать выражения в константах.
Добавилась возможность делать функции с переменным количеством аргументов (...$params) и развертывание аргументов c помощью оператора ...


php 6 (никогда)

php 6 так и не вышел. Главный challenge этой версии был в поддержке UTF на уровне ядра (был выбран UTF-16). Но там оказалось столько работы, что после длительной разработки в итоге от идеи отказались. Как утверждают разработчики, если бы выбрали UTF-8, все было бы гораздо легче и был бы какой-то результат. Уж не знаю почему.


php 7 (2015 год)

Седьмая версия стала очередным прорывом в языке, сопоставимая с 5.0 и 5.3. Во первых, всё стало быстрее работать раза в два-три.
Во-вторых, в тайпхинтинг стало возможным использовать скалярные типы: int, string и т.д. А также задавать тип возвращаенмого значения метода. Причем, если в начале файла указать


declare(strict_types=1)

то на попытку передачи float в аргумент, требующий int, будет выдан Fatal Error.


По сути это дает возможность писать на php почти что как на строго типизированном языке.


Добавлены операторы ?? и <=>


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


php 7.1 (сегодня)

Типы аргументов и возвращаемых значений можно пометить как nullable с помощью оператора?
например ?string


тип возвращаемого значения void. Т.е. если в таком методе будет return, то это вызовет fatal error


Замена list на []
т.е. будет возможна запись


[$a, $b] = [$b, $a];

У констант класса появилась видимость (public, protected, private)


Обработка нескольких исключений сразу (как в java)


catch (FirstException | SecondException $e)  

Отрицательные смещения для строк "abcdef"[-2]


Асинхронная обработка сигналов pcntl_async_signals()


Полный список php7.1 уже доступен в мануале: https://secure.php.net/manual/ru/migration71.php


Что мы имеем в итоге?

В итоге мы имеем хороший язык для веба, у которого есть всё: фреймворки (Symfony, Yii и т.д), менеджер зависимостей и т.д. Но порог входа теперь совсем другой. Т.е. человек, который пишет на современном php, должен как минимум знать кучу ООП best practices, использовать фреймворки и composer, знать кучу фич языка и его расширений.


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


В итоге работодатели ожидают дешевую рабочую силу (это ж «похапе», там дешевые программисты), а на деле при найме выходит, что для решения современных задач нужны современные программисты, а их сильно не хватает.


Вообще, хотелось бы обсудить перспективы php на будущее. Какие у языка есть киллер-фичи?


Т.е. после внедрения в язык кучи языковых конструкций, он стал не очень привлекательным для новичков (мне кажется, новичок скорее выберет go из-за простоты). Но при всём своём развитии (которое я очень сильно приветствую), php не дотягивает до языков кровавого энтерпрайза, таких как C# или та же java. Потому что типизация все же не совсем строгая, нормальной многопоточности считай нет, и всё еще есть костыли разных видов. Также нет дженериков, человеческой поддержки utf. Массив в php — это странная смесь массива и HashMap и т.д. Т.е. если в энтерпрайзной нише уже есть java/c#, то зачем там нужен php, который слегка не дотягивает?


Как вы думаете, есть ли своя ниша у php, и в чем она заключается? Я не для того, чтобы потроллить, мне правда очень интересно.

Комментарии (14)

  • 1 декабря 2016 в 07:37

    –4

    Как вы думаете, есть ли своя ниша у php, и в чем она заключается?

    На мой взгляд везде, где не требуется GUI без браузера, и не слишком критична скорость выполнения.
  • 1 декабря 2016 в 08:12

    +1

    Я хочу чтобы в мейнстриме появился нормальный компилируемый язык со статической типизацией для веб-разработки. Да, конечно что-то есть, можно хоть на си писать сайты…, но это не распространено. А распространены именно динамически типизированные языки php, python, ruby и js. Интересно почему?

    Об уровне — это чистая правда. Я не веб-разработчик, но когда в старые времена для каких-то целей нужно было создать сайтик (по сути простой веб-интерфейс для доступа к БД в локалке), я это сделал на «php4» вообще не задумываясь — настолько все было просто.
    Что там творится теперь — мне непонятно. Уровень абстракции очень сильно вырос, количество абстрактных прослоек выросло, и это привело к тому что я «не чувствую» ни сложности алгоритмов, ни низкоуровневой структуры программы. То есть современные фреймворки работают, но их работа превратилась в некую магию, для полного понимания которой нужно, вероятно, глубоко изучить внутреннюю структуру фреймворков на самом низком уровне. Все ли к этому готовы?
    Все руководства по фреймвокам сводятся к написанию «hello-world» сайтов практически без объяснения внутренней работы самого фреймворка. Я после безуспешных поисков такого глубокого руководства пытаюсь сам разобраться понемногу в свободное время, может статью напишу:)

    • 1 декабря 2016 в 08:20

      0

      Посмотрите на .Net Core
    • 1 декабря 2016 в 08:24

      +1

      Все руководства по фреймвокам сводятся к написанию «hello-world» сайтов практически без объяснения внутренней работы самого фреймворка.

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

      Ну естественно вырос, сейчас требуется не просто отображение каких-то статичных данных, и чтобы нормально въехать во все возможности фреймворка, нужно потратить такое же количество времени, как на изучение какого-то десктоп фреймворка.
    • 1 декабря 2016 в 09:04

      +1

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

      Java, C#, PHP (PHP не компилируемый, но тайпхинтинг — тоже вариант статической типизации).
      Эти три языка чаще всего и используют на длительных веб-проектах.
      Все ли к этому готовы?

      Кто не готов, может клепать в старом стиле и получать зарплату немногим выше, чем настройщики вордпрессов.
      На таких новичков спрос всегда будет.
      Просто язык повзрослел, и стали популярны технологии, требующие навыков профессионального программиста.
  • 1 декабря 2016 в 08:18

    +1

    Слой REST/JSON-сервисов в web-приложениях, если удастся вывести PHP из сферы действия Apache/Nginx и поднимать как standalone сервер (типа ExpressJS, Tomcat/java, WSGI/python). Ну или в рамках Apache/Nginx запускать PHP-приложения со стадиями инициализации приложения, обработки запросов, завершения приложения (типа servlet’ов). Делать вот это все на каждый GET/POST запрос с web’а — весьма расточительно, не говоря уже о сборке HTML’а на стороне сервера. В web-разработке позиции PHP весьма сильны, но с фронта всех теснит JS — остается back.

    • 1 декабря 2016 в 09:46

      0

      есть php-pm
  • 1 декабря 2016 в 08:36

    0

    Я сначала сидел на php потом зачем то, пересел на rails, а потом снова вернулся на php + Yii. Сейчас мне очень нравиться PHP + Yii, а RubyOnRails вспоминать не хочется.
    • 1 декабря 2016 в 08:47

      0

      На php очень дешёвая инфраструктура, легко поддерживать проекты на Yii (мне кажется, что именно благодаря рельсам на php появилось столько замечательных фреймворков), при этом на php 7 + Yii порог входа все же сильно ниже .Net
      • 1 декабря 2016 в 08:53

        0

        Да, Yii точно был создан по мотивам рельсов
      • 1 декабря 2016 в 09:26

        0

        Yii — отличен, и про порог входа верно сказано. Я, не имея никакого практического опыта веб-разработки быстро въехал, и даже начал что-то делать. Но надо сказать, что у Yii, все же, неплохая документация, хотя есть и сложные (для не профессионала, по крайней мере) моменты, этого не отнять
  • 1 декабря 2016 в 09:27

    +1

    ИМХО, пока в PHP можно писать как хочешь (не используя ООП и кучу других печенек), то поток «вечных новичков» в PHP не уменьшится. Но есть вопрос: ведьPython тоже не сложный, так почему там такого нет?
    • 1 декабря 2016 в 09:46

      0

      Потому что на нём сложнее написать Hello World и мгновенно получить положительную эмоцию от того, что всё завелось. Порог входа в PHP действительно самый низкий из всех платформ на рынке. Можно просто положить файлик из одной строчки на копеечный хостинг и всё заработает само собой.

      В тот же .NET, например, порог входа с точки зрения написания кода не особо выше, но всё равно зачастую новички могут не сразу врубиться, что и куда надо положить, чтобы страничка открылась.

  • 1 декабря 2016 в 09:39 (комментарий был изменён)

    0

    Именно из-за того, что порог входа был низкий, а теперь надо сильно перестраиваться.

    Скорее из-за банальной лени. Кто хочет идти вперед, тот не стоит на месте. Наблюдается та же самая песня в мире 1С при переходе от использования обычных к управляемым формам. Кому-то удобнее сидеть в теплом и обжитом болоте, а кто-то перестраивает себя и свое окружение.

© Habrahabr.ru