Всем привет, меня зовут Коля и я 10 лет пишу на php. Хлоп-хлоп-хлоп, привет, Коля.
Впервые я попробовал PHP в 11 классе, на тот момент были очень популярны сайты для мобилок, и меня это затянуло. Я писал на php на уроках и переменах со своего nokia n73, разбирался с одной из широко известных в узких кругах CMS, и грезил светлым будущим. Вот же оно, я теперь программист, я все понимаю и у меня получается.
Затем была первая работа, брошенный универ, ООП, фреймворки, и первые попытки соскочить. Сначала Java, затем плюсы. Я делал простенькие программки-помощники (трекер времени с автосохранением в jira, десятистрочные плагины для IDE), и среди этих for, if, switch я без проблем плавал как рыба в воде.Но как только требовалось что-то посложнее таймера, сразу начиналось избиение клавиатуры, стола и прочих подручных предметов.
Я искренне не понимал, какого черта ошибка выглядит как третий том Войны и Мира, с кучей непонятного текста и полным отсутствием человекопонятного пэхапэшникопонятного описания ошибки. Таких вещей было много, а дядя требовал закрыть насущные таски, и я просто забрасывал слегка начатое изучение нового языка в долгий ящик.
Время шло, опыта становилось все больше, паттерны, SOLID, CQRS, DDD. PHP стал совсем понятным, любая ошибка при выполнении скрипта вызывала лишь усмешку и заряженный xdebug, а в мозгу стучало "нет ничего невозможного". Хороший программист может легко разобраться в любом незнакомом языке, а я считал себя хорошим программистом. Java Android, первые table view с данными из интернета, и снова те же грабли. Куча непонятных вещей, вроде передачи параметров между экранами (постоянные краши в этом месте с полотном непонятных ошибок). Сам java уже давно не пугал, классы похожи на PHP, вместо parent - super, а для переопределения нужно писать @override. Приватные классы, переопределение метода прямо при создании объекта wtf??? Снова дядя, задачи, кросс ревью, скрам-митинги, спринты. Снова долгий ящик.
Strict types в php, теперь уже совсем по взрослому, в новых RFC обещают дженерики. Вот это уже настоящий прорыв, теперь мы заживем не хуже всяких java.
Новая попытка, swift, kotlin. И тут, знаете, тот самый момент, когда ты впервые увидел JavaScript.
JavaScript
(код и выводы отсюда)
const f = () => 42;
Скобки, стрелочки, да что тут вообще происходит, как это, черт возьми, работает? Но у JS свой путь, тут важна краткость, и они нашли выходы - тот же TypeScript выглядит понятно и лаконично.
Swiftbook выглядел многообещающе просто: if, for, switch, class struct, enum, tuple(офигеть удобно, почему в php такого нет?). Идея пет-проекта, быстро накиданная на symfony json API.
Красиво написанные в XCode структуры для entities, какая-то либа для дерганья апишки и конвертации json в объекты. И эпик фейл. Я настолько привык к отсутствию проблем с json в php, обкололся symfony serializerами, что полностью зашел в тупик со строгой типизацией в свифт. Моя, как я думал, великолепная апишка возвращала
{success: true, result: {SomeObjectOrArray}}
или
{success:false, errors: [listErrors]}
Как конвертировать ответ в объект, когда либа на вход принимает строку и название класса, а в самом классе должны быть указаны типы, а в моем случае в result - могло быть все что угодно. Да, можно было бы переписать апи так, чтобы метаинформация содержалась в коде ответа, а тело содержало только нужные объекты, но это был тупик, потому что такой вариант ни разу не приближал меня к большему пониманию swift. Психанул, подпер костылями, пошел дальше.
Еще одна попытка написать что-то, по привычке берем пример из интернетов и настраиваем под себя (на первых порах с PHP всегда прокатывало). Но вы только взгляните на параметры метода (долго искал подходящий пример, нашел не самый сложнопонимаемый, но вот. Код отсюда)
open func collectionView(_ collectionView: UICollectionView, canPerformAction action: Selector, forItemAt indexPath: IndexPath?, withSender sender: Any?) -> Bool {
guard let indexPath = indexPath else { return false }
return self.presenterForIndexPath(indexPath).canPerformMenuControllerAction(action)
}
Что тут вообще происходит, нижнее подчеркивание, какие-то ключевые фразы перед названием параметров.
Или вот:
if let JSONObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: Any]],
let username = (JSONObject[0]["user"] as? [String: Any])?["name"] as? String {
// There's our username
}
Синтаксис очень переполнен, приходится держать в голове множество конструкций, от чего мозг php-разработчика успешно отвыкает за годы разработки (чего уж там три с половиной конструкции против десятков, а в некоторых языках и сотен конструкций, синтаксического сахара и прочего).
И синтаксис - это далеко не самая главная проблема, месяц-другой и такой код будет выполняться в мозгу за считанные секунды. Проблема в понимании механики выполнения программы, асинхронности и многопоточности, и других вещей, которых PHP попросту лишен за ненадобностью. Все это придется учить с начала.
Те вещи, которые делались за считанные минуты и несколько строк кода (давайте возьмем JS, таблица, по клику на строку которой нужно эту строку удалить) теперь почему-то выглядят как пачка классов с непонятного назначения методами и, на первый взгляд, какой-то слишком усложненной логикой. Я видел отрисовку грида на UIKit, и это выглядит как мини-фреймворк. И эта реализация должна быть такой большой, ведь у нас нет умного браузера, который сделает все для вас (сейчас уже есть SwiftUI, который позволяет делать это гораздо короче, но с ним еще не все так просто). Тут нужно глубинное понимание работы, и это не просто "запустился скрипт, построчно выполнился и умер".
Я рад, что жена в свое время выбрала первым языком swift. Знаете, когда я ради интереса сделал за нее небольшое домашнее задание, первым вопросом преподавателя было "что за phpшник это писал?"
Если меня кто-нибудь спросит, какой язык ты посоветуешь для изучения новичку, едва ли я отвечу PHP. PHP язык с нулевым порогом вхождения и нет никаких проблем с его изучением. Десяток ключевых фраз, несколько конструкций, еще щепотка сложных вещей типа генераторов, стрима или замыканий. Пару минут - Hello World, пара часов - ToDo list, пара дней - мини блог. Пара лет, и ты уже Middle/Senior с запросами покруче архитектора, но без всякого понимания, как это работает внутри вида "почему мой алгоритм такой медленный". Но порог "выхода" слишком велик. Можно хорошо писать скрипты, но "взрослые" языки придется постигать почти "с нуля".
Вместо послесловия
Я люблю PHP, а точнее те вещи, которые я могу делать на нем. Люблю чистый и понятный код, который в целом легко пишется на этом языке. Как-то давно на хабре была статья о том, что хороший код и выглядит красиво, все эти отступы и скобочки, лаконичные функции без грамма лишнего. И PHP позволяет писать такой код. На мой взгляд в своей области (создание web-приложений) этот язык отлично подходит, и он должен быть именно таким (ну, или почти таким). Но являюсь ли я хорошим программистом после десятка лет разработки на PHP? Наверное нет.
NiceDay
да, но нет.
в php есть асинхронность, многопоточность, довольно удобная (на мой взгляд) работа с бинарщиной, голые сокеты и куча самых разнообразных вещей. а какое-то время назад вполне себе здравствовали обертки для gtk и qt, народ даже окошечки рисовал из php (сейчас можно обойтись без биндинг библиотек и дергать через ffi)
и даже свой аналог async-await есть.
и статья немного выглядит как "какой такой Tcp Listener? в похапэ я просто писал <?= 'Hello '. $world ?> и буквы сами попадали в браузер" — нет, то что вы не сталкивались с чем-то в php нисколько не показатель что там этого нет или что на нем нельзя так писать.
а сахара вон в 8ке насыпали, но сахар то всего лишь абстракция, которая позволяет впихнуть больше смысла в меньше строк, а не сделать магию.
catmodecode
ReactPHP и pThreads всякие это скорее то, что есть, но этим пользуются люди с особым вкусом. Меня аж целый раз спросили во время собеседования умею ли я в многопоточность в пхп, я в голове то в этот момент не сумел в неё, а они про пхп. Это все там не нужно. А окошечки и подавно.
Можно же, но не надо, пожалуйста.
Tatikoma
pthreads старое не стабильное. Сейчас кажется пользуются www.php.net/manual/ru/book.parallel.php
ReactPHP неплох, но лично я предпочёл мигрировать на amphp.