Найти в Дзене
Сотрудник Бристоля

Как я перешел с C++ на PHP и чуть не сошел с ума: исповедь студента-безопасника

Всех горячо приветствую. Не думал, что мой пост первый пост будет таким, но тоже пойдет. Дисклеймер: это все мое мнение, никого к нему не принуждаю, никого не поддерживаю и не осуждаю. Все что тут сказано является безумными бреднями простого студента, прислушиваться к которым не стоит. Ни один язык программирования не пострадал, и стол тоже. Всем добра и нервов, кто будет это читать. Я - простой студент, случайно попавший на направление компьютерной безопасности. В периоде обучения встала необходимость в изучении PHP. И оооо, это было ошибка. После годового изучения плюсов переход на синего слоника оказался очень болезненным. Почему? Нет, это даже не потому что он кривой. Просто посмотрите на именования функций. Они выглядят так, будто этого франкенштейна сшил безрукий хирург с нервным тиком из не знаю даже чего. Самое интересное, что эти функции находятся даже не в разных библиотеках, а в стандартной. Такое ощущение, что я должен или как школьник искать документацию на каждую функцию
Оглавление

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

Дисклеймер: это все мое мнение, никого к нему не принуждаю, никого не поддерживаю и не осуждаю. Все что тут сказано является безумными бреднями простого студента, прислушиваться к которым не стоит. Ни один язык программирования не пострадал, и стол тоже. Всем добра и нервов, кто будет это читать.

Я - простой студент, случайно попавший на направление компьютерной безопасности. В периоде обучения встала необходимость в изучении PHP. И оооо, это было ошибка. После годового изучения плюсов переход на синего слоника оказался очень болезненным. Почему?

После этого я не уверен, что разраб даже ответит
После этого я не уверен, что разраб даже ответит

PHP - вторая Вавилонская башня

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

  • Подчеркивания? Не, не надо. А может поставить?
    Возьмем, допустим, функции работы со строками. У нас есть
    str_replace, str_split... Но тут же рядом лежат функции strlen, strpos, strtoupper. Прикиньте, подчеркивания пропали оказывается. Не, ну что уж тогда не добавить CamelCase? Ах, он же в стандартах каком-то там из 22 (если я не ошибаюсь) рекомендуется для методов класса, в другом для переменных. Ухты.
    Хочешь декодировать Base64? Вот тебе
    base64_decode. Хочешь декодировать URL? Думаешь будет url_decode? Ты что, еще не научился? urldecode - вот что тебе нужно. Ты или гуглишь каждую функцию, пока ее не запомнишь, или тихо плачешь в сторонке, пытаясь ее угадать.
  • To или 2? А можете сразу оба? Нет? Жаль(
    Есть
    bin2hex. С двойкой выглядит красиво, будто бы какой-то современный американский подросток писал. Рядом bindec, cal_to_jd. Самое интересное, что еще есть sodium_bin2base64. И мне интересно, двойку привлек bin или hex, а может base64? Я не знаю кого об этом можно спросить, но мне интересно.
  • Русская рулетка с аргументами.
    Возьмем функции массивов. В
    array_filter($array, $callback) сначала идёт массив, потом коллбэк. Логично? Вроде да. А теперь смотрим на array_map($callback, $array). Каким чудом? Вопрос хороший.
    А если возьмем функции поиска.
    strpos($haystack, $needle) — ищем иголку в стоге сена. Окей. in_array($needle, $haystack) - почему здесь всё наоборот?!

Такое ощущение, что я должен или как школьник искать документацию на каждую функцию, или чувствовать на какую функцию какая часть деменции разработчика решила упасть.

Этот вопрос можно оценивать как выход в супер-пупер финал
Этот вопрос можно оценивать как выход в супер-пупер финал

Типизация? Могу отдать все

Вот вдруг мы решим сложить "5 собак" с числом "10" и получим... 15. Как? А можно на PHP считать мою зарплату? Я готов подписаться на зарплату в 10.000 копеек плюс 24 рубля в час.

А если вдруг мы решим сравнить строки? Вот тут прикол на приколе приколом погоняет. "0e123" == "0e456" знаете что будет? TRUE, а может и 1, там уже как язык решит. Самое тут интересное, что это хеши паролей. Это уже не просто баг, это впадина в безопасности размером с Марианскую впадину.

А если строка и число? "php" == 0 тоже TRUE. А почему? Ну пиха приводит строку к числу и сравнивает.

Ну а если вдруг ты случайно нажмешь лишнее = то что? Ну вот например "15" === 15 вернет FALSE, ну а если "15" == 15? TRUE. О да, спасибо, папаша.

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

А_хочешь_почитать_поэму_вместо_нормальной_информации_об_ошибке?

Есть такая ошибка T_PAAMAYIM_NEKUDOTAYIM которая о чем говорит? Я изначально думал что это какое-то заклинание из Гарри Поттера или какая-то планета из Звездных Войнов. Но нет, это если ты поставил случайно ::, причем это написано на ИВРИТЕ. А можно еще на латыни или иероглифы ascii-символами вывести? Не знаю как нормальный человек мог поставить случайно ::. Хотя если ты программируешь на PHP серьезно, то ты можешь и не такое. Есть еще T_PLUS_EQUAL, T_SL.

Угадай что верну

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

strpos ищет позицию подстроки. Если подстрока в начале, то вернет 0, если такого нет, то false. Но интересно что 0 == false. То есть если ты напишешь if (strpos(...)) то для PHP "найдено в начале" и "ничего не найдено" одно и тоже.

Есть функции, которые возвращают false, другие -1, NULL, NAN, а самые особенные возвращают в лог E_NOTICE.

Мелочи, которые я не придумал как описать

List? А может лучше array?

Если в нормальных языках есть list, map, set, queue, vector... то в PHP все реализовано через что? Правильно, через array. Но другая догадка тоже была правильная. Зачем? Ну а зачем много? Может он хотя бы работает быстрее? Хахахах, нет.

mb_, mb, mb, может быть

Стандартные функции работы со строками работают только с однобайтовой кодировкой. То есть если ты strlen скормишь z , она вернет 1, если Я или смайл 😄 - в первом случае будет 2, во втором - 4. Чтобы он правильно считал нужно использовать mb_(mb_strlen, тут хотя бы везде mb_ с подчеркивание, спасибо).

Забыл поставить? Ну жалко тебя, базу данных, твою работу и твою жизнь, переделаешь, если заметишь. В 2026 году вот такое это круто. Особенно прикольно, что ты еще должен это расширение скачать.

Жалко всех, кто понял его боль
Жалко всех, кто понял его боль

Печеньки, даже не овсяные, и без молока, за то с сессиями

Знаете что будет, если написать код, пробел или перенос строки, а потом только вызвать setcookie() или session_start()? Скрипт упадет. Язык ломается от обычного пробела...

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

А если я хочу удалить куки? Всего то я должен заняться некромантией и отправить протухшую дату браузеру. Потому что функцию delete_cookie() решили не писать. А может она должна называться deletecookie() или как-то еще?

По дефолту PHP хранит данные сессии в файле. Если пользователь открыл 5 вкладок они будут загружаться параллельно? ХАХАХА. Они будут ждать, пока прошлый скрипт закончит выполнение и закроет файл. Выстраивается очередь как к врачу в поликлинике.

Хоть кто-то радуется PHP
Хоть кто-то радуется PHP

Концовка

Говорить про файлы, ООП, работу с датами и временем, многопоточность, сборщика мусора я не хочу. Я слабо разбираюсь, да и там все настолько грустно и скудно, что говорить не хочется.

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

И я знаю про ===, но стрелять себе в колено, целясь в мишень не очень приятно.

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