LINUX.ORG.RU
ФорумTalks

всесторонняя критика PHP

 ,


0

1

Нашел прикольную статью с всесторонней и аргументированной критикой языка программирования PHP - http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/ Рекомендуется к прочтению всем, кто собирается изучать этот ЯП, с целью направить их энергию в более полезное русло.

Маленький отрывок для Ъ:

Что делает вот этот код?

  @fopen('http://example.com/not-existing-file', 'r');
  • Если PHP был скомпилирован с опцией --disable-url-fopen-wrapper, он не будет работать (при этом документация говоря «it won't work» не поясняет, каким именно образом он не будет работать: вернет null, выбросит исключение, и т. д.)
  • Если allow_url_fopen в php.ini выключен, то код тоже не будет работать, при этом совершенно непонятно как именно.
  • Из-за @ предупреждение о несуществующем файле не выведется
  • Но если scream.enabled включен в php.ini, то предупреждение выведется
  • Или если scream.enabled включен через ini_set.
  • Но оно не выведется, если задан неправильный error_reporting
  • Куда именно выведется предупреждение сказать нельзя, так как это зависит от опции display_errors в php.ini. Которая может быть переопределена через ini_set

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

Update: Полный перевод статьи на русский - http://habrahabr.ru/post/142140/

★★★★★

Последнее исправление: provaton (всего исправлений: 1)

Очень аргументированная критика...

Если вы не знает PHP то фиг знает что у вас получится при написании кода, да...

null123 ★★
()

А всёравно будут использовать. Потому что просто-быстро-легко. Косяки потом вылезут, когда будет что-то сложнее хеллоу-ворлд, но там ведь не поварачивать обратно уже, да и опыт уже приобретётся, да и популярно, потому гугл знает что делать.

Bad_ptr ★★★★★
()
Ответ на: комментарий от Solace

Сила php скорее в массовости. А что язык - на любителя, так это сразу понятно.

Звучит чуть менее нелепо, чем «Сила говна — в говноедах. А что говно — на любителя, так это сразу понятно».

fang
()
Ответ на: комментарий от fang

php в своё время стал весьма массовым языком. То ли отсутствие четких альтернатив, то ли «Потому что просто-быстро-легко», но стал. Теперь, даже если отказаться от php, всё-равно нужно будет поддерживать кучи говнокода.

Так понятнее?

Solace ★★
()
Ответ на: комментарий от null123

Это не знание, это навыки владения бубном. Языки, которые заставляют играть на бубне а не описывать задачу, должны исчезнуть.

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от Solace

То ли отсутствие четких альтернатив

Ну, как сказать… 10 лет назад PHP пришлось выбивать с рынка монополиста — Perl. И выбил он его очень успешно, потом уже и Python, конечно, гвоздь забил. Но альтернативы, мягко говоря, к моменту прихода PHP на рынок — были :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Solace

К концу 1990-х, началу 2000-х на рынке web-скриптов безраздельно властвовал Perl. Он стоял у каждого хостера, бесплатные хостинги обычно были с Perl'ом, все популярные на тот момент форумы/CMS были на Perl.

А уже к середине 2000-х Perl стал уделом legacy и фанатов языка :)

KRoN73 ★★★★★
()

Выброс

PHP слишком сложный, нужен пример попроще, из родного POSIX:

Что делает этот код?

int ret;
do {
     ret = close(fd);
} while ((ret == -1) && (errno == EINTR));
AptGet ★★★
()
Ответ на: комментарий от Solace

То ли отсутствие четких альтернатив

Ему и сейчас альтернатив особых нет. Слабо распространенные Питон и Руби, да Ънтерпрайзная Жаба.

Saloed
()

Совершенно ничего страшного в этом коде нет. Тебе предоставлены гибкие параметры конфигурации, а ты еще и ноешь...

Проблема PHP в другом - горы не нужных функций, часто очень узких. Армия библиотек с разбродом и шатанием в именах функций и классов. Недопустимые вольности в синтаксисе. Какой вариант написания if.else я встречу на этой неделе?

Но ЕДИНСТВЕННЫЙ серьёзный минус языка - это пейсатили на нем. Не будь их - был бы нормальный язык.

И сразу вопрос - а зачем его учить? Разве знание какого-нибудь скриптового языка не позволяет писать на PHP просто глядя одним глазом в справочник функций?

Suntechnic ★★★★★
()
Ответ на: комментарий от Suntechnic

Проблема PHP в другом - горы не нужных функций, часто очень узких. Армия библиотек с разбродом и шатанием в именах функций и классов. Недопустимые вольности в синтаксисе. Какой вариант написания if.else я встречу на этой неделе Но ЕДИНСТВЕННЫЙ серьёзный минус языка - это пейсатили на нем. Не будь их - был бы нормальный язык.

Всё верно, но там упоминался и такой недостаток: «при этом документация говоря „it won't work“ не поясняет, каким именно образом он не будет работать: вернет null, выбросит исключение, и т.д.»

И сразу вопрос - а зачем его учить? Разве знание какого-нибудь скриптового языка не позволяет писать на PHP просто глядя одним глазом в справочник функций?

Любой язык надо учить. Разумеется, для человека, который знает перл, руби и питон, «изучение» пхп сведётся к беглому пролистыванию документации. Но если не учить, можно напороться на эпичные грабли, щедро разбросанные в php там и сям.

geekless ★★
()
Ответ на: комментарий от Saloed

Питон всё «моднее» становится, по крайней мере, всё чаще вижу то там, то тут. Так что в перспективе может и стать таковой.

Solace ★★
()

А я щас пилю сайтик на ruby :)

Debasher ★★★★★
()

provaton

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

вы так говорите, как будто в этом есть что-то плохое.

drBatty ★★
()
Ответ на: комментарий от null123

Если вы не знает PHP то фиг знает что у вас получится при написании кода, да...

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

Да хрен бы с написанием, что делать с поддержкой такого кода. Я 3 года занимался переносом сайтов с различных хостингов, по всем этим граблям прошёлся.

А уж как весело когда сайт молча падает из-за одного лишнего пробела...

true_admin ★★★★★
()
Ответ на: комментарий от Suntechnic

Но ЕДИНСТВЕННЫЙ серьёзный минус языка - это пейсатили на нем.

+1 :)

Разве знание какого-нибудь скриптового языка не позволяет писать на PHP просто глядя одним глазом в справочник функций?

Забавно, что именно так я этот язык учил 12 лет назад, так и сегодня использую. Вообще, php.net/<имя_функции> весьма рулит :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

KRoN73

10 лет назад PHP пришлось выбивать с рынка монополиста — Perl.

ну у php по сравнению с перловкой действительно масса плюсов. ИМХО главный - 95% кодеров понимают сишный синтаксис, и потому кажется, что изучать php вовсе не нужно. Его и так все «изучили».

drBatty ★★
()
Ответ на: комментарий от true_admin

Речь о том что его проектировали идиоты

Суровая реальность, данная нам в ощущения, говорит о том, что академические языки не приживаются и не выживают.

Да хрен бы с написанием, что делать с поддержкой такого кода

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

А уж как весело когда сайт молча падает из-за одного лишнего пробела...

Это ты про Питон? ;)

KRoN73 ★★★★★
()
Ответ на: комментарий от drBatty

ИМХО главный - 95% кодеров понимают сишный синтаксис, и потому кажется, что изучать php вовсе не нужно

Синтаксис у PHP и Perl очень близок :) Разве что всякая работа с регекспами в виде китайской грамоты на Perl и функций на PHP. Но это не принципиально.

Можно сказать ещё, что у PHP более привычная объектная модель. Но когда PHP выбивал с рынка Perl, объектами в нём ещё не пользовались :)

KRoN73 ★★★★★
()

Вижу, что Ъ совсем Ъ. Ладно, запощу еще парочку интересных пунктов

  • json_decode может вернуть null в случае валидных данных и невалидных
  • array_search и strpos когда искомый элемент не найден возвращают false, который часто неявно конвертируется в 0 (что означает, что искомый элемент находится в нулевой позиции)
  • == не имеет свойства транзитивности («foo» == TRUE, and «foo» == 0… but, of course, TRUE != 0.)
  • Оператор сравнения делает невозможным создания детерминированного метода сортировки (NULL < -1, and NULL == 0)
  • использование глобальных переменных без global приводит к созданию локальной переменной
  • Имена переменных зависят от регистра, функций - не зависят
  • нет модулей
  • много псевдофункций со специальными правилами парсинга. Например, empty($var || $var2) выдает parsing error.
  • Нету stack traces и нечитабельные сообщения о ошибках парсинга (например, :: называется T_PAAMAYIM_NEKUDOTAYIM)

По ссылке еще гораздо больше интерестностей, но все лень переводить.

provaton ★★★★★
() автор топика

Ну так жеж. Кто спорит, что ПХП далеко-далеко не идеал :) Запалом (но не качеством) статья напоминает The Unix Haters Book. Влияние на развитие критикуемой технологии будет, видимо, аналогичным.

Автор этой критической простыни, кажется, пишет, что любит питон? Пусть посравнивает создание анонимных функций в PHP 5.3 и питоне 2.7 :)

Был давеча на CodeFest, так там пару спрашивали докладчиков из зала: «А почему вы выбрали именно PHP?» Лучший ответ: «Потому что он хороший.» :)

П.С.

Автор оригинала и топикстартер прогуливали риторику и психологию в школе.

«Я не люблю FOO, поэтому я сейчас буду искать там недостатки. <много недостатков FOO> какбы между делом: зато я люблю BAR, <несколько плюсов BAR в сравнении с FOO> <снова много недостатков FOO>. Вывод: FOO - плохое и ненужное.»

Ага, покровы неожиданно сорваны :) Критические построения по такому шаблону вызывают только улыбку и за «вброс» не считаются.

Eugenep
()
Ответ на: комментарий от KRoN73

что академические языки не приживаются и не выживают

квалифицированные специалисты все чаще отказываеются от php и выбирают python с сотоварищи. но бизнес часто не может себе этого позволить - просто потому что найти php-кодера легче и проще.

VladimirMalyk ★★★★★
()
Ответ на: комментарий от true_admin

очевидно закрывает fd пока не закроется

Казалось бы да, и на некоторых *nix'ах так и есть. Но на большинстве, в т.ч. и на линуксе, этот код может закрыть не тот дескриптор, тк после первого close() дескриптор освобождается.

AptGet ★★★
()
Ответ на: комментарий от KRoN73

KRoN73

Синтаксис у PHP и Perl очень близок :)

э... Это шутка?

KRoN73

Разве что всякая работа с регекспами в виде китайской грамоты на Perl и функций на PHP

для preg_replace()/preg_match() синтаксис регулярок эквивалентен перловке. Не?

KRoN73

Можно сказать ещё, что у PHP более привычная объектная модель. Но когда PHP выбивал с рынка Perl, объектами в нём ещё не пользовались :)

хм.. в перловке уже юзают ООП? До чего прогресс дошёл...

drBatty ★★
()
Ответ на: комментарий от KRoN73

академические языки не приживаются и не выживают.

Питон это академический язык? Низнал-низнал.

Говнокод легко пишется на любом мейнстримовом языке

некоторые языки прямо таки для этого были созданы.

приличный код пишется тоже на любом мейнстримовом языке

непродумманые языковые конструкции могут принуждать к горождению костылей.

А мейнстримность... Мы тут не популярность обсуждаем, это тут ни при чём.

Это ты про Питон? ;)

с каких пор питон молча падает? Не, ну в нём тоже можно try ... except: pass сделать, да. Заставь дурака перекреститься...

true_admin ★★★★★
()
Ответ на: комментарий от Eugenep

Дописал в стартовом посте, спасибо за ссылку.

provaton ★★★★★
() автор топика
Ответ на: комментарий от VladimirMalyk

квалифицированные специалисты все чаще отказываеются от php и выбирают python с сотоварищи

А Питон — тоже ни разу не академический язык со множеством костылей :) Понятно, что получше, чем PHP, но качественно — тот же самый уровень.

KRoN73 ★★★★★
()
Ответ на: комментарий от AptGet

Кстати, в статье как раз сказано, что один из любимых аргументов пхпшников - «в си точно также все через запутанно и неочевидно». Но только ПХП язык с претензией на высокоуровневость, поэтому гордиться тем, что там все «как в Си» - это все равно, что гордиться тем, что в твоей легковушке A-класса звук двигателя как у БелАЗа.

provaton ★★★★★
() автор топика
Ответ на: комментарий от drBatty

э... Это шутка?

Нет. Очень похожие же языки. Хотя, наверное, зависит от того, с чем сравнивать. Но на фоне Си/Си++ — весьма близки.

для preg_replace()/preg_match() синтаксис регулярок эквивалентен перловке

Я не про сами выражения, а про функции, их использующие. В PHP — это функции, в Perl — элементы языка.

хм.. в перловке уже юзают ООП?

http://i-vd.org.ru/books/perl/object-oriented.shtml

KRoN73 ★★★★★
()
Ответ на: комментарий от AptGet

тк после первого close() дескриптор освобождается.

Я в своё время много посвятил этому вопросу. На практике оно может EINTR вернуть? Я читал что нет и что в ядре всегда двух случаях возвращает ошибку: отвал блочного устройства и отвал NTFS. Т.е. в нормальной жизни вроде как не бывает, поэтому я везде или игнорю возвращаемое значение или log(«Achtung! Тут какая-то трава»);.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

академические языки не приживаются и не выживают.

Питон это академический язык? Низнал-низнал.

Питон не прижился и не выжил??? Я что-то пропустил?

с каких пор питон молча падает?

Ну, например, если иксепшны не выводятся в браузер.

Не, ну в нём тоже можно try ... except: pass сделать, да

А в PHP можно или в браузер ошибки выводить (только зачем?) или в логи кидать.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

но качественно — тот же самый уровень.

Фига се. И каков же критерий качественности?

true_admin ★★★★★
()
Ответ на: комментарий от KRoN73

Ну, например, если иксепшны не выводятся в браузер.

проблема приложения. Ты чувствуешь разницу между проблемой в коде и проблемой самого интерпретатора который кардинально меняет поведение от 100500 причин?

true_admin ★★★★★
()
Ответ на: комментарий от provaton

provaton

array_search и strpos когда искомый элемент не найден возвращают false, который часто неявно конвертируется в 0 (что означает, что искомый элемент находится в нулевой позиции)

php это такой ЯП, в котором типы данных сами конвертируются откуда угодно и куда угодно. Это одно из основных свойств ЯП. Обычно оно помогает, но не всегда конечно. Что мешает юзать ===, как того требует документация?

provaton

== не имеет свойства транзитивности («foo» == TRUE, and «foo» == 0… but, of course, TRUE != 0.)

ну и что? И да, см. выше.

provaton

Оператор сравнения делает невозможным создания детерминированного метода сортировки (NULL < -1, and NULL == 0)

это там NULL кривая (в женском роде потому, что это по-русски НЁХ). Куда как более правильная НЁХ из SQL. ЕМНИП в мане написано, что порядок сортировки НЁХ не определён. (если подумать - К.О.)

provaton

использование глобальных переменных без global приводит к созданию локальной переменной

дык это нормально, хоть какая-то защита от быдлокода (использование своих глобальных переменных в 99% случаев === быдлокод).

provaton

много псевдофункций со специальными правилами парсинга. Например, empty($var || $var2) выдает parsing error.

э... Это ИМХО хрень неведомая.

provaton

и нечитабельные сообщения о ошибках парсинга (например, :: называется T_PAAMAYIM_NEKUDOTAYIM)

это скорее пасхалка :-)

drBatty ★★
()
Ответ на: комментарий от true_admin

А его вообще проектировали? История PHP на википедии читается как увлекательные мемуары препарата анатомического театра Медицинской Академии им. Мечникова.
Интерпретатор для веб-странички переписывают на C, потом переписывают для электронной коммерции, потом расчленяют на модули, потом добавляют ООП, и наконец в очередных попытках сделать хорошо плюют на новую версию. И при этом непрерывно пишут всякие модули, плагины, шаблоны и другие заготовки.
Главное, что в нашем несовершенном мире, огромное количество людей и организаций этим пользуются и считают такой инструмент экономически целесообразным.

siphonops ★★★
()
Ответ на: комментарий от KRoN73

KRoN73

Нет. Очень похожие же языки. Хотя, наверное, зависит от того, с чем сравнивать. Но на фоне Си/Си++ — весьма близки.

KRoN73

http://i-vd.org.ru/books/perl/object-oriented.shtml

почитал по сцылке - действительно, кривизна и нелогичность ООП в перловке сравнима с кривизной ООП в php...

drBatty ★★
()
Ответ на: комментарий от siphonops

А его вообще проектировали?

См. выше замечание про академические языки :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

«Do not tell me that “good developers can write good code in any language”, or bad developers blah blah. That doesn’t mean anything. A good carpenter can drive in a nail with either a rock or a hammer, but how many carpenters do you see bashing stuff with rocks? Part of what makes a good developer is the ability to choose the tools that work best.»

Это по ссылке.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.