- Язык программирования PHP. Почему мы пишем на PHP?
- Что за язык такой, PHP?
- Об интерпретируемости PHP
- О динамической типизации в PHP
- Но не всё так просто
- Между первой и седьмой промежуток небольшой
- HipHop для PHP. Прорыв в скорости
- Будет ли новая версия PHP?
- Для чего нужен PHP?
- Так стоит ли учить?
- Несколько слов о типизации в PHP
Язык программирования PHP. Почему мы пишем на PHP?
Языку программирования PHP уже давно предсказывали исчезновение. Но годы идут, а этот язык по-прежнему в топ-10 рейтинга TIOBE. Почему он так популярен и распространён? Об этом и поговорим.
Что за язык такой, PHP?
PHP: Hypertext Preprocessor («Инструменты для создания персональных веб-страниц», Personal Home Page Tools) до сих пор считается лидирующим в сфере современной веб-разработки. Его создал программист из Дании Расмус Лердорф, разработавший в 1994 г. набор скриптов на Perl — речь идёт о той самой «персональной домашней странице», ставшей впоследствии основой PHP.
Спустя какое-то время языком стали интересоваться разработчики со всего мира. Фактически, PHP является одним из старейших языков, если мы говорим об open source. Сегодня его поддерживают энтузиасты во главе с Zend Technologies. Таким образом, PHP активно развивается по сегодняшний день.
Об интерпретируемости PHP
Основная характеристика языка программирования PHP — его интерпретируемость. Тот же Java сначала компилируется, потом запускается в работу. Что касается PHP, то он создаётся в процессе обращения к нему. То есть пользователь открывает web-сайт, на сервер отправляется запрос, и в это самое время компилируется PHP-код. При этом каждый скрипт компилируется в режиме реального времени, а потом выполняется.
За счёт вышеописанного свойства PHP считается очень гибким языком. В том же Java разработчик вводит название класса лишь единожды, и оно не меняется. Язык PHP, в отличие от Java, компилируется в рантайме, поэтому есть возможность подставить, по сути, любое название класса из переменной.
Но за гибкость надо платить. В случае с PHP мы платим скоростью работы web-сайта.
О динамической типизации в PHP
Как известно, языки программирования бывают с динамической и статической типизацией. Во втором случае тип переменной определяется заранее и жёстко. Если это число, то int, если строка, то string. В первом случае переменная может являться одновременно и числом, и строкой, и объектом, и массивом — чем угодно. Мы можем присвоить одной переменной число, потом массив — язык программирования позволит нам так сделать. Именно таким и является PHP.
Но не всё так просто
У динамической типизации есть минусы, и заключаются они в том, что она снижает быстродействие и потребляет много оперативной памяти. Опять же, мы платим за гибкость и удобство. Впрочем, PHP-разработчики сейчас активно работают над тем, чтобы уменьшить потребление памяти, сохранив гибкость статически нетипизированного языка программирования.
Как бы там ни было, два вышеописанные свойства объясняют, почему PHP так популярен.
Между первой и седьмой промежуток небольшой
Версии PHP с первой по третью были, мягко говоря, «сырыми». Но хоть возможностей было и мало, для создания простых сайтов этого хватало. Впрочем, хватало и различных нюансов, поэтому работать с этим языком программирования было непросто. Но, начиная с версии 5.4, PHP превратился в отлаженную технологию.
Неплохо себя показали релизы 5.5 и 5.6. А вот шестую версию пропустили. Предполагалось, что она будет поддерживать Unicode на уровне ядра, однако релиз не состоялся. Один из разработчиков тогда сказал, что PHP 6 был весьма амбициозным, но довольно отстойным проектом. В результате занялись PHP 7. И не зря — эту версию считают революционной с точки зрения быстродействия. Та же PHP 5.6 довольно медленно работала с массивами, да и вообще с переменными. Собственно говоря, строка обрабатывалась в десятки раз медленнее, чем на C#. С одной стороны, речь идёт о долях секунды, поэтому проблема не бросается в глаза. С другой, если у тебя миллионы пользователей, это недопустимо. А ведь мы говорим про Facebook, между прочим.
HipHop для PHP. Прорыв в скорости
Как известно, Facebook был написан на PHP, поэтому проблему скорости нужно было решать. Решение было найдено — собственный интерпретатор языка. Разработчики компилировали его изначально в промежуточные коды, а потом отправляли в обычный интерпретатор Zend Engine. Таким образом, программисты из Facebook внедрили статическую типизацию, ускорив работу PHP в два раза. И это был прорыв на то время. Транслятор назвали HHVM — «HipHop для языка PHP».
Но команда PHP-разработчиков тоже не тратила времени даром. Она плотнее занялась массивами и со временем выпустила седьмую версию языка, работающую быстрее HHVM. Кстати, в PHP 7 по-прежнему практически отсутствует статическая типизация. Она есть лишь в параметрах функции, поэтому, можно считать, что её и нет. Далее язык продолжал ускорятся, улучшая показатели даже в пределах с 7.0 до 7.3.
Будет ли новая версия PHP?
Разработчики понимают, что надо сделать PHP быстрее, сохранив гибкость, а значит, придётся переходить к статической типизации. Пока рассматривается оптимальный вариант, предполагающий наличие оной в некоторых частях скрипта. Ориентировочная дата выхода PHP 8 — 2022 год, но может и раньше.
Кстати, на сегодняшний день проходит тестирование нововведений в PHP 8. Расмус Лердорф, создатель PHP, утверждает, что в PHP-мире ничего не случается без движения сообщества. Ту же статическую типизацию хотели внедрить ещё в версии номер 7, но нашлись изъяны, и она не прошла голосование. Также стоит добавить, что в 8-й версии хотят полностью отойти от языка C, на котором частично написан PHP. Кроме того, планируют ускорить работу с матрицами.
Для чего нужен PHP?
Как уже было сказано в начале статьи, — для веб-разработки. Только web и ничего кроме веба. Однако сегодня эта область просто безгранична, и даже десктопные приложения уходят в web — облачный сервис Microsoft Office тому пример.
Кроме того, когда-то считалось, что PHP не подойдёт для крупных и высоконагруженных проектов, но опыт Facebook доказал обратное. Ещё один пример удачной реализации — Авито».
Так стоит ли учить?
Несмотря на предсказания о скорой смерти, PHP до сих пор востребован. А за счёт низкого порога входа изучить его несложно. Те же C# и Java имеют более высокий порог вхождения. Впрочем, у низкого порога входа есть и минусы: сегодня на российском рынке труда PHP-разработчиков довольно много, и им платят так себе. Правда, это потому, что большинство из них имеют не очень высокий уровень.
Что касается действительно профессиональных PHP-разработчиков, то они, по сути, используют те же паттерны проектирования, что и в случае со статически типизированными языками. Даже бытует мнение, что на PHP сложнее программировать. В той же Java или C# допустить алгоритмическую ошибку и присвоить переменной не тот тип вы не сможете. А язык программирования PHP это пропустит, в результате чего программисту придётся поломать голову с вопросом, что же не так. Вроде бы и работает всё, но, увы, неправильно.
Именно поэтому настоящие эксперты PHP-разработки получают не намного меньше, чем программисты, владеющие другими языками. Только вот найти действительно хорошего специалиста — это сегодня проблема.
Как бы там ни было, начать изучать PHP — это лучше, чем не начать изучать ничего. К тому же, в сети есть множество неплохих курсов, уроков и лекций. Пройдя их, можно подумать и о переходе на более высокий уровень мастерства. А вот здесь помогут платные курсы для продвинутых разработчиков:
Несколько слов о типизации в PHP
Теги: php, clang, типизация, dynamic typing, static typing, compile-time, run-time, integer, strong typing, weak typing, _zval_struct, zvalue_value, zend_value, динамическая типизация, статическая типизация
По виду типизации, языки программирования делятся на языки с динамической (dynamic typing) и статической типизацей (static typing). Статическая типизация — когда тип переменной точно известен в compile-time, например в Clang int a = 1; и в run-time тип переменной «a» может быть только integer.
С динамической типизацией попроще. Тип переменной выводится в run-time, например, в PHP $a = 1; и в run-time переменная «$a» может быть числом 1 или даже строкой «string». Тип переменной обуславливает операции, которые мы можем с ней производить, например, числа – складывать, а в строках искать вхождение подстроки.
Типизация, в свою очередь, делится на сильную (strong typing) и слабую (weak typing). Когда мы выполняем какую-либо операцию при сильной типизации, то два операнда должны иметь один и тот же тип, например в Python 1 + “string” вызовет ошибку, потому что 1 – число, а «string» – строка.
А вот в языках со слабой типизацией ошибки не будет, например в PHP 1 + “string” вернёт цифру 1. И причиной всему является приведение типов. Интерпретатор PHP начинает парсить строку «string», чтобы привести её к числу. Напарсить ничего стоящего у него не получается и он приводит строку «string» к цифре 0, которое в итоге и прибавляется к цифре 1. Строку «42string» интерпретатор приведёт к числу 42, а если надо привести строку «47.4string» к числу с плавающей точкой, то мы получим 47.4.
Таким образом, PHP – это язык со слабой динамической типизацией. Информация о выведенном типе переменной хранится в структуре «_zval_struct», в этой же структуре хранится ссылка на union-структуру zvalue_value (zend_value в PHP7), где и хранится реальное значение, на которое и указывает переменная.
Знание того, как устроен и работает zend_value помогает ответить на такие вопросы, как, например, «А какой тип будет у переменной «$a», которая ссылается на самое большое число (константа PHP_INT_MAX), если её сложить саму с собой (тип intger поменяется на double)?».