LINUX.ORG.RU

Основная проблема PHP

 


0

1

теме наверное всё же место в talks, но хочется анонов

в общем ковыряя древний большой php5.2-проект с классическим, легендарным говнокодом, ради которого я даже временно перешёл с emacs на phpstorm, потому что /me тупо не в силах справится с размером контекста, подумал о том, что php-мир был бы совсем другим, если бы не одна маленькая функция

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

без неё логика строилась бы по другому и соответственно огромное количество кода было бы другим (в хорошем смысле), и судьба php была бы совсем другой

это функция isset

grep isset -R | wc -l
13274
★★★★★

Последнее исправление: Debasher (всего исправлений: 4)
Ответ на: комментарий от Kilte

Ну или намеренно не стал включать.

От желания выстрелить себе в ногу не спасёт никакой язык.

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

Пока кто-то не забыл флаг --enable-mbstring при сборке

Он включен дефолтно, его не надо указывать, уймись.

Почему я тогда должен думать о том, какие функции выбирать для работы со строками

Почему я тогда должен думать

Потому что этим человек отличается от мартышки.

no-such-file ★★★★★
()
Ответ на: комментарий от deep-purple

Да ну? Ой, не смеши. Полистай сорцы каких нибудь драйверов на сях или сорцы «enterprise» (именно в кавычках) решений на .NET от всяких дипломированных выпускников. Говнокода и мартышек нет только в каком нибудь Haskell, я думаю.

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

mb_string по дефолту включен, все нормально, можешь не думать)

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

MySQL может быть вообще не нужен, в отличии от строк. Наиболее частые операции со строками предполагают, что мы работаем с символами, а не с байтами. Так почему этого не должно быть по дефолту?

Вот мне нужно например получить первый символ из строки. Что я делаю в php?

$ php -r 'echo mb_substr("абвг", 0, 1), "\n";'
а

Хотя постойте. Там вроде можно обращаться к символам строки по индексу.

$ php -r 'echo "абвг"[0], "\n";'

Нет, нельзя, пустота. Хотя для ascii символов работает:

$ php -r 'echo "abc"[0], "\n";'
a

Словом, всё через жопу сделано.

Python

Нет, не должен. Там всё из коробки нормально пашет.

$ python3 -c 'print("абв"[0])'
а
Kilte ★★★★★
()
Ответ на: комментарий от no-such-file

Он включен дефолтно, его не надо указывать, уймись.

Ок

Потому что этим человек отличается от мартышки.

См. пост выше.

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

MySQL может быть вообще не нужен.

utf-8 может быть вообще не нужен.

В любом случае ты сейчас сову натягиваешь. В нормальных дистрибутивах PHP идёт сразу с mbstring. А если ты сам химичишь и не поставишь mbstring нарочно это твой выстрел в ногу.

Хотя постойте. Там вроде можно обращаться к символам строки по индексу.

К байтам, а не символам. Об этом прямо сказано в документации. Которую в любом языке желательно читать перед работой с ним.

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

на сколько в питоне короче

В Ruby обычно куда короче, чем в Питоне. А ещё есть Perl, на нём такое можно написать, что потом никто прочесть не сможет :D

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

срочно все на ассемблер, переписывать контактик на ассемблере...

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

utf-8 может быть вообще не нужен.

Не суть. Вопрос состоит в этом:

Наиболее частые операции со строками предполагают, что мы работаем с символами, а не с байтами. Так почему этого не должно быть по дефолту?


К байтам, а не символам.

К символам. И об этом сказано в документации.

Доступ к символу в строке и его изменение. Символы в строках можно использовать и модифицировать, определив их смещение относительно начала строки, начиная с нуля, в квадратных скобках после строки, например, $str[42]. Думайте о строке для этой цели, как о массиве символов.

Ну а про то, что если символ представлен более чем одним байтом, то это не работает как надо, я уже давно в курсе. И именно поэтому, я считаю, что это реализовано через жопу.

Kilte ★★★★★
()
Последнее исправление: Kilte (всего исправлений: 1)
Ответ на: комментарий от Kilte

Пока кто-то не забыл флаг --enable-mbstring при сборке. Ну или намеренно не стал включать.

Ни один хостинг не посмеет так сделать (кто-то ещё пользуется шаредом?). Во всех дистрах оно включено по-дефолту. Да и вообще, ты как это себе представляешь? Задеплоить сайт и не посмотреть работает ли он?

В общем, я тоже против php, но у хейтеров далеко не всегда адекватная аргументация.

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

Да, согласен, притянуто за уши, но всё может быть =)

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

Kilte ★★★★★
()
Последнее исправление: Kilte (всего исправлений: 1)
Ответ на: комментарий от erzentd

Спроси тех самых кодеров, что я могу сказать?

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

получить первый символ из строки. Что я делаю в php?

Ничего. Нельзя получить первый или хоть какой символ. Можно получить подстроку, состоящую из одного первого символа. Логично, что для этого используется функция с говорящим названием mb_substr.

Python

Тоже самое. Только используется неочевидный синтаксис, т.к. создатель языка угорел от полиморфизма и запилил «одинаковый» способ для работы с последовательностями. В результате получились многолетние танцы с бубном, чтобы всё работало с utf и при этом не обосраться предать идею.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

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

Верно, но это всё детали.

mb_substr

А префикс mb_ не смущает? И как тебе такой кейс. Есть функция str_pad. В случае с мультибайтовой строкой она не дополнит её до 10-ти символов, как ожидается. В mbstring такой функции не предусмотрено. Разве это нормально, что мне придётся самому изобретать её?

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

Kilte ★★★★★
()
Последнее исправление: Kilte (всего исправлений: 1)
Ответ на: комментарий от Kilte

Там я получаю именно то, что мне нужно для любого набора символов, в отличии от PHP.

И в результате очень распространённая ошибка на Питоне — падение приложения с извещением о некорректной кодировке символа или некорректном сравнении. Иногда ужасно достаёт.

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

Ну х.з. Все вопросы к авторам этих приложений. Если во втором питоне и есть какие-то непонятки, то в третьем, КМК, всё круто. По умолчанию все строки в юникоде. Нужны байты, используй байтовые строки. Всё прекрасно конвертируется, с какими-либо проблемами не сталкивался.

Вообще сейчас какое-то переливание из пустого в порожнее идёт. Моя позиция такова, что в PHP нужна поддержка юникода на уровне языка, а не библиотеки. Это означает, что любая функция может принимать юникод и при этом работать именно так, как ожидает того пользователь, не коверкая символы и возвращая ожидаемый результат. Сейчас же творится какой-то ад. Стандартные средства нормально работают только с ascii, для мультибайтовых строк нужен mbstring, для которого кодировка задаётся глобально, да ещё и не все функции реализованы. С этим можно жить, но это какое-то уродство.

С другой стороны, если бы PHP разрабы сделали тогда всё правильно и PHP 6 явился бы на свет, то скорее всего получится такая же хрень как со вторым и третьим питоном. Хотя не уверен, не могу точно сказать.

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

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

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

джавистов такого не видел, у java кодеров резюме вообще у всех под копирку. а вот у пхпшников куча перлов в резюме.

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

Т.е. ты таки считаешь, что от PHP действительно гниёт мозг, верно? Как вообще ЯП может повлиять на это?

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

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

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

Любой уважающий себя PHP-разработчик должен знать ещё и иврит! Эта штука переводится как двойное двоеточие.

Kilte ★★★★★
()
Последнее исправление: Kilte (всего исправлений: 1)
Ответ на: комментарий от erzentd

Давай говорить правду. Если выпускник пишет говённый код, это либо админ, но он сам еще не понял, либо это еще один человек который будет до конца своих дней доказывать, что «ООП гоавно **ять, я с нуля напишу в 6 строк **ять, я писал еще когда ты под стол ходил» ну и в этом духе. А код таких людей, это кошмар, особенно когда эта обезьяна сходит с ума окончательно, а тебе достаются его старые штаны и этот сраный код.

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

Знаю, видел. К сожалению тут есть доля правды. Особенно сейчас такой тренд пошел, что 40 летние дяди из менеджеров, которые просто в кач-ве хобби, как то там выдавили из себя «админку» для магазина на PHP/HTML/JS/SQL фарше. Получают приличные 500 руб. в час и ничего так, работают. Хотя, в Java, уже не надо, с приходом Android всё стало почти также. Прочитал книжку, собрал пару простых софтин, игрушку примитивную, уже значится всё, записали в разработчики.

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

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

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

Я не говорю, что кто то спорит. Просто проходил мимо и решил подтвердить мнение просвещённого джентльмена, так сказать поддержать.

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

И в результате очень распространённая ошибка на Питоне — падение приложения с извещением о некорректной кодировке символа или некорректном сравнении. Иногда ужасно достаёт.

А в похапе распространенная ошибка - высер варнингов вместе с кодом вперемешку на страницу пользователю. Иногда ужасно доставляет.

Ок аналогия, да?

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

А префикс mb_ не смущает?

Не смущает, т.к. сразу дает понять, что функция принимает multibyte строку.

Есть функция str_pad. В случае с мультибайтовой строкой она не дополнит её до 10-ти символов, как ожидается. Разве это нормально, что мне придётся самому изобретать её?

Во-первых это не та функция, которая нужна каждый день, я, например, её вообще никогда не использовал, т.к. нет нужды. Во-вторых, зачем её изобретать? Полным-полно снипетов с реализацией, не вижу проблемы.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от Kilte

Стандартные средства нормально работают только с ascii

Стандартные средства работают с бинарными буферами. Обычные строковые функции интерпретируют их как ascii строки. Mbstrings интерпретирует их как multibyte строки. Zlib интерпретирует их как gzip данные и т.д. Всё очень логично, лаконично и не требует изобретать специальный синтаксис для всего на свете.

Моя позиция такова, что в PHP нужна поддержка юникода на уровне языка, а не библиотеки

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

no-such-file ★★★★★
()
Ответ на: комментарий от chuye

не обязательно, у меня знакомая училась в итмо, их препод 0, и студентам идиотизм преподавал, придя на работу в крупного оператора телекома( точнее контору которая создаёт софт для них), ей за пол года полностью переделали сознание, удалили всё что говорил препод, и теперь пишет абсолютно по другому. Диплом она писала так, как хотели видеть преподы, но в работе она такой говнокод не использует.

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

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

chuye
()
Ответ на: Всем ясно от anonymous

x86 унылое говно, тем не менее у тебя и выбора иного нет.

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