Pull to refresh

В защиту PHP

Reading time 4 min
Views 3.4K
Original author: BaileyP
Недавно на stackoverflow была создана тема, в которой автор утверждал, что PHP неважнецкий язык и просил переубедить его. В качестве аргументов он привёл несколько доводов, которые были последовательно прокомментированы другим участником. Вольный перевод сего представлен ниже.
Лично я полностью согласен с отвечающим и думаю, что всем ненавистникам PHP стоит с нижеследующим ознакомиться.

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

Это то, что я люблю и ненавижу одновременно. Однако по своей сути это утверждение верно. Почему некоторые двухсловные функции разделяются подчеркиванием, а некоторые нет? Почему $needle и $haystack иногда меняются местами? Это смешно. Но в конце концов действительно ли это так важно? Моя IDE с автоподстановкой и php.net всегда под рукой. Так что возможно это и является негативным фактором для PHP как языка. Но не мешает мне быть эффективным программистом.

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

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

Отсутствие логики при редизайне. Вышеупомянутые «сокращения» сделали иногда невозможным указывать для функций значения по умолчанию. Этот баг пофиксен в PHP 5, но они же убрали передачу переменных по ссылке из PHP 4!

Я не думаю что есть какой-то недостаток логики. Я думаю, вас сильно задело данное конкретное изменение и «во рту остался неприятный привкус». Изменения в языке зачастую становятся известны за месяцы, а то и годы до их реализации. Для перехода от 4 к 5 существует migration guide в котором описаны все различия. Передача параметров по ссылке была ужасной чертой, которая не даёт разработчику каких-либо преимуществ, не достижимых другими способами.

Плохая реализация нэймспейсов (фактически из вообще нет). А сейчас, когда они появились, что будет использоваться в качестве разделителя? Бэкслэш! Символ, который повсеместно используется для экранирования, даже в PHP!

По этому поводу у меня смешанные чувства. Часть меня думает, «какая разница, ведь символ экранирования не имеет смысла вне строки», а часть меня считает «наверное, они всё-таки могли бы придумать что-нибудь получше». Но могли ли они? Я не знаю, я не разработчик Zend. Однако тот факт, что у нас до 5.3 нет пространств имён является ужасным упущением.

Чрезмерное применение пребразования типов приводит к ошибкам. У меня нет проблем с преобразованием, скажем, float в int и обратно. Но PHP (когда я последний раз проверял) с радостью попробует преобразовать массив в целое.

Я считаю нормальным не согласиться с тем, как PHP делает это, но я не согласен с тем, что это делает язык «плохим».

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

PHP это DSL для Интернета. Я плотно работал с ним в течение 8 лет и пользовался рекурсией от силы 4 или 5 раз, как правило, для обхода директорий или XML. Это не тот подход, который часто нужен для веб-разработок. Я не оправдываю низкой производительности, но это гораздо больше академический вопрос, чем вопрос продуктивности. Если вам действительно нужна быстрая рекурсия, PHP — не ваш выбор.

Функции нечувствительны к регистру. Я понятия не имею, о чём они думали в тот момент когда сделали это. Язык программирования это способ определить поведение как для компьютера, так для программиста, без двусмысленности. Нечувствительность к регистру вводит много неясностей.

Я на 100% согласен с этим.

PHP поощряет (практически требует) смешивание логики и представления. Да, вы можете написать код так, чтобы этого не было, но он действительно упрощает написание неправильного (с точки зрения проектирования) кода.

Как замечательно — люди жалуются на язык, который позволяет им применять любые системы вывода (об этом красноречиво свидетельствует количество и стиль шаблонизаторов для PHP) — ИЛИ — пропустить всё и просто выводить напрямую. Это совсем не делает PHP плохим. Это часть того, что делает PHP хорошим.

Производительность PHP ужасна без кэширования. Скажите, кто-нибудь продаёт коммерческий продукт кэширования для PHP? Ах да, это делают сами разработчики PHP.

Вы имеете в виду кэширование байткода (например, акселераторы), или кэширование вывода?

Если первое, тогда я не думаю, что это важно для меня. Акселераторы свободны и их очень просто прикрутить. Мы могли бы спорить о том, почему они не является частью языка, но в конце концов, я не думаю, что это так уж важно.

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

В целом, я думаю, вы считаете PHP «плохим» языком в очень академическом понимании. А люди, использующие PHP, кодят на нём «to get things done».
Tags:
Hubs:
+52
Comments 446
Comments Comments 446

Articles