Это копия, сохраненная 15 февраля 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
ОП довольно занят, но постарается ответить на все вопросы. Также, ответы и решения задач можно поискать в архиве тредов phpclub.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>2440871 . Все старые треды есть в архиве: https://phpclub.tech/ (впрочем, иногда он не работает).
С чего начать
Наши уроки по PHP собраны по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не запоминайте его, он временный). Это учебник для изучающих с нуля. Там есть задачи, их нужно решать. Но если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Если не знаешь как решать, запости код и попроси подсказку или поищи задачу в архиве тредов.
Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование. У нас есть задачи для изучения этого:
- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Laravel/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony или Laravel
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md
Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md
Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра.
Вот неофициальный роадмап (карта того, что желательно изучить): https://miro.com/app/board/o9J_lbUUBBQ=/
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
- Новости IT на англ. https://news.ycombinator.com/
- какой-то древний, устаревший, но большой и на русском справочник по веб-разработке, посоветованный аноном: https://starcat.dp.ua/doc/wdh/
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.
Платиновые вопросы
- Почему PHP? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а зайди на https://github.com/codedokode/phpbook, нажми зеленую кнопку Clone or Download -> Download ZIP, распакуй на рабочий стол и получи личную копию сайта, не требующую интернетов.
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу (ищи в архиве по слову "устроился").
- Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.

Для этого достаточно вставить код на http://beta.phpformatter.com/ и нажать «format». Робот оформит все как надо. Если ты используешь IDE, то там есть горячая клавиша для этого. Список клавиш для IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть рекомендации PSR-1 и PSR-12. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
- ставим тайп-хинты на аргументы функций, результат функций и поля классов
Вот ссылка на рекомендации PSR, где все это описано подробнее и даны примеры оформления:
PSR-1 (рус.): https://svyatoslav.biz/misc/psr_translation/#_PSR-1
PSR-12 (англ.): https://www.php-fig.org/psr/psr-12/
А что с тем тредом стало, уплыл? Я что-то проморгал
Престарелый джун вкатился.
По Ларе - документацию. По ООП - все то же, что и 10 лет назад, ну плюс еще рефакторинг гуру, мб.
Спасибо. Кстати, в шапке есть задачи про студентов, файлообменник, тестхаб. А решений нет?
Бля чувак ну ты понял о чем я. Я имею ввиду вариант реализации задач правильный с точки зрения автора гайда.
старый объявлен депрекейтед и удален
Правильного варианта нет, но к студентам есть наиподробнейшие комментарии, если сделать все как описано, то и будет "правильный" вариант.
Как по мне чувак качественно и понятно доносит о ООП, шаблонах
Думаю, это больше пост для жс труда и вообще платина, но...
Посоветуйте хороший пикер даты+времени, чтобы ни от чего особо не зависел, умел в разные форматы дат с разными разделителями, мог в валидацию (то есть можно было удобно ввести в форму руками, а можно выбрать), поддержкой мобильных устройств. В стандартном инпуте даже год через жопу выбирается. Бонусом если ещё будет уметь диапазон дат выбирать. Когда-то использовал флэтпикр, но там были проблемы с мобильной версией кажется.
Обалдеть. ОП, ты ещё жив? Видел твои треды ещё лет 8 назад. За это время я вырос в успешного бузинесмена через пыхапэ кодера, потом пм/рп, потом вот это вот. Программировать правда так и не научился, но ты когда-то давал советы мудрые, я тогда ещё в универе учился, да и "в целом" помогал тут и мы обменивались парой сообщений по почте, кажется. Интересно, сколько ещё двачеров ты сделал чуточку умнее? Спасибо что ты есть.
> За это время я вырос в успешного бузинесмена через пыхапэ кодера, потом пм/рп, потом вот это вот.
Зачем ты нам это рассказываешь? В жизни реальной даже похвастаться не перед кем?
Он там, насколько помню, даже сам говорил, что просто какую-то из книг пересказывает. Вроде даже РефГуру, лол.
Еще вспомнил, что у Димки Елисеева есть цикл по ООП. Один из видосов оттуда мне когда-то прям глаза открыл, когда я только вкатывался.
Это не для тебя написано, это благодарственное письмо ОПу треда и всем старожилам, если конечно ОП не умер или не забил давно и по-прежнему бескорыстно заботится о ньюфагах.
Ну на его deworker я бы всем вкатунам, которые че-то уже соображают, советовал заглянуть.
Ебать, в 2022м ещё кто-то делает обучающие курсы по этому говну. Воистину, пыха есть пыха, сдыхает но никак не сдохнет.

Посмотрел https://youtu.be/IWcVI1LVBZg
Какой пиздец, ёбаный стыд. Как может взрослый мужик на полном серьёзе показывать детям пикрил. За такое в приличном обществе канделябром бьют.
Запомните, дети, проблема пхпшника в том, что он в силу малого опыта кругозора не может отличить говно от не говна.
Для сравнения декораторы в питоне: https://www.programiz.com/python-programming/decorator
Это встроено в язык и не надо костылить.
пикрил бы выглядел
@notify_managers
@notify_users
@logger
def order_update(args):
...
>Это встроено в язык и не надо костылить.
Все, мужики, с понедельника все проекты переводим на питон!
Бля, я далеко не фанат пхп. Более того я бы не рекомендовал в него вкатываться вообще. Но твои доебы это такая чушь ебаная, что можно вообще охуеть. Надо сходить в питон тред спросить кто тебя с пробитой башкой из дурки выпустил.
>Какой пиздец, ёбаный стыд. Как может взрослый мужик на полном серьёзе показывать детям пикрил. За такое в приличном обществе канделябром бьют.
Мужик показывает пример конфига. Ты, ебанько, вообще понял что на скрине происходит? Как это вообще относится к встроенности в язык или костылям?
>пикрил бы выглядел
>@notify_managers
>@notify_users
>@logger
>def order_update(args):
>...
Пикрил КОНФИГ, а не код. Тебе чтобы сделать возможность включать или выключать конкретный декоратор через интерфейс тоже придется написать конфиг. Чтобы блядь манагер мог галочку поставить напротив "Уведомлять пользователя" и пользователь уведомился. Тоже придется его читать и В ЗАВИСИМОСТИ ОТ КОНФИГА БЛЯДЬ задействовать декоратор. Или, сука, не задействовать.
То что ты, хуесос пробитый, не отличаешь декорацию ОБЪЕКТА от ФУНКЦИИ оставим на совести твоей бухавшей всю беременность мамаши.
А что с пыхой не так? Работы навалом и в стране и снаружи. Со своими задачами справляется. Что еще должно мотивировать при выборе того или дру го го языка?
Ну представь что бухгалтер общается с кассиром.
- Давай становись бухгалтером скорее. У бухгалтеров возможностей куча. Вариантов немеряно.
- А че с кассовым аппаратом не так? С задачами справляется. Деньги платят, работа есть.
У пхп очень специфичная и замкнутая экосистема. Вне пхп тебе оттуда пожалуй пригодится только знание ООП и умение обращаться с IDE.
У большинства языков сейчас практически общая основа. Да есть специфика. Да есть куча различий. Но чтобы на них писать нужен одинаковые знания, БАЗИС. Это называется Computer Science. Теория алгоритмов, структуры данных, работа с памятью. С этими знаниями для освоения нового языка нужно всего-лишь привыкнуть к синтаксису и начать вникать в нюансы.
Ты наверняка слышал фразы "язык это инструмемнт", "выбирай инструмент под задачи". Так вот это именно об этом. Когда у тебя есть база ты выбираешь подходящий инструмент, ты уже знаешь как им пользоваться. Новый язык? Ты его просто пробуешь. Ты можешь как ферзь ходить по всей доске, все дороги открыты, разумеется если приложить усилия.
Ловушка пхп в том что весь этот базис в нем не нужен. Да, на собесе тебя могут спросить про виды сортировки, но в повседневной работе ты не пишешь сортировку на пхп. Да, ты можешь знать разные структуры данных, но в пхп они тебе не нужны. Все попытки выйти из пхп экосистемы будут факультативными и не будут закрепляться на практике в твоем повседневном коде, а иногда вообще будут ему противоречить.
Да, пхп это легкий путь, почти ничего знать не надо. Да, на хлеб что намазать будет, и может даже икру. Но это путь деградирования, который ведет в тупик. Ты в течении нескольких лет поймешь потолок задач для пхп, а смена языка будет означать практически начало карьеры сначала.
>Да, на собесе тебя могут спросить про виды сортировки, но в повседневной работе ты не пишешь сортировку на пхп.
А не на пхп ты сортировки каждый день пишешь? В других языках в стандартной либе сортировщика нет?
>. Да, ты можешь знать разные структуры данных, но в пхп они тебе не нужны.
А в яве нужны? Каждый день связный список реализуешь с нуля или красно-черные деревья крутишь? Что за бред, ты такой же перекладыватель жсонов или конфигуратор спринга, лол.
П пхп нелогичная стандрартная либа, нет из коробки асинхронности\многопотока и геморно писать демонов в этой связи. Все.
>А не на пхп ты сортировки каждый день пишешь? В других языках в стандартной либе сортировщика нет?
Квиксорт-то есть, а вот какой-нибудь мердж сорт с распараллеливанием вполне себе можно написать.
Речь была о том, что на пхп тебе вообще смысла нет пытаться писать алгоритм сортировки. Никакой. Он в принципе не применим, и не выполняет своих функций.
В то время как на другом языке ты можешь написать свежеизученный алгоритм и реально протестить его эффективность, сравнить с стд и может даже оставить в коде. Есть точка приложения.
>А в яве нужны? Каждый день связный список реализуешь с нуля или красно-черные деревья крутишь?
Та же самая ситуация. В яве ты изучив красно-черные деревья можешь проверить их на реальном коде, живого проекта. Проверить их эффективность, сравнить с стд, с другой реализацией. Получить опыт и принять решение.
А с пхп что? А нихуя. Можешь паттерны перечитать с рефакторинг гуру. Или про солид че-нить. Нинужно. Нихуя нинужно.
Все эти красно черные алгоритмы это не просто смешной способ писать код. У них есть назначение. И даже если они есть в стандартной либе нужно шарить что из этого и как использовать. Да даже банально чтобы понять что язык говно и нахуй не нужон нужно понимать чего ему не хватает в этой стандартной либе.

>>512571
всегда угораю с таких вот БАЗОВИЧКОВ КОМПУХТОР СКИЕНСЕ. Наслушались где-то умных слов про алгоритмы и теперь несут их, как единую истину. Дураку в жизни не объяснить, что 95% алгоритмов не нужны на прикладном уровне, на их основе написаны многие вещи в стандартной либе, и скорее всего, его реализация будет корявее и багованнее. Но дурак будет до конца доказывать - "алгоритмы нужны каждый день нях, пхп говно потому что нет смысла их использовать" и т.д.
Ответь на два вопроса. В первую очередь себе.
1) Сколько, по твоему мнению, нужно времени миддлу пхп чтобы перекатиться в миддла на джаве или шарпе?
2) Сколько, по твоему мнению, нужно времени миддлу на джаве или шарпе чтобы перекатиться в миддла на пхп?
Есть еще вопрос станет ли вообще миддл на джаве или шарпе перекатываться в пхп, но это вопрос риторический.
На пыхе прикольно mvp писать и что называется давать по съёбам когда время сдавать проект заказчику. Все остальное на пыхе говноработа. Долгие проекты это просто нужник куда срут мимокроки. Потому что в пыхокомпаниях экономия на всем, в том числе и на процессах разработки.
Если задача жизни кататься между ЯП и измерять производительность языков, то ты прав.
Ясен хуй и ты прав, что ява шарпы имеет реализацию всего, что общество возложило на программирование в целом. Но не всегда для того чтобы приварить 2 железки надо искать 5 осевой сварочный чпу станок.
>Но не всегда для того чтобы приварить 2 железки надо искать 5 осевой сварочный чпу станок.
Мой пойнт как раз в том что этот тезис тут не уместен. Да, кому-то нужно мыть толчки и быть ассенизатором. Но нахуя именно тебе этим заниматься? Как существование в мире ниши для пхп определяет твой выбор языка?
Бля, ты вообще понимаешь что в случае с джавой и шарпом это не выбор языка даже. А просто выбор маршрута в айти, который можно менять как хочешь. А в случае с пхп это именно выбор пхп болота.

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

576x304, 0:08
>Бля, я далеко не фанат пхп. Более того я бы не рекомендовал в него вкатываться вообще.
>А что с пыхой не так?
>У пхп очень специфичная и замкнутая экосистема. Вне пхп тебе оттуда пожалуй пригодится только знание ООП и умение обращаться с IDE.
>смена языка будет означать практически начало карьеры сначала.
>если поднапрячь сраку еще чуть чуть, потратить лишние пару месяцев, то можно стартануть с гораздо более высокой и удобной для карьеры позиции.
Если будучи вкатывальшиком поднапрячь сраку и потратить немного больше времени, то можно вкатиться не в пыху. И это будет более выгодный старт карьеры.
Дегенеративное хуйло, мне за тебя еще и тред читать?
Краткий пересказ треда, решебник для вкатывальщиков в пхп том первый.
Ну да, всего пару месяцев добавил и вот уже вкатился на кардинально другой уровень, а с опытом на пыхе и 4 месяцев не хватит и ваще сразу выгонят, лол, блять.
Еще раз - в каморку забейся обратно и не отсвечивай.

320x240, 3:19
Ебанько, каким хуем ты приплел мой вопрос про свап языков МИДДЛАМИ сука, к вкату на первую работу? Какая же блядь каша там у тебя в голове. Что надо употреблять чтобы не зная по теме нихуя блядь вообще, так самоуверенно нести какую-то хуйню?
Тебе там выше написал, как произойдет свап мидлами в реальной жизни, на что ты смог прокукарекать только
>с твоим говнокодом
>Опытный джавист вычисляет пхп макаку
>Не через сколько. За говнокод никто никого не выпихивает. Максимум первые месяца 3 в кодревью будет тебе срать. Но людей не увольняют за то что в кодревью много комментов. Главное одну и ту же ошибку по 100 раз не допускать.
>По табам вместо пробелов блять? Кодстайл в каждой и в большенстве случаев кодстайл тебе phpcs покажет где не тот.
>Да и к стилю придрочиться можно, первые задачи будут на онбоардинг, где ты будешь фиксить баги или копипастить.
>В кодинге самое сложное не сам язык освоить, а разобраться в том как громадная хуйня работает со всеми этими ебучими микросервисами, супервизорами и тд. И часто можно понять просто открыв мануал.
Не бля, на эту хуйню я всерьез отвечать не буду. Я канеш понимаю что тред для вкатывальщиков. Но если ты ни дня сука не работал, нахуя ты это пишешь? Как определит блядь. Так же как ты определишь на двощах залетного петуха с пикабу. Я же как-то определил что ты еще ни одного оффера в своей жизни не получал.
Да помню, тот самый пост где ты предлагал напиздеть в резюме и на собесе и просто притвориться что всю жизнь на джаве пишешь.
Предлагаю сразу притвориться архитектором или CTO. Хули там, таски в джире двигать и на митинги ходить, а зп больше.
>Да помню, тот самый пост где ты предлагал напиздеть в резюме и на собесе и просто притвориться что всю жизнь на джаве пишешь.
Ну да. Это База. Главное залезть.
Никто не сидит на проекте по пять лет. Может только тимлид. Да и то съебет года через три. Так оно устроено. Чел, который писал "делай мвп и съебывай" по сути прав. Все с кем я со старых работ контачу по несколько контор сменили.
Мне вот тоже пора перекатываться. После нового года пойду искать. Может высру че на гитхаб чтоб зп еще немного подогреть, может съебу наконец из рашки. Но сидеть пять лет на одном месте даже если это великолепнейшая, уютнейшая компания это самое хуевое что можно придумать.
>вы учите не то
>вы пишете не так
>вы работаете неправильно
Как же заебал этот бубнеж из каморки.

Это так. Ну два года. Ну край три. Пять лет это слишком дохуя.
Хочу уйти потому что в битриксе плотят меньше, ну и начались какие-то неприятные чувства, что вроде ты в айти, но вроде и где-то там кто-то там и вроде и никто ты вообще, не "трушный" веб-разработчик.
HTML, CSS, JS для внедрения верстки в БУС (верстать не надо), JS библиотеку БУСа (изучается в процессе работы), PHP, ООП, MVC (в БУС немного отличается от большинства), SQL, БУС ОРМ, composer, git, ssh, ftp, PhpStorm, ajax. Это для ждуна.
По сути, 60к в месяц получается 6к за 2 дня. Если 20 дней рабочих в месяце без выходных.
Бля, я даже на ноут скопить не могу, не говоря о тачке и квартиры

Вот тебе пара историй для мотивации.
Первый пхп джун. Пришел с какой-то фриланс помойки, где месяц писал на yii. За пол года освоился с симфони, заебал всех вопросами, купил тачку и потом успешно перекатился в другую контору на миддла. Щас уже тимлид, зашибает гораздо больше меня, но я ебал эти корпоративные игры, я код пишу.
Второй js джун. Пришел хз откуда, но опыта считай небыло. За пол года изучил vue, катался по тайландам на удаленке. Щас сеньор помидор в каком-то стартапе в мурике.
Ну пиздуй на завод. Там то тебе сразу 260 отваливать будут.
а что поделать, на языках для илиты работы нет, так что свободного времени много

Что это за залупа, постоянно вижу в документация, фреймворках, как оно работает?

Лучше напиши что стоит учить?
Сейчас Yii2 планирую + redis, а дальше что? Вот пишут микросервисы, а их как учить и делать? Ну на сколько хорошо нужно знать sql для мидла?
Легаси-говно, которое нужно было, когда в пыху еще не добавили нормальную типизацию.
IDE тебе потом подсвечивает вроде как что должно выходить на основе этих комментов. Еще может быть для рефлексии API. Там комменты указывают PHP что делать с этим куском кодом. reflectionAPI. Оно может код менять после тебя и запускать

угаманись
Идея хранить список декораторов в конфиге мне не нравится, так как при просмотре кода не очевидно, что они вызываются.
Аналогично, кстати, я не люблю "события" на сервере. Надо их избегать, так как опять же, код становится неочевидным. В Доктрине, например, есть события, в Симфони.
Ты предполагаешь, что человек один раз освоит PHP и никогда больше ничего учить не будет. А он может благодаря PHP найти работу, получить опыт и дальше развиваться в каком-то еще направлении, пока ты будешь ходить со своим Эликсиром по 2 с половиной собеседованиям с требованиями не менее 6 лет опыта.
> Потому что в пыхокомпаниях экономия на всем, в том числе и на процессах разработки.
Ну так иногда это и нужно. Заказчику нужна формочка для приема заказов, а не платить втридорога за проектирование, написание на каким-нибудь малоизвестном языке вроде Окамла, на который потом не найти разработчиков и под который придется досписывать библиотеки. Ему нужна формочка и PHP разработчик в разумные сроки и бюджет доставляет нужный продукт.
А когда бизнес вырастет, PHP разработчик освоит Го и перепишет тяжелые части на нем. Пока ты будешь со своими Окамлом и Эликсиром ходить по 2 с половиной собеседованиям.
(хотя в окамле и есть интересные идеи)
> джава
Это настолько продвинутый язык, что в нем нельзя сравнить 2 строки через ==.
> шарп
Ага, это под который нужно комп с виндой покупать. Плюс, как я понимаю, он коммерческий и значит под него если и есть какие библиотеки, то все платно и закрытое.
Что-то я не слышал особо о проектах на шарпе, кроме stackoverflow.
> Опытный джавист
Я вспоминаю как декомпилировал какое-то Андроид-приложение и постоянно были конструкции вроде
try {
someFunction();
} catch (e) {
return null;
}
такой код тоже опытные явисты пишут? Что-то у меня есть подозрение, что в мире Java не все так красиво, как ты описываешь. Хотя сам язык неплохой, но слишком многословный, и писать на нем мне не хочется.
> и потратить немного больше времени, то можно вкатиться не в пыху. И это будет более выгодный старт карьеры.
Не будет. Если один за 6 месяцев выучит PHP/веб, а другой (по твоим заверениям) за 8 месяцев Яву, то зарплату им дадут примерно одинаковую, так как для изучения обоих (по твоим заверениям) требуется примерно одинаковое кол-во усилий и на них примерно одинаковое кол-во кандидатов. Более того, если на Яву меньше вакансий, то это будет значить, что там больше кандидатов на одно место и можно продавить их на менее выгодные условия.
Потому что ты не можешь найти задачи с достойной оплатой и продать себя. Если бы ты пошел в крупную компанию, то у них есть менеджеры и продажники, умеющие продавать твои услуги и обеспечить тебе желаемый уровень дохода.
Это задача, по моему, на настройку вордпресса мышкой в админке. Оптимальным решением тут было бы не писать код, а подключить готовые плагины или библиотеки. Если у них самописный сайт, то конечно найти готовый плагин не получится, но это уже их проблема.
Это phpDoc - стандарт для написания комментариев и документации. Например, если ты будешь его использовать, то некоторые IDE будут показывать справку по функции при наведении на неё. Также, из этих комментариев можно сгенерировать документацию.
В общем, изучай.
Там вообще-то не только типизация, а еще документация. Я легко могу к функции или классу написать 10-15 строк описания.
Плюс, там можно указывать структуру массивов вроде SomeClass[] или array{x: int, y: string}.
>Там вообще-то не только типизация, а еще документация.
Ну я думаю, что он не совсем уж дебил и понял, что зелененькое - описание. Мне кажется его вопрос был именно про типизацию.
Хотя если он там че-то в исходниках фреймворков ПОСТОЯННО видит, но при этом до сих пор не понял, что это phpDoc, то хуй его знает...
>Пикрил КОНФИГ, а не код.
Мань, там конфиг не нужен.
Конфиг для декораторов не составляется никогда.
Если ты не понимаешь этого - значит ты не сталкивался с задачами где декоратор просто необходим. Пример такой задачи, которую этот пхпшник с видео почему-то не упомянул (ну, мы-то знаем почему проблема пхпшника в том, что он в силу малого опыта кругозора не может отличить говно от не говна а также не знает какие в жизни задачи реальны а какие выдуманы), - это заворачивание бд-операции в транзакцию.
def some_db_logic():
db.query("select for replace a from b")
db.query("replace b set a = c where hui")
и у тебя таких функций десятки по коду
и ты хотел бы каждую завернуть в транзакцию. тебе чтоб не писать begin перед и commit/rollback после каждой - ты делаешь декоратор
def transactional(f):
def inner():
db.begin()
try:
res = f()
db.commit()
except:
db.rollback()
return res
return inner
и затем пишешь просто
@transactional
def some_db_logic():
...
или как это делается в ruby, просто на блоках кода
ActiveRecord::Base.transaction do
david.withdrawal(100)
mary.deposit(100)
end
Никаких опций включения/выключения тут нет. Декораторы не включаются и не выключаются, они просто экономят код как и макросы. Никакого говна типа полного замещения логики исходной функции они не делают. И прочая, прочая. Пхпшник с видео с мудрым ебалом зачитал википедию, но ничего не рассказал о реальных примерах.
То что ты говоришь про включение/выключение логирования делается через фича-флаги. https://www.martinfowler.com/articles/feature-toggles.html
то есть просто
if feature.notify_manager:
log.info('хуё-моё')
декораторы тут нахуй не нужны.
> не отличаешь декорацию ОБЪЕКТА от ФУНКЦИИ
так декоратор и есть функция. по определению.
если есть функция f(args: T) -> result: U
то декоратор - это такая функция, которая принимает в себя f и возвращает функцию g с такой же сигнатурой что и f
decorator(f) -> (g(args: T) -> result: U)
в коде используешь так:
допустим у тебя есть функция
sum = fn(a, b) -> a + b
и где-то в коде ты пишешь
value = sum(1, 2)
когда ты хочешь задекорировать её - ты просто добавляешь
sum = logger(sum)
и в итоге получается
sum = fn(a, b) -> a + b
sum = logger(sum) // в этой строчке вся мякотка
value = sum(1, 2)
>Пикрил КОНФИГ, а не код.
Мань, там конфиг не нужен.
Конфиг для декораторов не составляется никогда.
Если ты не понимаешь этого - значит ты не сталкивался с задачами где декоратор просто необходим. Пример такой задачи, которую этот пхпшник с видео почему-то не упомянул (ну, мы-то знаем почему проблема пхпшника в том, что он в силу малого опыта кругозора не может отличить говно от не говна а также не знает какие в жизни задачи реальны а какие выдуманы), - это заворачивание бд-операции в транзакцию.
def some_db_logic():
db.query("select for replace a from b")
db.query("replace b set a = c where hui")
и у тебя таких функций десятки по коду
и ты хотел бы каждую завернуть в транзакцию. тебе чтоб не писать begin перед и commit/rollback после каждой - ты делаешь декоратор
def transactional(f):
def inner():
db.begin()
try:
res = f()
db.commit()
except:
db.rollback()
return res
return inner
и затем пишешь просто
@transactional
def some_db_logic():
...
или как это делается в ruby, просто на блоках кода
ActiveRecord::Base.transaction do
david.withdrawal(100)
mary.deposit(100)
end
Никаких опций включения/выключения тут нет. Декораторы не включаются и не выключаются, они просто экономят код как и макросы. Никакого говна типа полного замещения логики исходной функции они не делают. И прочая, прочая. Пхпшник с видео с мудрым ебалом зачитал википедию, но ничего не рассказал о реальных примерах.
То что ты говоришь про включение/выключение логирования делается через фича-флаги. https://www.martinfowler.com/articles/feature-toggles.html
то есть просто
if feature.notify_manager:
log.info('хуё-моё')
декораторы тут нахуй не нужны.
> не отличаешь декорацию ОБЪЕКТА от ФУНКЦИИ
так декоратор и есть функция. по определению.
если есть функция f(args: T) -> result: U
то декоратор - это такая функция, которая принимает в себя f и возвращает функцию g с такой же сигнатурой что и f
decorator(f) -> (g(args: T) -> result: U)
в коде используешь так:
допустим у тебя есть функция
sum = fn(a, b) -> a + b
и где-то в коде ты пишешь
value = sum(1, 2)
когда ты хочешь задекорировать её - ты просто добавляешь
sum = logger(sum)
и в итоге получается
sum = fn(a, b) -> a + b
sum = logger(sum) // в этой строчке вся мякотка
value = sum(1, 2)
кхм-кхм
>Декоратор (англ. Decorator) — структурный шаблон проектирования, предназначенный для динамического подключения дополнительного поведения к объекту. Шаблон Декоратор предоставляет гибкую альтернативу практике создания подклассов с целью расширения функциональности.
Он называет вынос повторяющегося кода в функцию декоратором, чи шо?
>А он может благодаря PHP найти работу
да не вопрос, а ещё можно битрикс раскачать или 1с админить и тоже будет работа. только это не про программирование.
Это пердёж мозгом, что для ООПешника абсолютно нормально.
ООПешник любит всё заворачивать в объекты с ебейшим оверхедом, в данном случае функциональность. И паттерн он связывает разумеется с объектами. Но суть декорирования касается только функциональности, ну ещё немного переменные захватываются.
def logging(f, level):
def inner(a, b):
log.write(level, "before f, a = {a}, b = {b}")
res = f(a, b)
log.write(level, "after f, sum = {res}")
return res
return inner
sum = fn (a, b) -> a + b
sum = logging(sum, "info")
value = sum(1, 2)
В ООП был бы оверхед строк на двадцать для объявления приватных полей, публичных полей, конструкторов, invoke-методов и прочего говна
>Но суть декорирования касается только функциональности, ну ещё немного переменные захватываются.
Ну неси ссылки на эту СУТЬ паттерна, а мы посмотрим. Если ты конечно не из своей больной головы все это высераешь.
Какие ссылки, ты что, ебанутый? Это очевидные вещи. Если ты конечно программировал на чём-то кроме пыхи и хтмл.
>Мань, там конфиг не нужен.
>Конфиг для декораторов не составляется никогда.
Ебанько, конфиг нужен не для декораторов, а для изменения поведения.
Есть опциональное поведение. Ты (еблан) его захардкодил. Теперь чтобы подрубить логи нужно лезть в код. Чел в видео (красавчик) сразу сделал задел для внешнего управления поведением. Теперь манагер может сам подрубать логгирование.
Обосрался обтекай, надо было видео внимательней смотреть, перед тем как высирать свой бред.
>Никаких опций включения/выключения тут нет. Декораторы не включаются и не выключаются
Никто не "включает декоратор", ебанько. Включается дополнительное поведение, которое реализуется с помощью декоратора. Даже если в настройках будет написано "не логгировать" декоратор будет работать, в любом другом месте кода декорируй и логгируй.
>это заворачивание бд-операции в транзакцию.
Бля, хуипутало. Ты бы хоть секунду потратил чтобы узнать что такое ларавель. Там охуитительная ОРМ, все заворачивается в транзакции, летает и пердит радугой.
>>513997
А теперь и мира говнокода на коленке переезжаем в реальный. https://www.section.io/engineering-education/custom-decorators-in-django/
Нихуя себе сходил за хлебушком. Как добавить декоратор в джанго инструкция в двух томах.
>Есть опциональное поведение. Ты (еблан) его захардкодил. Теперь чтобы подрубить логи нужно лезть в код. Чел в видео (красавчик) сразу сделал задел для внешнего управления поведением. Теперь манагер может сам подрубать логгирование.
Вот теперь объясни, зачем тут декораторы и в чём их суть, если достаточно простых ифов.
if logging_enabled {
log.info("бляпиздец before")
}
feature()
if logging_enabled {
log.info("бляпиздец after")
}
Шизик, хватит в портки дристать себе. Лучше таблеточки пропей какие-нить.
Так транзакции ты без ифов написал, ебанько. А тут с какого-то хуя именно на ифах надо.
Хватит троллить тупостью. Ну перепутал, не обратил внимания. Нахуя позориться дальше?
Ебанько, если я вручную задекорирую ДРУГОЙ объект в этом проекте, декоратор будет работать или нет?

ты не понял сути. кладу тебе последний раз за щеку, соси внимательно:
то что сделано на пикриле - делается ифами без всяких конфигов
if ($features->notify_user) {
$f = OrderUpdateDecoratorLogger::decorate($f)
}
if ($features->notify_managers) {
$f = OrderUpdateDecoratorNotifierManager::decorate($f)
}
и т.д.
речь была про то что пхпшник притащил за собой свой любимый оверхед
пробрось в текущий контекст как тебе удобно, хоть в аргумент, хоть в конструктор, хоть в замыкание
Пробросил тебе защеку. Один хуй конфиг будет, черт ебаный. А то что в ООП нужно каждый объект декорировать, так это везде так. В твоей функцианальной параше тоже только кажется что все изи, я выше скидывал сколько ебли с декораторами в джанго.

>то что в ООП нужно каждый объект декорировать, так это везде так
поэтому нахуй ООП
> я выше скидывал сколько ебли с декораторами в джанго
полистал, там краткая инструкция как выбрать комп, установить линукс, питон, джанго, сконфигурировать его, и в конце пару строк про декораторы.
я же написал как их делать (пикрил). они на самом деле настолько простые.
а в питоне для них сахар - если укажешь @decorator_name перед функцией - питон сам завернёт функцию в декоратор. но сахар - лишь сахар, можно и без него
чмоня, мы уже поняли, что это единственный номер, который ты умеешь показывать, не продолжай
>Один хуй конфиг будет
Ну пиши без конфига, так даже проще. Вообще, отключаемые логи - это гниль и параша. Ты не в курсе? Проблема логов в том, что они нужны ПОСЛЕ того как произошёл инцидент. То есть, их нужно держать включенными всегда, либо не расчитывать на них вовсе.
>черт ебаный
Ну ты представился, и я представлюсь: программист-наносек 16 лет стажа, пишу десятке языков, ещё десяток читаю.
>поэтому нахуй ООП
Ну вот. Мог бы не высирать столько постов по пол страницы и не показывать как там в питоне декораторы делаются.
Диагноз: имбецил.
>и не показывать как там в питоне декораторы делаются
могу не показывать если ты знаешь. но ты же не знаешь. неэрудированные нынче чмоньки пошли
>задекорирую ДРУГОЙ объект
блядь, декоратор объектов хуев.
да, будет работать, если сигнатура совместима
сигнатура - это совокупность типов и количества аргументов и типа результата
Ну так хули ты пиздишь что декоратор кто-то там включает и выключает? Если бы у декоратора было свойство "включен", тогда да. А так иди на хуй.
>если сигнатура совместима
>сигнатура - это совокупность типов и количества аргументов и типа результата
как же жалко это выглядит...
> что декоратор кто-то там включает и выключает?
код читал, чмоня? getEnabledSettings видел?
>Если бы у декоратора было свойство "включен", тогда да.
Видимо я не очень понял суть твоего жёванного вопроса, ты в следующий раз хуй изо рта до конца вынимай прежде чем что-то говорить.
Хватит вилять сракой, имбецил. Настройка включает отправку логов при обновлении заказа, а не декоратор.
Так что завали свое функциональное ебало и иди проспись от стекломоя, макака.
>Настройка включает отправку логов при обновлении заказа, а не декоратор
Какой пиздец. Настройка включает отправку логов путём включения или не включения декоратора в стек декораторов, ёбаный ты смешной.
>путём включения или не включения декоратора в стек декораторов
Бля, какие маневры сракой. "путем добавления в стек", чмоня. ЧТД.
Никто никаких декораторов не включал и не выключал, а ты попущен за свой гнилой пиздежь. Выкатывайся отсюда нахуй, обоссанный чушок. В питон тред тебя не посылаю, такие черти никому не нужны.
> флаг enabled есть
> код опирающийся на эти флаги есть
> но декораторы никто не включает и не выключает
яснопонятно
>Какой пиздец. Настройка включает отправку логов
> но декораторы никто не включает и не выключает
Шизофреник, хватит троллить тупостью. Просто съеби.

Вот ты вроде начал правильно писать, а дальше пошел совсем неграмотный код. После rollback нужно пробросить исключение дальше, а не выходить как ни в чем не бывало.
> или как это делается в ruby, просто на блоках кода
Точно такой же подход с коллбеками есть и в Доктрине:
$dbal->transactional(function () {
});
А в Питоне нет удобных анонимных функций, поэтому вместо коллбеков используют with.
> так декоратор и есть функция.
Не обязательно. Ты просто кроме декораторов из Питона не воспринимаешь других декораторов. Декоратор может быть и объектом с методами enter/exit, и кстати, даже в Питоне такие декораторы есть (это менеджеры контекста).
Ну ты глупенький. Писать формочку на PHP — это не программирование, а на Руби или Эликсире или Яве это уже программирование, да?
Ну давай я тогда скажу что писать код руками это не программирование. Программист это тот, кто проектирует нейросеть, чтобы она сама за него писала код, а все остальные жалкие формошлепы независимо от языка.
На 1С точно так же можно программировать, да, язык там скорее всего поганый, но это все равно программирование.
Писанины много получается. Идея декоратора в том, что ты один раз его пишешь и подключаешь в 20 местах, вместо того чтобы копипастить туда 40 ифов.
>>514012
Справедливости ради, это какой-то переусложненный код. Я не понимаю, почему декораторы указываются в конфиге, а не в самом коде. В конфиг выносят параметры, которые планируется менять, а не куски кода. То есть, если тебе надо отключать логгирование, то ты делаешь в конфиге параметр enable_log, а не подключаешь декоратор.
В данном примере, как я понял, мы делаем разные действия в зависимости от роли пользователя, редактирующего заказ. Это было бы проще сделать в самом коде с помощью if + при необходимости вынести какие-то параметры в конфиг. Так в коде было бы проще разобраться, а в данной реализации сначала придется отреверсить реализацию декораторов, чтобы понять, как оно работает.
Смысл декоратора в том, что ты можешь его в 20 местах применить, а не в том, чтобы разбить процесс оформления заказа на 20 файлов.
В Питоне декораторы реализованы удачно, а тут просто получился переусложненный код (но у Питона есть много недостатков, например, производительность. Глупо менять язык только ради декораторов, которые не так и нужны).
> Смысл декоратора в том, что ты можешь его в 20 местах применить, а не в том, чтобы разбить процесс оформления заказа на 20 файлов.
Хотя тут я немного приврал. В ООП часто декораторы не переиспользуемые, например, в HTTP-клиенте с помощью декораторов реализуют логгирование/кеширование/сжатие и эти декораторы нельзя нигде переиспользовать, в логгерах декораторами могут реализовать какую-то обработку логов.
> как вы думаете, то, что на капче цифры разноцветные, облегчает или усложняет ее взлом?
Слишком сложные материи для пхпшников. Мы о таком не думаем.
Не меняет сложности, самая важная задача это сегментирование, а там уже несложно распознать.
>После rollback нужно пробросить исключение дальше
да
>Точно такой же подход с коллбеками есть и в Доктрине
да
>в Питоне нет удобных анонимных функций
да. там есть однострочные лямбды, либо локально определяемые вложенные def, они получаются не анонимными, но в принципе жить с этим можно
>Декоратор может быть и
да, идей может быть много, и реализации могут быть разными. можно оборачивать поведение во что-либо, можно подменять контекст выполнения, переменные окружения и так далее. базовых приёмов немного, остальное - их комбинации.
Цвет для людей, при обработке картинка переводится в чб, потому что цвет не дает никакого дополнительного смысла.
>Писать формочку на PHP — это не программирование, а на Руби или Эликсире или Яве это уже программирование, да?
На руби/эликсире/яве ты работаешь с более богатой семантикой и виды решаемых задач шире, это ведь языки общего назначения. К тому же из-за лаконичного синтаксиса у программиста остаётся больше времени и сил на мышление на тему ЧТО он делает вместо КАК.
>Писанины много получается. Идея декоратора в том, что ты один раз его пишешь и подключаешь в 20 местах, вместо того чтобы копипастить туда 40 ифов.
>
Ответ принимается
>Справедливости ради, это какой-то переусложненный код.
Да, я об этом и говорил. Пример переусложнён. Естественным образом напрашивающийся пример не показан. Когда декораторы нужны а когда нет - не объяснено, просто зачитан текст из трёх разных источников.
Ты говорил о том, что это все хуета, что пхпшники долбоебы, что нужно уебывать из профессии.
А потом съехал на
>пуньк-среньк пример переусложнен
Когда тебя немного по полу еблетом повозили
Ты опять выходишь на связь мудило? Пример переусложнён потому что его писал пхпшник, что непонятно?
Он переусложнен, потому что это урок про паттерны проектирования, а их никто толком не понимает и потому делают такие переусложненные примеры.
Есть такая фраза: "не умеешь сам - учи других". Вот по-моему это прямо в десятку именно про сферу программирования.
Все эти, если так можно сравнить, продавцы лопат для искателей золота выучили может синтаксис и какие-то простые примеры. Но очевидно, что для программирования нужно нечто большее. Иначе зачем толкать эти курсы (всегда с большими скидками, как вы наверняка замечали), если сами могли бы 300к/нс зарабатывать и избегать демпинга профессии вдобавок.
В том то и дело что чел на видео все умеет. Все претензии петухонеров в итоге свелись к тому что:
1) Язык говно.
2) В ПОСЛЕДНЕМ примере урока чел немного вышел за рамки темы и показал более сложные вещи.
Даже если пхп говно, это не делает урок говном. Грамотная речь, разобрано сразу несколько определений паттерна. Для пхп как языка показанные примеры на 100% корректны как семантически, так и идиоматически. Отличное видео. Уверен, что возьмись автор за уроки по питону тоже все отлично сделает.
Просто петуховен ебанько невнимательно посмотрел видео и рвался пол треда роняя кал.
На 5:10 звучит фраза: "Можем выполнить за неделю, а можем за два дня. Если за два дня - то мы разрешаем себе говнокодить и говнокодим."
Этой фразы в общем достаточно чтобы понять уровень ДАфанасьева - мидл не выше среднего.
В чём тут дело? Грейд программиста теснее всего связан с неким минимальным уровнем качества. У каждого программера есть предельный уровень говна в коде, выше которого он не поднимется будь сонным, обдолбанным или в адской спешке.
Я например уже и слово-то такое забыл, у меня просто нет понятия "сейчас пишем говно, а потом перепишем нормально", да и оглядываясь назад, никогда к этому разделению не стремился. Почему это важно? Потому что жизнь показывает, что если человек не умеет писать красиво - то он и отрефакторить не сможет сколько времени ему ни дай. Это происходит потому что стиль и принципы написания становятся ОСНОВНОЙ привычкой. Вы либо умеете писать некрасиво, либо умеете писать красиво, и это два конфликтующих навыка.
Аналогия - предложить школьнику написать в тетради сначала хуёвым почерком, а потом переписать красиво. Ни один учитель никогда не будет разделять эти навыки потому что если научишь писать ученика хуёвым почерком - потом хуй переучишь. Поэтому школьники сперва учатся писать ровные буквы, потом корректные предложения.
То же самое при любом моторном навыке - игре на музыкальных инструментах, занятии спортом и тд - сперва учимся делать медленно и правильно, и только потом - быстро. Если ты запечатлел саму технику неправильно - ты её неправильную и закрепишь.
А в пых-программировании почему-то считается что можно быстро наговнякать, а потом исправить. Хуй, ребятки. Чтобы исправить - нужно понимать глубинные вещи, а если ты их понимаешь - то сразу хорошо напишешь.
Вот прекрасная иллюстрация https://youtu.be/E8_dcn1k9aA на 9:20. Соискатель не отрефачил код и обосновал это фразой "мне что, весь проект отрефакторить?", что говорит о том, что проект находился в уёбищном состоянии, и все с этим жили. Ну живите дальше, чо.
Кстати, котятки, вы знаете, что для скорейшего вката нужно выучиться слепому десятипальцевому набору? Это ещё до любого ЯП.
На 5:10 звучит фраза: "Можем выполнить за неделю, а можем за два дня. Если за два дня - то мы разрешаем себе говнокодить и говнокодим."
Этой фразы в общем достаточно чтобы понять уровень ДАфанасьева - мидл не выше среднего.
В чём тут дело? Грейд программиста теснее всего связан с неким минимальным уровнем качества. У каждого программера есть предельный уровень говна в коде, выше которого он не поднимется будь сонным, обдолбанным или в адской спешке.
Я например уже и слово-то такое забыл, у меня просто нет понятия "сейчас пишем говно, а потом перепишем нормально", да и оглядываясь назад, никогда к этому разделению не стремился. Почему это важно? Потому что жизнь показывает, что если человек не умеет писать красиво - то он и отрефакторить не сможет сколько времени ему ни дай. Это происходит потому что стиль и принципы написания становятся ОСНОВНОЙ привычкой. Вы либо умеете писать некрасиво, либо умеете писать красиво, и это два конфликтующих навыка.
Аналогия - предложить школьнику написать в тетради сначала хуёвым почерком, а потом переписать красиво. Ни один учитель никогда не будет разделять эти навыки потому что если научишь писать ученика хуёвым почерком - потом хуй переучишь. Поэтому школьники сперва учатся писать ровные буквы, потом корректные предложения.
То же самое при любом моторном навыке - игре на музыкальных инструментах, занятии спортом и тд - сперва учимся делать медленно и правильно, и только потом - быстро. Если ты запечатлел саму технику неправильно - ты её неправильную и закрепишь.
А в пых-программировании почему-то считается что можно быстро наговнякать, а потом исправить. Хуй, ребятки. Чтобы исправить - нужно понимать глубинные вещи, а если ты их понимаешь - то сразу хорошо напишешь.
Вот прекрасная иллюстрация https://youtu.be/E8_dcn1k9aA на 9:20. Соискатель не отрефачил код и обосновал это фразой "мне что, весь проект отрефакторить?", что говорит о том, что проект находился в уёбищном состоянии, и все с этим жили. Ну живите дальше, чо.
Кстати, котятки, вы знаете, что для скорейшего вката нужно выучиться слепому десятипальцевому набору? Это ещё до любого ЯП.
>Вот прекрасная иллюстрация https://youtu.be/E8_dcn1k9aA на 9:20.
>Соискатель не отрефачил код и обосновал это фразой "мне что, весь проект отрефакторить?", что говорит о том, что проект находился в уёбищном состоянии, и все с этим жили. Ну живите дальше, чо.
Читаю пост чепуха, который вместо того чтобы дать ссылку на видео с таймстампом пишет время рядом. Что говорит о том что он либо не умеет этого делать, и учиться не хочет, либо ленивое хуйло. А тупое ленивое хуйло можно вообще не читать. Как тебе логическая связь? Заметил что тут она есть, а в примере "отказался рефакторить свой код" => "чужой код не отрефакторен" логической связи нет?
Чел рассказывает мнение о техническом долге Уорда Каннингема. Это не его идеи, он просто рассказывает чужой способ посмотреть на проблему. Ты выдергиваешь какую-то хуйню из высказываний двадцатилетней давности и выдаешь её за жизненное кредо автора видео просто потому что автор тебе рассказал что "вот кто-то вот так считает".
Плохо доебываешься, тупо. Давай ищи где он откровенную хуйню в коде написал, тогда пиши. Таймстамп не забудь, десятипальцевый.
Блаженный...
Я что-то понять не могу.
1 - Что означает слово возвращает? Куда возвращает? Показывает будет являться синонимом?
Возвращаемые значения ¶
Функция не возвращает значения после выполнения.
Как это понять?
____
Если length положительный, возвращаемая строка будет не длиннее length символов, начиная с параметра offset (в зависимости от длины string).
Если параметр length опущен или null, то будет возвращена подстрока, начинающаяся с позиции, указанной параметром offset и длящейся до конца строки. - как это расшифровать?
Как это понять? Почему длина положительная или отрицательная?
не длиннее length символов, начиная с параметра offset - тут вообще запутался.
>Как это понять?
Учись гуглить. Ответы на эти вопросы есть по первой ссылке на твоем же этом хекслете.
>как это расшифровать?
Тут нечего расшифровывать. Если так сообразить не можешь - поэксперементируй с разными значениями в онлайн редакторе каком-нить.
>Почему длина положительная или отрицательная?
Там все написано. Играйся с кодом, пробуй.
Нет, не показывает, а именно возвращает. Когда ты вызываешь функцию, она возвращает какое-то значение и ты можешь его сохранить в переменную, вывести на экран, передать в другую функцию и тд. Вот здесь пример, где мы вызываем функцию some_function и сохранем значение, которое она вернет, в переменную $x:
$x = some_function();
А здесь мы выводим это значение:
echo some_function();
> Как это понять? Почему длина положительная или отрицательная?
Длина строки не может быть отрицательной, но ты можешь передать в функцию отрицательное число в параметре length. В этом случае отрицательное число вопринимается не как длина, а как отступ от конца строки.
То есть, если мы передаем в offset или length отрицательное число, то это значит "отсчитать указанное число символов от конца строки". Например, offset = -5 значит "взять подстроку, начиная с 5-го символа от конца строки".
Посмотри примеры кода там.
Также, функция substr не работает корректно с не-латинскими символами. Используй mb_substr вместо неё.
>Куда возвращает?
где спиздила - туда и возвращает
щютка
когда ты делаешь
fn a() {
print b() // переход в функцию б отсюда
}
fn b() {
// сюда
return 123;
// возврат из функции в место вызова
}
чтобы понять что такое "возвращает" нужно понимать, что при выполнении программы у исполняющей машины есть указатель на оператор который исполнится следующим. когда ты вызываешь функцию - указатель перемещается в вызываемую функцию, а по окончании функции возвращается в исходное место. вместо с указателем возвращается и значение, которое функция возвращает и как бы подставляется вместо вызова функции. код из примера выше будет выглядеть как бы вот:
fn a() {
print 123
}
в точку вызова b() подставится значение, которое вернула функция b
Разве для какой-то лоховской капчи.
Если символы перекрываются, есть деформации и всякий мусор поверху, то нихуяшеньки он тебе не упростит.
Мы говорим про капчу на этом сайте, а не про какую-то.
Кстати, тут цифры похоже просто из нескольких шрифтов берутся даже без всяких деформаций.
>причем тут фн а?
просто пример кода из которого происходит вызов функции b. Можешь назвать её fn main. Важно что ты вызываешь функцию b, ей передаётся управление, функция b делает что-то, а потом возвращает управление в точку где она была вызвана.
Понял. А что такое вызов? Синоним - просто написать функцию? В твоем примере это принт б?
То есть у нас была принт б. у неё было управление.
потом мы написали фн б. ей передалось управление. она все посчитала и вернула в принт б.
Так?

480x360, 7:32
Бля, твои вопросы из разряда "почему трава зеленая". Тебе отвечаешь и возникает новое "почему", и так пока до кварков не дойдешь. Видео релейтед.
Для начала нужно понять как "работает" программа. Код написанный тобой преобразуется в строгую последовательность команд. Каждая функция это последовательность команд в оперативной памяти. И каждая функция это отдельная программа. Твоя программа (функция) печатающая "Хелло ворлд" и совершенно равноправная с ней программа (функция) "substr". Обе хранятся в памяти по разным адресам.
Последовательность команд (функция (программа)), которые прямо сейчас выполняются (execute) процессором называется "control flow" https://en.wikipedia.org/wiki/Control_flow
Для того чтобы выполнить (execute) другую последовательность команд (функцию (программу)) нужно обратиться (call) к участку памяти, в котором она хранится.
Поскольку выполняться (execute) при этом начинают команды другой (функции (программы)), то считается что control flow перешел к выполняемой функции.
Переход control flow к функции происходит сам собой, просто из факта того что она сейчас выполняется. Однако нужно определить что будет выполняться после. Куда, в какую область памяти нам вернуться вернуться (return) чтобы корректно продолжить выполнение.
Для того чтобы знать кто кого вызвал (call) и куда потом вернуть (return) control flow используется call stack https://en.wikipedia.org/wiki/Call_stack , который вот совпадение также называют execution stack, program stack, control stack.
Вот тебе исчерпывающий ответ почему так нахуй. Так сложилось исторически. Так перевели эти термины на русский. Разумеется в пхп все не совсем так, или даже совсем не так. Но это уже другая история.
Мне кажется, проблема в том, что ты просто не понял, что такое функция. Давай начнем с основ.
Значение — это вещь, которую может обрабатывать программа. Например, числа и строки — это значения, и программа может как-то с ними работать, например, складывать числа, или разрезать строки на части. Вот пример кода:
$a = 4;
$b = 'x';
Здесь мы записываем в переменную $a значение 4, а в $b значение 'x' (строку). А вот пример, как можно преобразовать одно значение в другое:
$a = 4;
$b = $a + 1;
Здесь во второй строчке мы берем значение 4, прибавляем к нему 1 и получаем значение 5, которое мы записываем в $b.
Функция это кусочек программы, который можно вызвать. При вызове мы можем передать в функцию какие-то значения, а функция после завершения может вернуть какое-то значение. То есть, функция берет какие-то значения, преобразует их как-то и возвращает результат. В PHP есть много встроенных функций, а также ты можешь создавать свои функции.
Чтобы вызвать функцию, мы пишем ее название, а затем круглые скобки, в которых через запятую указываем передаваемые в функцию значения:
mb_substr("hello", 2);
В данном примере кода мы вызываем функцию mb_substr и передаем в нее два значения: "hello" и 2. Эта функция возвращает строку "llo" (то есть, часть строки hello, начиная со 2-го символа), но мы никуда не сохраняем это значение и оно просто выкидывается.
Вот как мы можем сохранить возвращенное функцией значение в переменную:
$x = mb_substr("hello", 2);
Здесь функция mb_susbtr возвращает строку "llo" и она записывается в переменную $x. То есть, код выше примерно эквивалентен такому коду:
$x = "llo";
Разумеется, возвращаемое функцией значение можно записать не только в переменную, но и передать в другую функцию. Вот пример, где мы отрезаем часть строки функцией mb_substr, и передаем эту часть в функцию mb_strlen (которая считает длину строки):
$x = mb_strlen(mb_substr("hello", 2));
Здесь мы сначала вызвыаем функцию mb_substr, она возвращает значение "llo", и затем мы вызываем функцию mb_strlen, передавая в нее эту строку. Функци mb_strlen вернет значение 3, которое мы запишем в переменную $x.
Если ты пишешь свою функцию, то возвращение значения из функции делается командой return.
Мне кажется, проблема в том, что ты просто не понял, что такое функция. Давай начнем с основ.
Значение — это вещь, которую может обрабатывать программа. Например, числа и строки — это значения, и программа может как-то с ними работать, например, складывать числа, или разрезать строки на части. Вот пример кода:
$a = 4;
$b = 'x';
Здесь мы записываем в переменную $a значение 4, а в $b значение 'x' (строку). А вот пример, как можно преобразовать одно значение в другое:
$a = 4;
$b = $a + 1;
Здесь во второй строчке мы берем значение 4, прибавляем к нему 1 и получаем значение 5, которое мы записываем в $b.
Функция это кусочек программы, который можно вызвать. При вызове мы можем передать в функцию какие-то значения, а функция после завершения может вернуть какое-то значение. То есть, функция берет какие-то значения, преобразует их как-то и возвращает результат. В PHP есть много встроенных функций, а также ты можешь создавать свои функции.
Чтобы вызвать функцию, мы пишем ее название, а затем круглые скобки, в которых через запятую указываем передаваемые в функцию значения:
mb_substr("hello", 2);
В данном примере кода мы вызываем функцию mb_substr и передаем в нее два значения: "hello" и 2. Эта функция возвращает строку "llo" (то есть, часть строки hello, начиная со 2-го символа), но мы никуда не сохраняем это значение и оно просто выкидывается.
Вот как мы можем сохранить возвращенное функцией значение в переменную:
$x = mb_substr("hello", 2);
Здесь функция mb_susbtr возвращает строку "llo" и она записывается в переменную $x. То есть, код выше примерно эквивалентен такому коду:
$x = "llo";
Разумеется, возвращаемое функцией значение можно записать не только в переменную, но и передать в другую функцию. Вот пример, где мы отрезаем часть строки функцией mb_substr, и передаем эту часть в функцию mb_strlen (которая считает длину строки):
$x = mb_strlen(mb_substr("hello", 2));
Здесь мы сначала вызвыаем функцию mb_substr, она возвращает значение "llo", и затем мы вызываем функцию mb_strlen, передавая в нее эту строку. Функци mb_strlen вернет значение 3, которое мы запишем в переменную $x.
Если ты пишешь свою функцию, то возвращение значения из функции делается командой return.
Давай разберемся с тем, что такое "поток управления" или control flow. Как известно, программа — это последовательность команд (инструкций). Поток управления — это порядок, в котором выполняются команды. PHP по умолчанию выполняет команды сверху вниз строго по очереди:
$a = 2; // команда 1
$b = 3; // команда 2
В программе выше PHP сначала выполнит команду 1, а потом команду 2. Но в некоторых случаях программа может выполняться не последовательно. Например, команды вроде if позволяют пропускать выполнение некоторых команд, а цикл for позволяет выполнять одни и те же команды много раз:
$a = 1; // команда 1
if ($a == 3) { // команда 2
$b = 2; // команда 3
}
В этом примере PHP пропустит команду 3, так как условие в if не выполняется.
С функциями поток управления получается еще более сложный. Рассмотрим пример:
function a() { // команда 1 "создать функцию a"
echo "Yes"; // команда 2
}
$a = 1; // команда 3
a(); // команда 4 "вызвать функцию a"
$b = 2; // команда 5
a(); // команда 6 "вызвать функцию a"
Эта программа выполняется так:
- сначала выполнится команда 1 "создать функцию a" и PHP создаст новую функцию a. При этом команды внутри функции (например, echo) пока не выполняются.
- затем PHP выполняет команду 3
- затем PHP выполняет команду 4. Это команда "вызвать функцию a" и PHP начнет выполнят команды в теле функции a
- затем PHP выполняет команду 2 из функции a
- затем функция заканчивается и PHP возвращается обратно к тому месту, из которого мы вызвали функцию, и продолжает выполнять код
- PHP выполняет команду 5
- затем PHP выполняет команду 6 и снова заходит в функцию a
- он выполняет команду 2
- затем PHP возвращается из функции обратно, но больше команд нет и программа на этом завершается
Вот эта вот последовательность и есть "поток управления". То есть, поток управления — это порядок, в котором выполняются команды в программе. В случае с функциями он получается довольно сложный.
> А что такое вызов?
"Вызов" это команда выполнить функцию (команда выполнить записанные в функции команды). Чтобы вызвать функцию, мы пишем ее имя и круглые скобки, в которых можно указать (а можно не указывать) аргументы, которые мы хотим передать в функцию:
x();
mb_strlen("hello");
> Синоним - просто написать функцию?
Это не синоним, так как "команда выполнить функцию" это не то же самое, что "написать".
Давай разберемся с тем, что такое "поток управления" или control flow. Как известно, программа — это последовательность команд (инструкций). Поток управления — это порядок, в котором выполняются команды. PHP по умолчанию выполняет команды сверху вниз строго по очереди:
$a = 2; // команда 1
$b = 3; // команда 2
В программе выше PHP сначала выполнит команду 1, а потом команду 2. Но в некоторых случаях программа может выполняться не последовательно. Например, команды вроде if позволяют пропускать выполнение некоторых команд, а цикл for позволяет выполнять одни и те же команды много раз:
$a = 1; // команда 1
if ($a == 3) { // команда 2
$b = 2; // команда 3
}
В этом примере PHP пропустит команду 3, так как условие в if не выполняется.
С функциями поток управления получается еще более сложный. Рассмотрим пример:
function a() { // команда 1 "создать функцию a"
echo "Yes"; // команда 2
}
$a = 1; // команда 3
a(); // команда 4 "вызвать функцию a"
$b = 2; // команда 5
a(); // команда 6 "вызвать функцию a"
Эта программа выполняется так:
- сначала выполнится команда 1 "создать функцию a" и PHP создаст новую функцию a. При этом команды внутри функции (например, echo) пока не выполняются.
- затем PHP выполняет команду 3
- затем PHP выполняет команду 4. Это команда "вызвать функцию a" и PHP начнет выполнят команды в теле функции a
- затем PHP выполняет команду 2 из функции a
- затем функция заканчивается и PHP возвращается обратно к тому месту, из которого мы вызвали функцию, и продолжает выполнять код
- PHP выполняет команду 5
- затем PHP выполняет команду 6 и снова заходит в функцию a
- он выполняет команду 2
- затем PHP возвращается из функции обратно, но больше команд нет и программа на этом завершается
Вот эта вот последовательность и есть "поток управления". То есть, поток управления — это порядок, в котором выполняются команды в программе. В случае с функциями он получается довольно сложный.
> А что такое вызов?
"Вызов" это команда выполнить функцию (команда выполнить записанные в функции команды). Чтобы вызвать функцию, мы пишем ее имя и круглые скобки, в которых можно указать (а можно не указывать) аргументы, которые мы хотим передать в функцию:
x();
mb_strlen("hello");
> Синоним - просто написать функцию?
Это не синоним, так как "команда выполнить функцию" это не то же самое, что "написать".

Есть те, кто курсы проходил?
Что скажите про loftschool и htmlacademy? Посоветуйте школу какую-нибудь, именно по пыхе.
Если хотите найти чтото новое,а может кого то....хотите почувствовать краски жизни,то Вам сюда.Очень позитивные ребята,новая кровь нашей жизни.....не хочешь отстать от ритма большой индустрии,то ты знаешь теперь куда тебе)))))))
Я вроде понял. А вроде нет.
<?php
function skr()
{
$drg = 5 + 5;
return $drg;
}
skr();
И вот почему не выводится цифра 10? Я создал свою функцию. Сделал переменную. И с помощью ретурна вернул ей значение. Почему не работает то ничего?
Блин, у вас информатики нет что ли в школе? Сейчас она вроде чуть ли не с 5 класса, там же эти азы объясняют.
В мое время было только 10-11 классы и я точно помню там объяснялись такие базовые концепции.
Если функция возвращает значение, то ты можешь с ним работать дальше, использовать каким-то образом, например $a = sin(90). И дальше его суммировать, умножать и тд.
А если функция просто выводит что-то( там внутри в конце echo вместо return), то будет просто выведено значение и ничего с ним ты сделать не сможешь.
сделай print(skr());
Так я отучился уже сто лет назад)
то есть я могу создать свою функцию, написать всякие значения. (пока не знаю какие, ну пусть будет умножение)
и просто напишу return и моя функция заработает, потому что мои значения умножения благодаря return заработают?
function skr()
{
$drg = 5 + 5;
print($drg);
return $drg;
}
skr();
Я написал print($drg);
Мне вывело 10. Вроде бы хорошо. Но потом я убрал return$drg. И ничего не изменилось. Все так же 10 выдает. Как он без возвращения возвращает?
вот из-за таких как ты, я и советую вкатышам учить с++
Возвращаемое значение, значит для программы дальше оно может использоваться. Выводимое - это чисто для пользователя на экране.
Потому что у тебя нет команды вывода (echo). Потому и не выводится. Когда ты пишешь
skr();
то результат функции никак не используется и потому не выводится, а просто выбрасывается. Чтобы он вывелся, надо этот результат вывести с помощью команды echo:
echo skr();
Сам PHP без твоей команды ничего не выводит.
Ты не там поставил print. Ты выводишь значение переменной, а не то, что вернет функция. Потому он работает и без return.
А вот если ты сделаешь
print(skr());
То тогда будет работать только с return.
> Я создал свою функцию.
Верно
> Сделал переменную.
Верно
> И с помощью ретурна вернул ей значение.
Неверно. return возвращает значение из функции. То есть команда
return $drg;
значит "закончить выполнение функции (выйти из нее), продолжить выполнение программы с того места, где была вызвана функция, и вернуть число 10".
То есть return ничего не записывает в твою переменную. Он берет из нее значение и ставит его как "возвращаемое функцией значение". Если бы ты написал
echo skr();
то функция бы вернула 10 и echo бы вывел это значение.
https://dropmefiles.com/EalGE
Пароль 123, хостинг сам запаковал по второму разу почему-то, хотя я не указывал ни архивации, ни пароля.
а берет он из функции значение или из переменной ?
я вот тут ещё написал. почему столько ошибок то
<?php
function sr($number1, $number2)
{
$number1 = 3;
$number2 = 5;
return (string) $number1 * $number2;
}
print_r(sr($number1, $number2));
function sg()
{
print_r('tek');
return 'tek';
}
print_r(sg() . sr($number1, $number2));
Через денек тебе уже просто отвечать не будут, чел. Невозможно таким тугим быть. Да ладно еще тугим - хер с ним. Но сам-то попробуй хоть как-то подумать, почитать что-то.
Хотя, сдается мне, ты просто разводишь местных сеньеров-помидоров.
> а берет он из функции значение или из переменной ?
"он" это return?
Команда return используется так:
return выражение;
Выражение — это может быть число, строка, переменная, математическая формула, вызов другой функции. Return вычисляет значение выражения, выходит из функции и возвращает полученное значение. пример:
return 5; // возвращает 5
return $x + 1; // возвращает значение переменной $x плюс один (переменная $x при этом не меняется)
return some_func(); // вызывает функцию some_func, и возвращает то, что она вернула
Ошибки из-за того, что ты не разобрался с "областью видимости" переменной. "Область видимости" это кусок программы, в котором переменная "видна" и с ней можно работать. За пределами области видимости переменная не видна и при обращении к ней произойдет ошибка.
Переменные, созданные снаружи функции, называются глобальными. К ним можно обращаться только снаружи функций (а из функции нельзя). Они существуют с момента создания и до завершения программы.
Переменные, созданные внутри функции (включая аргументы функции), называются локальными. К ним можно обращаться только внутри этой функции, и они уничтожаются при выходе из функции (то есть, если ты вызвал функцию 2 раза, то во второй раз там будут созданы новые копии переменных, не имеющие ничего общего с предыдущими).
Тебе это может показаться запутанным, но такой подход улучшает качество кода. Если бы видимость переменных не была ограничена, и к ним можно было бы обращаться откуда угодно, то в большой программе можно было бы в одном месте кода нечаянно перезаписать переменную, использующуюся в другом месте кода. А с областями видимости, даже если 2 функции используют переменную с одинаковым именем, то это будет 2 разных переменных и одна никак не влияет на вторую.
Ты в коде пытаешься обратиться к локальным переменным снаружи функции.
Вот пример областей видимости:
$x = 1;
// здесь видна $x
function test()
{
$y = 1;
// здесь видна $y и не видна $x
echo $y;
}
// здесь видна $x и не видна $y
echo $x;
Вот тебе еще в помощь мануал: https://www.php.net/manual/ru/language.variables.scope.php
>>516116
Почему же, я отвечу. Но посоветую также почитать учебник из шапки, где многие вещи объясняются.
Вызов функции ето база, и ето главное. Это понимаешь как вызов ментов, ну если там кипишь какой порезали его если значит, то не западло вызвать. Врачи сами вызовут их. Вот и функции, они вечные функции. Их тоже можно вызвать. Позвать так тихонько.
А еще внутри у ней переменные разные. Ето функции если возвращают, то еще возвратные переменные есть. Вот они кароче и возвращаются. И когда взываешь примерно так можно почувствовать что они идут оттуда изнутри.
Обращайся еще за гайдами, братишка. Нам в пхп такие толковые как ты нужны.

Я напилсо и решил написать вам мотивирующий пост.
Работаю РНР-программером за 350КР. Эо на одной работе. Есть ещё вторая.
Помимо РНР, нужные навыки:
SQL, JS, HTML/CSS, Bootstrap/React/Angular, Английский язык UE+, Git, RabbitMQ, Memchache, Smarty, Slim, Twig, Symfony/Laravel.
+ софт скиллс (не быть быдлом).
Это на зарплатку в 350. Дерзайте. Вполне реально, особенно сейчас (когда все программеры свалили).
Спасибо за подробное объяснение!
Я до областей видимости ещё не доходил)
,,,
Ещё такой вопрос. <?php
function greeting()
{
print_r('Hello, Hexlet!');
}
Принт р тоже же возвращает значение из этой функции?
Там просто написали - Функции trim() и strtolower() ничего не печатают на экран (в консоль), они возвращают результат своей работы, и поэтому мы можем записать его в переменные. Если бы они вместо этого печатали на экран, мы бы не могли присвоить результат их работы переменной. Как мы не можем сделать с определенной выше функцией greeting()
Так вот. Принт-р печатает на экран. Но результат работы переменной то присваивается ?
У меня сложилось иное впечатление, всем похуй на вкатышей по-прежнему, что-то я за этот год тут по-моему только 1 упоминание видел, что на работу кто-то устроился. Все эти 350к вакансии это наносеков переманивать с одного места на другое.
Тебе реально надо с самых азов начинать. Что такое переменная и присваивание, например. У тебя в функции нет ни переменных, ни присваивания.

Дрписываю.
>> Есть ещё вторая.
всё по ТК РФ! Ознакомьтесь -- полезно!
>> Помимо РНР, нужные навыки:
Забыл добавить базовые вещи: ООП, SOLID, навыки администрирования Unix/Docker/и может быть, Kubernetses. Туда же Jenkins и прочее CI/CD.
Это поможет вам выйти на базовую зарплатку в 300+ килорублей.
>>516370
Для вкатышей -- да, отдельные условия. Они обязаны учиться по 7+ лет на практике.
Тогда и познают перечисленные технологии.
В остальном, всё что я написал -- верно.

Я пошёл спать! :)
А мессадж мой: если будете упорно изучать РНР + разработку ПО в целом, вполне можете иметь зарплатки по 350+.
Удачи вам! Не сдавайтесь! Работы полно! 80% всех сайтов на РНР.
Спокойной ночи!
Мож ты рисуешь хорошо или еще чего?
> Принт р тоже же возвращает значение из этой функции?
Нет. Значение из функции можно вернуть только командой return. Здесь нет команды return, поэтому эта функция всегда возвращает null (это такое специальное значение).
Ты можешь сделать функцию, которая и печатает что-то на экран, и возвращает что-то с помощью return.
Это на ждуна надо сделать?
все, ты не отмоешься от зашквара пыхи
Начни с UML диаграммы. На ней и увидишь где избыточность.
залей на гит тогда гляну
Посмотрел код. Действительно, в будущем лучше освоить гитхаб и заливать туда.
> $order = $sort_list[$sort];
Здесь проблема в том, что ты передаешь в функцию поиска студентов Student::getAllStudents кусок SQL-кода. И функция не может никак проверить, что он безопасен. Это создает потенциал для появления в будущем тут SQL-инъекции, когда кто-то передаст туда кусок, пришедший от пользователя.
Вместо этого надо передавать в функцию тип сортировки и пусть функция Student::getAllStudents сама построит нужный SQL-код. Кстати, типы сортировки можно сделать константами.
> function sort_link($title, $a, $b) {
Названия $a и $b неудачные, так как непонятно, что они обозначают. Также, имена функций принято начинать с глагола (хотя это не стандарт и бывает по-другому), лучше было бы get_sort_link или make_sort_link.
> return '<a class="active" href="?sort=' . $b . '">' . $title . ' <i>▲</i></a>';
Здесь данные подставляются в HTML без экранирования.
> $page = isset(($_GET['page'])) ? html(intval($_GET['page'])) : 1;
> $search = html($_GET['search']);
Вызов html() здесь не нужен. Экранирование надо делать в шаблоне при выводе данных, а не при получении их из $_GET. Потому что при подстановке строки в HTML, в URL, в SQL-запрос используются разные правила экранирования и заранее ты не угадаешь, какой способ надо использовать.
> $s_string = "Показаны только абитуриенты, найденные по запросу \"$search\".";
Эту строку надо формировать в шаблоне, а не здесь в контроллере. Ты просто передаешь в шаблон переменную $search, и в нем ее проверяешь и выводишь текст при необходимости.
> class Student{
> private $name;
> private $surname;
> if ($page == 1) $offset = 0;
Код оформлен не по PSR. Скобка после имени класса идет на новой строке. If оформляется в несколько строчек. Если ты отправишь такой код на какую-то вакансию, то произведешь плохое впечатление. Советую почитать второй пост треда про оформление кода.
> $stmt->execute([$this->name, $this->surname, $this->sex,
> $this->group, $this->place, $this->email,
> $this->byear, $this->points,$this->pass]);
Если список длинный, то его пишут по одному элементу на строчку.
> private $name;
> function __construct($name, $surname, $group,
Сейчас уже у всех есть PHP7.4 и нужно указывать типы полей. Это делает твой код читаемым и защищает от ошибок. Также, нужно указывать типы у аргументов функций и тип возвращаемого значения.
Ты смешал в классе Student два класса: один класс, представляющий информацию о студенте и класс, который умеет сохранять или загружать студентов из БД. Нужно сделать два отдельных класса, иначе ты нарушаешь принцип единой отвественности - каждый класс отвечает за что-то одно.
> $res = $pdo->query("SELECT pass FROM STUDENTS WHERE email = '$this->email'");
> $string = "SELECT * FROM STUDENTS ORDER BY $order LIMIT $st_per_page OFFSET $offset";
Так нельзя, нужно передавать параметры через плейсхолдеры, иначе возможна SQL-инъекция. В случае с сортировкой, нужно передать в функцию тип сортировки, она выберет из массива строку и ее можно подставить напрямую. У тебя есть такой массив, но проверка должна быть в функции getAllStudents, чтобы с одного взгляда было видно, что все безопасно. Сейчас, глядя только на функцию getAllStudents, нельзя гарантировать, что она работает безопасно, так как мы не знаем, какие данные в нее приходят. Мы не должны изучать весь код, чтобы понять, безопасна функция или нет, это должно быть очевидно сразу.
> $hash = $res->fetch(PDO::FETCH_NUM);
> $this->pass = $hash[0];
Используй fetchColumn, и он сразу тебе вернет нужное значение, а не массив.
> while($row = $result->fetch(PDO::FETCH_ASSOC)){
>$arr[] = $row;
Используй fetchAll и не изобретай тут велосипед с циклами.
> WHERE `name` LIKE ? OR
> surname LIKE ? OR `group` LIKE ? OR points LIKE ?
> $stmt->execute([$search, $search, $search, $search]);
Здесь можно было использовать именованные плейсхолдеры вроде `name` LIKE :search, чтобы не передавать один параметр 4 раза.
Функции получения списка студентов и поиска при желании можно объединить в одну, так как в них много похожего.
> spl_autoload_register(function ($class) {
> else die( $path);
Это неправильно. Если автолоадер не нашел класс, то он не должен ничего делать, так как автолоадеров может быть несколько и может быть этот класс найдет следующий автолоадер.
> $errorN = $errorSn = $errorSe = $errorGr = $errorM = $errorBy
В такой ситуации не нужно делать 10 однотипных переменных, можно просто сделать массив или объект.
> else {
> $student['email'] = $email;
> $student['name'] = $name;
Здесь было бы лучше передавать в шаблон всегда объект Student, зачем делать массив, если у тебя уже есть удобный объект.
> class ConnectionDB{
> private static $host = 'testdomain'; // Change as necessary
Настройки надо вынести в конфиг, чтобы не надо было править код. Конфиг может быть в разных форматах: JSON, ini, или даже в виде PHP-файла с переменными.
> private static $chrs = 'utf8mb4';
Не надо это делать настройкой, так как скорее всего твой код не заработает с другими кодировками.
Также, у тебя в коде не определена константа PASSWORD_DEFAULT.
> `name` varchar(40),
Для полей, которые обязательны к заполнению, надо указывать NOT NULL
> sex varchar(2),
Здесь надо использовать тип ENUM, иначе можно вставить все, что угодно.
> email varchar(40),
Здесь надо добавить ограничение уникальности, чтобы нельзя было в БД вставить 2 одинаковых email.
> byear integer,
Здесь было бы хорошо добавить ограничение CHECK, которое бы запретило вставлять слишком маленькие или слишком большие значения.
> private static $opts =
> [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
Надо оформлять так:
private static $opts = [
(4 пробела) PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
(4 пробела) ...
];
> preg_match('/^[A-Яa-яЁё]{1,20}$/ui',
Я бы разрешил в имени еще дефисы и апострофы, так как бывают фамилии вроде Римский-Корсаков или д'Артаньян.
> ('/^(м|ж){1}$/ui', $val);
Пол лучше сделать константами вроде Student::GENDER_MALE = 'm', а еще лучше освоить PHP8 и сделать enum (перечисление). А в БД вставлять m/f. Аналогично для поля местный/приезжий.
> public function validMail($val){
> global $pdo;
Так неправильно, надо явно передавать PDO, а не пытаться искать его в глобальных переменных. Потому что если такой переменной нету или она названа по-другому, то функция не будет работать. Получается, это ненадежная функция, которая может сломаться в любой момент. Не используй глобальные переменные.
> if(password_verify($val, $_COOKIE['logged'])) return "";
Тут две ошибки. Во-первых, валидатор не должен сам лезть в куки, ему должны их передать снаружи. Во-вторых, ты тут в одной функции смешал проверку правильности email и аутентификацию пользователя. Это должны делать две разных функции. Одна проверяет правильность и уникальность email, вторая проверяет хеш.
> if($val>0 && $val<300) return "";
> else return "Введите число баллов от 0 до 300";
Но твоя функция не разрешает ввести 0 или 300. Тогда надо писать "до 299". Также, нет проверки, что введено целое число.
Год рождения надо проверять, что он не менее 1880 и не более текущего.
Шаблоны обычно называют index.phtml или index.html.php. Их логично поместить в папку templates или views.
> <? if($s_string) echo $s_string?>
В шаблоне используют версию if с двоеточием, а echo не используют.
> <input type="submit" value="Найти" />
В HTML не пишут слеш в конце одиночного тега. Так делают только в XML.
Заголовок шаблона лучше вынести в отдельный файл, чтобы не копипастить.
> Электронная почта: <input type="text"
Тут надо использовать type="email". На мобильных устройствах это меняет вид клавиатуры для более удобного ввода. Я советую почитать MDN https://developer.mozilla.org/ru/docs/Web/HTML/Element/Input , там перечислено, какие бывают типы полей ввода.
> Пол (м/ж): <input type="text"
Здесь надо использовать радиокнопки.
> Год рождения: <input type="text"
Здесь лучше тип number, опять же. У него можно указать параметры min/max, и он показывают цифровую клавиатуру на моб. устройствах.
Посмотрел код. Действительно, в будущем лучше освоить гитхаб и заливать туда.
> $order = $sort_list[$sort];
Здесь проблема в том, что ты передаешь в функцию поиска студентов Student::getAllStudents кусок SQL-кода. И функция не может никак проверить, что он безопасен. Это создает потенциал для появления в будущем тут SQL-инъекции, когда кто-то передаст туда кусок, пришедший от пользователя.
Вместо этого надо передавать в функцию тип сортировки и пусть функция Student::getAllStudents сама построит нужный SQL-код. Кстати, типы сортировки можно сделать константами.
> function sort_link($title, $a, $b) {
Названия $a и $b неудачные, так как непонятно, что они обозначают. Также, имена функций принято начинать с глагола (хотя это не стандарт и бывает по-другому), лучше было бы get_sort_link или make_sort_link.
> return '<a class="active" href="?sort=' . $b . '">' . $title . ' <i>▲</i></a>';
Здесь данные подставляются в HTML без экранирования.
> $page = isset(($_GET['page'])) ? html(intval($_GET['page'])) : 1;
> $search = html($_GET['search']);
Вызов html() здесь не нужен. Экранирование надо делать в шаблоне при выводе данных, а не при получении их из $_GET. Потому что при подстановке строки в HTML, в URL, в SQL-запрос используются разные правила экранирования и заранее ты не угадаешь, какой способ надо использовать.
> $s_string = "Показаны только абитуриенты, найденные по запросу \"$search\".";
Эту строку надо формировать в шаблоне, а не здесь в контроллере. Ты просто передаешь в шаблон переменную $search, и в нем ее проверяешь и выводишь текст при необходимости.
> class Student{
> private $name;
> private $surname;
> if ($page == 1) $offset = 0;
Код оформлен не по PSR. Скобка после имени класса идет на новой строке. If оформляется в несколько строчек. Если ты отправишь такой код на какую-то вакансию, то произведешь плохое впечатление. Советую почитать второй пост треда про оформление кода.
> $stmt->execute([$this->name, $this->surname, $this->sex,
> $this->group, $this->place, $this->email,
> $this->byear, $this->points,$this->pass]);
Если список длинный, то его пишут по одному элементу на строчку.
> private $name;
> function __construct($name, $surname, $group,
Сейчас уже у всех есть PHP7.4 и нужно указывать типы полей. Это делает твой код читаемым и защищает от ошибок. Также, нужно указывать типы у аргументов функций и тип возвращаемого значения.
Ты смешал в классе Student два класса: один класс, представляющий информацию о студенте и класс, который умеет сохранять или загружать студентов из БД. Нужно сделать два отдельных класса, иначе ты нарушаешь принцип единой отвественности - каждый класс отвечает за что-то одно.
> $res = $pdo->query("SELECT pass FROM STUDENTS WHERE email = '$this->email'");
> $string = "SELECT * FROM STUDENTS ORDER BY $order LIMIT $st_per_page OFFSET $offset";
Так нельзя, нужно передавать параметры через плейсхолдеры, иначе возможна SQL-инъекция. В случае с сортировкой, нужно передать в функцию тип сортировки, она выберет из массива строку и ее можно подставить напрямую. У тебя есть такой массив, но проверка должна быть в функции getAllStudents, чтобы с одного взгляда было видно, что все безопасно. Сейчас, глядя только на функцию getAllStudents, нельзя гарантировать, что она работает безопасно, так как мы не знаем, какие данные в нее приходят. Мы не должны изучать весь код, чтобы понять, безопасна функция или нет, это должно быть очевидно сразу.
> $hash = $res->fetch(PDO::FETCH_NUM);
> $this->pass = $hash[0];
Используй fetchColumn, и он сразу тебе вернет нужное значение, а не массив.
> while($row = $result->fetch(PDO::FETCH_ASSOC)){
>$arr[] = $row;
Используй fetchAll и не изобретай тут велосипед с циклами.
> WHERE `name` LIKE ? OR
> surname LIKE ? OR `group` LIKE ? OR points LIKE ?
> $stmt->execute([$search, $search, $search, $search]);
Здесь можно было использовать именованные плейсхолдеры вроде `name` LIKE :search, чтобы не передавать один параметр 4 раза.
Функции получения списка студентов и поиска при желании можно объединить в одну, так как в них много похожего.
> spl_autoload_register(function ($class) {
> else die( $path);
Это неправильно. Если автолоадер не нашел класс, то он не должен ничего делать, так как автолоадеров может быть несколько и может быть этот класс найдет следующий автолоадер.
> $errorN = $errorSn = $errorSe = $errorGr = $errorM = $errorBy
В такой ситуации не нужно делать 10 однотипных переменных, можно просто сделать массив или объект.
> else {
> $student['email'] = $email;
> $student['name'] = $name;
Здесь было бы лучше передавать в шаблон всегда объект Student, зачем делать массив, если у тебя уже есть удобный объект.
> class ConnectionDB{
> private static $host = 'testdomain'; // Change as necessary
Настройки надо вынести в конфиг, чтобы не надо было править код. Конфиг может быть в разных форматах: JSON, ini, или даже в виде PHP-файла с переменными.
> private static $chrs = 'utf8mb4';
Не надо это делать настройкой, так как скорее всего твой код не заработает с другими кодировками.
Также, у тебя в коде не определена константа PASSWORD_DEFAULT.
> `name` varchar(40),
Для полей, которые обязательны к заполнению, надо указывать NOT NULL
> sex varchar(2),
Здесь надо использовать тип ENUM, иначе можно вставить все, что угодно.
> email varchar(40),
Здесь надо добавить ограничение уникальности, чтобы нельзя было в БД вставить 2 одинаковых email.
> byear integer,
Здесь было бы хорошо добавить ограничение CHECK, которое бы запретило вставлять слишком маленькие или слишком большие значения.
> private static $opts =
> [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
Надо оформлять так:
private static $opts = [
(4 пробела) PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
(4 пробела) ...
];
> preg_match('/^[A-Яa-яЁё]{1,20}$/ui',
Я бы разрешил в имени еще дефисы и апострофы, так как бывают фамилии вроде Римский-Корсаков или д'Артаньян.
> ('/^(м|ж){1}$/ui', $val);
Пол лучше сделать константами вроде Student::GENDER_MALE = 'm', а еще лучше освоить PHP8 и сделать enum (перечисление). А в БД вставлять m/f. Аналогично для поля местный/приезжий.
> public function validMail($val){
> global $pdo;
Так неправильно, надо явно передавать PDO, а не пытаться искать его в глобальных переменных. Потому что если такой переменной нету или она названа по-другому, то функция не будет работать. Получается, это ненадежная функция, которая может сломаться в любой момент. Не используй глобальные переменные.
> if(password_verify($val, $_COOKIE['logged'])) return "";
Тут две ошибки. Во-первых, валидатор не должен сам лезть в куки, ему должны их передать снаружи. Во-вторых, ты тут в одной функции смешал проверку правильности email и аутентификацию пользователя. Это должны делать две разных функции. Одна проверяет правильность и уникальность email, вторая проверяет хеш.
> if($val>0 && $val<300) return "";
> else return "Введите число баллов от 0 до 300";
Но твоя функция не разрешает ввести 0 или 300. Тогда надо писать "до 299". Также, нет проверки, что введено целое число.
Год рождения надо проверять, что он не менее 1880 и не более текущего.
Шаблоны обычно называют index.phtml или index.html.php. Их логично поместить в папку templates или views.
> <? if($s_string) echo $s_string?>
В шаблоне используют версию if с двоеточием, а echo не используют.
> <input type="submit" value="Найти" />
В HTML не пишут слеш в конце одиночного тега. Так делают только в XML.
Заголовок шаблона лучше вынести в отдельный файл, чтобы не копипастить.
> Электронная почта: <input type="text"
Тут надо использовать type="email". На мобильных устройствах это меняет вид клавиатуры для более удобного ввода. Я советую почитать MDN https://developer.mozilla.org/ru/docs/Web/HTML/Element/Input , там перечислено, какие бывают типы полей ввода.
> Пол (м/ж): <input type="text"
Здесь надо использовать радиокнопки.
> Год рождения: <input type="text"
Здесь лучше тип number, опять же. У него можно указать параметры min/max, и он показывают цифровую клавиатуру на моб. устройствах.
И еще. Ты используешь <br> в HTML. Этот тег предназначен для переноса строк в тексте. Если ты хочешь просто поместить один блок над другим, то просто оберни их в div.
На мой взгляд, для рядового программиста не требуется высшее образование. Он должен получить среднее профессиональное образование, например, в колледже или техникуме, где его обучат компьютерной грамотности, алгоритмам, ООП, паре языков вроде Питон/Java, ассемблеру, HTML, типографике, сетям, основам юзабилити, SQL. Года 3 для этого хватит. Мне кажется, этого достаточно, чтобы стать веб-разработчиком.
Аналогично можно сделать курсы для системных администраторов, разработчиков десктопных приложений, специалистов технической поддержки, embedded и системной разработки. Ну конечно для программистов Ардуино понадобится не 3, а 4 года, там ведь паять еще учиться придется.
А высшие учебные заведения должны заниматься больше computer science. Их выпускники не должны писать микросервисы для перекладывания JSON из сокета в базу (разве что на 1-м курсе в рамках изучения основ). Они должны разрабатывать новые языки программирования, проектировать интегральные схемы, методы оптимизации, делать сложные вычисления, новые архитектуры нейросетей, может быть архитектурой распределенных высоконагруженных систем заниматься и т.д. В общем, делать то, что ближе к науке.
Но в реальности почему-то все по-другому. Работодатели зачем-то требуют на рядовые вакансии высшее образование, и в самих университетах вместо описанного мной преподают всякую ерунду. В итоге у нас огромное число людей с высшим образованием, которые никак не применяют полученные знания и не занимаются близкой к научной деятельностью. Ну вот сколько из вас применило на работе по клепанию форм мат. анализ или линейную алгебру? Сколько из вас вычисляло интеграл численными методами? Сколько из вас разработало язык программирования?
Неэффективность получается ужасная. Ведь все эти бесполезные предметы не бесплатные, за них так или иначе кто-то платит. Какой смысл оплачивать прохождение курса, если он 90% выпускников никогда не понадобится?
Даже в ИТМО преподают историю, физкультуру, ОБЖ и философию. Зачем за это платить? А если взять какие-то менее известные университеты, то там все еще печальнее.
На мой взгляд, для рядового программиста не требуется высшее образование. Он должен получить среднее профессиональное образование, например, в колледже или техникуме, где его обучат компьютерной грамотности, алгоритмам, ООП, паре языков вроде Питон/Java, ассемблеру, HTML, типографике, сетям, основам юзабилити, SQL. Года 3 для этого хватит. Мне кажется, этого достаточно, чтобы стать веб-разработчиком.
Аналогично можно сделать курсы для системных администраторов, разработчиков десктопных приложений, специалистов технической поддержки, embedded и системной разработки. Ну конечно для программистов Ардуино понадобится не 3, а 4 года, там ведь паять еще учиться придется.
А высшие учебные заведения должны заниматься больше computer science. Их выпускники не должны писать микросервисы для перекладывания JSON из сокета в базу (разве что на 1-м курсе в рамках изучения основ). Они должны разрабатывать новые языки программирования, проектировать интегральные схемы, методы оптимизации, делать сложные вычисления, новые архитектуры нейросетей, может быть архитектурой распределенных высоконагруженных систем заниматься и т.д. В общем, делать то, что ближе к науке.
Но в реальности почему-то все по-другому. Работодатели зачем-то требуют на рядовые вакансии высшее образование, и в самих университетах вместо описанного мной преподают всякую ерунду. В итоге у нас огромное число людей с высшим образованием, которые никак не применяют полученные знания и не занимаются близкой к научной деятельностью. Ну вот сколько из вас применило на работе по клепанию форм мат. анализ или линейную алгебру? Сколько из вас вычисляло интеграл численными методами? Сколько из вас разработало язык программирования?
Неэффективность получается ужасная. Ведь все эти бесполезные предметы не бесплатные, за них так или иначе кто-то платит. Какой смысл оплачивать прохождение курса, если он 90% выпускников никогда не понадобится?
Даже в ИТМО преподают историю, физкультуру, ОБЖ и философию. Зачем за это платить? А если взять какие-то менее известные университеты, то там все еще печальнее.
>>517301
Спасибо большое, вот уж терпение все расписывать. Я в принципе все замечания/ошибки понял, кроме
>не определена константа PASSWORD_DEFAULT
Насколько я понял это уже предопределенная константа, и она bcrypt значит в текущий момент. Или это не в контексте хеширования, а относится к настройкам pdo?
и
>:search
Насколько я понял без эмулирования подготовленных выражений в pdo не получится без повторения аргументов, может я ошибаюсь. Я использую open server с mysql.
Учебник как учебник. Не хуже 9 из 10 курсов в интернете.
Че, зря мамку то не послушал в свое время, ага?
Дело не в учебнике, очевидно.
Появляются вопросы потому что он на них отвечает, причем развернуто. К тем, кто просто посылает нахуй, вопросов быть не может.
>Появляются вопросы потому что он на них отвечает
Вот это логика у анальника. Мб еще солнце светит потому что кто-то хочет?
Да, точно, я перепутал аргументы функции. Тогда у тебя есть уязвимость. Если ты куку получаешь как хеш от email, то тогда злоумышленник может, зная email жертвы, сгенерировать хеш и отредактировать ее данные.
Токен доступа надежнее всего генерировать случайно.
> Насколько я понял без эмулирования подготовленных выражений в pdo не получится без повторения аргументов, может я ошибаюсь.
Да, верно, mysql поддерживает только знак вопроса (мануал https://dev.mysql.com/doc/c-api/5.7/en/mysql-stmt-prepare.html ), но ты можешь включить эмуляцию подготовленных запросов.
Что касается стиля кода, посмотри PSR и как код оформляется в Симфони и стремись к такому же стилю: https://github.com/symfony/form/blob/6.1/Form.php
Конечно, в хеше еще есть случайная соль, но лучше не полагаться на это, а сгенерировать полностью случайный неподбираемый токен.
1. Сколько стоит легально? Работает для РФ?
2. Если с торрента спиздить, какой шанс что там вирус от васяна?
ideone.com/Hk4KeI
читал прохладную что чел такой вкатился в конторку, поставил на рабочий бук ломаную версию, кодил себе, опыт набивал, а через полгода фирмЕ претензия за использование без покупки - ломаная версия стучала регулярно на серв.
Стучит как-то раз ломаная версия на серв:
- Кто там?
- Я из фирмы.
- А вы точно сотрудник фирмы?
- Бля буду.
- Ну все, тогда шлем претензию.
- А по какому адресу?
- 127.0.0.1
Этим сервером был Альберт Эйнштейн.
Путин же вроде разрешил их нахуй слать со своими лицензиями, разве нет? И теперь можно хуи класть на всю эту хуйню ибо у них даже офиса теперь тут нет
2 + 2, Сколько месяцев в году? Я хз, что можно спросить у битриксоида о погремированнии, чтобы он не обосрался.
По делу есть что пиздануть, остряк хуев?
Мне нужно скопить бабок на съебатрон, на битриксе платят больше, чем на дно работе
Ну сам факт того что ты спрашиваешь не "что мне читать шоб знать битрикс", а "че пиздануть на собесе", как бы все объясняет.
Мне про битрикс хватило инфы о том что там функция получения даты лезла в базу. Проверил - лезла. На этом знакомство окончилось.
>функция получения даты лезла в базу
зачем? мне теперь реально интересно. Битриксобояре, объясните.
https://www.govnokod.ru/14143
CharToDateFunction вроде отрефакторили
А вот CompareDates десять лет разменяла http://bxapi.ru/src/?id=175199
Я подозреваю, что если у тебя нет опыта, то вопросы могут быть только по теории:
- язык PHP
- MySQL
- верстка: HTML/CSS/JS
- основные настройки битрикса
- основные модули битрикса
- вопросы по документации битрикса
Попробуй погуглить "вопросы собеседование битрикс".
Ебало свое представили, говнобекендеры?
Когда вы все на нормальный стек перейдете уже.
Мимо веб Ангуляр господин.
Спасибо, анон. Это всё понятно конечно, уже гуглил, прохожу сейчас курс от самого битрикса, пока junior дев., душная параша.
Можно как-то доджить собеседования в зуме или это сейчас золотой стандарт на удалёнку?
Резюме конечно я такое сделал, что хрюши кипятком ссут. Но проходить собеседования в зуме я очкую, т.к. по сути нихуя о битриксе не знаю.
>>520357
Двачаю, мне дали тестовое сделать что-то типа метода config в ларавеле, я эту хуйню наклепал за 10 минут и кинул ссылку на гитхаб, позвали на собес и спросили 3,5 нубских вопроса по пхп, тимлид сказал у меня всё, попиздели с директором за кофем минут 10-15 и как бы всё. Туда всех подряд с улицы берут похоже. Я потом съебал в руби через полгода обогнав в развитии большинство коллег, потому что не переставал учится.
>>521757
>прохожу сейчас курс от самого битрикса, пока junior дев., душная параша.
Нахуй ты с этим говном колупаешься? Возьми лучше ларавель тот же не пожалеешь
> функция получения даты лезла в базу. Проверил - лезла
Лол реально?
Я там ковырял кишочки тоже, такое адовое говнище, особенно инфоблоки лютый пиздец в базе творят. А кэширование это отдельная песня
Бля, реально))) Сука какие же там долбоебы разрабатывают этот продукт

>Что вам мешает сделать лучше?
Ничего не мешает, пишу код в разы лучше и в разы производительнее.
Вон сейчас сижу работаю, гоняю базу с прода у себя на компе таблица 4,5 млн. архив 2 гига, поллчаса поднималась через pg_dump. У меня на ноуте фильтр по 4 текстовым столбцам отрабатывает за 200 мс, обычный постгрес, не слишком шустрый ноут, смогут ли битриксовые инфоблоки с хуйлоад блоками такое сделать большой вопрос. А я ничего не делал сверхъестественного обычная таблица и просто пару индексов добавил, такое сделает любой кто по-диагонали прочитал документацию постгреса, но это уже работает лучше чем у них, а они с 2007 года разрабатывают и могли бы уже давно переделать работу с БД, я просто видел как эти ебучие инфоблоки устроены это сущий пиздец.
Про остальное и говорить не стоит.
Тут вопрос в другом, чтобы продавать такой продукт как битрикс нужно быть в первую очередь маркетологом, чем разработчиком. Мы в треде рассматриваем в первую очередь с точки разработки, а она здесь полнейшее говно. Но вот маркетологи и менеджмент, мое почтение продавать такое говно под видом, подсадить на него такое количество лохов клиентов, создать целую секту интеграторов-наебаторов которые с пеной у рта защищают свое болото и доят клиентов потому что это говно требует большей поддержки чем другие решения. Это талант иметь нужно тут не поспоришь.
> веб Ангуляр
Angular это когда на сайте 2 мегабайта яваскрипта и там кружок крутится 15 секунд прежде чем увидишь контент? Если так, то разработчикам на Angular есть чему поучиться у PHP-разработчиков, у которых сайты грузятся без всяких кружков.
Сам я кстати для своих поделок использовал Preact. Он весит по моему в районе 10-20 Кб до сжатия.
Проблема битрикса не в том, чтобы сделать лучше, а в том, что бизнес-модель такая. Они все бабки на маркетинг вкачивают при полном похуе на сам код и его качество. В результате кабанчики ведутся только так, а вот от программистов получают под зад с таким подходом. Никому не хочется в помоях лазать. Безперспективняк и проффессиональный тупик.
Как я понял, идея инфоблоков в том, чтобы добавлять их настраницы и настраивать мышкой в админке, не привлекая 300к-в-месяц программиста, а используя 30-к-в-месяц контент-менеджера. Ты считаешь все с точки зрения программиста, а не с точки зрения бизнеса.
Вообще, сама по себе идея правильная. Ну нет смысла задействовать талантливого выпускника computer science и в сотый раз изобретать велосипед, чтобы вывести на сайте каталог товаров или форму записи на прием. Это должно делаться проще.
Аналогично, HTML тоже должен стать деталью реализации, его не надо писать руками, а дизайнер должен его получать из макета автоматически.
Но, как я понимаю, из постов в этом треде, в итоге с Битриксом все же обычный контент-менеджер не справляется.
Форму записи и каталог обычный бесплатный вордпресс с плагинами умеет. Битрикс это развод за те деньги, что они просят.
К тому же бизнесу всегда нужно больше - сегодня ему формочку, а завтра црмку интегрируй. Послезавтра телеграм бота напиши.
Бизнес все же не такой глупый. Если они купили систему и она не решает их задачи, то наверно они будут искать другую. А раз они пользуются и платят, то наверно их устраивает. В код они не заглядывают. Как я понимаю, Битрикс задуман не для того, чтобы его покупали напрямую, а через веб-мастеров и студии, которые тайком получают процент от его покупки.
Есть рынок заказной разработки, а если рынок типовых проектов. Где не нужна дорогая разработка с нуля на фреймворках, а нужно быстро накликать мышкой что-то красивое и работающее. Как-то, узнав, что я программист, у меня спросили, сколько стоит сделать сайт, а потом сказали "а нам вот за 3000 сделали". Есть и такой рынок. Битрикс это конечно не сайты за 3 000, но сайты за 100-200 000 на нем реально делать.
Наверно можно было бы сделать хорошую систему для таких случаев, но что-то 300-к-в-месяц программисты воротят нос от этого рынка.
Честно говоря, у меня вызывает сомнения, что движок для блогов может работать с каталогом товаров. Это как минимум странно.
В айти бизнес всегда глупый. Это аксиома.
Если он не сам айти занимается конечно.
Никакой программист не выберет битрикс для своего кабанчика, а вот сами кабанчики, наслушавшись песен их маркетологов, выбирают. Потом матерятся почти всегда.
Если у тебя там не сотни тысяч товаров, то ничего не будет.
Есть такая аксиома: кроилово ведет к попадалову.
В том-то и дело что кабанчик считает что денег на зарплату мне у него нет. Он думает что покупка CMS это разовая трата. А думает он так потому что ему эту идею ПРОДАЛИ. Есть бесплатные варианты, есть менее говенные чем битрикс за ту же цену, но эти варианты никому не впаривают сотни манагеров на зарплате.
Короче: лохам впаривают то что они хотят услышать, это и называется сетевой маркетинг.
>Как я понял, идея инфоблоков в том, чтобы добавлять их настраницы и настраивать мышкой в админке, не привлекая 300к-в-месяц программиста, а используя 30-к-в-месяц контент-менеджера. Ты считаешь все с точки зрения программиста
Да идея в этом, но ту же самую хуйню можно реализовать в разы проще и на все эти клики мышкой сделать create table и alter table, но эти долбоебы смогли извратить эту идею до ужаса, даже версионирования нет.
Только один хуй есть интеграторы которые создают и редактируют эти инфоблоки без миграций или DDL прямо на продакшене лол обычный пользователь в эту хуйню очень редко лезет.
>Но, как я понимаю, из постов в этом треде, в итоге с Битриксом все же обычный контент-менеджер не справляется.
Потому что это говно ебаное, допустим надо ты контент-менеджер, включил эрмитажтм тебе немного текст на странице поправить или добавить ссылочку в меню или в компоненте на страничке надо сделать пару настроек, казалось бы нетривиальная задача и ничего не предвещает беды. Но эта хуйня работает на php файлах и в момент правки берет код, парсит и сохраняет новый код, очень часто эта залупа при этой операции ломает дохуя всего потому что не всегда ей удается правильно распарсить содержимое. А еще контент менеджер может записать любой html и php код со всеми вытекающими, у меня был такой случай когда контент менеджер при добавлении html кода ошиблась и не закрыла тег, вся верстка пошла по пизде в том числе этот эрмитажтм и в конечном итоге мне пришлось лезть через админку и править файл.
>Бизнес все же не такой глупый. Если они купили систему и она не решает их задачи, то наверно они будут искать другую. А раз они пользуются и платят, то наверно их устраивает. В код они не заглядывают.
Нет он просто в этой сфере некомпетентный. Бизнес продает, выпекает, варит железо, строит, учит, возит, лечит, производит и тд. У них есть своя компетенция и своя сфера, но им нужен сайт, магазин или какая-нибудь CRM именно поэтому они обращаются в сторонние организации за этой услугой, которые умеют заглядывать в код.
>Битрикс задуман не для того, чтобы его покупали напрямую, а через веб-мастеров и студии, которые тайком получают процент от его покупки.
Да, % процент в зависимости от золотистости пратнера, но цену на сам битрикс сбивать нельзя все должны продавать по одинаковой цене. Купить лицензию можно https://www.1c-bitrix.ru/buy/products/cms.php но ТП при любых вопросах будет посылать нахуй к интеграторам-наебаторам.
>>522376
>Есть рынок заказной разработки, а если рынок типовых проектов. Где не нужна дорогая разработка с нуля на фреймворках, а нужно быстро накликать мышкой что-то красивое и работающее. Как-то, узнав, что я программист, у меня спросили, сколько стоит сделать сайт, а потом сказали "а нам вот за 3000 сделали". Есть и такой рынок. Битрикс это конечно не сайты за 3 000, но сайты за 100-200 000 на нем реально делать.
Есть и я знаю конторы которые делают тоже самое что и битриксодела на ларавеле, у них есть своя наработка такая полу CMS и своя админка как в джанге, они быстро эту хуйню делают под заказчика и у них уже написаны и магазины и интеграция с 1С и прочая хуйня. За сотку вполне рабочий магазин делают. Просто у битрикса сильны маркетологи и плюс 1С есть в названии, который практически у всех заказчиков, а еще все эти партнеры просто обвешены сертификатами и золотыми ярлычками от битрикса, в то время как у других этого всего нет. Возможно первоначально ценник будет ниже все таки ЦМС как никак, но зато в долгосрочной перспективе когда из-за меняющиеся бизнес требований нужно постоянно что-то дорабатывать битрикс будет в разы дороже, плюс со временем будет появляться много проблем в ходе эксплуатации особенно когда наберется большая БД и много файлов. И несколько наших заказчиков плевались от этого говна, но продолжали поддерживать, рагутся с ПМами и платить, а один таки ушел в другую контору через 3 месяца после релиза, я как раз тогда только устроился на митингах все хвастались этим проектом лол где ему все сделали на node.js, ПМ бывший бармен который с ним занимался сказал что тот типа рад в ладоши хлопает и у него все летает, потом разорялся хули ему на битриксе не сиделось мы же ему все нормально сделали столько времени потратили на его проект
>Бизнес все же не такой глупый. Если они купили систему и она не решает их задачи, то наверно они будут искать другую. А раз они пользуются и платят, то наверно их устраивает. В код они не заглядывают.
Нет он просто в этой сфере некомпетентный. Бизнес продает, выпекает, варит железо, строит, учит, возит, лечит, производит и тд. У них есть своя компетенция и своя сфера, но им нужен сайт, магазин или какая-нибудь CRM именно поэтому они обращаются в сторонние организации за этой услугой, которые умеют заглядывать в код.
>Битрикс задуман не для того, чтобы его покупали напрямую, а через веб-мастеров и студии, которые тайком получают процент от его покупки.
Да, % процент в зависимости от золотистости пратнера, но цену на сам битрикс сбивать нельзя все должны продавать по одинаковой цене. Купить лицензию можно https://www.1c-bitrix.ru/buy/products/cms.php но ТП при любых вопросах будет посылать нахуй к интеграторам-наебаторам.
>>522376
>Есть рынок заказной разработки, а если рынок типовых проектов. Где не нужна дорогая разработка с нуля на фреймворках, а нужно быстро накликать мышкой что-то красивое и работающее. Как-то, узнав, что я программист, у меня спросили, сколько стоит сделать сайт, а потом сказали "а нам вот за 3000 сделали". Есть и такой рынок. Битрикс это конечно не сайты за 3 000, но сайты за 100-200 000 на нем реально делать.
Есть и я знаю конторы которые делают тоже самое что и битриксодела на ларавеле, у них есть своя наработка такая полу CMS и своя админка как в джанге, они быстро эту хуйню делают под заказчика и у них уже написаны и магазины и интеграция с 1С и прочая хуйня. За сотку вполне рабочий магазин делают. Просто у битрикса сильны маркетологи и плюс 1С есть в названии, который практически у всех заказчиков, а еще все эти партнеры просто обвешены сертификатами и золотыми ярлычками от битрикса, в то время как у других этого всего нет. Возможно первоначально ценник будет ниже все таки ЦМС как никак, но зато в долгосрочной перспективе когда из-за меняющиеся бизнес требований нужно постоянно что-то дорабатывать битрикс будет в разы дороже, плюс со временем будет появляться много проблем в ходе эксплуатации особенно когда наберется большая БД и много файлов. И несколько наших заказчиков плевались от этого говна, но продолжали поддерживать, рагутся с ПМами и платить, а один таки ушел в другую контору через 3 месяца после релиза, я как раз тогда только устроился на митингах все хвастались этим проектом лол где ему все сделали на node.js, ПМ бывший бармен который с ним занимался сказал что тот типа рад в ладоши хлопает и у него все летает, потом разорялся хули ему на битриксе не сиделось мы же ему все нормально сделали столько времени потратили на его проект
как попробуешь в большом проекте своми бекендовскими ручками потеребить что-либо на своем рякте, тогда и поговорим.
Но обычно бизнес сам не покупает CMS. Он обращается к нескольким компаниям и просит их оценить определенную задачу. И использует ту технологию, которую предложила веб-студия.
Если бы альтернативы были такие хорошие, то компании, предлагающие их, выигрывали бы конкурс.
Другой вариант - бизнес может поручить выбор внутреннему IT-специалисту. Опять же вопрос, что он выберет?
>это и называется сетевой маркетинг
Нет, малыш, сетевой маркетинг - это способ дистрибьюции "пользуюсь-и-продаю", когда рядовые пользователи продукции сочетают в себе и покупателей и перепродавцов и рекламных агентов.
Впаривание цмс - это просто маркетинг.
Это не реакт, а преакт.
Говоря о больших проектах, ты умеешь делать большие проекты без мегабайтов яваскрипта?
>идея инфоблоков в
EAV
https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model
>Это не реакт, а преакт.
Что-то на уровне жиквери.
>Говоря о больших проектах, ты умеешь делать большие проекты без мегабайтов яваскрипта?
Конечно можно. Можно большой проект и на жиквери с пхп сделать.
Но зачем руки в говне морать когда можно спокойно на Ангуляре сделать и улюлюкая от скорости выполнения всей аппы.
Ах да, точно, там же секунда-две сайт загружается в начале.
> 2 мегабайта яваскрипта и там кружок крутится 15 секунд прежде чем увидишь контент
эти бляди страшно гордятся тем, что клиент видит не пустое окошко, а анимацию
Всё по факту сказал. Но во всех местах где я был - вышку не спрашивали. В нормальном и не спросят- российскими дипломами тем более только жопу подтирать.
Ну битрикс за 15 лет заработал 135 лямов. Бизнес хрюкает и довольно урчит
Примерно тысяч 650 долларов в месяц, лень открывать калькулятор.
А тебе миллион видимо?
>>522369
Само себя разрабатывает и поддерживает, что ты будешь делать.
>никому в помоях
Так и скажи что не можешь в чужой код и комплексные архитектуры и привык хуярить мвп в смузи стартапах. С другой стороны дальше таска в тырпрайзе не видеть это тоже сорта говна, чсвсить просто не надо да.
Конструкторы это в принципе лучшее что случалось с вебом.
Вообще конечно проигрываю с ресентимента макак против бояр-бизнесменов.
Рыжиков в треде? Или очередной золотой партнер?
Я как раз таки и смог в чужой код и поглядел на то говно у вас там под капотом, архитектуры там нет, точнее есть подобие модулей и компонентов, но все они очень сильно переплетены друг с другом и есть копипаст одного и того же кода повсеместно, это все помножено на мешанину из дремучего легаси с глобальными переменными, старого ООП и нового D7 и ни одно из них не сделано от и до.
Как раз таки это говно от и до написано в стиле дальше своего таска в этом "тырпрайзе" нихуя не вижу.
Бля так и представляю как к тебе приходит сантехник, меняет все трубы на ржавые, а на твой вопрос че за хуйню он делает отвечает: зато наша контора пидарасов заработала в этом году сто лямов.
И ты такой: бля, респектую бро, вот тебе вдвое больше бабла, это наш стиль, приходи почаще. А трубы? Да хуй с ними, занести бабла конторе пидарасов не жалко.
Конструктор это тильда и ему подобные, а битрикс это говно которому требуется не просто php разработчик, а специальный выращенный для этого говна. Не получится взять так и самому накликать мышкой и чтобы оно заработало кроме демо примеров и то в одном из них шрифты мелкие пиздец, там каждую хуйню нужно дорабатывать напильником
Скорее не ржавые, внешне выглядит заебись и ты с этим живешь, где-то через год начинается. То кран потечет, то унитаз будет постоянно засорятся. Если задеть соединения труб, то обязательно порвет. Если в унитаз насрать больше чем обычно, то он перестанет смывать. А чтобы заменить лейку в душе нужно менять смеситель и кусок трубы. И за это все хостинг арендодатель будет с вас брать больший тариф процентов на 30
Зато по ляму в месяц зарабатывают и золотые партнеры кормятся
Люди хвастаются в сети, как они зарабатывают по $400 000/год на 2 работах и 1 млн/год на семи.
Я думал там сроки жесткие и на одной работе люди еле успевают. Или с опытом быстрее все получается?

Да это мемчик. Не успеешь ты в двух местах нормально работать. Вот и выгоняют щас всех (см на кризис в США-шке).
Но! По ТК РФ ты имеешь право честно работать на 1.5 ставки. Поэтому можно официально подрабатывать на полставки -- но и это бьёт по ворк-лайф балансу.
Что-то выгорел на прошлое. месяц без выходных, вот теперь сижу и фантазирую как сделаю свой йоба пет со всем нажитом опытом и как вкачусь на 150к!

Жс дебил не знает как представлены дробные числа в памяти, и даже не удосужился проверить как тоже самое в его загоне работает
Какая нахуй версия? Проблема в том как дробные числа хранятся в памяти, при чем тут версия? Тебя уже обоссали выше, но ты так нихуя и не прочел, вот результат у меня в консоли браузера, и на ts 4.8.4(latest)

результат пик1
Хочу написать вебсокет-сервер, используя функцию stream_socket_server в бесконечном цикле. Какие подводные? Утечка памяти? Насколько это вообще практично?
Проблема даже не в том как оно храниться, десятичные числа можно хранить в памяти со сколько угодной точностью. Проблема в том что у цп внутри есть мат сопроцессор который умеет быстро переваривать числа в формате ieee754. Его регистры заточены под хранение 754 - не байтом больше. Всякие децималы поддерживаются стандартными библиотеками разных языков но считаются очень медленно посравнению с ieee754.
мимо слесарь
Не совсем понял.
Вот есть функция mt_rand();
Там нет команды return. Но она возвращает случайное значение.
Только для этого её надо в переменную сохранить?
Я вот ещё не понял. Я прочитал, что любая функция возвращает значение.
(С Хекслета - В этом смысле функции идентичны операциям — они всегда возвращают результат своей работы.)
$rk = 'xt';
$dd = $rk . print_r(34);
print_r($dd);
Я думал, что будет xt34.
А получилось 34xt1.
Почему 34 вылезло вперед и откуда вообще 1.
$sk = print_r();
var_dump($sk);
Почему мне не выводит значение этой переменной null ?
> Вот есть функция mt_rand();
> Там нет команды return
Функции бывают пользовательские и встроенные. Встроенные — это те, что уже включены в PHP и ты можешь сразу их использовать. А пользовательские — это те, которые ты написал сам.
mt_rand это встроенная в PHP функция (к тому же, она написана не на PHP, а на Си). И в ее исходном коде, естественно, есть return. Почему ты решил, что его там нету?
> Только для этого её надо в переменную сохранить?
В переменную мы сохраняем не функцию, а значение, которое она вернет. В данном случае, число:
$x = mt_rand();
> Я вот ещё не понял. Я прочитал, что любая функция возвращает значение.
> (С Хекслета - В этом смысле функции идентичны операциям — они всегда возвращают результат своей работы.)
Да, это верно. Даже если ты не поставишь return, функция вернет специальное значение null, которое обозначает отсутствие значения. То есть
function x() {}
$a = x();
Здесь в $a запишется null. Обрати внимание, что это именно значение null, а не строка "null". Поэтому можно сказать, что любая функция возвращает какое-то значение.
> и откуда вообще 1.
Потому, что функция print_r возвращает булево значение true ( смотри мануал https://www.php.net/manual/ru/function.print-r.php ):
> ... В противном случае возвращаемое значение будет равно true ...
Обрати внимание, что это именно булево значение true, а не строка из 4 букв "true". Также обрати внимание, что "выводит на экран" и "возвращает" это разные вещи. Функция print_r выводит на экран одно значение, а возвращает другое. Здесь она выводит 34, а возвращает true.
Когда ты пытаешься склеить строку 'xt' и значение true, true превращается в единицу и получается xt1. Это преобразование описано в мануале тут: https://www.php.net/manual/ru/language.types.string.php#language.types.string.casting
> ... Значение bool true преобразуется в строку "1" ...
> Почему 34 вылезло вперед
Давай разберем построчно код.
$rk = 'xt';
Записать в переменную $rk строку "xt"
$dd = $rk . print_r(34);
Здесь мы вызываем функцию print_r, которая выводит число 34, и возвращает true. При склеивании "xt" и true получается "xt1" и эту строку мы записываем в $dd
print_r($dd);
Выводим строку, хранящуюся в $dd, то есть "xt1".
> $sk = print_r();
> var_dump($sk);
> Почему мне не выводит значение этой переменной null ?
Потому, что у тебя в коде ошибки, а также, print_r возвращает не null, а другое значение. Я запустил твой код и мне вывело:
PHP Warning: print_r() expects at least 1 parameter, 0 given in /home/runner/9wx7sl1vsy/main.php on line 3
bool(false)
Это переводится так: в функцию print_r обязательно надо что-то передать, а ты ничего не передал. У тебя не показываются ошибки? Тогда напиши мне, какая у тебя ОС, как ты устанавливал PHP (скачал сам PHP или какую-то сборку вроде Wamp) и как ты запускаешь код (в консоли, в браузере), и я напишу, как включить показ ошибок.
> Вот есть функция mt_rand();
> Там нет команды return
Функции бывают пользовательские и встроенные. Встроенные — это те, что уже включены в PHP и ты можешь сразу их использовать. А пользовательские — это те, которые ты написал сам.
mt_rand это встроенная в PHP функция (к тому же, она написана не на PHP, а на Си). И в ее исходном коде, естественно, есть return. Почему ты решил, что его там нету?
> Только для этого её надо в переменную сохранить?
В переменную мы сохраняем не функцию, а значение, которое она вернет. В данном случае, число:
$x = mt_rand();
> Я вот ещё не понял. Я прочитал, что любая функция возвращает значение.
> (С Хекслета - В этом смысле функции идентичны операциям — они всегда возвращают результат своей работы.)
Да, это верно. Даже если ты не поставишь return, функция вернет специальное значение null, которое обозначает отсутствие значения. То есть
function x() {}
$a = x();
Здесь в $a запишется null. Обрати внимание, что это именно значение null, а не строка "null". Поэтому можно сказать, что любая функция возвращает какое-то значение.
> и откуда вообще 1.
Потому, что функция print_r возвращает булево значение true ( смотри мануал https://www.php.net/manual/ru/function.print-r.php ):
> ... В противном случае возвращаемое значение будет равно true ...
Обрати внимание, что это именно булево значение true, а не строка из 4 букв "true". Также обрати внимание, что "выводит на экран" и "возвращает" это разные вещи. Функция print_r выводит на экран одно значение, а возвращает другое. Здесь она выводит 34, а возвращает true.
Когда ты пытаешься склеить строку 'xt' и значение true, true превращается в единицу и получается xt1. Это преобразование описано в мануале тут: https://www.php.net/manual/ru/language.types.string.php#language.types.string.casting
> ... Значение bool true преобразуется в строку "1" ...
> Почему 34 вылезло вперед
Давай разберем построчно код.
$rk = 'xt';
Записать в переменную $rk строку "xt"
$dd = $rk . print_r(34);
Здесь мы вызываем функцию print_r, которая выводит число 34, и возвращает true. При склеивании "xt" и true получается "xt1" и эту строку мы записываем в $dd
print_r($dd);
Выводим строку, хранящуюся в $dd, то есть "xt1".
> $sk = print_r();
> var_dump($sk);
> Почему мне не выводит значение этой переменной null ?
Потому, что у тебя в коде ошибки, а также, print_r возвращает не null, а другое значение. Я запустил твой код и мне вывело:
PHP Warning: print_r() expects at least 1 parameter, 0 given in /home/runner/9wx7sl1vsy/main.php on line 3
bool(false)
Это переводится так: в функцию print_r обязательно надо что-то передать, а ты ничего не передал. У тебя не показываются ошибки? Тогда напиши мне, какая у тебя ОС, как ты устанавливал PHP (скачал сам PHP или какую-то сборку вроде Wamp) и как ты запускаешь код (в консоли, в браузере), и я напишу, как включить показ ошибок.
>По делу есть что пиздануть
А что я написал не по делу? Спросят два - три говновопроса на уровне тех, что я написал выше на которые ответит любой ждун и пригласят на вакансию.
>>521841
>Что вам мешает сделать лучше?
То, что в это нужно влить тонны бабла для того, чтобы оно хоть маломальски начало приносить прибыль. Сделать то продукт можно легко на какой нибудь симфонии.
>Давайте на четверых сообразим!
Соображай. Платить мне кто будет? А бабки вливать в рекламу? Есть пару десятков лямов? Вливай и поехали.
А сказки про поделим оставь для дэбилов готовых работать за еду на проекте в который никто не собирается вливать денешки, а следственно мёртвом.
> нужно влить тонны бабла
> Сделать то продукт можно легко
Ты же сам себе противоречишь. Если сделать легко, то "тонны бабла" не нужны.
Понял. Спасибо!
$text = "skr";
$rk = $text[0];
$rt = $text [-1];
print_r($rk);
А зачем нужны квадратные скобки? Впервые такое вижу.
И почему без указания функции substr нам выводит букву?
Я думал должно быть substr($text, 0, 1);
Спасибо! А нужно ли для этого что-то отдельно создавать? Я раньше немного работал с react js, и там я создавал компонент с карточкой, а на странице, где нужно выводить эти карточки просто подключал компонент.
А, всё, я понял как это сделать
Можно к элементам строки обращаться по индексу как к массиву, начиная с 0. -1 это последний элемент.
$text = 'Логотип Google Chrome. Chrome – это быстрый, бесплатный и безопасный веб-браузер. Браузер от Google. Скачать Chrome.';
$rk = "hi: {substr($text) 0, 6}";
print_r($rk);
Вот почему в этом варианте просто печатается текст и моя функция не работает?
$text = 'Логотип Google Chrome. Chrome – это быстрый, бесплатный и безопасный веб-браузер. Браузер от Google. Скачать Chrome.';
$rk = "hi: {$text[substr($text, 0, 6)]}";
print_r($rk);
А тут добавил квадратные скобки и вроде должно заработать, но выдает ошибку.
В двойных кавычках нельзя исполнять функции.
Так что используй оператор объединения строк как на следующем примере:
$text = 'Логотип Google Chrome. Chrome – это быстрый, бесплатный и безопасный веб-браузер. Браузер от Google. Скачать Chrome.';
$rk = 'hi: ' . substr($text, 0, 6);
print_r($rk);
Там просто задание такое -
Выведите на экран первую и последнюю буквы предложения, записанного в переменную $text, в следующем формате:
First: N
Last: t
$text = 'Never forget what you are, for surely the world will not'; - сама переменная.
И вот решение -
$text = 'Never forget what you are, for surely the world will not';
$result = "First: {$text[0]}\nLast: {$text[strlen($text) - 1]}";
print_r($result);
И собственно вот вопросы.
{$text[0]} - как так получается, что возвращается какой-то символ? Я же не ставил функцию.
{$text[strlen($text) - 1]}" - а вот тут уже вызывается функция. Почему так? strlen - возвращает длину строки. то есть там длина строки минус 1 получается. А выводиться последняя буква. Почему так?
[] - Что означают квадратные скобки?
Чел, начинай с основ, уже говорили же.
Что такое массивы, индексы и т.д.
Тут обращение к элементу массива по его индексу. Отсчет идет с нуля, то есть получается (длина строки - 1) это индекс последнего элемента.
PHP лучший вариант сейчас.
Другое дело, что ты ведомый человек, поэтому тебя бросает туда-сюда. Реши раз и навсегда и вкатывайся в один стек. Разницы нет, везде суть одна: ты пишешь код. Если снова будешь сомневаться, то ничего не получится 100%.
Да я вроде все прочитал. Но тут то мы не задавали массив.
Но если есть правило, что к строкам можно обращаться так же как и к массивом, то почему в первом случае мы просто обращаемся к индексу [0], а во втором случае указываем функцию strlen?
>{$text[0]} - как так получается, что возвращается какой-то символ? Я же не ставил функцию.
>{$text[strlen($text) - 1]}" - а вот тут уже вызывается функция. Почему так? strlen - возвращает длину строки. то есть там длина строки минус 1 получается. А выводиться последняя буква. Почему так?
Ты клинический что ли? Лучше справку для пенсии получи.
Для этого программы и нужны, чтобы пальцами не считать. Нужен последний элемент строки, вот ты функцией и получаешь его индекс, ты вообще можешь не знать что там за строка (обычно так и бывает).
Ты вкатываешься или просто по фану этим занимаешься?
Я занимаюсь, чтобы мозги не застаивались)
Не, я понимаю, что программы для удобства нужны.
Я спрашиваю почему в первом случае мы не вызываем функию, а во втором вызываем.
>Я спрашиваю почему в первом случае мы не вызываем функию, а во втором вызываем.
Твои уже намертво застоялись. Серьезно. попей глицин, я хуй знает.
Потому что 1й элемент всегда имеет индекс 0. А последний элемент может иметь какой угодно индекс в зависимости, что за строка обрабатывается.
Для здорового человека (или не с той проблемой) ничего не даст, а так вполне.
Хотя выше оно использовано в виде дауна-аутиста, а не всерьёз.
Учу Php 2ой месяц пиздец пока все нравится.
Конечно бывает , чет не получается. Грущу в такие моменты и иду гуглить, перечитывать теорию.
Мне лично похуй хэйтят его или нет.
Я его выбирал из-за окружения, тк близкие пишут на пхп и это охуенно! Многое объяснили, что не мог понять сам.
Даже если не найду работу разрабом на пхп можно изи будет после года учебы в системные аналитики вкатиться. Знаешь, как работают протоколы, sql знаешь, знаешь что такое бэк и фронт, даже ебать код можешь прочитать и код для обхода массива написать. Все ебать ценный кадр за 150к минимум!

Вот уж вкатились так вкатились...
Квадратные скобки позволяют получить один байт из строки.
Строка состоит из символов, а каждый символ (в кодировке utf-8) кодируется от 1 до 4 байтами. Если алфавит латинский, то 1 символ = 1 байт и конструкция $string[$i] получает $i-ю букву. Если же алфавит не латинский (например, кирилица), то ты получишь кусок буквы. По этой причине использовать скобки не надо.
У функции substr та же проблема, это старая функция, написанная с учетом, что 1 символ = 1 байт. На нелатинских символах она работает некорректно, потому надо использовать mb_substr, которая знает тонкости utf-8.
Подробнее строки и кодировки описаны тут
https://github.com/codedokode/pasta/blob/master/cs/strings.md
https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
Для этого нужно писать код на бекенде. Одним яваскриптом ты из браузера к базе не подключишься.
Однако, если ты используешь GraphQL API на бекенде или базу вроде Firebase, то это возможно.
Это должен быть отдельный класс, так как "машина" и "поисковик машин" это две разные вещи.
- Car хранит информацию об одной машине
- отдельный класс позволяет сформировать список машин
Вывод списка тоже должен быть отдельно от поиска, если ты используешь шаблоны, то вывод делается в шаблоне.
Почитай для начала:
- урок по MVC с примером (!) кода: https://github.com/codedokode/pasta/blob/master/arch/mvc.md
- урок по работе с БД с ООП: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
- про принцип единой ответственности из SOLID. Некоторые статьи объясняют его заумно, ищи такую, где объясняется простыми словами
Если хочется изучать архитектуру дальше, можешь почитать книгу Фаулера Patterns of Enterprise Application Architecture (она есть на русском).
> Почему так? strlen - возвращает длину строки. то есть там длина строки минус 1 получается. А выводиться последняя буква. Почему так?
Потому, что в строке байты нумеруются с нуля. Если длина строки = 10, то в ней байты идут с номерами от 0 до 9 (посчитай и убедись, что их ровно 10). Поэтому последний байт имеет номер 9, а не 10.
Чел, делай как удобнее, большинство этих рекомендаций - бред сивой кобылы. Код всё равно переписывают раз в несколько лет, хотя бы из-за того, что новые идеи появляются какие-то.
Если непонятно, приведу пример:
Клиент нажимает кнопку "сделать заказ". Скрипт отправляет емейлы о поступлении заказа клиенту и еще нескольким работникам. И только потом отправляет клиенту подтверждение заказа. Всё это время браузер клиента "грузится" и ждёт ответа.
Эта проблема решается при помощи кронджобов, но на мой взгляд - это самый настоящий костыль и использовать мне его совсем не хочется.
Намного лучше было бы иметь описанную мною функцию, которой к сожалению не существует:
После нажатия на кнопку "сделать заказ", скрипт сразу отправляет клиенту подтверждение заказа, закрывает соединение с клиентом, и только потом начинает отправлять емейлы.
И каким образом у них реализован этот механизм?
Наверняка эта возможность написано не на чистом php, а использует нечто-то другое.
Что значит на чистом пхп? БД можно использовать? А Редис? Джобы ларавеля на чистом пыхе реализованы. Контроллер кладет задачу в БД и выдает ответ пользователю. Висит пхп процесс, читает задачи из БД, запускает воркеры.
Твоя функция называется "отправить клиенту хедеры Connection: close и Content-Length: x", после чего можно делать че угодно, ответ уже ушёл. Ну либо вызвать fastcgi_finish_request(). В всяких ооп-обёртках request/response объектов типа symfony/http-foundation это есть из коробки, можешь пример реализации тут глянуть: https://github.com/symfony/symfony/blob/6.1/src/Symfony/Component/HttpFoundation/Response.php#L372
Все таки в пыхе буферезация вывода неспроста. Сначала поработал, потом буфер вывода клиету выплюнул. Пыхопроцес же закрываетя при дисконекте клиента (точнее начинается фаза очисти памяти и тд). По твоему пыхопроцесс мог бы новое соединение принимать без фазы очитки https://www.phpinternalsbook.com/php7/extensions_design/php_lifecycle.html
Посмотрел реализацию.
Функции fastcgi_finish_request не существует.
Функции litespeed_finish_request тоже не сущесвует.
Остальной код, который выполняется если этих функций не существует, нужного эффекта не оказывает.
Что бы эта функция работала, нужно что бы был установлен некий FastCGI Process Manager
Да сто лет это решается, можно решить чисто на клиентсайде и поллить какой-то айди задачки, можно срать апдейтами опять же жса в "грузящемся" скрипте с отключенной буферизацией.
Ну и почему он у тебя не установлен? запускаешь под апачем php mod? сейчас пыха == php-fpm
Я 1 курс 1 семестр (учусь не в СНГ) и у нас по одному предмету (с которого меня уже кикнули, точнее, предмет мне перенесся на следующий год, но делать работу надо) нужно сдать зачет.
А этот семестральный зачет - это сайт. Нужно сделать все самостоятельно, по критериям. С джавойскрептом, пхп. Фреймворки нельзя использовать.
Я знаю только html, css пока. Потому что физически не успеваю (как и остальные) переписывать спидран учителя на уроке, не то, что понять. На тот же js у нас было всего два академ. часа...
Задуманный сайт, по сути, похож на кинопоиск, ток, понятно, гораздо проще. На главной странице есть разделения на все фильмы - потом серийные - полнометражные - рандомный фильм. Должна быть возможность зарегистрироваться, + оставлять комментарии под фильмами. И по условию учителя еще должна быть возможность добавить зарегистрированного в админы, чтобы он имел возможность САМ добавлять фильмы.
В общем, сдаем мы это приблизительно в январе.
Нужны любые советы и наводки, как это можно реализовать + за такой срок, потому что как новичку мне без наводок тяжеловато. хтмл сисс страница уже есть. Понятно, что в интернете полно материалов, но у меня ограниченное время + подсказки мне не помешают, хотя бы маленькие советы, и понимание, какие материалы и что мне изучить на спидране.
Спасибо, если прочли.
>После нажатия на кнопку "сделать заказ", скрипт сразу отправляет клиенту подтверждение заказа, закрывает соединение с клиентом, и
падает с фаталом
>Эта проблема решается при помощи кронджобов
очередей, а не кронджобов. перед ответом в браузер отправляешь в очередь (rabbitmq, kafka) событие, консюмер хавает его из очереди и делает работу.
консюмер может быть написан на другой технологии, но на пхп смотри symfony + rabbitmq bundle например.
Вообще анон, раз уж работаешь на говне - работай хотя бы по нормальным гайдам. Открой symfony доку, там твои ситуации уже 100500 раз решены, учись у грамотных.
>Твоя функция называется "отправить клиенту хедеры Connection: close и Content-Length: x", после чего можно делать че угодно, ответ уже ушёл.
Пиздец, удаление гланд через выхлопную трубу.
Воистину, пых-культура - это слепой ведёт незрячего.
Да, это блаженный местный.
Наверно, ты не так понял. Принцип Dependency Inversion говорит о том, что если у нас есть класс A, и ему нужен класс B, то правильнее будет переделать его так, чтобы ему нужен был не конкретный класс B, а любой класс, реализующий один или больше интферфейсов (B1Interface, B2Interface итд).
Например, ты пишешь парсер сайта avito - AvitoParser. Для работы ему нужно скачивать страницы с сайта avito, и для отправки HTTP-запросов он использует класс CurlClient. Получается, AvitoParser намертво привязан к CurlClient и подменить CurlClient на другой класс невозможно.
Принцип Dependency Inversion предлагает вместо этого сделать интерфейс HttpClientInterface, и сделать, чтобы AvitoParser мог использовать любой класс, реализующий этот интерфейс, а не только CurlClient. А CurlClient будет реализовывать этот интерфейс.
Я объяснил, что такое Dependency Inversion, а теперь ты объясни, где ты тут увидел запрет на использование наследования.
Нет, не бред. Например, принцип Lisvov Substitution Principle часто встроен в сами языки программирования (включая PHP), и именно из-за него при наследовании ты не можешь делать некоторые вещи.
Аналогично, Single Responsibility, очень полезный принцип.
Проблема твоего подхода в том, что:
1) тут никак не сохраняется результат работы функции. Нужно ведь не просто отправить email, а еще написать клиенту "email успешно отправлен" или "не удалось отправить email, попробуйте еще раз"
2) нет защиты от ошибки. Если вдруг скрипт упадет в процессе отправки email, то никто об этом не узнает и не попытается повторить отправку
3) веб-воркеров ограниченное количество и если каждый будет делать какие-то длительные операции, то некому будет обрабатывать запросы пользователей и сайт будет тормозить. Представь, что тебе надо отправить сотни email. Все веб-воркеры будут только заниматься их отправкой и никто не будет обрабатывать запросы пользователей.
То, что ты описал довольно просто реализуется через очереди задач. Ты помещаешь в очередь задачу отправки email, а cli-воркер берет задачи из очереди и выполняет их. Очередь позволяет сохранить результат выполнения задачи (или ошибку). Очередь также позвоялет обнаруживать взятые, но не завершенные задачи (если скрипт упал в процессе выполнения).
Очередь решает 3 проблемы, описанных выше.
Также, есть функция fastcgi_finish_request, но по 3 причинам выше я не советую ее использовать.
Гугли "очередь задач". Суть в том, что мы создаем очередь (например, в базе или в специальном хранилище очередей вроде RabbitMQ), и у нас есть программа-воркер, которая постоянно следит за очередью, берет из нее задачи и выполняет.
RabbitMQ я не люблю по двум причинам: 1) он переусложнен, там сделаны какие-то роутинги, и прочие сложности, которые мне не нужны. 2) там нельзя сохранять результат и статус выполнения задачи. Поэтому мне кажется, что база данных тут лучше подходит.
Попробуй почитать учебник по PHP в шапке, он очень простой и ты его наверно за пару недель можешь освоить. Также, почитай урок по архитектуре MVC тут https://github.com/codedokode/pasta/blob/master/arch/mvc.md и другие уроки отсюда https://github.com/codedokode/pasta/
Дальше, тебе нужна будет база данных. Есть простой учебник по основам SQL: https://sql-academy.org/ru/guide
К концу декабря как раз все это освоишь и можешь писать свой сайт.
Если что-то будет непонятно, спрашивай тут вопросы.
Нет, я умный, и очень хорошо знаю как технические, так и культурные недостатки пыхи.
А в том комментарии я хотел сказать, что проблема решается не хедерами. Хотя хедеры конечно же можно отправить.
Нихуя не так.
DI - не про интерфейсы вместо классов. DI - про то, что класс А не будет ничего знать про то, где брать класс Б или как его инстанцировать. При инстанцировании класса А ты передаёшь ему готовый экземпляр класса Б. Сам А не ищет Б ни через хардкод ни через сервис-локатор, ни в глобалсах не смотрит, не инстанцирует сам, никак. Именно в этом и заключается инверсия - раньше класс А сам искал Б, а после инверсии он не ищет, а ждёт когда ему положат в клюв.
>RabbitMQ я не люблю по двум причинам
>1) я нихера не понимаю как работают очереди
>2) я нихера не понимаю как строить приложения на основе событий, а не на основе долбёжки базы по крону
поправил тебя, не благодари

может через компосер глобально устоновить пакет?
Это не пакет, а экстеншен, т.е. бинарник к самому пхп. Надо установить ручками или просто раскомментировать в php.ini.
Хз, чо там в твоей зборочке.
Тут не Dependency Injection, a Dependency Inversion. Перед тем, как писать ответ, я погуглил, что это такое: https://en.wikipedia.org/wiki/Dependency_inversion_principle
>>527812
Тут нужен не пакет, а расширение Mcrypt, его через композер не поставить. Многие расширения на Windows уже идут в комплекте с PHP и нужно лишь разрешить/раскомментировать их в php.ini. Если расширение не идет в комплекте, то надо скачать dll c PECL, как описано тут: https://www.php.net/manual/ru/install.pecl.windows.php
Ебать, еще один из 2007
>>526698
А у меня вопрос.
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
print_r($input[$rand_keys [0]]);
print_r($input[$rand_keys [1]]);
У меня есть функция - array_rand. Она возвращает рандомный индекс. Почему тогда в строке, где print_r мы сами указываем индекс, если мы задали в переменной $rand_keys, функцией array_rand вернуть 2 случайных индекса?
Вот есть у нас эта функция. Возвращает она случайный индекс. в данном варианте у нас от 0 до 3 индекс. то есть 4 случайных может выпасть. Если я напишу print_r( $input[0]); то мне выдаст - Neo. То есть индекс отвечает за элемент. А в данном случае мы уже указываем индекс [0].print_r($input[$rand_keys [0]]);
Ну там же все написано
>Если вы выбираете только одно значение, функция array_rand() возвращает ключ, соответствующий этому значению. В обратном случае, она возвращает массив ключей, соответствующих случайным значениям.
$rand_keys это новый массив, в данном случае из двух элементов с индексами 0 и 1. Вот и выходит что подставляются 2 рандомных индекса старого массива и выводятся элементы по этим индексам.
Квадратные скобки позволяют взять из массива элемент по индексу. При этом индекс может быть числом, а может быть сложным выражением.
$rand_keys это массив из 2 элементов с ключами (индексами) 0 и 1
$rand_keys[0] это элемент из $rand_keys с ключом 0
$input[$rand_keys[0]] это элемент из $input с ключом $rand_keys[0], то есть с ключом, взятым из 0-го элемента $rand_keys
Ты главное не затягивай, начинай пилить как можно раньше. А то это дело такое, подводнокаменное.
>foreach ($array as &$item)
Ну в бд хранится информация, функция из бд возвращает массив и его нужно обработать определенным образом и вывести в шаблон. Например дата хранится в unix формате, а надо в человеческий вид привести.
С созданием нового массива быстрее вроде работать будет
Можно ещё в запросе это сделать, можно качать в виде ключ-> столбец и прямо по ключу менять значения.
Т.е. не столбец, а запись.
>Тут не Dependency Injection, a Dependency Inversion. Перед тем, как писать ответ, я погуглил, что это такое: https://en.wikipedia.org/wiki/Dependency_inversion_principle
Да, я обосрался. Действительно, есть такая задача и способ её решения.
Исходная проблема: есть парсер веба, например KoalaHttpParser. Мы пишем на его основе логику, получается зависимость
MyMagickApplication <- KoalaHttpParser
{hi} <- (low)
стрелочка тут указывает направление влияния, т.е. изначально была либа парсера, а потом мы на её основе построили приложение.
Дальше вся эта залупа разрастается:
ZebraDbDriver -> MyMagickApplication <- KoalaHttpParser
Однажды ты просыпаешься и понимаешь что пиздец, твоё детище MyMagickApplication завязло в зависимостиях. Хуёво это тем, что ты в его реализации ограничен требованиями от низкоуровневых либ. И ты думаешь "вот был бы у меня вагон времени - я бы написал всё с нуля, сначала MyMagickApplication, а потом под них MyMagickHttpParser, MyMagickDbDriver итогдалие".
То есть ты думаешь о том, как инвертировать зависимости
MyMagickDbDriver <- MyMagickApplication -> MyMagickHttpParser
(Напомню что стрелочки тут показывают направление влияния, т.е. обратны направлению зависимости. Вообще "зависимость от" - это синоним "знание о". Если либа А знает о либе Б, а "знает" означает "знает и учитывает в своей реализации" - то А зависит от Б. При этом нормальные здравые чуваки стараются чтобы Б ничего не знала об А, иначе получится циклическая зависимость.)
Вот ты пофантазировал вялого, а потом вспомнил о жестокой реальности, что у тебя низкоуровневые либы уже есть и весьма неплохие, переписывать их глупо. Но стрелочки ты развернуть хочешь. И ты придумываешь схему:
MyMagickApplication -> [?] <- KoalaHttpParser
то есть объявляешь буферную зону, в которую сливаешь все нестыковки между верхней и нижней частями. А детально это выглядит так
{MyMagickApplication -> HttpParserInterface} -> (KoalaHttpParserAdapter <- KoalaHttpParser)
Выделенное фигурными скобочками - это часть верхнеуровневой части, круглыми - нижнеуровневой.
Как ты мог заметить, стрелочка изменила своё направление по сравнению с самой первой диаграммой.
{hi} -> (low)
Это и есть инверсия зависимости между Hi-level-abstraction и Low-level-abstraction частями проекта.
>Тут не Dependency Injection, a Dependency Inversion. Перед тем, как писать ответ, я погуглил, что это такое: https://en.wikipedia.org/wiki/Dependency_inversion_principle
Да, я обосрался. Действительно, есть такая задача и способ её решения.
Исходная проблема: есть парсер веба, например KoalaHttpParser. Мы пишем на его основе логику, получается зависимость
MyMagickApplication <- KoalaHttpParser
{hi} <- (low)
стрелочка тут указывает направление влияния, т.е. изначально была либа парсера, а потом мы на её основе построили приложение.
Дальше вся эта залупа разрастается:
ZebraDbDriver -> MyMagickApplication <- KoalaHttpParser
Однажды ты просыпаешься и понимаешь что пиздец, твоё детище MyMagickApplication завязло в зависимостиях. Хуёво это тем, что ты в его реализации ограничен требованиями от низкоуровневых либ. И ты думаешь "вот был бы у меня вагон времени - я бы написал всё с нуля, сначала MyMagickApplication, а потом под них MyMagickHttpParser, MyMagickDbDriver итогдалие".
То есть ты думаешь о том, как инвертировать зависимости
MyMagickDbDriver <- MyMagickApplication -> MyMagickHttpParser
(Напомню что стрелочки тут показывают направление влияния, т.е. обратны направлению зависимости. Вообще "зависимость от" - это синоним "знание о". Если либа А знает о либе Б, а "знает" означает "знает и учитывает в своей реализации" - то А зависит от Б. При этом нормальные здравые чуваки стараются чтобы Б ничего не знала об А, иначе получится циклическая зависимость.)
Вот ты пофантазировал вялого, а потом вспомнил о жестокой реальности, что у тебя низкоуровневые либы уже есть и весьма неплохие, переписывать их глупо. Но стрелочки ты развернуть хочешь. И ты придумываешь схему:
MyMagickApplication -> [?] <- KoalaHttpParser
то есть объявляешь буферную зону, в которую сливаешь все нестыковки между верхней и нижней частями. А детально это выглядит так
{MyMagickApplication -> HttpParserInterface} -> (KoalaHttpParserAdapter <- KoalaHttpParser)
Выделенное фигурными скобочками - это часть верхнеуровневой части, круглыми - нижнеуровневой.
Как ты мог заметить, стрелочка изменила своё направление по сравнению с самой первой диаграммой.
{hi} -> (low)
Это и есть инверсия зависимости между Hi-level-abstraction и Low-level-abstraction частями проекта.
>PHP лучший вариант сейчас
чтобы быстро заработать копеечку
в плане обучения computer science он был и остаётся одним из худших вариантов
Это не проблема верстки? Кстати есть какой-то краткий гайд по основным аспектам? А то я с чистым хтмлом только взаимодействую.
у лары есть блейд,там можно жить чисто на знании html(собственно как я и делаю)
Спасибо за многобукв, но я все равно не очень догоняю.
отмена,я адун
> И ты думаешь "вот был бы у меня вагон времени - я бы написал всё с нуля, сначала MyMagickApplication, а потом под них MyMagickHttpParser, MyMagickDbDriver итогдалие".
Я не понимаю твоей логики здесь. Зачем писать MyMagicHttpParser, который подходит только для MyMagicApplication? KoalaHttpParser (который ничего не знает про MyMagicApplication) как раз лучше, так как его можно использовать в любом другом приложении.
Проблема, которую решает Dep. Inversion в том, что твое приложение завязано на KoalaHttpParser, а ты бы хотел, чтобы ты мог менять парсеры хоть каждый день в зависимости от настроения. Для этого мы меняем зависимость MyMagicApplication от KoalaHttpParser на зависимость MyMagicApplication от HttpParserInterface.
$doctors = array(
array(
'name' => 'Иванов',
'specialty' => 'хирург'
),
array(
'name' => 'Петров',
'specialty' => 'кардиолог'
)
);
foreach($doctors as $array => $doctor) {
foreach($doctor as $property => $value) {
if($value == 'Иванов') {
unset($doctor);
}
}
}
c отступами и скобками, если что , всё нормально, это тут криво вставилось.
Чет ничего вменяемого найти не мгу, кто-нибудь занимается таким поделием? Готов за ревью помогать по мере сил.
Могу в процедурный пых, немного ооп. Скуэль с вложенными, с джойнами могу. Подберите меня кто-нибудь)
>symfony + rabbitmq bundle например
зачем бандл?
есть компонент и он нормально работает
https://symfony.com/doc/current/messenger.html
От тебя больше проблем будет
спасибо!
Ковыряюсь в связке Вуе + Лара и хочу сделать не полноценные SPA, а модульный - когда на Вуе только интерактивные элементы, а всё остальное рисуется Блейдом. Например в ресурсном контроллере в update я отдаю формочку где компоненту в пропсах передаю один айдишник записи, а на клиенте уже при отрисовке идёт запрос на бекенд за данными этой записи.
Мне получается надо делать какой-то юзерапи для этих запросов? И где этот апи держать - дописывать методы в ресурсных контроллерах или создать отдельные в своём неймспейсе?
Хз может вы проще как-то делаете, а я заморочился?
Бери тогда livewire и не используй vue. А если хочешь vue тогда inertia и не используй блейд. Но если готовишься к собесам то лучше nuxt или next js, а ларавел только как апишку и обходи компании где требуются фулстеки, в пыхе это чревато набрать говна вместо опыта.
но если ты совсем вкатунец, то естественно тебе любой опыт сойдет, так что этот совет не для тебя
>хочу сделать не полноценные SPA, а модульный - когда на Вуе только интерактивные элементы, а всё остальное рисуется Блейдом.
Хуйня какая-то
Почему хуйня, вайти? Удобно же - статическая страница с динамическими элементами, которые отвечают только сами за себя.
Не совсем, это спа но с без логики на фронтенде, все что должен отобразить компонент страницы передается ему через пропсы бекендом. Валидация тоже только на беке, отпавка форм multipart/form-data и urlencoded без перезагрузки страницы. Т. е когда ты валидируешь инпут ты отправляешь целиком форму. И другой чисто бекендерсий опыт релевантен.
Но это годно если в одно рыло пилишь аппу. В компаниях лучше пилить отдельно фронт отдельно бек
Де, еще в отличие от спа у инертии каждая страница импротируется динамически и представляет собой отдельное приложение. Целиком весь фронт не грузится. Не нужен роутер и vuex
https://nednex.com/en/split-your-css-to-media-related-files-to-improve-performance-significantly/
Я правильно понимаю, что это можно сделать в вебпаке? Он позволяет собирать CSS разбивая его по @media запросам на файлики, или придётся пилить велосипед? Ищу актуальное решение, благодарочка за любую инфу!
У тебя прямо мегатонны мобильного сss, а не три строчки меняющие направления у флексов и темплейты у гридов?
Нахуя вообще Vue при таком подходе? Есть Inertia и livewire именно для этого. Чекай стартер киты в документации Laravel https://laravel.com/docs/9.x/starter-kits, там есть наборы где можно сразу влиться и начать делать такое приложение, поэкспериментируй с ними.
Мобильного - нет, но все вьюпорты и темы если учесть, то получается, что дофига можно было бы выиграть разделением.
На сайте значительная часть людей с дерьмовым мобильным инетом.
Тогда что ты собрался разделять у тайлвинда, у тебя же нет css типа BEM, для блоков которые не на всех страницах, а просто всюду насрано одними и теми же утилитами тайлвинда?
то есть в одном css bg-orange-500, а в другом bg-cyan-500, то микрооптимизация - у тебя css окажется на 90% идентичным
Я хочу тестануть это на своём пет-проекте с tailwind, чтобы понять как это автоматизировать и какие подводные камни, чтобы потом притащить в легаси проект с бутстрапом, где выигрыш будет ещё больше и будет заметен не только для мобильщиков с говноинетом.
>это годно если в одно рыло пилишь аппу
Примерно так и есть - прикидываю что было бы удобно использовать при разработке в одного где ехал фреймворк через фреймворк.

Аксиос из меты берёт насколько помню. Креденшиалсы тоже автоматом прописываются для кабинетов пользователей.
Или речь идёт о множественных формах? Получается, что токен у них один на все будет. С дивана я не вижу проблемы т.к. это не сильно от апи-токена отличаться будет. Наверное.
Привет, я передаю жпег через форму php и по какой то причине у меня это не срабатывает,
вот код
if( isset($_FILES) && $_FILES['avatar']['name'] == 0){ echo ' Файл загружен ';}
print_r($_FILES);
$destiation_dir = "F:\OSPanel\domains\phpLearn\userImages";
move_uploaded_file($_FILES['avatar']['name'], $destiation_dir );
что выводит на страницу
Файл загружен
Array ( [avatar] => Array ( [name] => Screenshot_6.png [type] => image/png [tmp_name] => F:\OSPanel\userdata\temp\upload\php3449.tmp [error] => 0 [size] => 416295 ) )
форма
<div class="container mt-2">
<form enctype="multipart/form-data" action="check_post.php" method="post">
<div class="mb-2">
<label for="inputFile" class="form-label">Выберите фотографию (файл) </label>
<input type="file" class="form-control" id="inputFile" name ="avatar">
</div>
заработало с помощью
$destination_dir = getcwd().DIRECTORY_SEPARATOR;
$target_path = $destination_dir . basename( $_FILES["avatar"]["name"]);
//echo __DIR__.$destiation_dir;
move_uploaded_file($_FILES['avatar']['tmp_name'], $target_path );
хз почему
name это имя файла получается а tmp_name сам файл?
у меня вышло сохранить в папке проекта, но все еще не выходит сохранить в папкуПроекта/userImages
все работает сори что насрал
>Зачем писать MyMagicHttpParser, который подходит только для MyMagicApplication? KoalaHttpParser (который ничего не знает про MyMagicApplication) как раз лучше, так как его можно использовать в любом другом приложении.
Речь про большие проекты, где не один человек делает пять сайтов, а пять человек делают сайт фуллтайм годами. Там нет задачи переноса кода на другой проект, а есть задача управляемости кода.
>ты бы хотел, чтобы ты мог менять парсеры хоть каждый день в зависимости от настроения
Хуйню написал, даже обсуждать это не буду.
Я пока это не собираюсь нигде использовать, просто любопытно.
Для такого огромного монитора 1920x1080 дает плотность точек 91 PPI (посчитать: https://www.sven.de/dpi/ ). Это довольно большие пиксели и, мне кажется, с полметра будет видно, что буковки не очень красивые и с серыми пятнами. Если ты сидишь дальше, то может быть ок.
На экране 96 PPI буковки не красивые. На экране с 140 PPI я не вижу с полметра пиксели и буковки более-менее нормальные. На экране с ~290 PPI (телефон) я вообще не вижу пиксели даже в упор. Там буковки выглядят почти как на бумаге.
>>531805
Если средства позволяют, я бы советовал брать побольше размером (чтобы больше кода помещалось и других окон), не не слишком большой (чтобы шею не пришлось выгибать) и с PPI чем больше, тем лучше. PPI в районе 140 смотрится довольно хорошо в Линуксе.
Также, желательно, чтобы матрица была IPS и с охватом хотя бы 100% sRGB, если для тебя важна точность передачи цветов (также можешь посмотреть, какая у него Delta E). Да и просто на таком мониторе картинка красивее смотрится. Если охват больше 100% sRGB, то это даже лучше, но если там в меню нет опции для ограничения охвата, то цвета без калибровки будут насыщеннее, чем надо.
Если ты не геймер, то на частоту обновления можно не смотреть.
Пока жива Лара, живы и мы!
Очередной вайтишка с нулевым кругозором удивляется тому, что язык, на котором работает 80% интернета никуда не пропал. Кек.
Да пиздец ебанулись уже не знают что делать и добавляются сахара как не в себя, лучше бы асинхронность нормальную запилили и в развитие swoole вложились, каждый релиз нагромождение бесполезной хуеты. 7.4 идеальная версия
Поработав с пару недель пригласили на корпоратив в Питер. Оплатили билеты и проживание.
Как приятно у вас (нас) в айтишечке.
У меня всё это было в 2003.
Никаких вкатунов ещё не было, я знал ассемблер z80, перл и фрибсд. Меня пригласил мажорный тип на одном из местечковых панковских концертов, с которым я был знаком через несколько рукопожатий. Мне вручили книгу по смуззихлебскому тогда сишарпу и ключи от квартиры, где был офис, там мы хуярили всякие проекты на фрилансе. Были же времена.
Потом выучил пхп, потом набрал пяток книг по руби, заснул в маршрутке и проебал их.
Потом появился третий питон и я его лениво учил, пробавляясь жабаскриптом. Потом я ударился в радиотехнику по стопам бати, копеечные микроконтроллеры могут в охуенные вещи.
Сейчас я лежу на диване и жду когда меня призовут, ничего из этого всего интересного не вышло, это был просто способ нихуя не делать и получать деньги, не ходя на ебучую работу.
М тебе советую того же, хотя там немного осталось.
Да вроде они последнее время больше по типизации упарываются. А это штука хорошая.
>Спустя 2 года таки вкатился
>Поработав с пару недель пригласили на корпоратив в Питер
А че в использование деепричастных оборотов за 11 лет школы не смог вкатиться?
Аноны, я уже учил php до проекта список студентов проект я не делал. Перескакивал с языка на язык и сейчас есть вакансия, где требуются
>Базовые знания php
Подскажите, пожалуйста, самый интенсивный курс по php, чтобы по быстрому все вспомнить.
Аноны, хочу сделать список студентов, информация в гайде актуальная? То есть про эту автозагрузку, шаблоны? А то прежде чем к задаче приступишь, недели две на гайде потераяешь.
Хуево, когда не знал, да еще и забыл...
Ну за высеры на дваче тебе же не платят, но...
>Базовые знания php
Пока ты будешь вспоминать то, чего не было, на эту вакансию уже 1к человек откликнется. Да и щас базовые знания - это знание Ларавел хотя бы.
Вакансия в мухосране, чтобы ты понимал, один человек пришел и прямо сказал, что ничего не знает и его взяли в тестировщики.
Другой человек имел опыт php, и его без технического собеса взяли. Правда на испытательный.
Правда до этого туда шел ещё, его чё то завалили вопросами, но возможно потому что там уже была кандидатурр получше.
Короче, действительно риск есть, но я поэтому и хочу интенсивный курс, так как я уже это учил, но нужно побыстррму вспомнить.
По большей части проблема в проекте, для приличия хочу сделать студ список, но тут загрузили с автозагрузкой, шаблонами, MVC. Вот это надо изучить.
Хотя в вакансии указано зслышать о KISS, SOLID и ещё что-то
Анон, вот так вот. Я уже 3-4 года в айти вкатываюсь, а кто-то вот так просто наскоком кабанчиком подкрашивает. Притом это не контора по нашим меркам.
Тестировщик - чей-то друг\сват\брат и за него попросили.
С опытом оно и понятно. Или ты себя равняешь с тем, кто с опытом?
А второй дурачок типа тебя. Его и побрили.
Просто делай студ лист без задней мысли, в учебнике опа если что подгляди про шаблоны.
Пока еще актуальная, единственное, что сейчас PHP8, и стоит использовать его фичи (то есть, везде указывать типы: в аргументах функций, в результатах, в полях классов), а для перечислений (например, пол, место жительства) можно использовать Enum.
Вроде добавили же легковесные файберы для асинхронности.
И в какой конкретно задаче тебе нужна асинхронность? Бизнес-логику с ней писать неудобно, даже с async/await получается громоздко.
Аноны, как вы смирились с тем, что вас не позовут в кремниевую долину или в Яндекс, потому что вы не умеет решать алгоритмические задачи?
Я не собираюсь ни в какие ебаные долины. Мне платят дохуя денег за лёжку на диване и небольшие просветы, когда я что-то делаю.
Обычные люди за много меньшие деньги тратят всё свое время, какие-то отпуска планируют, когда отдохнут от ебучей каторги. Я же всю жизнь отдыхаю со школы.
Немножко завидно фулл-тайм пограмистам, но они тоже жизнь сливают в унитаз в гонке за хуйнёй.
>>511483 (OP)
Спрошу по другому, как вы миритесь с тем, что вы не станете великим программистами?
>Вроде добавили же легковесные файберы для асинхронности.
Это все хорошо, но в синтаксисе самого языка этого нет.
>И в какой конкретно задаче тебе нужна асинхронность?
ХЗ даже сказать не могу про что-то конкретное, я сейчас на расте пишу и она у меня везде, от запросов на внешние апи до работы с файлами, код работает в разы быстрее когда все асинхронное.
>Бизнес-логику с ней писать неудобно, даже с async/await получается громоздко.
Тоже самое, просто у метода добавляешь async, а при вызове .await когда нужно, все остальное уже делается под капотом оборачивается в футуру, в js тоже самое создается промис и выполнается. Если их надо одновременно запустить, то в расте в tokiio::spawn отправляешь футуры и потом делаешь join, в js отправляешь промисы в Promise.all В расте единственно что нельзя так просто читать и писать, нужно либо склонировать переменную, либо оборачивать Arc и Mutex. Если нужно читать одновременно оборачиваешь в Arc<T>, если нужно оборачивать Arc<Mutex<T>> и делать lock() когда пишешь, но я обычно копирую переменную и записываю новые когда делаю join. Собственно вот и все сложности, просто в некоторых местах добавляется пару строчек кода, а в большинстве случаев нужно просто писать async await, это на самом деле не так страшно как кажется, но когда есть действия которые можно распараллелить то это дает неплохой прирост производительности
Я изначально не собирался быть великим программистом.
Я рандомхуй в своём пузыре, все знакомые и все клиенты рекомендуют меня для решения задач, потому что я решаю задачи.
У меня нет амбиций, я хочу нихуя не делать и получать за это деньги. Наследственной ренты у меня нет, поэтому приходится что-то делать.
Возможно, у меня какие-то депрессии-хуессии, которые отнимают у меня мотивацию, в предках достаточно пиздеца.
Вижу разделение таких как я и реальных ебанашек идейных в 10-20 против 90-80.
Сейчас же любой долбоёб прётся в ойти с желанием занять моё место, но мозгов/склада ума не хватает, так что они лишь несут деньги цыганам, которые тоже плотно заняли нишу стрижки добоёбов. Я бы тоже хотел стать таким, но мои скиллы несколько отличаются.
>Вижу разделение таких как я и реальных ебанашек идейных в 10-20 против 90-80.
Типа идейных 80-90? Че так много?
Наоборот.

Да мне бы хоть просто вкатиться...
Ну и последний вопрос. Если смотреть на количество вакансий, каких вакансий больше, тех, где требуются знания алгоритмов, структур данных, математики или где просто требуют знания инструментов?
Вся эта хуйня это карго-культ от гугла, на деле тебе ничего из этого не пригодится, оно выродилось в стандартные вопросы и в стандартные ответы.
Не, я только рад, но мне страшно, что я захочу вырасти в карьере, а вокруг будут вакансии с требованиями на уровне того же гугла
>великим программистами
Тебе 12 лет что ли? Что это за хуйня "либо стать великим, либо лежать на диване как бревно"? Так что ли?
Делаем потому, что можем и за это платят.
У меня вопрос.
function rd($rl, $ss)
{
$sds = '...';
$ss = mt_rand(1,2);
$xxx = substr($rl, 0, $ss);
$bg = $xxx.$sds;
return($bg);
}
$dd = "text";
$tt = 1;
print_r(rd($dd, $tt));
Тут я использую return. Ради интереса решил изменить в функции и убрать return и поставить print_r($bg);
И все равно все так же работает. Почему так. Ведь в таком случае функция ничего не возвращает и не принимает на вход никаких параметров?
Я бы попробовал, но это к психиатру какому-то надо идти, ну его нахуй. Пробавляюсь гидазепамом время от времени. Его вот хотят сделать йоба-рецептурным, надо будет закупить впрок.
Чел, ну серьезно, это не твое. Запишись на курсы вокальные или рисовать учись лучше.
Создай еще одну функцию, которая использует как параметр результат первой. И сравни что происходит ретурн и принт.
Я попробовал. создал 2 функции. Смог сложить.
Когда использовал принт, то не получилось.
Я понимаю, что return позволяет мне сохранять значение в переменной и использовать его дальше. А принт просто печатает.
Я просто не понимаю, почему в данном случае все работает. Я думал должно ошибку выдавать.
P/s
А куда в данной функции(которую я скинул выше) записывать параметр первой функции во вторую?
Все норм пари на линуксе
А что за задачу ты пытаешься решить? Трудно из твоего кода это понять, так как у тебя названия переменных и функций выглядят как случайный набор символов. Тяжело разбираться в таком коде, и ты сам, наверно, путаешься.
Желательно использовать нормальные названия переменных и функций, чтобы было понятно, что делает код, вроде $name, $count и тд. Если ты делаешь что-то абстрактное, то используй тогда $a, $b, $c и так далее.
Если ты не используешь return в функции, то функция все равно возвращает значение по умолчанию - null.
Если ты просто уберешь return из кода, то print_r(rd($dd, $tt)) попытается вывести null и программа ничего не выведет. А если ты заменишь return на print_r,, то функция выводит данные на экран, но возвращает null (так как в ней нет return).
>>537474
> Я просто не понимаю, почему в данном случае все работает. Я думал должно ошибку выдавать.
В PHP отсутствие return не является ошибкой, так как в этом случае функция возвращает значение по умолчанию null. Поэтому твоя программа не выдаст ошибку от того, что ты уберешь return.
null это не строка "null", а специальное значение, которое обозначает отсутствие данных.
Ты можешь убедиться в этом таким кодом:
function a()
{// нет return
}
var_dump(a()); // выведет null
Я советую тебе использовать var_dump вместо print_r, так как она выводит данные в более понятном виде, и указывает тип данных.
А что за задачу ты пытаешься решить? Трудно из твоего кода это понять, так как у тебя названия переменных и функций выглядят как случайный набор символов. Тяжело разбираться в таком коде, и ты сам, наверно, путаешься.
Желательно использовать нормальные названия переменных и функций, чтобы было понятно, что делает код, вроде $name, $count и тд. Если ты делаешь что-то абстрактное, то используй тогда $a, $b, $c и так далее.
Если ты не используешь return в функции, то функция все равно возвращает значение по умолчанию - null.
Если ты просто уберешь return из кода, то print_r(rd($dd, $tt)) попытается вывести null и программа ничего не выведет. А если ты заменишь return на print_r,, то функция выводит данные на экран, но возвращает null (так как в ней нет return).
>>537474
> Я просто не понимаю, почему в данном случае все работает. Я думал должно ошибку выдавать.
В PHP отсутствие return не является ошибкой, так как в этом случае функция возвращает значение по умолчанию null. Поэтому твоя программа не выдаст ошибку от того, что ты уберешь return.
null это не строка "null", а специальное значение, которое обозначает отсутствие данных.
Ты можешь убедиться в этом таким кодом:
function a()
{// нет return
}
var_dump(a()); // выведет null
Я советую тебе использовать var_dump вместо print_r, так как она выводит данные в более понятном виде, и указывает тип данных.
Есть тесты на Селениуме для сайта на php(Yii2). Просто примитивные скрипты на Java. Как и куда эти тесты правильно добавить в сам проект на Yii2? Как сдеать чтобы их можно было запускать в PHPStorm прямо в среде по нажатию кнопки а не только из консоли с самого сервака?
А че, загуглить никак?
Проверь своё говно здесь https://3v4l.org/ и тащи сюда ссылку, хуль мы тут должны в голове коньпилировать
Добавить можно в папку tests/selenium
Как запускать - надо смотреть доки к PhpStorm. В PhpStorm тебе нужно лишь указать консольную команду для запуска, но подвох в том, что сначала надо заставить эту команду работать у тебя:
- нужно установить нужную версию java
- скорее всего, нужно установить менеджер пакетов maven или что они там используют (gradle?), и установить им нужные пакеты
- нужно установить или настроить браузер, которым будет управлять selenium, желательно в headless режиме, чтобы он не мешался на экране и чтобы ты случайно в него не ткнул
Если память много, ты можешь установить виртуальную машину с линуксом и в нее ставить Яву и запускать тесты в ней.
Близится конец месяца моей стажировки, будут делать новый офер. Меня вряд ли спросят, но все же за 20 к въебывать не хочется. На хх мониторить не хочу, мне кажется там разброс дикий.
Есть инфа средней по рынку?
Мне на мухосранской удаленке после месяца с 20 до 35 подняли.
Компания мне оплатила курсы, начал учится. Уволился. Под конец курса уже фрилансил. Даже не закончил его, тк время не было ещё и учебный проект делать. Фрилансить мне надоело, спросил у бывшего ментора есть ли знакомы которые ищут джуна. Дали контакты, сделал тестовое. Предложили офер. Ничего сверхъестественного.
Стажером я устроился имея 3 месяца опыта во фрилансе.
По факту я не стажёр, просто это повод платить меньше в первый месяц. Мне так кажется.

Я депрессивный пожилой зумер, амбиций нет. Понимаю, что во всякие модные среакты, нодыжс, петон мозгов не хватит попасть и пробиться сквозь толпу 16лвл синьоров. Мне бы что то попроще, не хайповое, там достигнуть какого то уровня и ок. Готов работать с петровичами, даже натянуть проперженный свитер. Про заоблачную зарплату тоже не мечтаю.
Иногда посещают мысли, что выбрав не то направление я могу пожалеть в будущем, но все ли так плохо может оказаться через 5-10 лет?
> Нормально ли вкатываться в 2к23 в PHP?
Да, только в него или 1с и нормально. Скачай мобильное приложение hh и почекай джуновские вакансии: там где на пыху 20-30-40 кандидатов - на питон/фронт/джэву 200-300-400, да еще и самих вакансий меньше.

Сап, у меня есть тег <code>, в котором отображаются данные из базы. Как в ларавел сделать так, чтобы я мог нажать кнопку, отредактировать и отправить изменения в базу?
Подскажите, почему пхпстэн показывает такую ошибку: Cannot call method getItem(). При этом все работает.
>найти наставника
Чтобы найти "наставника" - надо брать деньги и искать институт, курсы, репетитора. Больше никак.
>Мне бы что то попроще, не хайповое, там достигнуть какого то уровня и ок.
Лол, я тоже так вначале думал. Сейчас сам на хайповом стеке работаю, как поридж какой-то.
Так больше не у кого спросить. Родители заводчане, друзей нет, а те что были не в айти
Да, спасибо, все четко.
Ладно, анон. Скажу как быдлокодер с шестнадцатилетним стажем. С пыхи зайти легко, на хлеб заработать всегда будет. Выйти будет сложно, но, возможно, тебе это и не надо будет.

https://www.php.net/releases/8.2/en.php
>>540402
Да. Был период, когда РНР все хейтили (возможно, в результате заказной кампании Microsoft), но он всё так же остаётся на 80% вебсайтов, плюс везде: в телекоме, банкинге, финтехе и т.д.
Хочешь получать мало -- ковыряй ЦМС-ки.
Хочешь получать много -- фреймворки, паттерны программирования и байтоёбство.
>Выйти будет сложно, но, возможно, тебе это и не надо будет.
В смысле перейти на какой то другой стек, например ноду? В случае чего, можно будет перекатиться в ноду имея опыт, даже с понижением зп/лычки?
>>541140
Я планирую двигаться в сторону лары. Вордпресс когда то смотрел, у меня чуть мозг не вытек. Хоть все и говорят, что это дно и легко, но как по мне, то ну его впизду. Мне ближе ООП почитываю книгу Зандстры по PHP 8. Там хоть понятнее, чем цмс, ну и интереснее + полезнее
Диды работают, вкатуны выбирают что-то более порриджевое. Стандартный расклад для старых языков.
Почему die(); можно писать со скобками и без скобок? Понятно, что в die можно передать параметры как в обычные функции, но при этом оно работает если просто написать die;
Функции же вроде без скобок не вызываются?
В бизнесе это так не работает. У нас проекты написанные в 2012-2014 году, их только полгода назад на php7 перевели.
Круто, но на коммерческих проектах про такое можно забыть - у бизнеса сейчас всё на 7.4 в самом лучшем случае, а чаще на 5.3
Т.е. битриксоиды пишут на более современной версии пыха чем вы?
Шёл 2022 год, а про асинхронность в нативной пыхе даже нет и слухов как и своего пакетного манагера.
В задницу себе засуньте асинхронный бандл
ну я образно выразился. на фрилансе я не развивался как разработчик. Денег было больше, это да. Но по сути я просто свои ошибки из проекта в проект таскал без код ревью и помощи от старших. + мне хотелось работать в команде, коммуницировать и тп. Одному очень скучно.
если более менее то за недели 3 ты сможешь запустить живой сервер с выводом инфы из БД
Я думаю не стоит пренебрегать какими-то технологиями. Не надо ненавидеть CMS, надо понять, как оно устроено, найти для себя в этом интерес. Даже в этом можно найти что-то новое, что-то, чего бы я никогда не увидел, изучая только популярный ООП MVC фреймворк.
> своего пакетного манагера
ну и кто тут обосралсо? Сколько лет composer-у?
> асинхронность
И по какой же причине я не могу ставить дополнительные пакеты? Ты скозал?
Но даже без дополнительных расширений -- легко, например, с помощью выделенных подпроцессов и вебсокетов.
В чём проблема? В РНР ты можешь вызывать любые системные функции и получать результат в браузере. Хоть весь линукс вызови )
https://www.php.net/manual/en/function.shell-exec.php
https://www.php.net/manual/en/function.system.php
Обычно люди не могут разобраться в какой-то технологии из-за того, что они не изучили другие технологии сначала, а перескочили через них. Если ты что-то не понимаешь, то остановись и изучи непонятный тебе вопрос, найди уроки, лекции или курсы по нему. Так, конечно, времени уйдет больше, но зато ты не будешь себя чувствовать обезьянкой, которая бездумно правит код, не понимая, как он работает.
В реакте ничего сверхсложного нет, и, кстати, его принцип работы напоминает PHP: при любом изменении данных мы заново перегенерируем всю страницу. Но если ты не знаешь хорошо JS и шаблонизатор JSX, или не разобрался в концепциях реакта, а сразу берешься за код на нем, то конечно ты ничего не поймешь.
Также, ищи тот способ обучения, который для тебя работает лучше. Кому-то больше нравятся видеоуроки, а кому-то чтение документации, кто-то лучше запоминает, если ведет записи. Кому-то помогает решение задач с codefores/leetcode. Кому-то удобнее изучать по много сразу, кому-то не спеша и с перерывами.
Увы, все эти способы требуют время. Либо ты тщательно все изучаешь и хорошо в итоге все знаешь, либо перескакиваешь и в итоге ничего толком не понимаешь.
И опять же, останавливайся каждый раз, как встретил что-то непонятное. Увидел слово "открыть файл" и не понял - остановись и найти уроки по работе с файлами, что значит "открыть" и "закрыть"? а не пытайся проскочить это.
Это надо делать на JS. Также, возможно, тебе лучше использовать тег textarea для этого.
>>540757
Он думает, что last может быть null, и тогда вызов getItem не сработает. В качестве костыля ты можешь либо отключить проверку в этой строчке, либо заменить if ($thus->isEmpty()) на if (!$this->last) и тогда он должен понять.
Потому, что die это не функция, а конструкция (вроде if или for). Ее синтаксис такой:
die выражение;
Если ты пишешь скобки, то это просто получается выражение, завернутое в скобки, а не вызов функции.
Асинхронность есть через библиотеки, и она редко когда нужна. Приведи реальный пример бизнес-приложения, где отсутствие асинхронности мешает использованию PHP.
Вот, например, сайт-лендинг для заказа услуг клининговой компании. Или сайт компании по продаже недвижимости. Где там асинхронность?
>>536712
>>Бизнес-логику с ней писать неудобно, даже с async/await получается громоздко.
> Тоже самое, просто у метода добавляешь async, а при вызове .await
Я пишу без async и await и у меня все работает. Зачем мне следовать твоему совету и усложнять код? Это никак не поможет решению задачи и не улучшит показатели бизнеса. Да и код лучше от этого не станет.
Также, для асинхронности в PHP есть файберы. Они позволяют писать асинхронный код без async/await/промисов и в том же JS или Питоне такого нет. PHP тут, похоже, впереди других языков в плане поддержки асинхронности, хотя она никому особо и не нужна.
Шёл бы ты отсюда, дурачок.
public function handleRequest(Request $req, Response $resp)
{
$name = $req->query->get('name');
$name = Util::sanitizeFilename($name);
// асинхронная операция - здесь выполнение файбера
// может быть прервано для обработки других запросов
$file = $this->fs->readFile("/files/$name");
$resp->setHeader("Content-Type: ...");
// асинхронная операция
$resp->sendContent($file);
}
Как видим, мы имеем ту самую асинхронность, с которой тут все носятся, по модели, похожей на Го.
Выглядит очень многообещающе, но какие будут показатели на практике? Интересно было бы проверить.
Если кто-то из анонов хочет разобраться в таких новых технологиях, поломать себе голову ближайшие 2 месяца, то могу предложить задачу: написать асинхронный memcached-сервер на файберах (либо чат на вебсокетах, если хотите задачу посложнее и поинтереснее, месяца на 4).
Нужен будет PHP8.1 или новее, возможно, под windows будут сложности, так что понадобится либо WSL2 (Windows 10) или linux, или хотя бы виртуалка с linux. Но может и под Win7 заработает, кто знает.
Нужно будет изучить: сокеты Беркли, вебсокеты, файберы, возможно, немножечко swoole либо ReactPHP (для асинхронной работы с файлами и запросами). Возможно, документация будет на английском, но машинный перевод сейчас не так и плохо работает, разберетесь. Нужно бы покрыть все тестами и сделать бенчмарк для измерения производительности. Будет нелегко.
Если есть желающие, пишите какая задача вам интереснее, я напишу что изучать и сформулирую ТЗ. Дам ссылку почитать, если что-то будет непонятно. Может даже объясню самые непонятные моменты. Будет чем похвастаться на собеседовании.
вот бы все эти знаки в башку сразу загрузить, очень интересно и выглядит супер полезно но времени нихуя нет.
знания быстрофикс *
>Они позволяют писать асинхронный код без async/await/промисов
А как они узнаю когда вызывать а когда нет, шишка этих промисов и футур в том что они ленивые.
>хотя она никому особо и не нужна.
Если делаешь форму мы вам перезвоним на ларавеле, то да, но где данных много, есть различные апи и микросервисы, много пользователей и тд асинхронность в разы ускоряет работу софта и уменьшает нагрузку на сервер
> асинхронность в разы ускоряет работу софта и уменьшает нагрузку на сервер
Но ведь API и микросервисы увеличивают ее.
Микросервисы нужны только компаниям большого уровня (у которых > 100 разработчиков и гигантские проекты на миллионы строк кода). Я думаю, у 95% бизнеса нет таких показателей и нет потребности в микросервисах и в твоей асинхронности.
Больше, можешь глянуть кол-во вакансий. Но вообще это не важно, нужно лишь быть лучше чем все твои конкуренты на место
https://onlinephp.io/c/cbe67
> $b != 1000000
Это неправильное условие продолжения цикла, так как вряд ли там наберется ровно 1 000 000. Правильно было бы написать: продолжать цикл, пока сумма меньше миллиона. И тогда if + break будут не нужны.
> $b = (round($b));
Здесь внешние скобки не нужны, можно писать $b = round($b);
Переменная $i тоже не очень нужна, так как мы можем узнать, сколько прошло лет, через разницу в возрасте.
> врядли там наберется ровно
Но может набраться больше, тогда цикл остановится и не выведет последний результат
>есть различные апи и микросервисы, много пользователей и тд асинхронность в разы ускоряет работу софта и уменьшает нагрузку на сервер
Про брокеры сообщений ты, я так понимаю, не слышал.
Если ты говоришь про асинхронность запросов к микросервисам, то мне, конечно, оч сложно бизнес-кейс для этого представить, но даже в том же guzzle это уже миллион лет как реализовано.
>Сколько лет composer-у?
Композер это нативный пакетный менеджер? Хуя какие открытия я познал, лул.
>не могу ставить дополнительные пакеты
По причине того, что асинхронность на уровне интерпритатора будет гораздо эффективнее.
>>542646
>и она редко когда нужна
Она нужна всегда когда ты стучишься к БД или к файлам т.е всегда.
>Также, для асинхронности в PHP есть файберы
PHP-реализация файберов — это не настоящие асинхронные вычисления. Даже после появления новинки ядро языка осталось синхронным.
>Про брокеры сообщений ты, я так понимаю, не слышал.
Не всегда прокатывает, бывает всякое легаси и сторонние апи, новое да с кроликом пишем
Не понимаю, почему не перевели доки свула на английский? Ебучие пидарасы пишут хуй пойми на каком наречии, переводчик не все может перевести.
swoole
В чем смысл использовать __ DIR__? Типа есть же аналог ../ перед реквайером ставишь и всё. А так получается __DIR__ . "/../.."
Тоже самое не?
>Низусть?
Вот тоже это интересно, нельзя просто загуглить что надо? Или там какие-то подводные камни надо отдельно разбирать?
>Или там какие-то подводные камни надо отдельно разбирать?
Запилить пару проектов надо чтобы механику работы понимать и шишек набить с языком. Познакомиться с популярными решениями, библиотеками и фреймворками.
Как тут что-то можно именно "выучить" я не понимаю.
__DIR__ - полный путь до папки. Например, если ставить скрипт на cron, то без __DIR__ путь будет ломаться.
Двачую, сегодня ковырялся в тепленьком легаси на ларе 4,2 пхп 5,4 По приезду домой сходу в душ
Как долго учил все это? Много ли времени уделял? Что было сложным? Хотелось дропнуть?
Год. Сложно было понять циклы и как парсить данные. Занимался по 4 часа каждый день, кроме последнего дня месяца - я делал уборку по дому и отдыхал на природе. Дропнуть хотелось часто, особенно в первый месяц, дальше было попроще. Если бы не работа, то, конечно, быстрее всё изучил бы. Наверное за 6-8 месяцев.
Это может всё звучать смешно, типа как можно циклы, условия и все вот эти базовые-пребазовые штуки так долго изучать и понимать, но у нас в школе даже информатики не было, я серьёзно тебе говорю, поэтому для меня всё было очень непонятным и сложным, т.к. получается, что с полного нуля я начал заниматься.
4 часа в день. Блин жесть. У меня и 2х часов свободных в день нету. Хорошо если 4-6 часов в неделю найдутся чтоб изучать перед компом. Видимо мне не светит
Смотрю пока что базовый курс. Нравится то, что сходу идет объяснение на примере какой то задачи, а не пересказ документации што такое цикл. Пытаюсь самостоятельно написать пример с урока после просмотра видео + есть задача после каждой темы, и видео с ее разбором.
На ютубах толком нихуя нет. На юдеми давно протухший курс какого то мекса висит, хуета хуетой
Верно. Но тогда неработающее условие из цикла for лучше вообще убрать:
for ($b=10000; ; $b = $b + (($b / 100) * 10)) {
...
Не нужно писать это условие, так как оно сбивает с толку при чтении кода и заставляет думать, зачем оно нужно. Код должен быть простым и очевидным, а не сборником загадок.
Также, здесь можно применить цикл while с постусловием (понимаю, что надо добавить в учебник, но все забываю):
do {
} while ($b < 1_000_000);
(подчеркивания в числах можно делать для читаемости).
О, ООП-вариант, интересно. Но на мой взгляд, тут требуются доработки.
Когда ты передаешь все параметры вклада в конструктор, и затем вызываешь calculate() без параметров, то у такого подхода нет никаких преимуществ перед обычной функцией. Нет смысла в замене обычной функции на класс.
Если ты хочешь использовать ООП, у тебя должна быть причина, почему ты сделал класс, а не просто функцию.
Смысл использования объекта появляется, если ты, например, в конструктор передаешь параметры банка (процент), а в функцию - параметры вклада (сумма, возраст ит.д.). Тогда объект соответствует условиям банка, и мы можем рассчитать несколько вкладов, используя один объект:
$deposit = new Deposit(10); // 10% в год
$deposit->calculate(10_000, 1_000_000, 18, 85);
$deposit->calculate(20_000, 500_000, 65, 85);
Тут у нас объект класса Deposit представляет собой "условия вклада" и позволяет рассчитывать результаты для разных сумм и возрастов. Мы можем даже создать несколько объектов (например, для разных банков или разных видов вкладов в одном банке) и сравнивать, куда выгоднее вложить деньги.
Также, твоя функция выводит результат на экран. Но лучше бы, если бы она его возвращала через return. Это позволяет более гибко использовать класс - может, мы захотим сделать какие-то дополнительные расчеты или поменять формат вывода. Не стоит смешивать в одной функции расчет и вывод данных.
Функция возвращает несколько параметров (итоговая сумма, итоговый возраст, дожил или нет). Для 3 параметров хватит массива, но если возвращаемых данных было бы много, то удобно использовать объект для их представления.
> (float)number_format($value, 2, '.', '');
Используй функцию round для округления до 2 знаков (хотя, в финансах часто промежуточные вычисления делают с 4 знаками).
> @param int $customerAge
> @return void
Эти аннотации не содержат никакой новой информации и их писать не надо.
> Композер это нативный пакетный менеджер?
Что значит "нативный". Я не очень понимаю этот термин. В Викисловаре "нативный" определен как "использующий специфические особенности архитектуры целевой платформы". Какие специфические особенности должен использовать composer и зачем?
>>544469
> Она нужна всегда когда ты стучишься к БД или к файлам т.е всегда.
В бизнес-логике часто требуется делать последовательные действия. Каким образом твой асинхронный код их ускорит?
Вот мне надо получить пользователя из БД по id. Как тут поможет асинхронный код?
Бывают ситуации, когда логику можно распараллелить, но это приводит к большим затратам времени с неясным выхлопом. То есть, если у нас страница отдается за 100 мс, то зачем мне тратить деньги на оптимизацию ее до 70 мс за счет асинхронности, и усложнять понимание кода, что приведет к дополнительным расходам?
Если для тебя приоритет скорость выполнения, то тебе нужно брать не PHP, а Го, Раст и писать на них (это будет дороже, но код будет более быстрый). Но в этом случае мы получаем, что PHP не нужна асинхронность.
> PHP-реализация файберов — это не настоящие асинхронные вычисления
Это асинхронность в том же смысле, как она реализована в JS и libuv, то есть возможность производить множество I/O операций параллельно без переключения контекста. Файберы при этом лучше механизма, основанного на промисах в JS.
Это же опен сурс, займись переводом. Опен сурс это не "сделайте мне бесплатно программу", а "разрешите поделиться сделанной мной программой, может быть кому пригодится".
Нет. Если ты пишешь require '../file.php', то файл ищется не относительно текущего файла, а относительно рабочей директории процесса (она задается с помощью chdir() и получается с помощью getcwd()). Иногда рабочая директория случайно оказывается такой, какой надо, и это работает, но гарантий нет.
Если же ты пишешь require 'file.php', то дополнительно файл еще ищется в include_path. Возможно, ты этого не хочешь.
В случае же __ DIR __ мы явно указываем, что файл должен искаться относительно текущего файла.
Как по мне, так система поиска файлов неудачно сделана (потому, что скопирована с Си).
9-12 месяцев. Для изучения самых основ PHP и основ ООП могу нескромно посоветовать учебник в шапке, а также официальный мануал PHP, а для практики советую сделать магазин, но на фреймворке Symfony или Laravel и почитать подробные советы из задачи про студентов из шапки.
>>546292
Допустим, тебе надо найти минимум функции с 900 переменными. Что, нельзя просто загуглить, какой минимум у этой функции?
У тебя на картинках явно не совсем базовый курс, так как там начинается сразу с POST/PUT, а где основы HTTP, основы PHP (циклы, массивы, функции итд). То есть, это не совсем для начинающих.
Хватит срать.
It's clear that fibers are a significant improvement, both syntax-wise and in flexibility. But they are nothing yet compared to, for example, Go, with its "goroutines".
There's still lots of functionality missing for async PHP to become mainstream without the overhead of frameworks, and fibers are a good step in the right direction, but we're not there yet.
https://stitcher.io/blog/fibers-with-a-grain-of-salt
Если это из-за работы, то получается у тебя выбор: либо дальше работать на этой работе, либо поменять график работы, чтобы сейчас меньше зарабатывать, но больше времени иметь на учебу.
Ты бы пост внимательнее читал. Я сравнил возможности файберов с возможностями JS, а ты приводишь в цитате Го.
Зачем PHP копировать архитектуру Го? Если тебе нужны горутины, то просто пиши код на Го.
>Ты бы пост внимательнее читал. Я сравнил возможности файберов с возможностями JS, а ты приводишь в цитате Го.
Так нода синхронная получается? Свежайшая инфа из пхп треда.
>Зачем PHP копировать архитектуру Го? Если тебе нужны горутины, то просто пиши код на Го.
А зачем тебе, петушиная голова, файберы? Нахуй ты про них заикнулся вообще?
Типичная задача в вебе это стукнуть в три апи, вытащить оттуда в цикле по миллиону записей, обработать и высрать результат в базу/очередь/еще одно апи. И если делать это все синхронно, то процесс может не закончиться вообще никогда, потому что ты тупо будешь не успевать обработать до подхода новой пачки.
И такое же типичное решение пхп макакера это насрать демонов, текущих как его мамаша по стасу михайлову. Все это добро дедлочит базу, падает по памяти и ебет мозги всем окружающим до тех пор пока какой-нибудь макакаен не поставит себе на стол ебучего хомяка и не заменит весь этот кал одной функцией. А так-то да нахуйя копировать хорошее, лучше атрибуты у джавы скопировать, так не хватало ведь говна в коде.
Базовый курс - топ, остальное сильно хуже, с тоннами воды.
Я один хуй на 8 сижу и пока переходить не планирую.
Что твой стиль письма, что твои знания примерно на одном уровне. Возможно, тебе следует изучить, как реализована асинхронность в JS и в Го, прежде чем пытаться комментировать.
> Так нода синхронная получается?
Давай еще раз повторю: файберы в PHP позволяют реализовать как то, что есть в JS, так и строить более продвинутые асинхронные конструкции. При этом без всяких async/await. Где ты тут увидел, что "нода сихронная", я не понимаю.
> Типичная задача в вебе это стукнуть в три апи, вытащить оттуда в цикле по миллиону записей,
Я бы такое решение, которое обрабатывает миллион записей в обработчике запроса, в прод не допустил, даже если оно написано на Расте. Но, возможно, в твоей компании так принято делать, не знаю.
> И если делать это все синхронно,
Асинхронность (как в JS) тебе никак не поможет ускорить обработку записей. Код на JS не будет магическим образом за счет асинхронности обрабатывать эти записи в несколько потоков параллельно. Если тебе необходимо делать какие-то вычисления и преобразования, то переход на JS тебе никак не поможет их ускорить. А ты, похоже, этого не понимаешь и пишешь тут чушь.
Асинхронность позволяет одновременно отправить несколько запросов в разные API, и это можно сделать в PHP, хоть на файберах, хоть на промисах (на файберах удобнее).
Асинхронность также не помогает при работе с БД. Твой код может быть асинхронным, но если у тебя одно соединение с MySQL, то ты можешь выполнять только один запрос одновременно. Ты не можешь отправить параллельно 1000 запросов (ты, конечно, можешь попробовать открыть 1000 соединений к БД, но это повлечет рой других проблем). Как видишь, ни JS, ни Го не позволят тебе легко распараллелить выполнение SQL-запросов.
Твой пост показывает, что ты этого не понимаешь. Сдается мне, ты свою воображаемую задачу никогда и не решал, а если и решал, то скорее всего неэффективно. Зачем тебе асинхронность, если ты ей пользоваться не умеешь.
> использовать готовый CSS-фреймворк Twitter Bootstrap
Twitter Bootstrap закрылся? Теперь обычный Bootstrap?
Спасибо большое!)
Задачу пытаюсь решить такую...
Случайно на форуме наткнулся на такой вопрос - "А можно ли вместо return все время использовать print_r'?"
Подумал про себя, что конечно нет. Потом решил проверить и все заработало. Вот и вопросы появились.
Ответ: в общем случае, нельзя, в редких случаях можно, но не нужно.
Можно заменить return на print_r, если ты сразу распечатываешь возвращаемое значение:
function f()
{
// можно заменить на print_r
return 2 + 2;
}
print_r(f());
Но в других случаях нельзя, например:
function f()
{
return 2 + 2;
}
$a = f() + 1;
print_r($a);
Этот код будет работать по-другому, если заменить return на print_r (можешь проверить сам).
Обожаю таких манек, выучил он, уже вижу твой горящий пердак от проблемы, которая есть, а загуглить и даже вопрос задать по ней не получается, потому что хз как это объяснить. Можно сразу свой анус к такому развальцовывать и морально готовиться.
Что не так? Он правильный ответ?
Тупорылый ты хуесос (как в JS). Какой нахуй MySQL? (как в JS). Ты не сможешь отправить несколько запросов одновременно на файберах (как в JS). Тебе это с самого начала в ебало и тыкали. То что JS в браузере этого сделать не может каким хуем оправдывает что пхп этого сделать не может? А факт того что тот же JS но в серверном исполнении в виде ноды это отлично делает ты, дегенерат, старательно игнорируешь.
>Я бы такое решение, которое обрабатывает миллион записей в обработчике запроса, в прод не допустил, даже если оно написано на Расте
Разумеется никто блядь не обрабатывает сразу миллион, а дергает сколько апи отдаст. Но раз уж ты упомянул, то в чем принципиальная разница? Что мешает тебе сначала получить по миллиону из каждого апи, а потом просто в цикле обработать этот миллион? Ну займет это в памяти двести мегабайт, как количество на скорость повлияет хуесосина? Я конечно читал в этом треде что понимание сложности алгоритмов нинужно, но вот так срать под себя это надо уметь.
>Асинхронность (как в JS) тебе никак не поможет ускорить обработку записей.
Кого вообще ебет обработка. IO 90% времени занимает. С трех апи может по 100мс с каждого набежать, даже для пхп 300мс это вечность нахуй. Такое же соломенное чучело как и (как в JS).
Короче, для эффективного решения этой задачи ТИПИЧНОЙ СУКА ЗАДАЧИ нужно чтобы язык обеспечивал НЕБЛОКИРУЮЩИЙ БЛЯДЬ IO. Пхп так не может. Файберы хуяйберы, один хуй не может. Так что предлагаю тебе завалить ебало и ждать когда сможет. То что нормальную асинхронность в него добавят это 100%, только ждать придется еще лет десять.
В чем разница написания таких конструкций:
$flag = "0";
if(!$flag) {
echo "не существует";
}
или:
$flag = "0";
if(empty($flag)) {
echo "не существует";
}
В чем-то разница есть вообще?
Читаю статейку про MVC от Оппа, и не понимаю, для чего нужно было создавать скрипт инициализации bootstrap.php?
Тип его же не обязательно создавать для MVC?
https://www.php.net/manual/ru/types.comparisons.php
Нужно быть очень осторожным с типами и что там ожидается в переменной.
bootstrap-файл это обычно "бутстраппинг" приложения, первичная инициализация и подгрузка конфигов. У меня, когда я на коленке делаю софтинку, этот файл возвращает экземпляр app, который в минимальном исполнении просто контейнер с сервисами.
Есть ли какой-нибудь годный курс по CMS Bitrix?
Можешь Михаила Базарова посмотреть, плюс на его сайте есть всякие читы к битриксу, бывало очень помогало. И еще канал "Я кодер" на ютубе. Ну и еще оф. курсы, но наверное заебешься через час смотреть их. Наверной я кодер канала хватит, дальше просто делай что тебе необходимо и так и учись уже, параллельно гугля проблемы.
Еще сильно советую тг-каналы по битриксу. Их два, но они оба по сути об одном. Там сам найдешь не так сложно. Там в этих каналах можно в поиске найти ответ на свою проблему или просто спросить, почти всегда отвечает кто-то, активность высокая кароче.
Спасибо, няш3
Обычно тебе нужно подключить автозагрузчик классов, может быть, прочитать конфиг, определить какие-то константы, подсоединиться к БД, еще что-то настроить, прежде чем собственно обрабатывать запрос пользователя. Такой код выносят в отдельный файл, чтобы не копипастить его. И каждый контроллер или скрипт в начале подключает этот файл.
Это не обязательно должен быть именно скрипт в файле, это может быть функция или даже класс (так часто делают в фреймворках).
Он не обязателен для реализации MVC, но скорее всего такой файл понадобится. MVC лишь описывает, как разбить обработку запроса на M/V/C, но MVC не указывает тебе, откуда читать конфиг и как подсоединяться к базе. Это ты должен придумать сам.
То есть, в приложении будут не только файлы моделей, вида, контроллеров, но и вспомогательный код, который не относится к M, V или C.
Пиздец меня сложило с этого честно говоря. Был полон уверенности, что сейчас то за годик натаскаю себя, что сразу на Джура залечу как нехуй делать(в финке живу), а по итогу у меня тупо времени нет на это обучение. Дома дел слишком много плюс работа, плюс надо иногда спать.
Это я наебал, сорри, люблю выдумывать всякие истории, мы же на дваче, думаю сам понимаешь. Гайды в шапке хороши, вкатиться сможет каждый, даже имея работу. Таких людей много, просто верь в себя, а не плачься как девочка из-за таких калментов.
Главное хоть немного любить кодить, иначе ничё путного не выйдет. Да и тем более как потом работать-то, если тебе это не нравится, и ты себя заставляешь заниматься кодерством? Ищи варианты как привить себе любовь к кодингу, если еще пока не любишь.
Анон из ньюфаг треда советовал курс Михаила Базарова на ютубе.
Какой бы хороший видеокурс ты не нашел, но повторение действий дает мало пользы в обучении. Важно не попасть в tutorial hell. Рано или поздно ты должен будешь выйти из зоны комфорта и начать писать самостоятельно. Чем раньше ты начнешь это делать, тем лучше.
>возможность производить множество I/O операций параллельно без переключения контекста
Concurrency is not parallelism!
>Какой бы хороший видеокурс ты не нашел
Так любой видеокурс подразумевает, что ты будешь сидеть и тепеливо повторять. Потом, когда просмотришь, ещё и потыкать написанное палочкой в разных позах, поломать-починить. Эксперимент - двигатель науки.
Делаю форму регистрации для studentList при помощи Bootstrap 5, но не могу выравнить форму по центру.
https://codeshare.io/qPRVYZ
Как я понял, блоку не хватает высоты, но можно ли как то обойтись без фиксированной высоты?
То есть по горизонтали могу, а по вертикали нет.
>Потом, когда просмотришь, ещё и потыкать написанное палочкой в разных позах, поломать-починить.
Да, но это не полностью самостоятельная работа. Частенько встречал чуваков в интернете, которые жаловались, что не могут сами с нуля ничего написать. Они даже работают разрабами при этом. Потому что все, что они делали, это копипастили и подгоняли решения.
>Эксперимент - двигатель науки.
Безусловно. Никто с этим не спорит.
>жаловались, что не могут сами с нуля ничего написать. Они даже работают разрабами при этом
Значит пиздёж, что работали. Это проблема чисто туториальщика-вкатуси.
Как ты себе представляешь человека, работающего на проекте и не умеющего на коленке что-то запилить? Ты из гикбрейнс что ли?
Это как встретить плотника, который не умеет заготовку сделать.
Можно уметь пилить отдельные фичи, но не уметь самостоятельно создавать проекты с нуля
Да

>в node js есть handlebar и прочие движки
В PHP тоже есть
>с помощью того, чтоб юзать echo
Можно и так. Еще можно html внутри php или php внутри html
У опа урок про шаблоны хороший.
Да
Советую переименовать в .phtml, vscode подхватывает подсказки синтаксиса сразу.
Как понять что происходит вот здесь, почему все эти 3 строчки показывают на один и тот же элемент с одним и тем же размером, но называется по разному и находится ниже по коду?
Может посоветуете что почитать?
Смотрел его, обычно много петросянит и пиздит с чатом, дропнул на моменте где он начал писать сокращенный синтаксис который у меня не работал и выглядел вырвиглазно, очередной инфоцыган кароч
Там на самом деле несколько элементов, просто вложенных друг в друга и имеющих одинаковый размер. Ты это можешь увидеть на первом скриншоте.
Почитай про HTML и DOM, про DOM на русском написано тут https://learn.javascript.ru/dom-nodes
Лучше назвать такой файл .phtml или .html.php, чтобы сразу было видно.
>>552572
Урок https://github.com/codedokode/pasta/blob/master/php/templates.md
>>551691
Они рассчитаны в первую очередь на обучение, для самых начинающих. Идеально пойдут как первый проект. Задача про студентов содержит так много комментариев и советов, что больше похожа на урок, чем на задачу.
Если ты не начинающий, то лучше будет придумать свой проект и делать его на фреймворке.
До появления flexbox вертикальное выравнивание было проблемой. Вот практически все классические способы выравнивания, которые мне известны:
1) если твой элемент является inline-block, то его можно выровнять с помощью vertical-align относительно соседних блоков. Это подходит только для горизонтально расположенных в строчку элементов (например, кнопки и ссылки)
2) если твой элемент находится внутри ячейки таблицы или элемента с display: table-cell, то его можно выровнять с помощью vertical-align на ячейке, но у таблиц свои проблемы
3) если твой элемент абсолютно позиционирован и известна его высота, то он выравнивается относительно родителя заданием top: 50%; margin-top: -(половина высоты);
4) для более новых браузеров абс. поз. или отн. поз. элемент выравнивается с помощью top: 50%; transform: transalteY(-50%); Прежде чем использовать, проверь поддержку transform на caniuse.com. (она поддерживается примерно с 2010 года, включая IE9 с префиксом).
Минус последних двух способов - необходимость в использовании абс. позиционирования. Если это тебе не подходит, то нужно использовать flexbox, он позволяет выровнять как угодно (а до этого использовали яваскрипт). Опять же, проверь на caniuse, поддерживается ли он всеми браузерами, под которые ты делаешь верстку.
Впрочем, ты используешь Бутстрап 5, а он сам далеко не всеми браузерами поддерживается. У них очень плохая, на мой взгляд, политика, что они поддерживают только последние версии браузеров и не поддерживают Internet Explorer. Это какая-то дурная мода, поддерживать только то, что установлено на макбуке верстальщика. Если у тебя, например, Win 7 или телефон, купленный 3 года назад и не обновленный, то получается тебя уже не поддерживают. Очевидно, такую моду продвигают богачи с Запада, которые каждые полгода покупают новый макбук, потому что на старом экран заляпался. По моему, это неправильное отношение. По этой причине, мне кажется, бутстрап уместно использовать для всяких внутренних сайтов и админок, на которые заходят только с нужных устройств.
Также, мне не нравится в Бутстрапе то, что он гигансткий. Я бы советовал брать из него только нужные модули, а не все сразу.
До появления flexbox вертикальное выравнивание было проблемой. Вот практически все классические способы выравнивания, которые мне известны:
1) если твой элемент является inline-block, то его можно выровнять с помощью vertical-align относительно соседних блоков. Это подходит только для горизонтально расположенных в строчку элементов (например, кнопки и ссылки)
2) если твой элемент находится внутри ячейки таблицы или элемента с display: table-cell, то его можно выровнять с помощью vertical-align на ячейке, но у таблиц свои проблемы
3) если твой элемент абсолютно позиционирован и известна его высота, то он выравнивается относительно родителя заданием top: 50%; margin-top: -(половина высоты);
4) для более новых браузеров абс. поз. или отн. поз. элемент выравнивается с помощью top: 50%; transform: transalteY(-50%); Прежде чем использовать, проверь поддержку transform на caniuse.com. (она поддерживается примерно с 2010 года, включая IE9 с префиксом).
Минус последних двух способов - необходимость в использовании абс. позиционирования. Если это тебе не подходит, то нужно использовать flexbox, он позволяет выровнять как угодно (а до этого использовали яваскрипт). Опять же, проверь на caniuse, поддерживается ли он всеми браузерами, под которые ты делаешь верстку.
Впрочем, ты используешь Бутстрап 5, а он сам далеко не всеми браузерами поддерживается. У них очень плохая, на мой взгляд, политика, что они поддерживают только последние версии браузеров и не поддерживают Internet Explorer. Это какая-то дурная мода, поддерживать только то, что установлено на макбуке верстальщика. Если у тебя, например, Win 7 или телефон, купленный 3 года назад и не обновленный, то получается тебя уже не поддерживают. Очевидно, такую моду продвигают богачи с Запада, которые каждые полгода покупают новый макбук, потому что на старом экран заляпался. По моему, это неправильное отношение. По этой причине, мне кажется, бутстрап уместно использовать для всяких внутренних сайтов и админок, на которые заходят только с нужных устройств.
Также, мне не нравится в Бутстрапе то, что он гигансткий. Я бы советовал брать из него только нужные модули, а не все сразу.
> но можно ли как то обойтись без фиксированной высоты?
А, нужно, чтобы форма была по центру экрана? Тебе надо просто для контейнера задать минимальную высоту в 100% высоты экрана. То есть, min-height: 100vh;, но проверь на caniuse, какие браузеры поддерживают единицы vh.
Лучше задавать не высоту, а минимальную высоту, на тот случай, если контента будет много и контейнер растянется больше, чем высота экрана.
Так как ты не задал высоту, то контейнер просто определяет ее по соедржимому.
Если хочется лучшей поддержки то нужно играться с height/min-height: 100% на всех родителях контейнера вплоть до HTML, но это сложно и там много подвохов.
Вообще, да, очень старый язык и очень неудобный, чего только стоит необходимость объявлять и определять функцию в двух файлах. Также, при передаче в функции указателя нельзя указать кол-во элементов в массиве, если оно переменное, признак конца массива, нельзя указать, разрешен ли null, нельзя указать тип передачи (borrow/ownership), тип доступа (r/w/rw), кодировку текста. Для структур нельзя указывать значения по умолчанию, нет именованных аргументов функций.
После вызова каждой функции надо писать проверку на ошибки, формирование сообщения об ошибке, очень долго.
При переполнении при сложении не происходит аварийного останова программы, а она просто выдает некорректные данные, но не говорит, что они некорректные.
Писать на Си это как средневековыми инструментами пытаться сделать автомобиль.
(я в курсе, что Раст исправил часть этих недостатков)
> Ты не сможешь отправить несколько запросов одновременно на файберах (как в JS)
Легко смогу при наличии цикла обработки событий. Файбер позволяет создавать что-то вроде green threads, присотанавливать и возобновлять их.
> Что мешает тебе сначала получить по миллиону из каждого апи, а потом просто в цикле обработать этот миллион?
Ты бы меньше плевался и внимательнее читал пост. Я тебе написал, что никто в продакшене не обрабатывает миллионы записей в онлайн-скриптах, так как это может легко повесить сервер. Миллионы записей обрабатываются в оффлайн-скриптах (крон/воркеры), прямо как в 60-е.
Если ты не знаешь таких вещей, то спорить с тобой смысла мало. Похоже, что обработку миллиона записей (это, кстати, немного) ты видел разве что в своих фантазиях, пока перекрашивал кнопки на формочке в Битриксе.
Ты лишь демонстрируешь свое невежество. Неблокирующие сокеты в PHP есть с незапамятных времен, и неблокирующие операции с файлами некоторые есть в PHP, некоторые есть в расширениях вроде swoole.
Я вижу, ты сделал комментарии к переменным. Это правильно, но плохо, что ты изобрел свой формат вместо общепринятого phpDoc. Лучше использовать phpDoc.
Для аргументов функции желательно указывать типы (я знаю, что этого пока нет в учебнике).
if можно было бы заменить на использование функций min/max и упростить код.
> if ($creditSum < 5000) {
Здесь надо было использовать переменную, а не число 5000.
Сумму выплаты надо округлять не вниз, а вверх, а то придешь в банк в последний день, а 23 копеек не хватило, чтобы закрыть кредит. Банк, конечно, будет этому рад.
В остальном, решено верно и код аккуратный.
По поводу задачи со студентами. Как реализовать создание таблицы в базе данных? Через phpmyadmin? Или через отдельный файл? Просто это должно быть для портфолио, если сделаю через phpmyadmin, то тот, кто будет смотреть проект если будет, не увидит процесс создания таблицы, а если сделать через отдельный файл, то получается каждый раз при запуске проекта создается новыя база данных?
И я правильно понял MVC?
Вот я создаю файл index.php. Тут в зависимости от куки отображается либо форма регистрации, либо форма редактирования - это Представление. Окей, если отображается форма регистрации, то пользователь вводит все данные, нажимает "Отправить" и далее <form> отправляет нас на страницу Контроллера? А контроллер вызывает файл Модуля, и тот отправляет все введённые данные в базу данных, затем Контроллер вызывает файл, который отображает таблицу?
>>553307
Спасибо, так и сделал
>>553299
Да, спасибо. А разве старый EXplore не перестали поддерживать? Мне то к спеху задачу студентов нужно сделать, а я год не верстал, поэтому пользуюсь Bootstap
>>550082
Спасибо. Понял.
Я создал только БД в phpmyadmin. А в классе, подключающемся у БД и возвращающим объект PDO, создал таблицы этой бд через "CREATE TABLE IF NO EXISTS..."
Вот ты создал эту таблицу, но ведь получается, что ты каждый раз создаешь новую таблицу при запуске проекта, нет? То есть данные из базы данных не удаляться, когда ты новую таблицу поверх старой создашь?
>начал писать сокращенный синтаксис который у меня не работал
Может ты просто не разобрался или не настроил что то? У меня все работает, это же в самом языке реализовано, никаких проблем не должно быть
Вэээ, я сколько по SQL читал, такой фертифлюшки не видел, будем знать. Спасибо.
Или index это и есть контроллер, который вызывает определенную форму в зависимости от куки?

> Композер это нативный пакетный менеджер? Хуя какие открытия я познал, лул.
Хуйлул. Npm, yarn, gradle, maven -- "нативные"? Узнал новое слово, и вставляешь невпопад?
> на уровне интерпритатора будет
Тыскозал? То есть, если положить ф-цию в соседний файл -- от неё что-то убудет?
Ньюфаг детектед, короче
> учить PHP в 2022 году, кроме допиливан
Присоединяюсь к вопросу. Есть ли риск, что внезапно php полностью уступит место ноде и питону?
В простейшем случае ты можешь создать и заполнить таблицы через phpmyadmin, а потом сделать SQL-дамп и положить в проект, чтобы любой мог бы его развернуть у себя. В README написать про дамп в инструкции по установке. Дамп загружается в БД вручную с помощью консольной команды.
Но лучше с точки зрения обучения будет написать SQL-код создания таблиц руками, а не создавать их через графический интерфейс. А дамп сделать консольной командой.
> Вот я создаю файл index.php. Тут в зависимости от куки отображается либо форма регистрации, либо форма редактирования - это Представление.
Нет, неправильно. Пользователь не может напрямую обратиться к Представлению, а только к Контроллеру. Все запросы от пользователя, в том числе запрос на показ какой-то страницы, принимают Контроллеры. Представления вообще не должны быть доступны через браузер.
То есть, index.php - это контроллер, который определяет, какую форму показать, подготавливает нужные данные (для заполнения формы, показа ошибок итд) и вызывает соответствующее Представление (кстати, формы очень похожи и их логичнее сделать в одном и том же представлении, а не копипастить).
> Окей, если отображается форма регистрации, то пользователь вводит все данные, нажимает "Отправить" и далее <form> отправляет нас на страницу Контроллера?
Да, причем обычно вывод формы и обработку данных от нее совмещают в одном Контроллере - так удобнее. Отличить показ формы от отправки данных можно по HTTP-методу - GET илит POST. Почитай урок про работу с формами: https://github.com/codedokode/pasta/blob/master/forms.md
Если слова "метод" и GET/POST вызывают у тебя непонимание, то прочитай сначала урок по HTTP: https://github.com/codedokode/pasta/blob/master/network/http.md
> А разве старый EXplore не перестали поддерживать?
Он предустановлен в некоторых версиях Windows. То есть человек купил компьютер, включил, а там только Internet Explorer. И почти ни один сайт, кроме Гугла и моего учебника, в нем не открывается. Было бы хорошо, если бы сайт хотя бы немного работал в нем, но это потребует от тебя тестирования и исправления косяков, что требует навыки и время.
В простейшем случае ты можешь создать и заполнить таблицы через phpmyadmin, а потом сделать SQL-дамп и положить в проект, чтобы любой мог бы его развернуть у себя. В README написать про дамп в инструкции по установке. Дамп загружается в БД вручную с помощью консольной команды.
Но лучше с точки зрения обучения будет написать SQL-код создания таблиц руками, а не создавать их через графический интерфейс. А дамп сделать консольной командой.
> Вот я создаю файл index.php. Тут в зависимости от куки отображается либо форма регистрации, либо форма редактирования - это Представление.
Нет, неправильно. Пользователь не может напрямую обратиться к Представлению, а только к Контроллеру. Все запросы от пользователя, в том числе запрос на показ какой-то страницы, принимают Контроллеры. Представления вообще не должны быть доступны через браузер.
То есть, index.php - это контроллер, который определяет, какую форму показать, подготавливает нужные данные (для заполнения формы, показа ошибок итд) и вызывает соответствующее Представление (кстати, формы очень похожи и их логичнее сделать в одном и том же представлении, а не копипастить).
> Окей, если отображается форма регистрации, то пользователь вводит все данные, нажимает "Отправить" и далее <form> отправляет нас на страницу Контроллера?
Да, причем обычно вывод формы и обработку данных от нее совмещают в одном Контроллере - так удобнее. Отличить показ формы от отправки данных можно по HTTP-методу - GET илит POST. Почитай урок про работу с формами: https://github.com/codedokode/pasta/blob/master/forms.md
Если слова "метод" и GET/POST вызывают у тебя непонимание, то прочитай сначала урок по HTTP: https://github.com/codedokode/pasta/blob/master/network/http.md
> А разве старый EXplore не перестали поддерживать?
Он предустановлен в некоторых версиях Windows. То есть человек купил компьютер, включил, а там только Internet Explorer. И почти ни один сайт, кроме Гугла и моего учебника, в нем не открывается. Было бы хорошо, если бы сайт хотя бы немного работал в нем, но это потребует от тебя тестирования и исправления косяков, что требует навыки и время.
Не, так не стоит делать. Обычно для маленьких проектов делают SQL-дамп и ты при установке проекта просто загружаешь этот дамп в базу. Так лучше, так как SQL-код с структурой таблиц лежит в отдельном файле, а не перемешан с PHP-кодом.
Для проектов посложнее способ с дампом плохо работает. Когда ты что-то меняешь в структуре БД, ты переделываешь дамп и загружаешь его в БД, но при этом все данные в БД теряются (так как она пересоздается с нуля). Потому в реальных проектах используют миграции - специальные скрипты, которые добавляют или меняют таблицы и колонки, не удаляя данные.
Спасибо. Будем делать так
Предположим, что я отвечу да. Что это тебе дает? А если отвечу нет?
>всё равно через пару лет перепишут? Или лучше душить питона/ноджс/джаву?
Что будешь делать когда перепишут с питона/ноды/джавы на язык X? Что будешь делать когда перепишут с языка X на язык Y? Тогда изучай языки, появившиеся в последние годы, в надежде, что когда нибудь будут переписывать на них.
>Есть ли риск, что внезапно php полностью уступит место ноде и питону?
Полностью на 100%? Прямо за 1 день? Сам ответь. Допустим, что это случилось, что дальше? Не сможешь на другом языке писать?
Если не можешь решать задачи как на пике (тренировочный контекст для подготовки на стажировку в Яндекс), то сильно ли это сузит выбор вакансий для анона? Или так выделывается только Яндекс и единицы?
>кстати, формы очень похожи и их логичнее сделать в одном и том же представлении, а не копипастить
Они действительно похожи. Допустим они отличаются от заголовка "Форма регистрации"/"Форма редактирования данных". То есть файл Представление должен по куки определить, какой заголовок отобразить. Но представление не может иметь доступа к внешним переменным, а как ему передать куки? Ведь представление это не функция?
Начинать карьеру заново, никто условного сеньора-пхпшника не возьмет сеньором-питонистом.
Ну у PHP, как я понимаю, этот процесс уже происходит прямо сейчас, а питон и нода наоборот только растут и развиваются, поэтому некорректное сравнение.
И если у какой-нибудь джавы этот процесс будет длиться десятилетиями из-за специфики бизнеса, то в случае большинства проектов на PHP переписать все на другой язык - не самое сложное дело.
>у PHP, как я понимаю, этот процесс уже происходит прямо сейчас, а питон и нода наоборот только растут и развиваются
Ты сказал? Если бы это было и так, когда нибудь могут так же переписать с питона/ноды/и т.д. на другой язык. Что будешь делать?
>в случае большинства проектов на PHP переписать все на другой язык - не самое сложное дело
Почему тогда не переписывают? Зачем вообще переписывать? Для прикола? Код нужен чтобы решать задачи. Похую на каком языке этот код. Если он решает задачу, то никакой адекватный человек не станет его переписывать. Пойми простую вещь, код сам по себе никому на хуй не нужен, если он не решает задачи. На хуй никому не нужны все эти языки программирования, всем нужны работающие программы. Пусть они будут написаны хоть на азбуке Морзе.
Почему тогда на хабре постоянно вижу посты типа "Привет, это хуйлуша из говномаркета и мы переписали наши сервисы с джавы на голанг", "Привет, это еблан из хуйбанка, и мы переписали наше приложение с флаттера на нейтив?
>Легко смогу при наличии цикла обработки событий. Файбер позволяет создавать что-то вроде green threads, присотанавливать и возобновлять их.
Какой нахуй цикл, ебанько. Отправив запрос в актуальной версии пхп ты будешь сидеть и ждать ответа. Фабер ПОЗВОЛИТ, и не сделать, а использовать грин треды, когда эти грин треды в пхп сделают. А вот когда их сделают, тогда и будешь пиздеть. Какой же конченный еблан с манямиром, пиздец просто.
>Ты бы меньше плевался и внимательнее читал пост. Я тебе написал, что никто в продакшене не обрабатывает миллионы записей в онлайн-скриптах
Я тебе сразу описал сервис, кончелыга:
>>548242
>Типичная задача в вебе это стукнуть в три апи, вытащить оттуда в цикле по миллиону записей, обработать и высрать результат в базу/очередь/еще одно апи.
И написал что в пхп с этим проблемы.
Ты начал писать какую-то поебень, про базы, про расты, про хуйню малафью, про какой-то прод, по запросу, по хуесу, оффлайн скрипты какие-то, вообще охуеть.
>Похоже, что обработку миллиона записей (это, кстати, немного)
Тупорылый ты хуесос, о том и речь что это слишком мало для временных затрат на получение этих данных в пхп. Ты там угашенный что-ли?
Имхо вкатунец не должен в принципе такими вопросами задаваться, тут хотя бы любую вакуху занять и набираться опыта.
Значит было надо. Есть то, с чем php справляется хуже, чем го. Если нет необходимости, то ничего переписывать и не будут. Но чтобы массово просто так из-за популярности какого-то другого языка начали переписывать с php, нет, такого не будет никогда, потому что -деньги.
>Отправив запрос в актуальной версии пхп ты будешь сидеть и ждать ответа.
Что? Можно легко реализовать вебсокет сервер стандартными средствами https://habr.com/ru/post/209864/
А еще есть https://github.com/walkor/workerman и https://github.com/swoole/swoole-src
А ты учел, что там может быть до 300 000 значений и без оптимизации у тебя будет большой перебор?
>>553756
Ну, есть много мест, куда возьмут не способных решить такую задачу. Но там будет не так интересно. Почему ты так быстро сдаешься? Программистам полезно иногда ломать голову над сложными задачами.
Первая задача, действительно, не такая и сложная, там просто надо подумать над оптимизацией, чтобы избежать полного перебора всех вариантов.
Было бы хорошо хотя бы немного уметь решать подобные задачи. Их можно найти на codeforces, там есть и очень простые. Также, можно почитать разборы олимпиадных задач и учиться по ним, и учебники по структурам данных и алгоритмам. Они научат тебя мыслить в нужном русле.
Первая задача будет намного понятнее, если изобразить ее графически на листе бумаги. Может, мне перевести тебе математические термины на простой русский язык? Мне самому пришлось раза 3 перечитать условие, чтобы понять его.
Вторая задача на комбинаторику, то есть на подсчет количества разных сочетаний. Опять же, могу дать пояснения.
>Что? Можно легко реализовать вебсокет сервер стандартными средствами
Дегенеративное хуйло, причем тут твой вебсокет сервер, когда нужно данные из API получать? Может быть в твоем дегенеративном манямире API пишут на вебсокетах, а у нас в реальном везде REST.
>А еще есть https://github.com/walkor/workerman и https://github.com/swoole/swoole-src
Бля, ты на свуле хоть че-то писал вообще? И ты, собака сутулая, еще че-то там пердел про знания какие-то. Вам таким кукаретическим хуеплетам, которые нихуя не писали колени ломать надо. Свуле сука он рекомендует, черт.
А десять китайцев бесплатных в нагрузку к этой хуйне прилагаются? А то надо доку на китайском читать и десять тысяч человекочасов на ловлю течки памяти и выяснение какие расширения можно с этой хуйней подружить, а какие нет.
Контроллер определяет, какую форму надо показать, и передает это в Представление с помощью переменной.
>>553849
Для сеньора освоить новый язык будет недолго. Иначе он какой-то не такой сеньор.
>>553850
Лучше всего учиться импортировать из командной строки, используя вызов программы mysql:
mysql ... < file.sql
Вот урок по командной строке: https://github.com/codedokode/pasta/blob/master/soft/cli.md
Про переписывание кода есть хорошая история от Джоэла Спольски (он очень умный, работал в майкрософте, придумал Trello и разрабатывал StackOverflow): https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/
В твоих примерах есть столкновение интересов бизнеса и разработчика. Людям хочется делать что-то интересное (им лично), а бизнесу хочется стабильное развитие при минимуме расходов.
Конечно, бывают (редкие) ситуации, когда переписывания не избежать: например, старая кодовая база перестает справляться с требованиями и масштабированием. Или язык настолько старый, что на него трудно найти разработчиков. Или язык перестали поддерживать. Но это будет очень дорого, я могу сказать, что просто замена верстки на большом проекте занимает кучу времени и появляется куча новых багов.
Если можно не переписывать, то лучше не переписывать, а улучшать существующий протестированный код. Некоторые решаются на полуавтоматизированную трансляцию кода, но это не всегда возможно.
Что касается перехода с PHP на Питон, назови какие есть от этого плюсы? Питон не быстрее PHP, хотя я соглашусь, что это довольно удобный язык для написания кода. Но ради чего начинать дорогостоящее переписывание?
> и мы переписали наше приложение с флаттера на нейтив?
Там могут быть объективные причины, вроде отсутствия поддержки каких-то новых фич, ненативно выглядящий интерфейс, или проблемы с производительностью или надежностью.
Плюс, не забывай, что переписыванием обычно занимаются компании с бездонными бюджетами и армиями разработчиков. Не каждый бизнес может себе такое позволить.
Представь, что ты владелец бизнеса и платишь зарплату разработчикам из своего кармана. Как бы ты отреагировал на предложение переписать 1М строк кода с Явы на Голанг?
> Отправив запрос в актуальной версии пхп ты будешь сидеть и ждать ответа
С тобой нет смысла спорить, так как ты не способен прочитать написанное. В PHP есть неблокирующие сокеты, и ты можешь отправлять или получать данные без ожидания готовности.
>>Типичная задача в вебе это стукнуть в три апи, вытащить оттуда в цикле по миллиону записей
Это не типичная задача. Не надо врать. В PHP с этим точно такая же ситуация, как в любом другом языке: будет работать медленно и нагружать сервер.
> А то надо доку на китайском читать и десять тысяч человекочасов на ловлю течки памяти
Странно, что у такого талантливого специалиста, как ты, уходит так много времени на поиск утечек памяти. Я-то думал, ты их с одного взгляда на код обнаруживаешь.
Кто-то с amocrm работал? Какого хуя при импорте с excel компаний/сделок постоянно слетает аксесс токен? Как эту хуйню ебаную фиксить, я уже заебался блять, нихуя в интеренете нет на эту залупу.
Больной ты на голову хуесос. Речь идет о сторонних библиотеках. Ты конечно ни дня не работал и поэтому не знаешь, что в среднем проекте обычное дело когда используется до пятидесяти сторонних либ. И на них, сука ты пробитая, не написано будут ли они течь под ебаным свулом или нет.
>>554403
>>554098
>>554572
Перепись вебсокетных кукаретиков. Вы можете со своими статьями про чаты пройти нахуй или пропиздовать в гугл и почитать в чем разница между рест апи и сокетами.
А еще лучше продемонстрируйте свои навыки, дырявые пиздоболы. Давайте вебсокетные черти, напишите мне функцию, которая будет стучаться в три апи без блокировок. Вот вам апи https://testing.googleapis.com/$discovery/rest?version=v1
Заранее ссу на ваши ебала, чмони.
>Это не типичная задача. Не надо врать.
Ебанашка, сейчас даже в самом мизерном проекте несколько сервисов. И общаются эти сервисы через очереди и апи. Даже soap уже несколько лет как сдох. Ты блядь если не формошлеп, то 90% времени работаешь с апи.
>В PHP с этим точно такая же ситуация, как в любом другом языке: будет работать медленно и нагружать сервер.
Откуда вы хуесосы берете нагрузку на сервер? Один начал про раст че-то лепетать, щас второй высрал про нагрузку. У тебя твой симфони ебучий или ларавель в тысячу раз больше процессороного времени сжирают, чем любая "обработка" которую ты только выдумать сможешь.
Хуй соси, голубец ебаный. Есть неблокирующие сокеты, можно реализовать и вебсокеты, и любое другое неблокирующее сетевое взаимодействие.
В вакансии написано, что знание REST API будет большим плюсом. Это можно изучить за полчаса или лучше сосредоточиться на базах? Тип я понимаю, что REST использует JSON формат, который похож на объекты JS, но при чем тут PHP я не понял.
Если по этой проблеме ничего не гуглится, то остается только разбираться самому. Разберись, как формируется этот токен, какой его срок жизни, как он передается, почему "слетает" (я так полагаю, не принимается). Может ты просто передаешь не тот токен или устаревший токен.
Я с такой проблемой не сталкивался и наугад сказать не могу.
Прочитай внимательно написанное по ссылке: https://docs.guzzlephp.org/en/stable/faq.html#can-guzzle-send-asynchronous-requests
После этого такой талантливый программист, как ты, без сомнения, сможет решить поставленную задачу.
И, кстати, если ты хотел узнать, как параллельно отправлять запросы в PHP, то можно было просто культурно спросить, и тебе бы ответили.
Да, сокеты Беркли это низкоуровневое API, а вебсокеты это протокол поверх них. Но не надо их путать, и думать, что "сокет" это просто сокращение от "вебсокетов". Сокеты это "абстракция", которая позволяет программам устанавливать соединение друг с другом и отправлять данные, а "вебсокеты" это часть протокола HTTP. Сокеты можно использовать и без HTTP.
Ты зря злишься, это мешает тебе концентрироваться и рассуждать логически. Я написал, что на практике не делают API, которые в ответ на запрос обрабатывают миллион записей. Потому что это будет слишком медленно. А то, что ты привел в пример обработку миллиона записей, указывает на твое непонимание проблемы, видимо, из-за нехватки опыта или знаний.
> У тебя твой симфони ебучий или ларавель в тысячу раз больше процессороного времени сжирают, чем любая "обработка" которую ты только выдумать сможешь.
Ты хоть раз в жизни профилировал Симфони-приложение? Подозреваю, что нет.
Нет, ты неверно понял. REST это набор принципов для построения API, и они не включают обязательное использование JSON как формата для передачи данных. Соответственно, REST API - это API, соответствующее принципам REST.
Поищи статьи именно про принципы REST. Можешь начать с https://restfulapi.net/
Если тебе непонятен какой-то принцип или вопрос, то уточняй. Например, "ресурсом" там называют сущность на сервере, к которой отправляется запрос, например, информация о товаре в магазине доступна на ресурсе с URL /api/v1/good/123.
На практике часто "REST" API не соответствуют принципам REST и их правильнее называть просто HTTP API.
Если ты совсем плохо знаешь HTTP и не понимаешь слов вроде "метод", то почитай https://github.com/codedokode/pasta/blob/master/network/http.md
Бля, борщехлеб. Ты бы не позорился. Пиздец, газл у него асинхронный. Открой блядь код функции requestAsync, чучело.

Ты наркоман солевой? На чем ты сидишь, признавайся сука. Я тебе третий раз описываю задачу, нарик:
>Типичная задача в вебе это стукнуть в три апи, вытащить оттуда в цикле по миллиону записей, обработать и высрать результат в базу/очередь/еще одно апи.
А теперь давай переведем ЛОГИЧЕСКИ на твой солевой язык:
1) которые в ответ на запрос обрабатывают миллион записей?
Тебе написали "вытащить оттуда в цикле". Любому кто хоть раз в жизни писал апи очевидно что там все постранично. Это блядь поинт всей задачи, сука. Тебе нужно сделать не один запрос, а по запросу на каждую страницу.
2) Потому что это будет слишком медленно
Что блядь значит "слишком медленно"? Я тебя, объебоса, уже спрашивал знаешь ли ты про сложность алгоритмов. В этой задаче затраты возрастают ЛИНЕЙНО СУКА. В том-то и суть что на пхп тебе похуй миллион там или миллиард, он блядь все последовательно делает: впитал пачку, высрал пачку, следующий. Как не режь, как не переставляй затраты те же.
3) указывает на твое непонимание проблемы, видимо, из-за нехватки опыта или знаний
То есть ты: не понимаешь как работает рест апи, не понимаешь сложность алгоритмов, не знаешь что от перестановки слагаемых сумма не меняется, в каждом посте ты срешь какой-то нерелейтед хуйней. А это я неправильно понял проблему, которую сам и описал.
Солевой наркоман.
>Ты хоть раз в жизни профилировал Симфони-приложение? Подозреваю, что нет.
Бля, а ты хоть раз смотрел на звездное небо? Подозреваю что да, ты же солевой наркоман блядь. Вот тебе профиль симфони, и че? До контроллера 30мс, после контроллера 25мс из 75 на весь запрос. Сразу перевожу для солевого: это значит что на реальную работу уходит только треть времени, да и та на рендеринг хтмл. В качестве факультатива можешь проверить за сколько отработает цикл на миллионном массиве.
На твоем скриншоте blackfire видно, что у тебя включен профайлер Симфони (он вызвается в Kernel::onTerminate), что скорее всего, указывает на то, что фреймворк работает в dev-режиме, а не в prod. Если бы ты выбрал продакшен-окружение, то как минимум terminate у тебя бы не занимал 20 мс, а в районе 1-2 мс.
Скорее всего по той же причине у тебя так долго происходит инициализация, так как в dev-режиме Симфони перепроверяет дату модификации каждого файла, использованного для сборки конфигов и контейнера, а таких файлов обычно много. Ну и профайлер Симфони не бесплатный. В продакшене, естественно, это все отключено.
Ты бы прежде чем ругать Симфони, открыл бы и прочел документацию. Хотя я думал, что такой талантливый программист, как ты, давно уже ее прочел и знаешь наизусть.
> Тебе написали "вытащить оттуда в цикле". Любому кто хоть раз в жизни писал апи очевидно что там все постранично.
Ты читать не умеешь по моему. В вебе в ответ на запрос клиента никто не обрабатывает по миллиону записей, ни в цикле, ни без.
Я много лет назад делал парсер с асинхронными запросами с помощью расширения curl (странно, что такой талантливый программист не слышал про такую возможность). Мой парсер скачивал множество страниц параллельно. Ты можешь прочесть про это в документации по расширению curl: https://www.php.net/manual/ru/function.curl-multi-init.php
Далее, в PHP есть поддержка сокетов в неблокирующем режиме (по моему, правда, в виндоуз это не работает, но меня это мало беспокоит), дока:
https://www.php.net/manual/ru/function.socket-set-nonblock.php
Для асинхронной работы с файлами нужно расширение вроде swoole, и тащить при этом 50 дополнительных расширений не требуется.
Изучи предложенную документацию, и после этого покажи, в каком месте guzzle не асинхронный. Или, что проще, используя код, например, отсюда: https://www.geeksforgeeks.org/how-to-make-asynchronous-http-requests-in-php/ посмотри, как он параллельно отправляет запросы.
Держи рабочий код: https://www.geeksforgeeks.org/how-to-make-asynchronous-http-requests-in-php/
Ты можешь использовать strace и убедиться, что запросы шлются асинхронно.
А где сокеты проебал, чмоня? Выдаю первую медаль пхп петуха. Теперь пиздуй под шконку.
>>555161
Теперь идет перепись асинхронных газзл долбоебов. На петухов или пидорасов вы не тянете, пидорасы иногда читать умеют. https://github.com/guzzle/guzzle/issues/1868
КАЖДЫЙ ХУЕСОС ИТТ ПИЗДЯЩИЙ ПРО АСИНХРОННЫЙ ГАЗЗЛ БЕЗ РАБОЧЕГО КОДА ОФИЦИАЛЬНО ПРИЗНАЕТСЯ ПХП ДОЛБОЕБОМ
Сеньор пиздабол, я на двести процентов уверен что нихуя ты не писал, но дам тебе шанс постирать штаны.
А ну-ка расскажи нам что будет если отправить твой мульти хуюльти курл запрос дважды подряд? Через сколько времени выполнится второй запрос? Будет ли он ждать первый?
Тебе уже написали: запусти strace и посмотри, что будет, если отправить 10 запросов параллельно через curl, guzzle, или неблокирующие сокеты (guzzle, по моему, умеет использовать и мультикурл и сокеты).
Твои высказывания про петухов оставь для своих друзей-одноклассников на переменке.
Такой вопрос, какой из циклов самый быстрый в переборе массивов?
Запускаю свой хуй тебе за щеку. На вопрос ответ будет или слился?
Зачем перед пидорком оправдываешься? Пусть хуй сосёт
Соси хуй, говно
>типичная задача ломиться в три апи разом за миллионами записей
Нет таких типичных задач в вебе, фантазер. По крайней мере никакой нормальный вебдев не будет выполнять оное пока пользователь на проводе висит.
Обтекай.
Почему куки не сохраняются в openserver?
<?php
setcookie('form', 'edit', time() + 315360000);
require '../bootstrap.php';
// if (isset($_GET['page'])){
// $page = $_GET['page'];
// }else $page = 1;
$studentService = new studentService;
//$studentService->addStudent($_POST["name"], $_POST["lastName"], $_POST["gender"], $_POST["numberGroup"], $_POST["email"], $_POST["ege"], $_POST["yearBirthday"], $_POST["isLocal"]);
$arrStud = $studentService->getAllStudent();
//$studentsCount = $arrStud->num_rows;
//$str_pag = ceil($studentsCount / 50);
require '../View/table.php';
?>
А, он устанавливался в пределах этого файла/домена
В куке нужно указать путь "/", то есть, чтобы кука была доступна на всем сайте. Иначе кука может быть доступна только по пути, совпадающем с адресом страницы (например, /form.php) и недоступна на других страницах.
Ты можешь проверить путь, указанный в куке, открыв инструменты разработчика в браузере (F12) и там вкладку storage/хранилище.

Помогите выбрать лучший шаблонизатор. Так как простой РНР в ХТМЛ коде сейчас не комильфо а почему, кроме моды?, объявляется конкурс на самый распрекрасный шаблонизатор. Какие вообще параметры сравнений? Наличие функционала, синтаксис?
Юзал smarty && twig, особой разницы по ошчушчениям не заметил.
Дополню вопрос: кто-нибудь пробовал написать свой шаблонизатор? Какие принципы вы бы заложили в эту функцию?
Смысл в том, что с его помощью код пишется быстрее и выглядит красивее и лучше читается, что экономит силы и время разработчиков. Ты бы открыл главную Твига, там есть объяснение с примерами кода: https://twig.symfony.com/#what-makes-twig-better-than-php-as-a-template-engine
То есть в PHP ты пишешь
<?= echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8') ?>
А в Твиге
{{ var }}
Плюс там есть макросы, наследование шаблонов и другие удобные фичи. На чистом PHP это все будет коряво и запутанно, нечитабельно.
Что касается производительности, то Твиг умеет компилировать себя в обычные PHP-файлы, то есть ты можешь скомпиоировать все свои шаблоны и на продакшене будут использоваться сразу PHP-файлы.
Часто требуется не максимальная производительность любой ценой, а разумный баланс между производительностью, удобством работы с кодом, затратами времени программистов. Твиг тут выгоднее, чем PHP. У меня на чистом PHP желания писать шаблоны нету.
В норме хороший шаблонизатор переводит свой язык в нормальные пхп-конструкции в html. Такой промежуточный кеш. Работает так же как обычный пхп+хтмл.

Многие сбежали, плюс надо поддерживать брошенные западные проекты. Делитесь, кого куда позвали на бешеные бабки?
Есть ли где-нибудь нормальная реализация алгоримтов на php, без всяких фентифлюшек или замудренностей?
Гуглишь реализацию алгоритма, а там вместо простой реализации происходят какие-то фокусы, используют ненужные для понимания алгоритма функции.
Вот пример Bubble sort на хабре.
public function sort(array $data)
{
$count_elements = count($data);
$iterations = $count_elements - 1;
for ($i=0; $i < $count_elements; $i++) {
$changes = false;
for ($j=0; $j < $iterations; $j++) {
if ($data[$j] > $data[($j + 1)]) {
$changes = true;
list($data[$j], $data[($j + 1)]) = array($data[($j + 1)], $data[$j]);
}
}
$iterations--;
if (!$changes) {
return $data;
}
}
return $data;
}
Код может быть хороший, я не знаю, но такой код громоздкий.использует list, этот код зачем вообще:
if (!$changes) {
return $data;
}
Мне просто легче разбираться на примере, а я смотрю на такаю реализацию и не понимаю
Гуглишь реализацию алгоритма, а там вместо простой реализации происходят какие-то фокусы, используют ненужные для понимания алгоритма функции.
Вот пример Bubble sort на хабре.
public function sort(array $data)
{
$count_elements = count($data);
$iterations = $count_elements - 1;
for ($i=0; $i < $count_elements; $i++) {
$changes = false;
for ($j=0; $j < $iterations; $j++) {
if ($data[$j] > $data[($j + 1)]) {
$changes = true;
list($data[$j], $data[($j + 1)]) = array($data[($j + 1)], $data[$j]);
}
}
$iterations--;
if (!$changes) {
return $data;
}
}
return $data;
}
Код может быть хороший, я не знаю, но такой код громоздкий.использует list, этот код зачем вообще:
if (!$changes) {
return $data;
}
Мне просто легче разбираться на примере, а я смотрю на такаю реализацию и не понимаю
https://github.com/doganoo/PHPAlgorithms
Хз что ты понимаешь под финтифлюшками, тут нормальная реализация.
Главное понимай что это чисто факультативное занятие, эти "алгоритмы" нет смысла тащить в прод. Они кроме чсв ничего не дадут.
for ($i = 0; $i < $size; $i++) {
for ($j = 0; $j < $size - $i - 1; $j++) {
if (Comparator::greaterThan($array[$j], $array[$j + 1])) {
$tmp = $array[$j];
$array[$j] = $array[$j + 1];
$array[$j + 1] = $tmp;
}
}
}
>Comparator::greaterThan
И что это за хрень? Какую то функцию реализовал, а зачем... Ладно, спасибо.
>Главное понимай что это чисто факультативное занятие, эти "алгоритмы" нет смысла тащить в прод.
Да я чисто из-за вакансий, а то в каких то известных компаниях требуют знания алгоритмов и структур данных. Да еще и закидывают задачи уровня олимпиад. Может такие компании нужно обходить стороной, не знаю. Просто не нравится факт того, чтоне можешь попасть в некоторые компании из-за не понимания решения задач
Флаг changes позволяет выйти из цикла раньше времени - когда алгоритм перестает менять местами элементы т.к. они уже идут по порядку, а итерации еще не закончены.
Потому что нужно как-то сравнивать объекты: ноды дерева, списки итд. Автор использует для этого интерфейс IComparable https://github.com/doganoo/PHPAlgorithms/blob/master/src/Common/Interfaces/IComparable.php Да и вообще привыкай, что работаешь только с объектами, все примитивы тоже должны быть засунуты в объект, хотя бы для того чтобы обеспечить иммутабельность.
Типо я разок поработал с докером, могу это в резюме написать?
Только после 10 лет опыта работы с инструментом и прохождения сертификации
Читаю про реализацию авторизации и там роль пользователя (модератор/обычный юзер), ну или просто факт того, что юзер авторизовался пишут в _SESSION[]. Но разве это правильно, разве нельзя другому пользователю подправить SESSION, чтобы представиться модером?
как ты умудрился не вкатиться в РНР? полно любой работы на любой кошелёк и мозги
>разве
Представь себе, блять, по какой-то странной причине нельзя редактировать сессии других пользователей. Теперь понятно, как вы не вкатываетесь, в голове пиздос!
Откликался только на стажировки или вакансии без опыта, которых там от силы 1-2 штуки в 2 недели. Попал на стажировку, но оффер не получил, да и особо не хотел. Под конец сказали, что вкатыш будет работать с вордпрессом первые полгода, я ебал
Посмотрел видосы Назарова про пиздеж в резюме. Оформлю стажировку, как год опыта и начну рассылку. До этого знал про то, что пиздеть нужно, но мне стремно было и я надеялся, что через стажировку смогу вкатиться, но сильно все затянулось. Терять нечего, хули
А я вот ни разу не пиздел при трудоустройстве. Работаю с далёких 00-х.
Не понимаю, как пустое место можно выдать за год опыта. Впрочем, в какой-нибудь Сбер или "Рога и копыта" мб и прокатит.

За какую сумму вы были бы готовы стажироваться/пойти на первую работу по РНР, если:
: Надо работать с легаси-монолитом без фреймворка (но с Compoaer, можно понемногу подтягивать библиотеки)
: Нужно минимальные знание jQuery && Bootstrap 4
: Есть очереди на RabbitMQ, но с ними тимлид поможет, если что
: 2-3 дня в офисе, остальное удалёнка
Принимаются ответы для
: ДС
: Вашего родного города
Удвоил. Можно больше даже - если там легаси уже, то деньги есть.
В чем разница двух вариантов функций?
$a = 22;
function testFunc($a) {
global $a;
$a = $a + 10;
}
function testFunc2(&$a) {
$a = $a + 10;
}
Обе изменяют внешнюю переменную, получается & и global просто варианты на выбор?
Это ты с апи еще не работал. Или с nosql парашей. Бекэнд = код + база.
Либо Js и на фронт, либо учи sql.
Sql это прям база для бэкенда, в смысле основа. Плохое знание бд это примерно одно и то же, что и плохое знание бэкенда.
В том числе и потому, что если ты хуево напишешь код на php, то его всё равно сравнительно просто масштабировать, ну поднимешь ещё один веб сервер и нормально будет, даже не очень дорого, cpu нынче ничего не стоят.
А вот хуевая работа с базой во-первых плохо масштабируется, во-вторых будет задевать соседние запросы (один мудак из сотни разрабов может загрузить базу и заставить тупить всё приложение) и может влететь в копеечку в каком-нибудь амазоне, который биллит тебя по дисковому io. Какой-нибудь тупой забытый индекс приведет к сексканам и ты при хорошем рпс довольно быстро увидишь веселые чиселки в счете.
Вообще, у бэкенд-разработки есть четыре кита, в порядке убывания важности
- Язык (в данном случае пыха) и инфра вокруг него (популярные либы и фрейморки, выбирай один получше, для новичков лучше ларавела имхо вариантов нет)
- Базы данных (выбери одну и её изучай)
- Сети (протоколы, http 1/2, мб grpc)
- Инфраструктура (nginx там, всякая мишура для билдов, мб докер с кубами, но это уже миддл+ левел)
Если ты в них не разбираешься, то ты или стажер или чмошник, но никак не разработчик.
Всем, кто прибежит и начнет кукарекать про микросервисы заранее ссу в лицо и напоминаю, что распиливая какашку на субкакашки, вы конфетку не сделаете всё равно. И за 100500 баз вы в итоге будете платить больше, чем за одну ну или железка будет всё равно одна, тогда вообще ничего не изменится, а запомоить весь сервис хуевой нагрузкой неприятно настолько же, как и всё приложение, тем более учитывая связность в микросервисной архитектуре.
Пон, спасибо. Тогда буду рвать ануз и превозмогать.
Сначала не понял, а потом как понял
Посмотрел оглавление, такой же скам, как и большинство прочих курсов. Сойдёт только для совсем зелёных джунов, которым тем более не жалко денег.
Аноны, посмотрите, пожалуйста, реализацию авторизации в стиле MVP. Какие есть ошибки? Если что, контроллер вызывается в файле login.php, а не за ее пределами.
https://codeshare.io/X81RMl
>>564231
>>564198
Курс хороший, но это больше практика. А последние задачи потребуют у тебя пол дня только для того, чтобы понять, что от тебя требуют. Для новичков бы не посоветовал, так как сам автор говорит, что это не обучающий курс, а тренажер.
Симфони прекрасен и начинай я новый проект на пыхе - выбрал бы его и только его.
Но новичкам всё же лучше подойдёт ларавел пожалуй. Он и попроще структурно, и мануалы пободрее и требований к навыку архитектора поменьше предоставляет.
>>564773
> Курс хороший, но это больше практика. А последние задачи потребуют у тебя пол дня только для того, чтобы понять, что от тебя требуют. Для новичков бы не посоветовал, так как сам автор говорит, что это не обучающий курс, а тренажер.
Хз, может, у меня когнитивное искажение на основании своего опыта, но я в упор не понимаю, что это блять за практика такая, для которой курс нужен.
Садишься на задницу за компьютер и начинаешь программировать любой фейсбук, который в голову взбредет, сразу столкнешься вообще со всеми задачи, которые могут быть. Пока будешь гуглить, как их правильно решать - всему и научишься.
Ну и параллельно хорошо бы книжку по бд какую-нибудь читать, чтобы была какая-то теоретическая база и ты понимал, что вообще делаешь. Ну там виды отношений, нормальные формы, ACID и всё такое.
Курсы не нужны, вообще. У меня часто спрашивают знакомые и я не видел ни одного нормального курса ни по одной технологии вообще. Что популярные, типа яндекс.практикума и говниллбокса, что малоизвестные - все скам и за твои деньги просто прочитают тебе часть оглавления любой книги по программированию/базам/алгоритмам/any. Никакой нормальной базы они поэтому не дают, а т.н. "практика" это как правило несколько тупых и плохо поставленных заданий, которые можно и самому себе придумывать.
Кроме шторма нормальных IDE нет. Там есть триал на месяц, если немного погуглить, то научишься его бесконечно сбрасывать.
На крайняк есть саблайм и вскод, но это совсем не то.
дыа
Вот когда стану фелстеком, тогда и попрошу работодателя. А пока я только учусь, в идеале хочу стать пыхарем, немного попробовал, посмотрел как друг делает там всё - понравилось. Надо было изначально идти в бек, как я и хотел, но повелся на то что якобы "сразу видно результат". Нахуй фронт, только в качестве неосновного знания. При этом уже есть пару петов на фронте, буду их поддерживать, улучшать, хули. Дабы не забывать. Продолжу пожалуй в вскоде.

Стек js/laravel/html/css - для портфолио буду юзать muicss чтобы с фронтом не дрочить мозги. Теперь вопрос, этого хватит для бекендера? Если я прям кишки этих языков дрочу?
>>565149
Вы че ебанутые? Все продукты jetbrains взломаны,
https://github.com/libin9iOak/ja-netfilter-all
Ну почти все, хз что там с fleet и тд
В некоторых компаниях спецом консольный гит например не юзают, и стиль кода по ide ведут. а на vscode одни костыли на костыле, vscode как блокнот хорошо работает чтобы побыстрому наклепать что нибудь.
Ну само собой, mysql, pdo/orm может быть postgre и подобное
Если ты не в состоянии спиздить рабочий инструмент тебе в пхп делать нехуй, верстка твой потолок. https://github.com/libin9iOak/ja-netfilter-all
>>565134
Нормальный чтобы написать пару функций и поделать несложные задачки. Я не говорю что VSCode плохой редактор, в нем дохуя полезного для JS, например. Но конкретно для пхп там очень мало, а что есть давно устарело. Для коммерческой PHP разработки VSCode не существует. Тебе либо дадут лицензию на шторм, либо дадут инструкцию как его спиздить. Так-то можешь писать хоть в виме, но спрашивать с тебя будут как с полноценного. Никого не ебет что у тебя плагин пять лет не обновлялся, работу работать надо.
Так что все эти разговоры про сорта и вкусы это хуйня полная. Чем быстрее начнешь пользоваться предназначенным для своей работы инструментом, тем больше времени жизни и нервов сэкономишь.


Какие нахуй вирусы и кейгены? На линуксе?
Там java-демон который прикручивается к ide c твоей же папки которую ты указал. Лицензия до 2025 года, новые версии обновляются у других. Незнаю, если с сетью-дебагом-деплоем-гитом проблем нет, то нахуй свои щекели тратить
Ок, ретранслирую эту мысль в головы твоих заказчиков, которые тебя скоро кинут.
Много матов, извиняйте коллеги.
Ну я когда вкатывался во фронт, то использовал вс код ясное дело. Друг говорил качай вебшторм, но вот вчера, тонны нефти анонам что подсказали, скачал пхп шторм, это как вебшторм, только с приблудами для пыхи, и охуел от того, насколько лучше. Пиздец, будто новый мир. Так что пока не попробуешь, не узнаешь.
Ты кстати охуеешь ещё сильнее, если пересядешь на какую-нибудь джаву или (особенно) котлин. Там за счет большей статичности языка IDE настолько развитая, что труъ программисты практически не пишут код, автокомплитится примерно всё. Если знаешь хоткеи и возможности IDE, конечно. Начиная от Move method, Implement interface и Generate test и заканчивая рефакторингами и лайв темплейтами.
Выбираешь слово, смотришь чтобы другие подсвечивались и cltr+D
Пытаюсь рабоать с api, в документации написано:
"Наш сервис ожидает ответ от хука не более 2 секунд. Если мы не получаем ответ за указанное время или код ответа не успешный (HTTP код не от 100 до 299), мы считаем хук не доставленным, а отклик невалидным.
При отправке запроса информация считается принятой, если в заголовке http ответа будет возвращён код от 100 до 299"
Че от меня хотят? Что мне написать в файле, чтобы им вернулся ответ?
Ничего не понял, кто веб хук программирует? Ты? Или ты его вызываешь?
Полностью опиши ситуацию.
>статичности языка IDE
шторм в такое тоже умеет, кстати, только с небольшим костылем нужно в пхпдоке уточнить тип переменной, аж охуел, когда лид такой прикол с сериализацией проделал
Какие есть варианты более глубже изучить язык? Я имею ввиду обучающие материалы, там более продвинутые курсы, такого плана.
А еще, что у джуна PHP/JS на собесе будут спрашивать?
Это не то, совсем. За типами тебе надо следить руками, а также отсутствует нормальный вывод типов, дженерики, вот это всё.
Ты не спорь, а просто проверь сам, если не согласен и удивишься от того, насколько я прав.
Это не задача шторма. Генерация документации - это задача инфраструктуры, то есть, тулчейна. В идеале даже, как часть CI/CD.
Ну и да, по моему опыту, намного удачнее, когда код генерируется из сваггера, а не наоборот.
Так как в этом случае у тебя больше возможностей работы с описанием апи, возможностями его создания, заполнения всякой метой и так далее. Можешь даже собирать её из нескольких источников. А уже имея схему, генеришь код на любом языке, не ставя схему в зависимость от некой тулзы генерации.
Грубо и супер упрощенно говоря, говняная тулза генерации схемы из кода (или просто код - какое-нибудь говняное легаси) будет генерировать плохую схему, потом эта схема будет использоваться для генерации клиентов под андроид и айос и это говно потечет дальше, в код на других языках.
А в случае, когда схема не зависит от изначальной тулзы/языка, ты можешь сделать её любой, а проблемы, если и возникнут, то уже на уровне конкретного языка и не будут расползаться.

Рекомендую
Вот допустим есть проц с 8 ядрами.
и есть скрипт index.php который включает в себя код по типу
1)$startDate = текущее время
2)wheile цикл, где идет просто i++ до 1 млн
3) $endDate = текущее время
4) timeDiff = $endDate-$startDate
5) file_put_content(name = $timeDiff)
допустим, что скрипт выполняется за 1 минуту.
если мы в кроне запустим 8 паралельных копий этого скрипта они все закончат работу +- одновременно?
как в данном примере поведет себя пыха? нагрузит проц на 100% одно ядро или все ядра?
я попробовал нечто подобное у себя, но у меня просто закешировалось все и цикл до 1 млн из оперативы подтягивает
(время работы скрипта 0 сек, 0% загружен проц и 2 гб оперативы жрет)
Спасибо за внимание
Ответ будет такой: "оно зависит". Пыха вообще не оперирует процессорами и/или тредами. Так что если ты десять раз запустишь `php index.php`, то у тебя в операционной системе просто запустится десять процессов. Как она у тебя их разберет - черт его знает, зависит от версии ОС, настроек, модели процессора, текущей нагрузки и много чего ещё. Грубо говоря у ОСи есть планировщик, который раскидывает задачи между потоками, переключает их и всё такое.
В случае, если ты будешь вызывать скрипт через php-fpm, то всё будет чуть сложнее, так как фпм это сам по себе менеджер процессов и там всё будет зависеть от количества воркеров и прочих настроек. А потом опять от ОСи, потому что всё равно воркеры=процессы и исполняет их она.
Добро пожаловать в реальный мир, не просто так придумана фраза "миллионы мух не могут ошибаться".
Большинство людей не очень умные.
Большинство вакансий - нищебродское говно.
Большинство девелоперов - слабаки.
Большинство софта - говнокод.
Большинство фильмов - ширпотреб.
И так далее.
Спасибо за ответ. Просто есть скрипт который парсит данные и грузит их в бд. Данных много и работает он долго. Но заказчику нужен именно php.
Я вот думаю, мб максимально возможно разбить этот скрипт на максимально независящее друг от друга процессы, но что бы все это в конце вылилось во что то единое.
Как делать грамотно паузы между запросами к api? У api стоит ограничение на количество принимаемых запросов, не более 7 в 1 секунду, я сделал конечно вариант через рандомное число, которое потом помещается в sleep(), но все же этот вариант мне видится не очень, как делать правильно?
А ты прикрути очередь. Очереди это щас модно. Будешь дергать по одному и никогда семь запросов за секунду не успеешь сделать. Заебенишь презентацию как внедрял, доклад ебанешь, премию получишь, одна польза.
Думать меньше надо, а соображать больше.
Да хуль там делать.
Берешь кролика. Демон срет в кролика. Перед запрососм в АПИ дергаешь кролика. Если в кролике есть какое-то гавно, то стучишь в апи.
Бля, дядь, ну хоть просто дернуть метод не посоветовал, уже неплохо, двачная тех поддержка растет и ширится.
Пытаюсь прочитать .csv файл, использую библиотеку league/csv, там в классе Reader есть метод класса - public function fetchColumnByName(string $name): Iterator
Что за формат iterator? Как с ним взаимодействовать? Можно ли его в понятный мне array перевести будет?
>формат iterator
Не формат, а тип. Гласит о том, что это итеррируемый объект который можно запихивать в цикл и там с ним работать.
>Можно ли его в понятный мне array перевести
Зачем?
То, что идет после двоеточия в заголовке функции - это тип значения, которое она возвращает. Там может быть указан обычный тип (int), имя класса или интерфейса. Тут указано именно имя интерфейса Iterator, и это значит, что функция может вернуть объект любого класса, который реализует этот интерфейс.
Что значит "реализует"? Что у возвращенного объекта будут методы, описанные в интерфейсе Iterator. Этот интерфейс встроен в PHP и описан в документации: https://www.php.net/manual/ru/class.iterator.php
Если ты вдруг забыл, что такое интерфейс, есть урок: https://github.com/codedokode/pasta/blob/master/php/interfaces.md
Итератор это не совсем простая штука. Итерация - это обход чего-то в цикле. Например, обход всех элементов массива или обход всех файлов в каталоге. Итератор (в PHP) - это объект-коллекция, который что-то содержит внутри себя и который можно обойти в цикле. Например, объект, который содержит в себе список файлов. Все итераторы в PHP реализуют интерфейс Iterator.
Массив это не объект, и поэтому не является итератором. Но его можно тоже обходить в цикле. Вместе все, что можно обойти в цикле, то есть массивы и итераторы, назваются "обходимые" или Traversable.
Возвращаясь к твоей функции. Она возвращает объект-итератор и это значит, что единственное, что ты можешь с ним сделать - это обойти его в цикле и извлечь содержимое:
$iterator = $x->fetchColumnByName($name);
foreach ($iterator as $value) {
var_dump($value);
}
Разумеется, кроме foreach, можно использовать и функции для работы с итераторами вроде iterator_to_array.
Записываешь в переменную время отправки первого запроса. Когда хочешь отправить второй запрос, проверяеешь - прошла ли 1/7 секунды с предыдущего запроса, если нет то вычисляешь, сколько времени осталось ждать и ждешь функцией usleep.
> если мы в кроне запустим 8 паралельных копий этого скрипта они все закончат работу +- одновременно?
Скорее всего да, но таких гарантий нет. Могут и не одновременно, если, например, процессор будет загружен чем-то еще.
> как в данном примере поведет себя пыха? нагрузит проц на 100% одно ядро или все ядра?
Операционная система (не PHP) постарается занять все доступные ядра, если они не заняты другими программами. Но скорее всего, процессор не будет загружен на 800%. Дело в том, что твоя программа, кроме вычислений, скорее всего будет работать с файлами или с сетью, а в этом случае она будет простаивать в ожидании ответа и процессор не будет использоваться в это время. По этой причине, если у тебя программа такого типа, то стоит запускать не 8, а 9-12 копий программы или даже больше. Определять точное число надо экспериментально, глядя на загрузку процессора.
> я попробовал нечто подобное у себя, но у меня просто закешировалось все и цикл до 1 млн из оперативы подтягивает
А ты попробуй что-то считать в цикле и выводить итог в консоль, а то может быть там оптимизатор видит, что цикл ничего не делает и пропускает его.
Да, это самый простой вариант. Если у тебя есть пачка адресов, которые надо парсить, то проще всего разбить ее на N частей и каждому процессу дать свою часть.
А как генерировать код и сваггера, чтобы при правках кода и при правках сваггер-файла и перегенерации кода ничего не терялось?
Тут проблема в том, что если ты сгенерировал код, вручную его подправил, потом обновил сваггер-файл, перегенерировал код и твои правки потерялись.
По моему, удобнее все же писать код, к нему добавлять аннотации, из которых генерируется сваггер-файл. Есть утилита swagger-php, есть L5-Swagger для Laravel и тд.
Не могу дать готовый урок, но в шапке есть задача про список студентов, и к ней преподробнейшие комментарии, где расписано как раз то, что тебе нужно.
Ты можешь отдать код ответа с помощью функции http_response_code() или header() в PHP.
Если ты плохо понимаешь слова "код ответа HTTP", то почитай урок по основам HTTP: https://github.com/codedokode/pasta/blob/master/network/http.md
Кстати, плохой совет, так как --classic дает проприетарной программе полный доступ к твоему аккаунту на компьютере и всем данным в нем.
MVP или MVC? MVP это Minimum Viable Product.
По моему, у тебя проблема в том, что ты думаешь, что на каждую страницу сайта надо создать ровно 1 контроллер, 1 модель и 1 вью. Это не так. Обычно на 1 страницу создается 1 контроллер и 1 вью, но тут есть варианты - например, у страницы может быть несколько вью на разные случаи (успех и ошибка). Или несколько контроллеров (если на странице несколько форм).
Но модели со страницами не связаны. Модели обычно связаны с таблицами в БД или с функционалом. У тебя есть функционал автворизации - ты создаешь сервис авторизации. Не только логин, а например, еще и выход.
То есть, 1 контроллер - это одно действие пользователя, 1 вью это одна страница, а 1 модель это одна таблица в БД или 1 кусочек функционала.
Поэтому, правильнее назвать модель не loginModel, а authService - сервис авторизации (сервис это что-то, что выполняет полезные функции).
- require надо ставить в начале файла.
- нужно убирать пробелы с краев в приходящих из формы данных
- при ошибке соединения с БД ошибку надо писать в лог (error_log()), чтобы ее увидел админ, а пользователю показывать красивую страницу ошибки
- глобальные переменные запутывают код и это очень плохо. Явно передавай соединение с БД в функцию, а не бери из глоб. переменных.
- не храни пароли в БД, а храни соленые хеши от них, урок https://github.com/codedokode/pasta/blob/master/security/password-hashing.md
- не вставляй переменные в SQL запрос, это создает уязвимость, урок https://github.com/codedokode/pasta/blob/master/security/sql-injection.md
- при ошибке желательно вывести в форме введенный логинЮ, чтобы не печатать его второй раз
- при ошибке желательно писать, что неправильное: логин или пароль
Спасибо, что код короткий и вставлен через сторонний сайт.
Еще, установку значений в сессии и из удаление лучше вынести в сервис авторизации. То есть, функции в нем могут быть такие:
- функция проверки логина, пароля
- функция, которая ставит признак входа в сессии
- функция, которая удаляет признак входа из сессии (разлогинивает)
- функция, проверяющая наличие признака входа в сессии
При таком подходе вся работа с авторизацией у тебя будет в одном файле и если ты как-то захочешь поменять механизм (например, вместо сессии использовать БД или куки), то тебе будет достаточно исправить только один файл, не трогая остальной код. Также, архитекутра будет более чистая.
Второй вариант лучше, так как переменная явно передается в функцию и это видно. Но еще лучше был бы третий вариант, где результат возвращается через return, а не через изменение входной переменной.
Погоди немного. Мы не перекатываем после 500 постов. У нас нет задачи всегда висеть на первой странице, надо и другим языкам дать шанс.
>>560587
А почему тебе не предложили оффер после стажировки?
>>560438
Сессия это файл, хранящийся на сервере. А у пользователя в куках хранится только имя этого файла (длинное и трудноподбираемое). Поэтому пользователь не может читать или записывать в сессию. Это может делать только PHP-скрипт на сервере.
Ты можешь ошибаться. Алгоритмы, во-первых, расширяют кругозор и учат искать оптимальные решения и мыслить немного по-другому. Во-вторых, при обработке больших объемов данных ты сможешь делать это более эффективно. В-третьих. изучать алгоритмы интересно, особенно сложные, а вдвойне интересно прочитать начало описания и попробовать догадаться до алгоритма самому.
А что именно тебе не нравится в базах? Может, просто объяснения плохие? Ведь базы позволяют эффективно хранить блольшие объемы данных и быстро искать в них нужные одним запросом, разве это не отличная технология?
Или, может тебе попробовать написать свою игрушечную СУБД на PHP, чтобы лучше понимать базы данных?
Уже все норм. Просто один момент с самого начала неправильно понял и из за него были проблемы
В школе девопсов дали задание развернуть вот это приложение Symfony Demo Application https://github.com/symfony/demo
Там нихуя не работает, потому что репозитарий не предназначен для развертывания. Я понимаю, что они мудаки и продают необкатанную хуйню, но хочу модифицировать приложение сам чтобы было похоже на настоящее. Это не запрещено.
Как мне добавить в репу миграции и данные, которые можно загрузить из fixtures? Там есть данные и они подгружаются через :
composer require doctrine/doctrine-fixtures-bundle --dev
php bin/console doctrine:schema:create
php bin/console --env=dev doctrine:fixtures:load
Воообще не могу разобраться, аж устал.
Лол, как это Symfony не предназначен для развёртывания?
А что тебе там нужно, кроме
- установки значений в .env файле
- composer install
- запуска миграций
- мб запуска тестов
Ты лучше объясни хули ты там такое учишь в школе девопсов, если ты не в состоянии три консольные команды выполнить?
Но в этой репе нет миграций. Открой и посмотри.
Как добавить те, которые в fixtures?
Хочу чтобы авторизация работала. Допустимо один раз запускать какие-то команды, но fixtures ведь нужны для автоматизированных тестов. Это не то
Там все плохо сделано.
Раздолбаи сделали раздолбайский курс. Хз зачем я в это ввязался.
Я, пожалуй, даже сдал бы это задание на sql, но лучше сделать хорошо и приближенно к реальности
Рекомендую попробовать кто ещё не.
>макос
Там же для дизайнеров и прочих пидрил, а не программистов. Не?
По крайней мере с точки зрения удобства и поддержки разраба Винда сосёт даже у кривенькой Убунты.
Это же IDE, ты и так захочешь его ей дать, чтобы она файлы могла все редактировать, встроенный http клиент работал и тд и тп.
>>567711
> Тут проблема в том, что если ты сгенерировал код, вручную его подправил, потом обновил сваггер-файл, перегенерировал код и твои правки потерялись.
Никто и никогда не должен править руками сгенерированный код.
Сваггер кодген генерирует http клиент и к примеру интерфейсы для http сервера. А ты потом просто вызываешь методы клиента или реализуешь его интерфейсы на сервере, ну и юзаешь структуры сгенерированных запросов и ответов ещё.
> По моему, удобнее все же писать код, к нему добавлять аннотации
Удобнее для тебя сейчас. Потом окажется, что ты хочешь, чтобы некий запрос выглядел как-то по особенному и хитрым образом вручную маппился в динамическую структуру и моментально ебнешься описывать это аннотациями.
>>566999
Так у тебя здесь не php узкое место, лол. Php работает примерно моментально в данном случае, в сравнении с работой с диском и, в особенности, с работой с базой.
И оптимизировать тебе нужно соответственно эту часть.
Ну или ты наговнокодил и каким-то образом заставил тупить прослойку, которая тупо вычитывает байтики с диска, разюирает их и посылает по сети в базу.
Вообще-то не совсем, мак с точки зрения софта это такой линукс для людей. Далеко не всем программистам нравится ебать себе мозг, решая неизбежные косяки с линуксом к примеру блютус в линуксе традиционно работает через жопу. Макось не идеальна, но всё же очевидных косяков там меньше, к примеру, для того, чтобы мак начал засыпать при закрытии крышки, тебе не придется лезть в logind.conf или гуглить, чтобы выяснить, что тебе нужно ставить какой-нибудь отдельный gnome-tweaks, better-gnome-tweaks или прочую херабору.
Плюс, с точки зрения железа и сборки, "ноутам" от эппла просто нет конкурентов. Качество экранов, качество сборки, толщина и легкость, клавиатура, просто божественный тачпад и тд и тп. У меня было много флагманских ноутов и ни один dell или lenovo пока не сравнился с прошкой, даже из той же ценовой категории.
А сейчас ещё и процы на М1+ подъехали, это вообще атас.
Как написано в README, данный проект правльно нужно разворачивать командой composer create-project или symfony new.
Также, там в data есть база данных sqlite.
> Как мне добавить в репу миграции и данные, которые можно загрузить из fixtures? Там есть данные и они подгружаются через
Сделал ли ты composer install сначала? И если сделал, то какие ошибки выдаются при попытке запуска указанных тобой команд?
> но fixtures ведь нужны для автоматизированных тестов.
В тестах не нужны миграции. Обычно при запуске тестов создается новая база, в ней таблицы на основе сущностей Доктрины и автоматически загружаются fixtures. То есть, для тестов тебе не надо что-то создавать.
Миграции нужны для выгрузки на прод и для передачи изменений другим программистам.
> Это же IDE, ты и так захочешь его ей дать, чтобы она файлы могла все редактировать, встроенный http клиент работал и тд и тп.
Но я не хочу, чтобы IDE читала серийный номер жесткого диска, историю бразуера или список ближайших вай-фай точек. Зачем ей давать такую возможность? Вдруг они захотят это собрать и сохранить на сервер? Я не доверяю коммерческим компаниям. История показывает, что например и Гугл- и Яндекс-карты сохраняли историю GPS-координат пользователя. Не думаю, что другие коммерческие компании ведут себя по-другому.
> и к примеру интерфейсы для http сервера.
Зачем мне интерфейсы для контроллеров? Что они дают, кроме раздувания объема кода?
> и юзаешь структуры сгенерированных запросов и ответов ещё.
А если мне надо в них что-то подправить? По моему, проще сделать структуры и из них генерировать сваггер-файл.
> Удобнее для тебя сейчас. Потом окажется, что ты хочешь, чтобы некий запрос выглядел как-то по особенному и хитрым образом вручную маппился в динамическую структуру и моментально ебнешься описывать это аннотациями.
Если задача такая сложная, то и кодогенерация с ней не справится. Тем более, аннотациями можно описать все, что есть в сваггер-файле. Я не понимаю, зачем вообще руками писать сваггер-файл, он явно не предназначен для ручного написания.
То есть: код намного сложнее, чем сваггер-файл. Потому логично генерировать сваггер-файл из кода, а не наоборот. Плюс еще в том, что если ты что-то правишь в коде, то аннотации находятся рядом и легко сразу и их поправить и сгенерировать новый сваггер.
По моему, описанный тобой подход хуже.
> Потом окажется, что ты хочешь, чтобы некий запрос выглядел как-то по особенному и хитрым образом вручную маппился в динамическую структуру и моментально ебнешься описывать это аннотациями.
Как я помню, аннотации сделаны так, что ими можно описать любые структуры, которые есть в swagger.
Ты красиво все описываешь, но в реальности это не так красиво.
В маках все распаяно. Хочешь проапгрейдить память с 8 до 16 Гб? Покупай новый мак за 200 000 вместо планки памяти за 2 500. Аккумулятор потерял емкость? Покупай новый мак. Боишься, что камера тайно тебя снимает? Покупай стороннюю шторку на камеру, ведь физического выключателя там нет, как и шторки.
Маки очень сильно оверпрайснуты. Единственное, что в них есть хорошего, это дисплей. Все остальные компоненты там излишне дорогие и мне бы хватило более слабых, но более дешевых, но их тебе Эппл не продаст. То есть, ты покупаешь дорогой процессор и далее используешь его на 10%, а за что ты платил оставшиеся 90%, непонятно. Свои собственные процессоры от Эппл более слабые, чем процессор Intel и AMD, хотя стоят не меньше.
Далее, в Линуксе нет телеметрии, а как насчет маков?
В маках плохая раскладка клавиатуры: например, точка и запятая находятся на разных клавишах в русской и английской раскладке. Как на такой клавиатуре печатать?
В Маках до сих пор нет полноценной изоляции для программ и защиты от сбора данных об оборудовании.
Наконец, в Линуксе, если что-то не работает, ты можешь все изучить, отладить, исправить, а если в маке что-то не работает, то остается только его выкинуть или мириться с проблемой.
>блютус в линуксе традиционно работает через жопу
У меня нормально всегда работал - три пеки сменил + ноут. Не было проблем никогда.
>тебе не придется лезть в logind.conf или гуглить, чтобы выяснить, что тебе нужно ставить какой-нибудь отдельный gnome-tweaks, better-gnome-tweaks или прочую херабору
С точки зрения программиста такой себе плюс. Для Бабы Сраки из бухгалтерии - да, важно.
>"ноутам" от эппла просто нет конкурентов
Я за ноутом не работаю - я не ёбнутый и не позер от it. Ты бы ещё на смартфоне предложил код писать.
>Аккумулятор потерял емкость? Покупай новый мак
Нет, батарею можно заменить
>Боишься, что камера тайно тебя снимает? Покупай стороннюю шторку на камеру, ведь физического выключателя там нет, как и шторки.
Изолента, лол, + шапочка из фольги
> к примеру, для того, чтобы мак начал засыпать при закрытии крышки
У меня есть 2 примера ноутов, в которых это работает из коробки, хотя мне больше нравится нажимать кнопку.
> толщина и легкость,
Я не готов платить в 3-5 раз больше за то, что ноутбук будет на 5 мм тоньше и на 200 грамм легче. У меня хватит сил его поднять в любом случае.
> просто божественный тачпад
Который все равно проиграет мышке за 300 р.
> флагманских ноутов
Развод доверчивых потребителей на деньги.
> процы на М1+ подъехали
У 8-ядерного M1 Pro на passmark рейтинг 17 000, а у AMD Ryzen 9 5900HX 22 000.
> У меня нормально всегда работал - три пеки сменил + ноут
Тут у меня противоречивые чувства. С одной стороны, работает без драйверов, с другой стороны у меня по bluetooth файлы перекидываются только в одну сторону. Плюс, нет возможности по bluetooth подключиться к телефону и просматривать на нем файловую систему. Интересно, в маках такое есть?
Также, я раздавал по bluetooth интернет с одного ноута на другой и через несколько дней bluetooth-модуль отключился и перестал орпределяться до перезагрузки. Интересно, в маках такое бывает или они могут раздавать интернет дольше нескольких дней подряд?
А, еще, я не могу использовать телефон как bluetooth-гарнитуру. Хотя у меня ощущение что и с маком так нельзя.
А у меня камера просто за монитором валяется отключенная от усб.
>с другой стороны у меня по bluetooth файлы перекидываются только в одну сторону
Если на ПеКу не скачиваются, то я бы смотрел в сторону разрешений на запись.
>Плюс, нет возможности по bluetooth подключиться к телефону и просматривать на нем файловую систему.
У меня домашний вайфай, поддержка ФТП уж это линуксы хорошо умеют в норме в любом ксяоми есть, в родном проводнике. Хожу через локалку, а блютуз только для мышек\геймпадов и прочей мелочёвки. Там вроде как скорость не шибко быстрая чтобы файлы перекидывать?
>раздавал по bluetooth интернет с одного ноута на другой
Хз, я с телефона как-то месяц сидел на ноуте. Телефон позволял прикидываться роутером, раздавая мобильный инет по вайфаю. Так все умеют сегодня вроде как.
>
>Как написано в README, данный проект правльно нужно разворачивать командой composer create-project или symfony new
Да, я заметил. Но я хочу сделать как на самом деле надо было сделать это задание.
>Сделал ли ты composer install сначала?
Тут все хорошо. И Fixtures грузятся.
Я хочу добавить в репо нужные миграции чтобы было совсем как будто типичное приложение.
Как лучше поступить? Не готов неделю изучать доктрину
Уже почти 30 лет, вместе с Java
Событийной архитектуре не похуй, что ты там любишь?

На самом деле, современный РНР достаточно похож по ООП-возможностям на эти два языка.
И да, Java Spring примерно так же глючит и блекбоксит, как симфони, требуя адских часов на дебаг вместо программирования.
Байтоёьства в РНР тоже хватает, сходите в ВК — они вам покажут.
Так что, можно уже наконец успокоиться в этом вопросике.

>что в нем нельзя сравнить 2 строки через ==
Ты колишься в череп крокодилом?
>Ага, это под который нужно комп с виндой покупать
Нет, ну ты точно наркоман.
>Что-то я не слышал особо о проектах на шарпе
Любая игра на Unity. Это просто на вскидку.
>>568583
>Байтоёьства в РНР
>Байтоёбство
>В пэхапе
Этого байтоёбства даже в решётках нет, а они куда серьёзнее чем этот однопотоковый полуЯП коий в 2023ем году не умеет даже в асинхронность не говоря о собственном автолоадере или пакетном менеджере.
Вы оба пьяные ещё, чтоли?
Сходили вчера всем трендом в ВК.
Кароч говорят что байтоебства в пхп хватило ровно на десять вакансий на планете, и на этих вакансиях давным давно сидят байтоебы с плюсов. А когда мы рассказали что вкатуны с двощей вызвали охранников и нас отпиздили.
Да ты можешь хоть 50 раз осилить, факт в том что джуны больше не нужны, даже мидлы уехали т.к. в этой стране айти фсё, ну может чел не из россии капчует, тогда ок
И так, я перегенерил эту пизданину.
То есть, загрузил fixtures, а потом создал migrations:diff.
Почему они их не положили в репозитарий, не совсем понятно.
Видимо, миграции получаются с базоспецифичным SQL и их выкладывать стыдно.
Но могли бы хоть sqllite положить?
>PHP 8 Объекты, шаблоны и методики программирования
>Реквестирую материалы с описанием полного цикла создания сайтика с использованием ООП, шаблонов, в общем, хочу посмотреть
Для простого сайтика ООП на посох не надо. Там, скорее всего, пригодится хтмл, цсс и жопаскрипт, шаблонизация нативная пхпшная. Часто для простых сайтиков просто берут вордпресс и начинают трахаться уже с ним, как дед мороз со снежной бабой.

>Ты колишься в череп крокодилом?
Ну тут уже даже я проиграл.
https://stackoverflow.com/questions/7410635/java-not-saying-that-two-strings-equal-when-they-do
Лел, так в пхп тоже нельзя сравнивать две строки через ==. Надо через строгое сравнение ===.
В джаве строка объект кста. Ты у себя в коде как даты сравниваешь, додстер?
>Ну тут уже даже я проиграл.
Ну ессена, ты ведь даже прочесть не смог, что написано на пикче ибо ты ебланище пэхапешное максимум которого найти нить на стаковерфлоу 11ти летней давности.
>>Ты колишься в череп крокодилом?
Вопрос был риторический.
>Не использует DateTimeImmutable
Вопросов больше не имею. На секунду забыл с какими животными в одном треде нахожусь.
Ты сделал неправильно. diff вычисляет разницу между текущей структурой базы и описанной в моделях. Чтобы получить миграции, создающие нужную структуру БД, нужно удалить все таблицы в БД и только тогда вызывать diff.
Данные в миграции, естественно, не включаются, только структура таблиц.
Есть ссылка на гайд по навигации в папках? Я постоянно забываю про что вот эти хуйни ./ ../ /.. и тд.
Ебанутый, == сравнивает ссылки, а не строки, обосрался - обтекай.
Мониторю вакансии, всё время джуновские позиции с малым количеством откликов нахожу именно н PHP, да и в целом на PHP дохуя вакансий.
Так это же хорошо, для вкатусь.
Может потому что всякие калбокс/брейнс не завезли курсы по php, и сама технология не такая хайповая, нет громких проектов
Из-за комплекса неполноценности.
С# везде второй: проиграл джэве в интерпрайзе, плюсам в гейдеве и десктопе, гошке в хуйлоаде, в вебе, собсвенно, пхп и жсу, питону в датасайенсе и машобе, про мобилки и говорить нечего. Да что там говорить, даже зарплаты +- одинаковые с пхп. И это несмотря на то, что майкрософт вбухала миллиарды в разработку и маркетинг, а сам язык, как говорят синьеры, получился действительно хорошим.
>C#
си хештег хорош в области написания читов и малвари все равно проигравет Goвну в последнем...

Ещё как есть. И управление памятью есть.
Сходи в ВК, они тебе всё покажут.
Оч часто встречаю PHP на больших данных в телекоме и финтехе.
Про пакетный менеджер и асинхронность тебе уже отвечали, так что просто иди нахуй, серьёзные господа тебе повторять больше не намерены =)
Принято, ещё как, не знаю где смотрел но кол-во вакансий к резюме 1 к 100. Не говоря уже о кале типа водрпрессов-битриксов где буквально на одну вакансию тысяча откликов таксистов
Та же Жаба для сравнения
Подумываю сейчас куда вкатываться учитывая войну и рыночек. Мне не сильно важна сфера, главное чтобы залететь можно было легко и приятно было именно программировать. Шарп больше нравятся в целом, но конкуренция там среди джунов пиздецовая, к тому же требуют чаще всего фулстек. Думаю подобная ситуация будет во время всей войны + мировой рецессии, надо на это смотреть. т-е. если война будет 2-10+ лет я жёстко могу факапнуться.
>Не говоря уже о кале типа водрпрессов-битриксов где буквально на одну вакансию тысяча откликов таксистов
Ты с вротендом перепутал
Лол, ну так Украина это не рашка где айти похоронили, здесь и за пхп адовая конкуренция теперь
Как можно реализовать перенаправление с site.ru/profile/1, на файл site.ru/profile? Типа пользователь вбивает нужный ему профиль в браузер site.ru/profile/1, где 1 это id профиля, а далее этот профиль обрабатывается в файле profrile.php?
Немного подумал и решил всё таки не ждать у моря погоды и вкатится в PHP, потом если надо будет переучусь на .NET или в любую другую технологию когда и если захочу(вдруг меня затянет). Буду теперь с вами в треде зависать, мб даже стану местной вниманиеблядью.
Почему не перекатываете тред кстати?
Вот возьми и перекати в честь этого

Это вообще нормально что Phpstorm просит по умолчанию fast-cgi -интерпритатор? Почему не FPM?
Первый раз с php работаю, настраиваю phpstorm-локальный сервер. Поставил пак (по уроку)
- sudo apt install php-fpm php-cli php-common php-json php-mysql php-phpdbg php-mbstring php-imap php-dev php-curl php-xdebug
Пришлось еще устанавливать (потому-что шторм ругался)
- sudo apt install -y php8.2-cgi
И еще вопрос, новая версия шторма уровень языка 8.2 поддерживает, или нет пока-что?
Звучит как будто тебе надо не перенаправление, а просто сделать profile.php где id через GET передается, типа mysite/profile.php?user=1
Я типичный вкатун с курсов вротенда (стандартный стек хтмл, ксс, джс, рякт, редакс, есть пара петов), страна Украина. С вакансиями в этой сфере сейчас пиздец. На интерна по 300 откликов, на джуна не меньше 100. Как конкурировать с пацанами с ВО я хуй знает, учить CS наверное чтобы быть труъ. Начал я короче немного в это погружаться, скребя поверхность и дошёл до алгоритмов. Поговорил немного со счастливчиками вротендерами и оказалось, что алгоритмы нахуй там не нужны, кто бы мог подумать, но на собеседовании требуют и в тестовых тоже просят. Короче, меня CS немного увлек и вротенда мне мало, хочу пожёстче. Конечно глаз пал на фулкека, может даже свичнусь в бек окончательно, имея стек пыха + бд + говно + фрейм для пыхи. В своём познании я преисполнился и понял, что программирование это не про язык и библиокеки, это немного другое. Здесь устройство сети понимать надо епта.
Начал я рисёчить чё бы такого для фулкека выучить и выбор по сути стоит между двумя стульями: node.js хуй знает что в этой ноде учить там же 8 глав в том гайде и чистая нода нахуй не нужна кроме менеджмента пакетов в вебпуке/express и pgp с каким-то фреймворком типо симфони или ларавел. Сразу скажу, я не обременял себя нахрюками про зашкварность пыхи, потому что это тупо инструмент и он мне нужен для бека. В целом бек это интересно как по мне, по крайней мере интереснее фронта так точно. Итак, скажите, прав ли буду я и хорошая ли это будет инвестиция с точки зрения скорого трудоустройства, если я погружусь в пыху? Заранее спасибо. Попрошу ещё мнение по поводу ноды с экспрессом.
>Итак, скажите, прав ли буду я и хорошая ли это будет инвестиция с точки зрения скорого трудоустройства, если я погружусь в пыху?
Да, пыха сейчас лучшая инвестиция (лучше мб только 1с, но это то еще говно), можешь почекать отклики на джине и сравнить с питоном/жсом. Однако, надо понимать, трудоустройство врядли будет быстрым - пыха впитала в себя джава-образное ооп и его с наскока не освоишь, как и фреймоврк.
Да ты ебанулся хрюкошвийн, джуну надо сделать тестовое и ответить на несколько технических вопросов, все ебать, какие нахуй алгоритмы пиздец.
Что тебе еще бедолаге пакетосранцу посоветовать лол. В пхп есть два стула в основном: вордпресс и ларавел. Первый тру руинный вариант как раз для тебя, второй посложнее, выбирай.
Ты когда последний раз проходил собес на джуна? Я больше скажу, мне на интерна прислали тестовое, в котором задание на графы было.
А симфони?
Бекенд это не только PHP, но еще и ООП, SQL, HTTP, ORM, фреймворк.
Про алгоритмы можно почитать книги вроде "алгоритмы и структуры данных".
Тебе нужно настроить роутинг. Это можно сделать на уровне веб-сервера (nginx), чтобы он переписывал URL запроса, или на уровне приложения PHP, чтобы при любом запросе вызывался бы index.php и далее он анализировал URL и подключал нужный файл.
Ты не написал, какой веб-сервер используешь, для разных серверов (Апач, нгинкс, встроенный в PHP сервер) настройки разные.
Тут немного запутанное описание, как это сделать для встроенного в PHP сервера: https://github.com/codedokode/pasta/blob/master/soft/web-server.md#%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-url
Для нгинкс можно посмотреть тут https://qna.habr.com/answer?answer_id=1496310#answers_list_answer - только там надо сделать исключения для статических файлов (css, картинок). Проще всего наверно изучить мануал по нгинксу, он на русском, и написать конфиг самому.
Исключение от ебанутых каких-то, мне за все разы даже физ баз не заставляли писать, дают задание (практическое) и вопросы по знанию языка, делаешь/отвечаешь - проходишь. Не знаю даже что тебе сказать, какая зп у вакансии была?
Какой сервер открывает phpstorm при запуске с браузера, откуда он берет его? Это явно не опенсервер, там другой порт.
Это вротенд, не удивительно.
Ну можешь подрочить алгоритмы, там задачки какие, но вообще в практике ничего сложнее циклов в циклах не юзается, на начальном уровне так точно.
Это да. Просто дальше в планах у меня инжиринг по хардкору, со всеми этими алгоритмами и сложными структурами данных, поэтому и дрочу их. К тому же думаю для собеса пригодится, я прав?
А мне как-то на тестовом предложили полноценную приложуху запилить с кабинетом и реферальной системой, все на vue + lara. На джуна.
Ебанутых по ту сторону не меньше чем на эту. Иногда прям натурально разводят на работу бесплатную, расчет, ясен пень, на джунов, которые не совсем догоняют максимальный возможный объем тестового и чего там просить нельзя.
Не не пригодится, но для себя можешь поучить, будешь ходить перед макичами козырять как можешь.
Вопрос по регулярным выражениям.
$stroka = "Stroka Stroka ";
$ex = preg_match_all("/.+?\s+/", $stroka, $matches);
Выводит так:
Array
(
[0] => Array
(
[0] => Stroka
[1] => Stroka
)
Другой вариант:
$stroka = "Stroka Stroka ";
$ex = preg_match_all("/.?+\s+/", $stroka, $matches);
Выводит так:
Array
(
[0] => Array
(
[0] => a
[1] => a
)
)
Квантификатор тут +, почему тогда ограничитель работает на одну букву и почему?
)
Вопрос по регулярным выражениям.
$stroka = "Stroka Stroka ";
$ex = preg_match_all("/.+?\s+/", $stroka, $matches);
Выводит так:
Array
(
[0] => Array
(
[0] => Stroka
[1] => Stroka
)
Другой вариант:
$stroka = "Stroka Stroka ";
$ex = preg_match_all("/.?+\s+/", $stroka, $matches);
Выводит так:
Array
(
[0] => Array
(
[0] => a
[1] => a
)
)
Квантификатор тут +, почему тогда ограничитель работает на одну букву и почему?
)
И почему вообще работает?

Все же блядь написано. Это не два квантификатора, а один из двух знаков. Называется "сверхжадный" (possessive). Тебе оно не надо, ты просто проебался с синтаксисом.
Пользуйся https://regex101.com и не еби мозги.
ок

Никуда ты не вкатишься - хуйнёй какой-то страдаешь и глупые вопросы задаешь. Хочешь учить уи - учи уи, а не начинай с ассмемблера как шизофреник. Можешь ещё танцам поучиться - тоже наверняка полезно будет.
А вот я не знаю что я хочу! Вот такой вот я. Да!
Думаю сначала попробую веб-разработку, а потом ui/ux. И решу что приятнее мне. Подводные?)
ахахаха бубубу смотри не уеби мне)) работал! С какой целью интерес проявляешь?)
Как это вообще будет работать? В методе fill вводятся аргументы, которые не заданы в исходном интерфейсе, интерпретатор с ошибкой сваливается
А ошибка с неймспейсом тебя значит не смутила? Там специально чушь написана, которую ты должен разгрести. А с аргументами можно легко порешать https://3v4l.org/nhDef Вот и думай.
он нихуя не выводит
$QUERYS = [
1 => "SELECT last_name as 'Фамилия', first_name as 'Имя', middle_name as 'Отчество', user_position.created_at as 'Дата найма', TIMESTAMPDIFF(MONTH, DATE(user_position.created_at), CURDATE() ) as 'Отработано месяцев'
FROM user, user_position
WHERE user.id=user_position.user_id
AND TIMESTAMPDIFF(MONTH, DATE(user_position.created_at), CURDATE() ) < 3
ORDER BY last_name",
База у тебя какая? Данные у тебя какие? Таблицы какие? Перед тем как что-то спрашивать сначала сделай тестовую базу.
https://dbfiddle.uk/5jQjN72m
Вот тут все замечательно работает и выводится.
Я подсел на чад gpd. Раньше все руками гуглил. Но меня кинули на легаси проект (ангуляр 1.5 + лара 4.2), с ларой еще нормально т.к. я в пхп разбираюсь а вот с js у меня знания ограничиваются только ивент кинуть на кнопку.
Так вот,начиналось все нормально, я просто спросил у нее по контроллеру ангуляра. и так за пару дней я просто начал дрочить нейронку. вместо того, что бы гуглить и разбираться я просто кормлю нейронке код и спрашиваю ее как сделать то или иное. Да, за ней приходится подтирать лишнее но это пздц. Я боюсь если ее вдруг отключат я поем говна конкретно.
Моя эффективность с ней выросла % на 100 наверное.
Стоит ли слезать с нее или нормально? есть сеймы?

Ебать этому проекту пизда. Код то генерится "почти" правильный. Рано или поздно все эти нескладушечки сложатся в цепочку и все смачно наебнется. И земля пухом тому кто это будет дебажить. Ошибки будут не типичные и в человеческую логику не укладывающиеся. Кароче пиздец, так держать. Ебош по клятым капиталистам нахуй.
Ебать в голос.
Ну на самом деле не все так плохо, я ж не бездумно копирую все. Я понимаю что тот или иной участок скопированного кода делает, и в код стайл он хорошо вписывается. Ну а если ты прав, то надеюсь дебажить буду не я. (меня продали в рабство найм где то на год точно)
пытаюсь установит nginx по этой инструкции.
все хорошо до момента, когда пытаюсь на http://localhost:8080
должно быть "Вы должны увидеть такую страницу с текстом «Welcome to nginx!».", а у меня страница не найдена. В чем проблема?
Я гуглил нихуя найти не смог.
В логах вот эта ошибка 2023/01/26 21:56:28 [emerg] 18053#0: unexpected end of parameter, expecting ";" in command line
Погуглив ошибку, я понял, что могут быть забыты скобки в конфе nginx, проверил все в редакторе, все заебись. Я ХУЙ ЗНАЕТ ЧТО ДЕЛАТЬ.
Рассмотрим как установить веб-сервер самостоятельно.
Установим последнюю версию nginx:
brew install nginx
Поскольку порт 80 требует прав администратора, а homebrew по умолчанию устанавливает софт с пользовательскими правами, то работать nginx будет на порту 8080.
Запускаем nginx, чтобы он работал в фоне и обслуживал наши запросы:
brew services start nginx
Индикатор успеха:
==> Successfully started `nginx` (label: homebrew.mxcl.nginx)
Проверяем, что всё установилось корректно, и nginx успешно работает на нашем компьютере. Откройте любой браузер и введите в адресной строке следующий URL:
http://localhost:8080

480x360, 0:04
>пытаюсь установит nginx по этой инструкции.
>unexpected end of parameter, expecting ";" in command line
>я понял, что могут быть забыты скобки в конфе nginx
Файл хост на маке настраивал ?
- все посты + к каждому последний коммент
- просто все посты без последнего коммента
- один конкретный пост + все комменты к нему
Я не понимаю, как нормально расщепить на два сервиса, чтобы один занимался только постами, а другой только комментами, чтобы не делалось лишних запросов к бд
Типа сделать сервис для постов с методами getAll и getById
И сервис для комментов с методами getAllByPostId и getLatestByPostsIds(array). Но это как-то пиздец всрато, этому последнему методу приходится передавать массив айди постов, для которых надо достать последний коммент, чтобы избежать н+1. И я хз как даже нормально запрос в нём написать
Я бы мог просто сделать eager loading для комментов, но мне же не на всех эндпоинтах нужны комменты, иногда только один коммент нужно достать из бд
Я запутался, я нихуя не понимаю
Че ты там расщепляешь, у тебя ж элокент в ларавеле.
Создаешь в модели поста три метода: allWithAllComments, allWithoutLastComment, oneWithAllComments. Все, дальше по доке орм. Сервисы какие-то блдяь выдумал.
Гражданин вы не в симфони. Ларавель, актив рекорд и код в моделях.
Сервисы нужны хотя бы для того чтобы инкапсулировать логику приложения в один слой. Негоже в контроллерах срать моделями и негоже вообще всю логику в модели пихать - это норм для небольших проектов только, потом охуеешь от размеров кода моделей.
Хватит срать баззвордами, чучело. Это ларавель, это элокент, на нем так пишут. Имаджинирую твое ебало когда ты узнаешь про фасады и сколько бест практис они нарушают.
Не будет у тебя нихуя в контроллере, элокент выплюнет сразу универсальную коллекцию, готовую к пагинации и любой дргуой хуйне, которую ты напрямую хуйнешь в шаблонизатор. И все. Литерали все. Эту хуйню можно даже не писать, а сгенерить за две минуты и пойти пить кофе.
Хочете ебли с сервисами, доктринами и репозиториями - пиздуйте в симфони.

Какими средствами лучше "подписть" сокет-соединеине пользователя на изменения в БД? То есть, меняется база -> новые записи прилетают в сокет-соединение?
Нельзя в пхп ниче "подписать". И у реляционной базы нет понятия "новые записи". По крайне мере для доступа снаружи. Можно организовать таблицу так чтобы получать запросом отсеченные данные, например по дате.
Если у тебя есть сокеты, то есть сервер. А если есть сервер, то у него есть цикл в котором он обходит все сокеты. Ну вот в этом цикле и стучи в базу, получай данные, сри в сокет. Не забудь только механизм для реконекта к базе сделать, коннекшен не расчитан долго висеть.
Макака, спок.
>нет понятия "новые записи"
Ну как нет, есть триггеры по insert. Хотя в данном случае оно мне не очень подходит.
Хотел как-то оптимизировать этот механизм, без цикла постоянной выборки, чтобы не создавать нагрузки на БД. Но, видимо, придётся поступить так.
>Ну как нет, есть триггеры по insert. Хотя в данном случае оно мне не очень подходит.
Не "не очень подходит", а это вообще другой функционал. События базы остаются на уровне базы, все что база с ними может сделать это сохранить на диск, т.е. в базу, улавливаешь?
Даже если ты каким-то хуем изъебнешься и, чисто теоретически, каким-то невероятным образом получишь информацию об инсерте, то ты её получишь на уровне ОС и тебе понадобится транспорт чтобы доставить эту информацию в пхп скрипт, например база, ладно допустим кролик или редис. Но один хуй тебе придется в это хранилище лезть из пхп как и в обычную базу.
>Хотел как-то оптимизировать этот механизм, без цикла постоянной выборки, чтобы не создавать нагрузки на БД.
Снизить нагрузку это совсем другая задача. Для начала можно использовать базу в которую можно стучать хоть сто раз в секунду, тот же менеджер очередей или редис. Можно стучать по реже, раз в секунду никому не повредит. Тебе один хуй придется постоянно слать пинг запросы чтобы проверять висит ли еще коннект.
>И, кстати, есть event-driven архитектура, и есть паттерн eventListeners, я их и имел ввиду.
Все современные фреймворки работают на событийной модели и евент лупе, дальше что? Проблема не в архитектуре приложения. Проблема в том что твой "пхп сервер" на самом деле не настоящий и может работать только с сокетами. Если инфа пришла через открытый сокет, то вся это псевдосерверная конструкция работает, а если инфа пришла обычным http запросом, то его обрабатывает другой процесс, с которым никакой коммуникации нет. Ты с самого начала взялся гвозди хуем забивать. В любом действительно асинхронном языке тебе посредник в виде базы и не нужен был бы.
Добавил в phpstan плагинов на более строгую проверку.
Теперь он жалуется что "Конструктор имеет параметр такой-то со значением по умолчанию".
Почему этого стоит избегать, и надо ли?
Бля, у вас в контекстном меню шторма вместо поиска в гугле постинг на двач стоит?
https://github.com/phpstan/phpstan/issues/5906
Ты читать умеешь? Шпик инглиш?
Это баги пхпстена, ты просто список багов глянь и охуей. Они под восьмую версию еще пару лет фикситься будут.
Есть ли нечто на ларавель, чтобы дорабатывать?
Шаблон админки имеется ввиду крупные шаблоны с уже встроенными js-модулями такими как datatables
Как говна за баней.
https://getcraftable.com/
https://laravel-admin-panel.readme.io/
https://backpackforlaravel.com/
Это только с первой страницы гугла. Гугли laravel crud admin и выбирай что понравится.
Почему бывает не принимаются с помощью $_REQUEST данные (массив пустой), но принимаются с помощью file_get_contents( 'php://input');
Как так? В чем нюансы?
А действительно. А пачему блядь. А может быть это написано в документации? Пшел нахуй отсюда.
Возможно причина в том, что на get запрос обычно налагается ограничение в 500-2000 символов, а длина $_post ограничена константой post_max в php.ini, php://input позоволяет обойти эти лимиты. Это легкий поиск по гуглу, сам не проверял.
Хуй проссышь про что ты. Где код, где пояснения к нему? Просто пукнул, что у тебя иногда работает не так как тебе хочется. Думайте, ёпта, зовите телепатов.
Так вопросы не задают.
Подскажите по работе такой лигулярки:
#(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}#gmi
Т.е.:
(\()? - если есть открывающая скобка - запоминаем;
\d{3} - соответствие 3 цифрам;
(?(1)\)|-) - проверяем сохраненное значение в 1-й группе, если тру - ищем соответствие с закрывающей скобкой, если фалс - ищем соотвестие с тире.
\d{3}-\d{4} - поиск соответствия с 3-мя цифрами, тире, 4 цифры.
Данные:
123-456-7890
(123)456-7890
123 456-7890
(123-456-7890
(123)-456-7890
1234567890
Не могу понять, почему происходит частичное совпадение с 4м выражением. Шаблон полностью соответствует шаблону из книги Бена Форта и у него там нет совпадения.
Условие "видит", что есть совпадение в 1группе(открывающая скобка), но при этом, сразу после \d{3} идет тире, а не закрывающая скобка. Т.е. совпадения не должно быть, а оно есть.
https://regex101.com/r/RtHZXe/1

>(\()? - если есть открывающая скобка - запоминаем;
Неправильно. "Если есть от ноля до одной скобки. Запоминаем."
В итоге у тебя получается три условия:
1) Если есть или нет открывающая скобка. A || !A
1) Если есть открывающая скобка и закрывающая и нет дефиса. A && B && !C
2) Если есть или нет открывающей скобки и нет закрывающей скобки и есть дефис. ((A || !A) && !B && C)
Условный оператор уточняет A только для левой части условия, для правой части A остается неопределенным.
(A && B && !C) || ((A || !A) && !B && C)
Чекаем таблицу истинности
https://www.wolframalpha.com/input?i=%28A+%26%26+B+%26%26+%21C%29+%7C%7C++%28%28A+%7C%7C+%21A%29+%26%26+%21B+%26%26+C%29
Регулярка должна сработать в трех случаях:
1) Есть открывающая скобка и закрывающая и нет дефиса.
2) Есть открывающая скобка и дефис.
3) Нет скобок и есть дефис.
Что мы и наблюдаем: https://regex101.com/r/qLv40U/1
Вообще рекомендую тебе этой хуйней не заниматься. Не трать свое время на эти изъебы с регулярками, они тебе нахуй не понадобятся. Поверь все более менее полезные регулярки легко гулятся и просто копируются. Лучше почитай доку симфони или ларавелся или посмотри полезный видос https://www.youtube.com/watch?v=pz6VdH4_BSg
Понятно, спасибо за подробный ответ.
Ограниченность php и реляционных субд вынуждает искать альтернативы, но глубокое изучение требует большого времени. Буду благодарен, если направите мое внимание на определенные технологии, что сэкономят время. Начинаю присматриваться к laravel с его библиотекой работы с базами, встроенными в OSP базами (PostgreSQL, Redis, MongoDB), а также к языку разработки python. Разработка ведется, главным образом, над алгоритмом обработки данных, но обрабатываемые данные могут непредсказуемо меняться. Если закрыть проблему через создание сотни sql-таблиц по десять varchar-тысяча, десять varch двести пятьдесят пять (пять на индексах), десять полей типа text (пять на fulltext), то база, вероятно, начнет тормозить, а происходящее в ней будет в неудобном для просмотра виде.
>Разработка ведется, главным образом, над алгоритмом обработки данных
Ну ты выдал, канеш.
Давай по пунктам.
1. Что ты пытаешься сделать? Ты написал очень много, при это не написав ничего. Все программирование про алгоритмы обработки данных, и у всех данные непредсказуемо меняются. Напиши конкретно.
2. Твои попытки угадать перфоманс бесполезны. В постгресе например нет разницы между TEXT И VARCHAR. А если тебе надо Json'ы хранить большой вопрос зачем вообще тогда реляционная база нужна.
3. Библиотека для работы с базой это орм. Их много, простых и сложных. То что ты описываешь это более высокий уровень. Библиотека, которая распарсит входящие данные и на их основе заставит орм создать таблицы.
Плохая новость: такое мало кому надо, твои правила создания таблиц все равно будут слишком специфическими и поэтому скорее всего готовой библиотеки для тебя не существует.
Хорошая новость: скорее всего тебе это тоже не надо.
Короче без пункта 1 нет смысла думать об остальном.
Ох, это безумие
Я 7 лет назад благодаря этому треду, мудрым советам ОПа и треду по вёрстке из/wrk
Нашёл работу, ушёл из ВУЗа и вот я уже 7 лет в индустрии, несколько раз менял стек, множество раз менял работодателей
А PHP треды всё ещен живы и PHP всё ещё лучший язык для бека, что я видел
Каеф
Всем добра.
ОП всё ещё не говорит, как его можно поблагодарить?
>я уже 7 лет в индустрии
>PHP всё ещё лучший язык для бека, что я видел
Бля, че это за индустрия такая? Сайты на вордпресс?
Какие обидки, ебанько? Я просто написал вам чтобы готовили вазелин - ваши проблемы с комментами внезапно удвоились.
>ваши проблемы с комментами внезапно удвоились
Схуя ли? Просто не используй это говно для дебилов. Щас бы в комментах прогать как ебанутый.
Мальчик, когда устроишься на первую в своей жизни работу тебе покажут одну штуку. Называется репозиторий. И там будет дохуя кода, который тебе придется принять как данность и писать так, как надо, а не как тебе хочется. Будет там сваггер? Будешь читать доку сваггера и писать ебучие комменты. Будут там аттрибуты? Будешь писать везде эти ебучие аттрибуты.
На работе так же со всеми общаешься или там ты тихая выебанная жопа в уголке? Или не приходилось ещё работать?
Каковы шансы к лету-осени начать на пхп фармить удаленно, хотя бы 10-20к в месяц?
Живу в городе 20к, уехать не смогу, ухаживаю за больными родителями.
Фриланс мёртвый давно, ещё до твоего вкатывания. Программирование вообще для фриланса не очень подходит, только если аутсорс какой-то на постоянку. Не, разумеется, нищебродские фриланс-биржи полнятся предложениями отведать говнеца за 500-1000-5000 рублей, но это совсем не деньги за те объёмы что они просят.
Думаю куда бы свитчнуться с 1с бекенда.
Посмотрел пыху. Где-то косарь вакансий с опытом от года до трёх, и что-то грустные зарплаты то по 500, то по 800 баксов, то фуллстековые вакансии, то блядь "синьор" с зп 140к (это на целых 10к выше моих мидловских), но по любому где-то есть подвох, колитесь

Это не нам колоться надо начинать, а тебе завязывать.
Ну так не иди к жадным кабанчикам. Этого говна всегда много было. Пускай ждут дальше милорда по цене грузчика в дс.
>Наши уроки по PHP собраны по адресу http://codedokode.github.io/phpbook
Учебник актуален в 2023?

Вот есть у меня хостинг. Там висит аппа. Хостинг vercel.
Есть другой хостинг. У этого хостинга есть бд. Хостинг beget.
Подключиться к бд beget на локалке я могу спокойно. Никаких проблем.
А когда аппа на хостинге vercel пытается подключиться к бд beget, то ошибка.
ER_ACCESS_DENIED_ERROR: Access denied for user 'moralcj1_begetho'@' .compute-1.amazonaws.com' (using password: YES)
Что не так? Могли бы пояснить.
На локалке же все подключается. А у этого ебаного vercel никакая бд не подрубается.

Похоже я у вас тут не первый.
Да, там пусто было, кроме локалхоста ничего.
Но похоже не получится все равно, т.к. у vercel доменное имя/айпишник динамический, хз.

426x240, 0:36
Ну так спроси у хостера. Может там регуляркой можно или маской. Там на сайте номер бесплатный. Позвони не переломишься.
Ну смотря че ты имеешь ввиду. Если консольные проектики запускать - консольной пыхи и хватит. Если пыховское веб-окружение - то xampp по старинке, либо докер. В ларе вообще есть готовый пакет по дефолту который высрет тебе докер компост конфиг под локалку, мне под большую часть задач хватает, чего не хватает можно в этот же конфиг докинуть (брокер очередей например). Развлекайся как душе угодно.
Онли докер. Последние лет пять этот вопрос даже не стоит. Если в конторе, в которую устраиваешься не используют докер что-то там пиздецки не так.
Гайдов как все развернуть щас как говна. Впитывай и легче будет устроиться на работу.
Как проект созданный на опенсервере полностью загрузить на гитхаб? Ну то есть у меня в папке с доменами код, а база данных не добавится получается?
У меня написанный api и html страничка, база данных через phphMyadmin.
Как это все выгрузить на гитхаб чтобы человек это мог у себя нормально запустить?
А какая разница какой язык? Там где ты работал принято базу данных на гитхаб загружать?
1) На гитхаб загружаюстя GIT репозитории. Соответственно нужно начать с создания такого репозитория.
2) Есть несколько способов запихнуть структуру базы данных в репозиторий. В пхп принято использовать миграции. Но можно хранить DDL команды.
3) Данные базы в виде дампа можно хранить как файл на любом сервере, который может хранить фалй. От ftp до того же гитхаба, если объем позволит.
4) Вот это как раз идеальный юз кес для докера - распространение рабочей среды >>604345 . Разворачиваешь докер из трех образов: nginx, php-fpm, mysql. Грузишь в образ php-fpm код, в nginx конфиг сайта, в mysql базу из дампа. Отдаешь готовые образы человеку. Он их у себя запускает и все гарантированно работает как работало у тебя.
Я просто обычно использовал монго, оно-то работает удаленно. Само приложение запустил и все работает.
Думал мб в опенсервере какая-нибудь встроенная утилита есть для переноса или хз как.
Но я понял в общем, щас буду гуглить что ты написал
Спасибо за ответ
В чем разница будет?
$a = null;
if(!isset($a)) {
echo "+";
}
/////////////////////
$a = null;
if(!$a) {
echo "+";
}
>>605775
https://www.php.net/manual/en/types.comparisons.php
Краткая инструкция почему динамическая типизация кал ебаный.
Понятно...
В гугле только ехала теория через теорию, а как именно это реализуется на практике нигде не пишут. Как сделать, например, парочку микросервисов и связать их друг с другом? Пишут, что по ХТТП, но там же задержки будут. В чём смысол если можно просто сервер пожирнее взять?
>В частности что такое "микросервис" как единица? Это мини-сервер со своей мини-базой?
По сути это веб сервер, посвященный одной функции. Со всем что этому сервису может понадобиться: базой очередью, даже фронтендом.
>Пишут, что по ХТТП, но там же задержки будут.
По хттп, задержки есть.
>В чём смысол если можно просто сервер пожирнее взять?
Смысол возникает когда ты - тот у кого берут серваки. Как и всякие DDD это скорее про организацию разработки, чем про организацию кода. Вот когда у тебя 100 разработчиков, 180 сервисов и 50 серверов пожирнее, возникают проблемы, которые решает микросервисная архитектура.
1. Как организовать команды и взаимодействие.
2. Как разбить сервисы.
3. Как равномерно нагрузить сервера.
Ответ микросервисной архитектуры на эти вопросы:
1. Вокруг сервисов. У каждого сервиса своя команда. Взаимодействие через http контракты сервисов.
2. Максимально мелко, вплоть до отдельных функций.
3. Сервисы должны быть максимально гомогенны. Стандартные контракты, стандартный протокол, стандартный размер. Буквально генерятся по шаблону.
Если все эти правила соблюсти снимаются почти все проблемы масштаба. Можно нанимать неограниченное количество разработчиков, у каждого будет своя маленькая команда, каждый будет заниматься своим делом. Можно покупать любой количество серверов, их будет легко интегрировать, нагрузку легко распределять.
Хорошая новость. Тебе это все нахуй не надо. Микросервисы это чрезвычайно дорогая игрушка для больших мальчиков. Сбер, яндекс, вк, авито, мейл, те кто там работает читают книжки, а не вопросы на двачах задают.

>Микросервисы это чрезвычайно дорогая игрушка для больших мальчиков.
Как-то часто это встречаю. Либо у нас сберов как собак нерезаных, либо народ не понимает употребляемой терминологии.
>те кто там работает читают книжки,
Я тоже не дурак почитать и палочкой потыкать иногда.
>а не вопросы на двачах задают
Скорее всего сидят как миленькие.
>>606747
http://phpbook.gq/l1/strings.html задача здесь
Код такой:
<?php
error_reporting(-1);
$word1 = array('Чудесных', 'Суровых', 'Занятных', 'Внезапных');
$word2 = array('слов', 'зим', 'глаз', 'дней', 'лет', 'мир', 'взор');
$word3 = array('прикосновений', 'поползновений', 'судьбы явлений',
'сухие листья', 'морщины смерти', 'долины края', 'замены нету',
'сухая юность', 'навек исчезнув');
$word4 = array('обретаю', 'понимаю', 'начертаю', 'закрываю', 'оставляю',
'вынимаю', 'умираю', 'замерзаю', 'выделяю');
$word5 = array('очертания', 'безысходность', 'начертанья', 'смысл жизни',
'вирус смерти', 'радость мира');
$words = array($word1, $word2, $word3, array("\n"), $word4, $word5);
foreach ($words as $word) {
$finalWord = $word[array_rand($word)];
echo ($finalWord == "\n" ? "$finalWord": "$finalWord ");
1) Постишь код - используй сервис для постинга пхп кода https://3v4l.org
2) Сразу чепуха в именовании. У тебя $word1 это массив со словами, а $words это массив массивов. Из-за этой ошибки получается чушь вида $word = $word[array_rand($word)].
Сразу называй переменные по факту: $words1, $words2, $wordGroups.
3) Зачем ты запихнул array("\n") в массив с группами слов? В итоге сам себя запутал, группа слов, которая на самом деле не группа и вообще здесь по другой причине. Так дела не делаются. Если хочешь что-то сделать - делай это явно. Никакой магии, читать и понимать это потом неудобно.
4) Из путаницы в пункте 3 новая путаница. Никакого $finalWord у тебя нет, из твоего кода вообще получается что все слова final. Просто из-за плохого именования $word уже занято и ты придумываешь костыли чтобы не ставить пробел после переноса строки.
Если все эти заморочки распутать, то получается просто и понятно https://3v4l.org/QoXBU А если в функции завернуть так вообще замечательно. Но функции я так понимаю дальше по курсу идут.
Главный вывод из этой ситуации: пиши проще. Еще проще. Запомни что тебе придется читать код в десять раз чаще чем писать.
Понял, спасибо
Поясните, как вызываются 2 функции в ооп сразу? Какие условия для этого нужны? Вот пример из одной из библиотек:
$lead = $this->amoCRM->leads()->create();
Спрашиваю, потому что если просто вернуть рандомные значения, то будет ошибка, а я хочу понять как работает. Вот типа мой тестовый класс:
class Admin2 {
public function getStatus()
{
return 3;
}
public function getMore()
{
return 2;
}
}
$user1 = new Admin2;
$user1->getStatus()->getMore();
Ошибка:
Uncaught Error: Call to a member function getMore() on int

Метод можно вызвать только у объекта. Если напрячь дедуктивные способности, то можно прийти к тому что вызов ->leads() возвращает объект. Такие вещи видны в IDE как на ладони смотри пикредетед. Взаимодействие с возвращаемыми значениями это путанная тема, там много хуйни можно наворотить, я в свое время вот таким баловался https://3v4l.org/AsP8p
Вообще эта простая строчка $lead = $this->amoCRM->leads()->create(); это просто фрактал говна. Я не знаю как ты связался с amoCRM, просто забудь эту хуйню как страшный сон. Пройди курс в шапке, а если прошел то займись изучением Symfony или Laravel, не трать свое время на никому не нужное говно.
Ну работа такая пока что, куда взяли, туда и взяли как говорится. То что объект возвращается я понял, а как потом вызывается второй метод? Типа от класса возвращаемого объекта ищет?
>а как потом вызывается второй метод? Типа от класса возвращаемого объекта ищет?
В смысле как? Зачем ему что-то искать если явно написано ->leads()->create(); интерпретатор и пытается вызвать у результата функции ->leads() метод ->create(), если это работает, то все ништяк, а если нет, то будет ошибка, как у тебя и вышло Uncaught Error: Call to a member function getMore() on int . Ты вернул число, и попытался вызвать у числа метод ->getMore() . Вот тебе факультативно https://3v4l.org/nR66q разберись что тут происходит.
Если ты хочешь понять как узнать когда пишешь код что можно метод вызвать, то именно для этого и нужна типизация. IDE всегда подсказывает что откуда возвращается и предложит варианты что там можно вызвать.
Мне не очень понятно как вообще может твой вопрос возникнуть, у тебя phpstorm стоит? Если нет, то ставь. Если на работе не оплачивают, то спизди https://github.com/libin9iOak/ja-netfilter-all
>Ну работа такая пока что, куда взяли, туда и взяли как говорится
Ну тогда как можно скорее съебывай или переводись на проект с фреймворком. Если нет возможности сам учи, это твой первый шаг в карьере должен быть, а не amoCRM ебаная. На работе об этом постоянно бурундучи, как ты охуенно изучил, да как оно охуенно впишется.
Есть тут те кто хорошо понимает как работает PHP? Столкнулся с ним имея опыт с другими языками, и мне сложно понять как он работает. Так как php работает нестандартно по сравнению с другими языками, php процесс запускается извне, с помощью отдельного внешнего веб-сервера, после завершения работы процесс умирает, по этим причинам его работа выглядит совершенно запутанно.
Задача следующая. Есть приложение на вордпрессе. Вордпресс работает также как php. Есть swoole, он работает как большинство других языков, процесс запускается интерпретатором, и работает до тех пор пока его не остановят или он не упадет. Можно ли как то запустить оба в одном процессе? Хочется использовать вордпресс, но на платформе swoole. Не просто обрабатывать запросы свулом, а чтобы ядро вордпресса могло выполняться в процессе свула. Или только межпроцессное взаимодействие?
Еще вопрос. Кто нибудь юзал вордпресс на дотнете? Вроде как стабильно работающее решение, но очень мало информации, дока скудная. В общем, ищу как использовать вордпресс, не используя легаси багаж из php.
>Есть тут те кто хорошо понимает как работает PHP? Столкнулся с ним имея опыт с другими языками, и мне сложно понять как он работает. Так как php работает нестандартно по сравнению с другими языками, php процесс запускается извне, с помощью отдельного внешнего веб-сервера, после завершения работы процесс умирает
Все ты понял. Да, нужен веб сервер, да умирает.
>Есть приложение на вордпрессе. Есть swoole.
Так перепиши приложение на свуле.
>Можно ли как то запустить оба в одном процессе? Хочется использовать вордпресс, но на платформе swoole
Нельзя. Нет и не будет.
>Еще вопрос. Кто нибудь юзал вордпресс на дотнете? Вроде как стабильно работающее решение, но очень мало информации, дока скудная.
Нет, мертворожденная хуйня. Никому не нужная.
Тем кто работает с вордпресс нахуй не нужна асинхронность, хуенность и прочая поебень. Wordpress это самое дно, это сайты визитки за 300, даже битрикс повыше плавает.
Symfony -> Laravel -> Yii -> Magento -> Bitrix -> Drupal -> Tilda -> говно -> моча -> Wordpress
>Wordpress это самое дно, это сайты визитки за 300, даже битрикс повыше плавает.
Ну зачем ты это ляпнул? Ты же обосрался по полной.
https://www.wpbeginner.com/showcase/40-most-notable-big-name-brands-that-are-using-wordpress/
>Тем кто работает с вордпресс нахуй не нужна асинхронность, хуенность и прочая поебень.
Видимо ты совершенно не умеешь думать.
>нужен веб сервер
Не обязательно. Печатаешь в консоли php app.php и приложение запускается. Почему бы не отказаться от cgi багажа. Nginx медленный и вообще не дает почти никакого профита. Swoole быстрее и функциональнее.
>Нет, мертворожденная хуйня. Никому не нужная.
Я уже понял, что ты неопытный, узколобый максималист. Ты неспособен к рассуждению и диалогу. Ты даже не знаешь что это и кем используется, а уже кукарекаешь. Также как и с вордпрессом, его используют в очень больших проектах, которые тебе и не снились, и тут ты такой вылазишь и кукарекаешь, что это наколенное поделие никем не используется. Ты обесценил свое мнение.
Если php приложение запускается с помощью php-fpm, то на каждый запрос запускается отдельный процесс или отдельный поток, или все запросы обрабатываются в одном процессе и потоке? А если не через fpm, то как? Если есть где такое подробно расписано, то посоветуйте, почитаю там.

>https://www.wpbeginner.com/showcase/40-most-notable-big-name-brands-that-are-using-wordpress/
И что ты этим пытаешься доказать? При объемах инфраструктуры крупных компаний просто по теории вероятности попытаются на каком-то проекте скроить и все сделать без программистов чисто на менеджерском ресурсе. Да, манагеру легко и удобно кликать кнопочки у устанавливать плагинчики. Но лезть в код этой параши - работа для ассенизатора.
>Видимо ты совершенно не умеешь думать.
Отлично умею думать.
>Не обязательно. Печатаешь в консоли php app.php
Это как бабка, которая при нажатии кнопки шлагбаум руками за веревочку поднимает?
>Nginx медленный
Одна история охуительней другой.
>Я уже понял, что ты неопытный, узколобый максималист. Ты неспособен к рассуждению и диалогу.
Опытный, максимально не узколобый. К рассуждению способен. Какой нахуй диалог, чучело? Ты спросил - тебе ответили. Ты ни о чем не рассуждаешь, не спрашиваешь "а почему так". Просто для тебя "не устраивает ответ" = "неправильно". И кто тут "неопытный, узколобый максималист".
>Ты даже не знаешь что это и кем используется, а уже кукарекаешь.
Сразу же чекнул репу https://github.com/peachpiecompiler/peachpie-wordpress а там пикрелейтед. Никем не используется.
>Также как и с вордпрессом, его используют в очень больших проектах, которые тебе и не снились, и тут ты такой вылазишь и кукарекаешь, что это наколенное поделие никем не используется.
Ты путаешь "в больших компаниях" и "в больших проектах". По твоей же ссылке: "sony" news, "Playstation Blog" blog, "TechCrunch" news, "Meta Newsroom" news, news, press releases, news, news. Такие огромные проекты как ленту новостей или блог пишут как учебные перед устройством на первую работу.
Короче ответ тот же. Переписывай свой незаменимый вордпресс сервис на свул или дотнет, хз на чем ты там пишешь. Ни один программист на планете не сделает этот кусок говнокода асинхронным.
Пустая болтовня ни о чем. Я же тебе написал, что твое мнение меня не интересует. Не комментируй мои посты пожалуйста. Мне нужны ответы опытных, ты не подходишь под эти критерии.
>>611429
Что ты порвался то? Тебе правильно сказали, что ВП та ещё параша. И что нет ничего хуже чем брать какие-то серьезные проекты на этом говне. Видел я что как там эти проекты делают - чуть влево-вправо и все, понеслось костылестроение и полет мысли полоумного хуятора. Разгребать такое врагу не пожелаешь.
Это копия, сохраненная 15 февраля 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.