На PHP работают 80% веб-сайтов и сервисов, в том числе и множество высоконагруженных проектов. PHP широко применяется в финтехе, телекоме, вебе. PHP широко поддерживает все основные базы данных, включая Postgres, Percona/MySQL, ElasticSearch и т.д. Поддерживает управление памятью и прочее байтоёбство.
Плюсы: Куча работы, в том числе на начальном уровне. Минусы: Много хейтеров.
Q&A: Q: Скорость A1: После версии 7 вообще не вопрос. Например, тут https://habr.com/ru/articles/718186/ -- результаты, близкие к C/C++. A2: Все использую Opcache и Memcache для сохранения данных между процессами. A3: PHP действительно быстрый, но жрёт память
Q: Ошибки приведения типов A: declare(strict_types=1)
Q: Асинхронность A: Все без каких-либо проблем используют брокеры сообщений, ветвление процессов или расширения для асинхронности. Подробнее: https://habr.com/ru/articles/451916/
Q: Где можно попробовать A1: для новичков https://onlinephp.io || https://www.google.com/search?q=php+sandbox+online A2: для изучения баз данных, SQL https://www.apachefriends.org/ru/index.html (а для редактирования устанавливаем IDE) A3: для изучения реального применения и DevOps: любая виртуализация (Vagrant+Virtualbox, Windows WSL) A4: для своего проекта в онлайн подойдёт практически любой виртуальный хостинг (я юзаю Sprinthost || для выбора: shared.menu )
Q: Чем редактировать PHP проекты A1: IDE PHPStorm / IntellijIdea -- но они платные A2: Как альтернатива -- Netbeans, Eclipse с плагинами PHP
Q: Актуальный набор навыков для успешного вката в нормальные конторы A: - ООП, SOLID/GRASP, MVC - HTTP/REST (если хотите в веб) - Безопасность на уровне OWASP TOP10 - SQL (Postgres, MySQL) - PHPUnit, TDD - Патерны программирования - PSR - PHP фреймворки, по примерному убыванию зарплат: Symfony > ModX > Laravel > Yii > Slim > Битрикс > Wordpress - ORM (Doctrine) - Git - Брокеры сообщениений (RabbitMQ, Kafka) - Linux, shell - Docker, виртуализация - (для fullstack) Frontend: HTML/CSS/SCSS, Bootstrap, реактивные фреймворки - Английский язык для чтения документации
-- копия шапки про обучение -- Как учить, что читать: Добро пожаловать в клуб востребованных и незаменимых людей. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки, печем печенье и даже делаем простые сайты! Зачем? Кто-то хочет изменить мир, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.
Да, в нашем треде отвечают почти на все вопросы, только бампайте каждые 5 дней. И не разводите флуд, если вам скучно, сходите погуляйте, например. Может вас побьет какой-нибудь хороший человек и вы перестанете флудить в нашем треде.
Это тред для начинающих. Не написал за свою жизнь ни одной программы и имеешь тройку по математике? Ты наш человек.
Остальные треды есть в архиве: https://phpclub.tech/ (там есть поиск, так что можно легко найти обсуждение какой-то задачи или ответы на свой старый пост) или ищутся в гугле по словам "клуб изучающих php" и в архиваче.
Мейлач лежит, модератор зверствует? Есть запасной тред на доброчане: /s/res/23225.xhtml#i46467
Форматируй свой код, если хочешь, чтобы его читали.
Правила: ведем себя воспитанно, помогаем новичкам, читаем учебники, решаем задачки, постим ссылки на решения, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 2-3 дня, у него мало времени, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время. Но в треде немало анонимных экспертов разного уровня, так что вряд ли вопрос останется без ответа.
С чего начать
У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не читайте, не сохраняйте, не запоминайте его, он временный). Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то можно начать с него. Он простой и понятный. Там есть задачи, их нужно решать (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению. С другой стороны, если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Visual Studio Code, Netbeans PHP или PhpStorm (с ним будет удобнее).
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.
Надо переходить к более серьезным задачкам, которые научат тебя всему этому.
Решения задач лучше показать мне, особенно на ООП, так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра. Также можно начинать смотреть фильмы и видео на английском.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
У автора учебника нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.
>>2687895 И так и так, формируй задачу себе по силам, по срокам и по знаниям.
>>2687930 Ничем не устраивает, просто несравнимый функционал. VS Code только для новичков на старте обучения ОК, и то из бесплатных лучше взять NetBeans или Eclipse.
>>2687964 Тут две причины, одну ты можешь не понять: это культура сферы разработки ПО. Вторая, более приземлённая: вредоносные модификации всевозможных кряков.
>>2687463 (OP) Вопрос по порядку исполнения скрипта. Имею ввиду, когда обработчик доходит до функции, то он ждет пока она исполнится, или запускает функцию и сразу дальше по коду идет?
Ждет. Точнее, он заходит в функцию, выполняет ее, а потом возвращается и продолжает выполнение основной программы.
В программе инструкции выполняются сверху вних, строго по очереди (исключение - циклы и ветвления if/switch). Соответственно, интерпретатор не может одновременно выполнять функцию и что-то другое.
>>2688142 Ну почему, можно попробовать юзать NetBeans / Eclipse. Не уверен, что там есть вот прям абсолютно весь функционал PHPStorm, но и то лучше VSCode.
>>2688183 Попроси кого-нибудь из знакомых, ну или в интернете сервис найди.
>>2688408 Программы на РНР по-умолчанию синхронны, асинхронность частично описана в ОП-посте.
>>2688799 >PHPStorm грузится полчаса и лагает даже на мощных машинах Неправда. К тому же ее возможности несопоставимы с VSCode.
У меня на i9 10x5.7 GHz + 64 GB RAM + NVIDIA 3070 не лагает, но это можно считать минимумом для комфортной работы, хотя никакого инпут-лага, зависаний итд, так что если будете собирать компьютер под PhpStorm берите ТОЧНО лучше.
>>2688817 Какие там возможности? Вот сейчас установил и хеллоуворлд работает только в консольный вывод, а делать php -S localhost шторм уже не умеет, выдаёт миллион ошибок. Но мне проще самому команду ввести, которая везде описана, чем разбираться в тупых конфигах шторма, которые они к тому же из версии в версию постоянно меняют, поля перетасовывают. К чему такой геморрой за свои же деньги!?
>>2688862 >Какие там возможности? Автодополнения, рефакторинга, навигации, git, отладка, разбор кода очень хороший, в VSCode конечно не только автодополнение по токенам, но оно такое убогое, что именно так оно и выглядит, как автодополнение из SublimeText, для примера попробуй открыть проект на Laravel или Bitrix, тебе PhpStorm почтив всегда будет давать правильное автодополнение, импортировать нужные классы, из этого же проистекает нормальный рефракторинг и все что я выше описал. Ну и кроме того доп.возможностей миллион, когда постоянно работаешь даже не замечаешь всех удобств, поэтому трудно тебе выдать полной список.
>>2687463 (OP) Подскажите бесплатный публичный CI-сервис, чтобы за один тест можно было тестировать несколько версий PHP. Мне нужно протестировать версии, начиная с 7.2 (я на 95% что всё работает), у старых пакетов, которые я написал, когда актуальной была 7.2 Scrutinizer может только одну версию за раз. Travis был идеальным вариантом, пока не перестал быть бесплатным. $3 единоразово я бы отдал, но $60 за пакеты, которыми сам не пользуюсь, отдавать не хочу. Свой публичный сборочный цех на Гитлабе поднимать не хочу по причинам выше.
>>2690524 >AOP И сразу нахуй. Отличный генератор лапшичной фабрики. Очень приятно после недели дебаггинга узнать что кто-то дохуя умный перехватил твой хуй и он теперь летит в твое очко.
>>2690550 Любой средний проект на пыхе со сроком жизни 3+ лет на проде - это тонны манкипатченной лапши и выполнение тасок с дебагером в зубах как-можно быстрее на отъебись.
>>2690557 Ну во первых не любой. Если следить, проводить код ревью и вовремя хуярить по рукам, то к третьему году оно только начнет подгнивать.
Другое дело если в системе by design поощряется внедрение любого поведения в любое место. С первого дня. Я даже представить не могу как это контролировать, какие могут быть правила когда никаких правил. Просто расслабиться и тонуть в говне.
>>2690557 Как будто в других языках не так. За все не скажу, но крайней мере в больших Java/Spring приложений с кучей Maven-зависимостей, всё со временем стремится развалиться точно так же. Про JavaScript и говорить нечего.
Думаю, это отражение физического закона энтропии.
Но, кстати, давайте обсудим лучшие практики XDebug. Можно на пальцах, чем он лучше print_r?
Вообще, есть ли в приципе на PHP КРОВАВЫЙ ЭНТЕРПРАЙЗ? Всей фреймворки популярные это Rapid App Development, а шоб энтерпрайзы пилить огромные и 300 лет работающие что-то есть?
В принципе кроме symfony не похоже чтобы что-то для этого было. Вроде где-то там был Laminas, но где на него хоть 1 вакансия?
На практике, сейчас работаю над финтех/банковским enterprise приложением, которому ~15 лет, и которое работает в >80 странах... ЗП около 400 (понимаю, что не предел).
Когда собрал ачивки/компетенции из ОП-поста, таких предложений стало поступать довольно много.
>>2691372 >А что думаешь за профайлинг? Есть на примете инструмент, который бы подсвечивал тормозной код? Я не он, но открываешь файл от профайлера и там тормозные функции и так показаны, зачем нужна подсветка в IDE не особо ясно.
>>2691370 Всегда пользуюсь xdebug 1) Точку легче поставить чем писть print_r 2) Брекпоинт можно поставить в процессе выполнения 3) Видно сразу все значения переменных. 4) Можно смотреть значение выражений 5) Самое крутое это условные брекпоинты. Часто в цикле какая-то функция выполняется. Легко сделать брекпоинт, который срабатывает при определенных значениях аргументов 6) Бывает полезно пошагово выполнять код и смотреть что попадает в переменные и что просходит на разных уровнях коллстака
>>2691493 >сейчас работаю над финтех/банковским enterprise приложением, которому ~15 лет >ЗП около 400 (понимаю, что не предел) >таких предложений стало поступать довольно много Перетолстил. 1) 15 лет возраст конечно солидный, но не для пхп. Это сейчас на нем можно писать почти как на джаве. А 15 лет назад пхп заслуженно звался говноязыком, пригодным для создания двухстраничных сайтов на коленке. Никакими "приложениями" тогда даже не воняло.
2) Зп. 400 сумма вполне реальная, так бывает. Но. В россии 300+ это уровень тимлида, техлида, лида разработки, как хочешь назови - человека который не пишет код. Даже если в вакансии это не написано 99% что тебя заставят управлять командой.
Бывают единичные вакансии до 500+. Тут никакой магии нет. Это не щедрый работодатель хочет дать больше денежек, работодатель денежки считать умеет. На таких вакансиях нужно решить какую-то сложную проблему и срочно. Например переписать кеш всей кодовой базы чтобы серваки держали нагрузку, оптимизировать запросы чтобы меньше платить условному амазону за базу. И уж будь уверен все очевидные вещи там давно оптимизированы, а оплата будет крепенько привязана к выполнению этой задачи.
Так что чтобы грамотно напиздеть нужно было написать: сейчас работаю лидом над финтех/банковским enterprise, зп 300, задавайте свои ответы.
На реакте или вью пхпшники не пишут. Либо у вам будет отдельный фронт, либо там надо будет выдать данные в виде таблицы с отчетом, в бутстрапе накаляеаешь
На реакте или вью пхпшники не пишут. Либо у вам будет отдельный фронт, либо там надо будет выдать данные в виде таблицы с отчетом, в бутстрапе накаляеаешь
Что выбрать вкатуну для первой РАБоты: Yii 1.1 с гибридным графиком в продуктовой компании или битрикс на удаленочке в обычной вебстудии? Я сам больше склоняюсь к битриксу, выглядит более "стабильным" в нынешней непростой экономической ситуации - на нем тупо больше вакансий, плюс умудрились пролезть во всякий крупняк, который занимается эскпортом (металлурги, золотодобыча, нефтегаз и т.п.).
Почему тип возвращаемый из функции указывается в паскаль-стиле, а тип параметров функции в си-стиле? Почему фигурные скобочки для классов и функций расставляются как в сишарпе, а конструкции типа циклов в джава-стиле? Почему нельзя было выбрать какой-то один стиль, а не городить гибрид из всего на свете?
Потому, что задача часто включает в себя правки на фронтенде. Например: добавить систему начисления штрафов курьерам. Сделать нужные кнопки и попапы в системе управления.
Чтобы выбрать один стиль изначально, надо сесть и с нуля спроектировать новый язык.
Возьми любой язык с большой историей и увидишь то же самое. Трудно заранее на 10 лет вперед предугадать развитие языка.
Возьми тот же Си++ например, от него плеваться хочется, десятилетия легаси, нет проверки на переполнение в математических операциях, а люди на нем пишут.
>>2692494 >нет проверки на переполнение в математических операциях, Не баг, а фича, так как на этап компиляции решение этой проблемы вынести нельзя, то придется делать кучу проверок в рантайме, что отрицательно скажется на производительности и нарушит один из столпов ЦПП. Уверен, что уже давно есть какая нибудь йоба-функция/опция компилятора, которая это реализует. Это же плюсы, нахой.
>>2692484 > А не студенты за корку хлеба как битрикс. И тех наебали, потом допиливали другие, потом третьи, потом решили переписать всё на D7, но и там как-то не доделали. А вот отдел маркетинга хавает хлебушек с икрой и продает это говно как горячие пирожки
>>2692726 Все. А что ты планируешь "не знать"? Типа если миддл, то запросы оптимизировать не надо или что? Вот дадите лычку сеньора пойду про индексы читать, а пока по дудошу вам сервер.
>>2692737 Тебе и ебли с индексами хватит. Вот тебе пример, который выше обсуждали. MySql. Есть три таблицы: товары, заказы и таблица связей товар_id -> заказ_id. По таблице связей индекс (товар_id, заказ_id). Тебе нужно найти товары в двух заказах 15 и 22. Ты пишешь запрос: SELECT DISITINCT(товар_id) FROM заказ LEFT JOIN товар_to_заказ AS ON заказ.id = товар_to_заказ.заказ_id WHERE заказ.id IN(15,22);
Ищешь всего по двум заказам, а работает медленно, индекс не используется и идет фулл скан таблицы связей. Почему? Как нужно оптимизировать этот запрос после того как решишь проблему с индексом?
>И еще, должен ли мидл уметь в репликацию, шардирование, партицирование, масштабирование горизонтальное? Тебя нормальный админ, даже не dba, к управлению базой никогда не подпустит, будь ты хоть сеньор помидор. Если она ляжет выебут сначала его, потом опять его, а только потом тебя. Даже если виноват ты, с него спросят какого хуя он тебе доступ дал. Так что делать репликацию и шардирование тебе не светит. А вот знать как работать с партицированными таблицами и репликами надо.
> то придется делать кучу проверок в рантайме, что отрицательно скажется на производительности
Неверно. Каждая операция обращения к оперативной памяти требует проверки (например, что не нарушены права доступа к странице памяти, что страница не выгружена в своп) и никто не жалуется. А уж переполнение при сложении проверять на аппаратном уровне гораздо проще, чем доступ к памяти.
Также, Swift делает такие проверки и никто не жалуется. Хотя конечно лучше было бы, если бы процессоры были не такими убогими и делали проверки аппаратно. Почему так не сделано?
Есть тут битриксойды? Как скрыть эти блоки - хедер, левую секцию и желательно футер тоже. Кароче как сделать просто пустую страницу, но сам шаблон остался именно этот?
В режиме правке ничё не нашлось, в файлах пока тока слова из меню получилось убрать...
>>2692191 Мб лучше выбрать смежную компанию (бус + лара/симф/йюи)? Туда легче попасть в плане конкуренции, чем на чистый фреймворк.
Годик отработать и уйти на чистый фреймворк уже, считай с опытом будешь, пусть и не 100% времени, но кого ебет, если ты реально работал с этим фреймворком и реально имеешь знания.
Написал юнит-тесты и нарочно сделал ошибку в тестируемой функции, чтобы проверить. Но ничего не выдаёт ни через консоль, ни через браузер. Как вообще пишут тесты в РНР?
>>2694286 Это пизда. Полный набор: магические числа, однобуквенные названия перменных, ассерты которые хуй поми что ассертят. Функцию еще нужно было назвать d для полной обфускации.
>>2694299 Это функция вычисления дискриминанта квадратного уравнения. А однобуквенные переменные - это коэффициенты квадратного уравнения, прямиком из предметной области.
>>2694306 Во первых. Тебе о том и говорят что надо писать так чтобы понятнее было. Я увидев disc сразу подумал что это какой-то discount. Потому что формула дискриминанта b^2 - 4ac, а у тебя ерунда какая-то написана.
Во вторых. Раз уж пишешь ЮНИТ тесты, почитал бы что в пхп считается юнитом. Объект. У тебя должен быть объект DiscriminantCalculator, который будет принимать объект QuadraticEquation. Вот тогда может идти речь о каком-то юнит тесте.
Всё равно не понимаю, в чём преимущество пхпшторма? Всё тоже самое делается в вс коде, но при этом не надо ничего грузить полчаса, да и выглядит более стильно.
>>2694409 Сто раз говорено было: в VSCode поддержка пхп держится на кривых камунити плагинах, которые нихуя не поддерживаются. VSCode блядь не предназначен нахуй для коммерческой разработки на пхп. Поэтому и "учиться" на нем нет смысла, все равно на работе придется ставить шторм.
>>2694182 Я пробовал смотреть - ну такое, мне не зашло, мало практики. Тот же Лаврик получше будет. Если ты за деньги собрался что-то покупать, то тут могу посоветовать только подписку на Хекслет.
>>2694552 Ну у них есть проекты и на ларе. Правда почему-то сказали, что учат сначала битриксу, что типа потому что он легче, но мне что-то не верится. Скорее всего на таких как я вешают всю лапшу с битрикса, а синьорам уже дают проекты на ларе.
Но я если честно не могу больше терпеть. Хочу побыстрее работать начать, пусть даже за 15-20к, но зато вайти. Я бы мог подзадротить полгода еще и стать ларавелистом, но это еще не факт что я бы потом работу нашел за месяц. Вполне возможно ушло бы еще полгода на поиск работы, итого ушел бы год допустим, а тут почти 100% я уже через 2 месяца буду работать.
Я просто заебался жить с родителями, я хочу свою микрохату, чтоб в тишине и туда-сюда. А там уже как стану битриксойдом мб перекачусь мб нет похуй уже.
>>2694190 >>2694552 Кстати решение нашел. Надо создать файл с таким же путем как в ядре bitrix/templates/furniture_red/header.php в папке local/. Всё что в папке local, оно переписывает всё что в bitrix/
Так мы можем изменять компоненты, хедеры, футеры, всё что угодно.
>>2694702 Все правильно делаешь, я потратил полгода на ларку устроился на первую работу к ипешнику и был уволен через 3 дня, типа недостаточно знаю. Искать вторую работу на ларе хз сколько займет по времени, поэтому сейчас откликаюсь на стажировки по битриксу... Жалею, что сразу не пошел в битрикс, сейчас бы уже полгода опыта было.
В PHP обычно тесты пишут не чистым кодом, а на фреймворках вроде phpunit. Но для твоей функции хватит и ассертов.
И еще, ты выбрал не очень удачную функцию и способ тестирования. Ведь ты проверяешь функцию таким же методом (считаешь ожидаемый результат по той же формуле).
Лучше проверять решение другим методом - например, подстановкой решения в уравнение.
В x86 нет автоматического выброса исключений при переполнении. То есть корректная программа требует больше инструкций, чем некорректная, игнорирующая ошибки при вычислениях. Глупо же сделано.
>>2695258 В теории CS да. А на практике в современном пхп приложении "просто функции" взяться неоткуда. У тебя автозагрузщик работает по PSR-4, а по PSR-4 один файл = один класс. Да и по всем бест пракстис у тебя приложение - объект, который создается в index.php и все что внутри тоже объекты.
Тебе даже просто переменные $a, $b, $c негде получить кроме как из другого объекта. Если ты их из базы получил, то орм объекты возвращает, а если их пользователь ввел, то у тебя по PSR-7 RequestInterface.
Самое смешное что сам тест тоже объект и подчиняется тем же самым правилам и стандартам PSR.
>>2695249 Не надо жалеть о прошлом, ты хотел лучшей жизни как и все мы. Главное, что ты что-то делал и в итоге придешь к работе. На битриксе очень часто бывают стажировки.
Например, YLab набирают каждые полгода, там конкурс обычно под конец 10 человек всего. Еще mcart (эм си арт), тоже где-то раз в полгода, тоже конкурс 10-15 человек. И есть еще и еще.
Битрикс может и кал, но норм компании, например опять же юлаб и эмсиарт, они всё пишут по современным методикам юзая ооп композер и тд. Плюс бывают смежные проекты битра + лара.
Единственное, что их курсы очень тяжело читаются, но инфа годняк. Еще советую вступить в тг группу, в поиске прям напиши "битрикс", там их всего 2. Отвечают там быстро, если что непонятно. На глупые или легко гуглящиеся вопросы поливают говном обычно.
>>2695524 >Должность как раз тимлид. Харош. Малаца. Пиздишь как надо.
Теперь нужно научиться говорить по тимлидски. 1) Тимлид не говорит "Я делаю" или "Я работаю". Тимлид всегда говорит "мы работаем". Это что-то типа компенсации за то что сам он код уже не пишет. Он сидит на этих бесконечных ебаных совещаниях и сильно переживает что не может заняться "делом".
2) Тимлид хорошо относится только к проекту который сам стартанул. Про легаси тимлид говорит "мы сейчас переписываем это говно на 7.4".
Теперь можно продожить фразу: Сейчас работаю лидом над финтех/банковским enterprise, зп 300. Переписываем это говно на актуальную версию, задавайте свои ответы.
Нет, я имел в виду команду сложения с проверкой на переполнение. INTO это отдельная команда, которую надо дописывать руками и у нее какие-то проблемы есть в современных версиях процессоров.
>>2695635 >А если скажут То будешь пилить Какие видел магазины на пыхе, везде было разделение на товары и торговые предложения со своим набором характеристик. Впрочем меня заставляли EAV пилить, когда я был почти стажером.
>>2695640 А как 1с выгрузка выглядить? Я как-то открыл эксель - там все на русском и строк дохуя и хуй пойми как это все парсить. Вариативный товар так выглядит - денормализовано? И так же храняться в бд, в одной строке? Кроссовки nike air max, белые, 45 размер 5500руб Кроссовки nike air max, белые, 43 размер 5500руб Кроссовки nike air max, красные, 36 размер 5500руб
Или так, нормализовано и все по таблицам? Как вообще всю эту хуйню парсить и разносить?
И еще, как поддерживать синхронизацию и целостность данных, чтобы состояние товаров(в наличии, или нет, сколько купили и тд) из 1С отражалось на сайте. Это репликацию пилить или что. Не проще блядь одну БД иметь а не так и так?
И почему характеристики товаров в поле JSON в MySQL не хранят?
У меня предъява к вашему гайду из шапки. Автор(ы) написали что программисты говорят о "присваивании", но ведь в данном случае речь об "инициализации". Значение ведь мы не меняем, а задаём. Это конечно мелочь и в целом все говорят как попало, но всё таки в гайде имхо всё должно быть максимально точно, чтобы не порождать лишнюю путаницу у людей читающих это.
>>2695978 Инициализация это в жс например "let arr;", в пхп это знак $, Т.е. $arr это уже инициализация, а $arr = [1, 2, 3]; это уже и инициализация и присваивание.
Ну я вкатун конечно могу быть не прав но так я считаю.
>>2695942 >И еще, как поддерживать синхронизацию и целостность данных, чтобы состояние товаров(в наличии, или нет, сколько купили и тд) из 1С отражалось на сайте. Это репликацию пилить или что. Не проще блядь одну БД иметь а не так и так? например через крон синхронизировать из бд 1с в бд твоего приложения/сервиса
Но в целом тебе не похуй ли? Ты же веб-макакер але. У меня на собесе спрашивали про функции для работы с массивами и строками лол. Мне кажется тут вот реально бессмысленно душнить.
>>2697011 Так то не для меня. Я-то сразу выкупил что это чушь. Это на потом. Через пару тредов опять ворвешься и расскажешь про банковский продукт на пхп. Только теперь сделаешь поправочку на дату когда в пхп ооп добавили. И все поверят, и зааплодируют. И пхп станет наконец ЕНТЕРПРАЙЗ.
Какие примеры? Примеры когда сложный энтрпрайс левел софт писался бы на PHP?
Ну skyeng. Ну slack мессенджер.
Тут скорее нужны примеры че такого может Java а PHP не может.
Типизация? Завезли максимально удобную. ООП-ха? Ну есть Удобный менеджер зависимостей? Ну есть Производительность? Не такая как у java, но норм. Да и язык не будет ботлнечить.
Чего тебе бля не хватает в пыхе для финтех-залупы какой-нибуь, лэл
Я считаю, неправильно здесь значения делать константами.
Константа - это то, что не меняется. Процент по кредиту или начальный платеж это однозначно не константа, так как банки постоянно их меняют (пусть даже эти изменения касаются только новых пользователей).
Платежи и прочее здесь не константы, а параметры. Которые пользователь может менять, чтобы, например, узнать сумму выплаты в другом банке.
Мне кажется, ты делаешь ошибку, думая, что в коде вообще не должно быть цифр или строк, а все их надо заменить на константы. Не надо.
Чел, тут смысл не в том "меняется ли оно по логике", а меняется ли оно по коду. Понятно что это тестовый пример, и в реале ты бы эти данные брал либо из запроса, либо из базы, либо еще откуда-то.
Просто типа хорошо делать привычку "ставить константу пока не запруфано обратное", потому что так ты легко видишь в каких частях кода состояние, а в каких просто константа
В учебнике выбрано выражение "сохранить в переменную", которое, как мне кажется, более понятно.
Мне кажется, если мы начнем разделять это на "инициализацию" и "присваивание", то мы все усложним для изучающих. В PHP переменные создаются автоматически, их не требуется объявлять или инициализировать.
Кроме того, как я понимаю, инициализацией называют задание начального значения переменной при объявлении. Но в PHP нет объявления переменных. Поэтому, наверно, термин "инициализация", взятый из низкоуровневых языков, здесь не применим.
Я думаю, там заложена идея, что проверки должны делаться при тестировании, а в продакшене не нужны. Но как по мне, лучше вариант, когда проверки делаются всегда, чтобы кривой код сразу выявлялся, а не много месяцев спустя, когда окажется, что в БД и всех отчетах за последние 3 месяца неправильные данные.
Вообще, не соглашусь, Java конечно мощнее PHP, и в плане библиотек, и в плане возможностей языка. Он используется и в Google, и в Yandex. Но писать на Java медленнее, чем на PHP. А это значит, что разработка сайта обойдется бизнесу дороже.
>>2697819 Slack давно сбежал с пхп на язык со статической типизацией и дженериками. Ну skyeng. Что skyeng? Кто это блядь вообще? Это система управления аэропортом? Или учет финансов? Очередной сайтик, без нагрузки, без ответственности. Для пхп идеально.
>Типизация? Завезли максимально удобную. Бля, не позорься. Вот какой должна быть нормальная типизация https://en.wikipedia.org/wiki/Algebraic_data_type Просто блядь посмотри на пикрелейтед и прикинь что люди уже много лет пишут вот так, а тебе и дальше сидеть в говне.
>ООП-ха? Ну есть Пчел. Ридонли поля добавили когда? Год назад? А теперь даю инфу: половина ооп кода на пхп это геттеры. А может и больше половины нахуй. Дженерики введут аккурат к технологической сингулярности.
>Удобный менеджер зависимостей? Ну есть Уася. "Удобный" это мягко сказано. Имадженирую твое ебало когда ты попытаешься свой приватный пакет доставить адресату.
>Производительность? Не такая как у java, но норм. Да и язык не будет ботлнечить. Именно поэтому все что требует производительности пишется сейчас на го, а в каждой пхп вакансии написано что желательно знать го. Не пишешь на пхп и не ботлнечит.
>Чего тебе бля не хватает в пыхе для финтех-залупы какой-нибуь, лэл Инфраструктуры и сервисов, которые десятилетиями писались на той же жабе. Ты вот знаешь насколько симфони безопасен? А знаешь контору, которая проведет аудит и поручится за его безопасность? На жабе с этим проблем нет, есть компании, есть инструменты для аудита. Вот тебе и финтех, бабка.
>>2697862 > знаешь насколько симфони безопасен? А знаешь контору, которая проведет аудит и поручится за его безопасность? На жабе с этим проблем нет, есть компании, есть инструменты для аудита
Шапка актуальная? Хочу себе сайт запилить на пыхе для личных нужд. Сам являюсь жс-макакой. Как у вас дела с типизацией? Как я помню пхп такая же динамическая дрисня как жс, но у нас есть тс, а у вас как дела с этим обстоят? Еще присматриваюсь к пхп как к области где смогу подучить ооп, это релевантный язык для таких целей?
В пхп не завезли какой-то синтаксический сахар из ФП. Никогда не понимал этот дроч на сахар, мне во
> Уася. "Удобный" это мягко сказано. Имадженирую твое ебало когда ты попытаешься свой приватный пакет доставить адресату.
Мне composer нравится больше чем те с которыми я пробовал работать, npm, pip, maven
> Пчел. Ридонли поля добавили когда? Год назад? А теперь даю инфу: половина ооп кода на пхп это геттеры. А может и больше половины нахуй. Дженерики введут аккурат к технологической сингулярности.
Как же некоторые люди любят все усложнять. Сначала сделаем тип, потом хотим джерерик. Mixed передай, интерфейс, или один из двух тайпов.
> Именно поэтому все что требует производительности пишется сейчас на го, а в каждой пхп вакансии написано что желательно знать го. Не пишешь на пхп и не ботлнечит.
А как в go с дженериками, эксепшонами, и adt? А ООП там как вообще поживает?
Пиздец дрочь на фичи и вкусовщину. Прочему в каком-нибудь go работать с json-ом и маршалить и размаршивалить его это такая ебучая блять боль? Почему там if err != nil?
Че нельзя сделать удобно как array в php, изи конвертишь в json и из него, ваще каеф.
Да и в java JSONObject это какой-то ад. Просто можно скопировать из PHP?
> Ты вот знаешь насколько симфони безопасен?
Не жаловались
> На жабе с этим проблем нет, есть компании, есть инструменты для аудита.
Безопасность зависит от языка программирования. У меня все
Блядь, как же Зандстра тяжело идет, пиздец просто. Вот паттерн Декоратор и казалось бы что тут сложного, но этот уебан начинает рассказывать предысторию, пре клетки в игре цивилизации и как она модифицируеться, короче тема паттерна где-то в облаках, а твой мозг загружаеться абстракциями той игры ебаной а не паттерном и вот когда к паттерну все подходит, мозг тупо перегружен, оперативка забита. Пиздец и написан еще как-то по уебански
>>2698116 А нахуй в 2к23 читать КНИГИ? Еще может бумажную купил, лол? Все уже давно есть на сайтах, ютубе и тиктоке, с интерактивностью и плейграундами.
>>2698236 >через phpdoc Чел, а у тебя в коде private используется? Так ты замени все private на public и в phpdoc указывай что это на самом деле private. Что тут может пойти не так, ты же в КОММЕНТАХ написал.
>>2698174 На на РНР скорость выполнения программ ниже. Разработчикам приходится писать миллион встроенных функций, чтобы компенсировать медленное выполнение программ на РНР.
Есть, а хуле такого? Инструмент и инструмент. Но я с ней не работаю напрямую, там ж для этого код уже написан. Я интеграцией внешних платежек занимаюсь, тема довольно однообразная и тупо ебка json'а по документации.
> Разработчикам приходится писать миллион встроенных функций, чтобы компенсировать медленное выполнение программ на РНР.
Нужны ваши советы, 5 лет страдал хернёй в гос.конторе, поддерживал код на php 5 и jquery. Фреймворки не щупал, mvc тоже. Подскажите как сейчас выстроить правильный путь, вроде не совсем новичок, а вроде по текущим меркам нихрена не знаю
Аноны, знакомый попросил ему написать интернет-магазин для своего бизнеса. Я понимаю, что интернет магазины интернет магазину рознь, но все же, сколько с него брать?
>Есть, а хуле такого? Инструмент и инструмент. Видишь, я же говорил что нету у тебя кафки. Такие глупые вопросы задаешь. Инструмент ебать. У тебя нет задач под этот инструмент. Ты еще напизди что у тебя хадуп.
>>2698294 >Про кафку напиздел. Нет у тебя кафки. Есть и кафка и кроллик, но у кафки проблема в либах поддерживающих её и почти полном отсутствии информации в случае, если что-то пошло не по плану.
>>2698739 >Есть и кафка и кроллик, но у кафки проблема Да, в природе есть кафка. И у кафки дохуя проблем. А чтобы получить пользу нужно хотя бы миллион сообщений в секунду. Которые ты на пхп хуй отправишь и получишь, потому что пхп клиенты кафки нихуя не держат коннект и не поддерживают фичи актуальной версиии. И у тебя каждый ack будет 300мс отрабатывать.
Но самая главная проблема что у тебя никакой кафки нет, и нахуя ты пиздишь непонятно.
>>2699774 А я сидел в одной комнате с президентом. Вывод из этого какой? Я с ним знаком? Нет. Я могу как-то этим фактом воспользоваться? Нет. Ну и нахуй ты это высрал?
Почему битриксоиды такие консервативные? КАКИЕ НАХУЙ 720p в 2020+ году АЛЛО? Есть редкие видосы где 1080p, но блять серьезно, что им мешает сделать фуллхд, а не этот обрезок? Я же так ослепну!!!
Только зумер с канала "Я кодер" сделал фуллхлд. Все скуфы делают почему-то 720p.
>>2700147 Ебать, чуть не блеванул с кода на пиках. Любому хуесосу, который будет пиздеть что битрикс это нормально, нужно тыкать этими скриншотами в ебало и хуярить по почкам.
>>2700147 Прежде всего это не битриксоиды, а скуфы. Вопрос зачем ты смотришь это обучение по легаси? Ты реально хочешь писать вот этот код? Лучше смотри по D7 хотя бы что то, у нас например React на фронте, а битрикс на бекенде.
>>2700156 Битрикс это не просто нормально, это вообще очень круто, древний код, если написан без хаков, нормально работает на новых версиях, и скуфы в 2к21 без переучивания могут продолжать через FileZilla писать свои компонентики.
>>2700188 А какого хуя пикрелейтед в шаблоне делает? Это приколы от скуфа или он просто делает как в битриксе принято?
На пхп без хаков писать нельзя. https://bugs.php.net/bug.php?id=62004 Вот охуенный баг, который не позволяет перейти на вторую строку в файле. Пофикшено только в восьмой версии. Везде где нужно прочитать вторую строку файла используется хак. Че там в древнем говнокоде битрикса кроется одному аллаху известно.
>>2700349 Когда в вакансии пишут ООП, то хотят чтобы пикрелейтеда в коде не было. Это не читаемая поебень. Никаких денег не хватит чтобы на ежедневной основе нырять в этот кал. А самое главное это нахуй не надо, вокруг полно нормальных компаний с нормальными проектами. Даже интересные бывают.
Блядь, ваще не могу въехать в регулярки. Хоть убей. Эта ебучая проверка как будто ваще абсолютно рандомно происходит. Я просто смотрю на то, что написал и не могу понять как она из этого где-то засчитывает, а где-то не засчитывает. Просто, блядь, прочитываю раз за разом свой шаблон и НЕ ВИЖУ как ебучий if там находит единицу (задача с номерами)
>>2700534 Простейший код, разобраться можно сразу же после изучения циклов и if, пишешь не напрягая себя всякими абстракциями, скорости работы не требуют.
>>2700529 Не вижу на скрине чего то ужасного, как ты вообще живешь если на все так реагируешь?
>>2700748 Только ещё больше запутывает. Вставляю туда свой шаблон, он ваще матчей не видит (я про заготовку из урока, где уже введены строки номера). В коде - матчи видит (даже больше чем надо). Обратные слеши нигде не использовал, если что.
>>2700755 >>2700748 А нет, то проблема с флагами, которые слетают если скопировать что-то в поле. Окей, флаги проставил. Теперь по 3 матча на одну строчку. Это как вообще.
В общем, как и сказал, этот сайт запутывает ещё сильнее, ибо помимо регулярных выражений нужно ещё разбираться как работает конкретно этот сайт. Мне бы пока разобраться просто с кодом.
Добрый день. Подскажите по двум вопросам на пиках (1, 2) соответсвенно: 1й - почему дублируется вывод одной и той же переменной при дебаге. 2й - почему phpstan показывает ошибку "Parameter #3 $subject of function preg_replace expects array|string, string|null given.", я понимаю, что функция preg_replace может вернуть null в случае ошибки, но даже если не будет совпадения с регуляркой в переменной $result будет присвоено значение из $matches.
>>2700757 Я всегда проверяю регулярки на regex101, без этого сайта сложнее разобраться, а осваивать его там нечего.
>>2700775 Ну хуй знает. Я вот проставил в своей регулярке ^ и $. Это значит что регулярка должна всей строке соответствовать, так? Этот сайт мне в одной строчке номера находит в итоге по 2 матча. Каким образом он это умудряется делать?
>>2700808 Да мне и самому сложно. Я уже сотый раз переписываю и если честно, то в голове каша шо пиздец. Притом, что я уже второй день пытаюсь осилить эту задачу. https://regex101.com/r/TOB6z5/1
>>2700750 >Простейший код, разобраться можно сразу же после изучения циклов и if Так ты разобрался? Что проверяет этот код?
>Не вижу на скрине чего то ужасного, как ты вообще живешь если на все так реагируешь? Живу НОРМАЛЬНО. Хожу по тротуару а не посреди шоссе, ем ртом, а не жопой. Невероятно скучная жизнь.
Тебе сука в каждой книге от википедии до сраного букваря написали: представление не обрабатывает введённые данные пользователя. НЕ ОБРАБАТЫВАЕТ СУКА. Не шлет запросы в базу, нихуя не вычисляет. Шаблон берет данные и выводит их на экран.
Потому что цель всех этих паттернов и MVC отделить поведение. Чтобы было это поведение в одном месте. Чтобы работать с ним было проще.
>>2700812 Совпадение регулярного выражения должно быть для всей строки, а у тебя частичные совпадения. Вертикальная черта (ИЛИ) здесь работает так - найти совпадение слева от начала шаблона до нее или справа от нее до конца шаблона. Также у тебя допускаются пробелы, а если их будет не 1, а больше (т.е. должен быть квантификатор *)?
Сначала раздели задачу:
найти +7 ИЛИ 8 - это одна группа (то что в круглых скобочках). Также между +7 могут быть пробелы (от 0 до много), перед 8 тоже самое;
- после 1й группы перед цифрой - могут быть пробелы, скобки, тире делаешь символьную группу[] потом цифра, потом снова эта символьная группа и все повторяешь десять раз.
Регулярка сложновата для начала, я на ней также подвисал. Есть курс по регуляркам на торрентах от webformyself (можно посмотреть на 1.5 скорости), есть книги Бен Форта (простая быстро осваивается) и Джефри Фридла (сложная для новичка).
В моем 1й вопросе (там где 2 скрина) есть эта регулярка, как вариант, так как можно делать по разному.
>>2700898 >или от начала шаблон и до конца А как тогда вообще мне ставить это ИЛИ? В том-же +7 или 8. Получается он либо найдёт просто +7 без ничего, либо полные номера с 8...? >не один А зачем ставить больше одного пробела?
>>2700828 >Так ты разобрался? Что проверяет этот код? Ну когда я был начинающим битриксоидом, то и сам такое писал, мозг не умер, поэтому ничего сложного не вижу и сейчас.
>Тебе сука в каждой книге от википедии до сраного букваря написали: представление не обрабатывает введённые данные пользователя. Да, поэтому этот шаблон это НЕ представление, все просто. А раз не представление значит и не занимается чем то одним.
MVC это не какой то идеал к которому все должны стремиться.
А самое грустное в том, что я не чувствую что все эти часы я потратил на понимание чего-то. То есть я буквально сделал эту регулярку теми-же знаниями, которые у меня были много часов назад. Но тогда я почему-то упёрся, а сейчас сделал без проблем. Хуй знает почему у меня не получалось, в общем.
>>2700997 Ты сракой не виляй. Что проверяет этот код?
>MVC это не какой то идеал к которому все должны стремиться. Дожили блядь. Какой нахуй солид, какие нахуй стратегии. Дегенераты не в состоянии MVC освоить.
>>2701004 Убери лишние экранирующие бекслеши и внеси в один символьный класс скобки (), и используй квантор {}, чтобы не повторять одно и тоже 10 раз. []\d[]{}
>>2701012 Если бы MVC и прочая чушь на которую ты молишься была бы так полезна, то программисты используя все это обошли бы битриксоидов в несколько раз, и разрабатывать новые проекты на нем стало бы просто невыгодно. Но этого не происходит, как думаешь, почему?
И вообще, вот слова создателя PHP: У нас есть такие вещи, как приватные свойства. У нас есть абстрактные методы. У нас есть все эти вещи, которые ваш учитель информатики сказал вам использовать. Меня вообще не волнует эта хрень.
>>2701264 База. Согласен на сто процентов. Пхп каловый язык для диких макак, которые право от лево не отличают. Мвц шмвц, правила какие-то. Правила для долбоебов. А абстракции для кончелыг. Мы - битриксоиды на работе катаемся ебалом по клавиатуре, а вечером сморим серики про ментов под сиську пива. Мы веб элита, нам он и нахуй не нужон мвц ваш.
>>2701324 Именно так, пока дауны дрочат свои паттерны, мы просто вкатываемся на изичах, через три года получаем сертификаты и зп в 200к, спокойно делаем работу, в 17:00 закрываем крышку ноутбука и живем, пока цивилизованные макаки отличающие лево и право, и дрочат свои фреймворки в свободное казалось бы время.
>>2700529 Во-первых, этот чел не скуф, ему где-то 25-35 лет. Во-вторых, он сделал это, потому что не знал, как приписать класс к форме, хотя это можно реализовать иначе, но тоже будет по качеству около этого кода. Так что да, битра в редких случаях диктует свой код так сказать. С другой стороны можно и не подключать хедер форму от модуля битрикса, а оставить свою.
>>2701335 Хз, мне нравится, открыл файл через FileZilla, поредактировал и все. Ты то небось постоянно свои фабрики абстраные дрочишь, я бы поспорил где хуже. Код, повторяюсь, примитивный, в любом компоненты битрикса примерно такой же.
>>2701341 Разве я должен что то разъяснять такому хуесосу как ты? Нет конечно. Получи хотя бы базовые сертификаты 1С, потом может я обращу на тебя внимание. Есть ощущение что ты шиз который работает только корзиночкой у мамы.
>>2701336 >Во-вторых, он сделал это, потому что не знал, как приписать класс к форме Нихуя подобного. Он это сделал потому что ему тег формы какого-то хуя в $arResult пришел. И моя претензия была не в том что он его поменял, а в том ГДЕ он это сделал.
>Так что да, битра в редких случаях диктует свой код так сказать. Это "битра" ему надиктовала вместо нормального объекта с человеческими названиями свойств и комментариями высирать в шаблон уебищный массив $arResult? Это "битра" ему надиктовала вместо $form->printErrors() высирать эти ебанутые условия?
>>2701361 Чел, ты агрессивное хуйло это раз, во вторых у меня все сертификаты при себе, в третьих что я тебе должен сказать про этот код помимо того что он меняет поля массива от CIblockProperty? Мне че полностью его видео смотреть разбираться? Ты по 2 строкам из Spring весь контекст понимаешь?
>>2701364 >Мне че полностью его видео смотреть разбираться? В этом и разница между читабельным кодом и нечитабельной хуйней, еблан ты сертифицированный.
>>2701393 Не пойму ты что доказать-то хочешь? Всё работает, ну и что костыли, они и в твоём сраном спринге имеются, и в современном голенге будут. Это работа, расслабься, просто делай её как тебе велят боссы и всё. Ты как сумасшедший дотер рассуждаешь и кричишь всюду, что дота говно, но сам играешь и каждый день хочешь еще.
>>2701519 >Всё работает, ну и что костыли Ты, мудила гороховый, со всему своими сертификатами нихуя не понял что там в коде происходит. И никто бы никогда не понял, если бы этот говнокодер на форуме не спросил.
Я блядь думаю, какого хуя меня на собесах спрашивают: вы срете прямо где сидите или в туалет ходите? А ссыте снимая штаны? Я блядь гадаю кого они такими вопросами отсеять хотят вообще? А вот кого. Вот таких дегенератов, которые срут где спят, а ссут за батарею.
Одно радует, в годный проект таким хуесосам вход заказан. А сертификаты битрикса ничего кроме смеха у нормальных людей не вызывают.
что по вашему простые сайты? Я вот написал свой сайт с нуля (PHP,Bootstrap,Mysql,JS) радиокаталога с базой данных, интересно какой это уровень Middle или Junior?
>>2701393 То есть ты по двум строкам из Spring и Symfony точно скажешь что и для чего они делают? Нет конечно. Видно что ты завистливый дурачек которые изучает свои паттерны и никуда устроиться не можешь, получил бы сертификат, может взяли бы тебя джуном, возможно даже к нам в компанию, поучил бы тебя как код писать. А то тебя даже примитив пугает. По ссылке не ходил.
>>2701934 В пхп оно пришло транзитом через перл из шелла. В обоих вообще строго должна быть строчка только с этим идентификатором, чтобы оно было валидным. Видимо, автор перестраховывается, имев или имея дело с ними ещё и там. В пыхе менее строго.
Задачи про граммаНаци
пилори17/05/23 Срд 18:31:58№2702293288
Делал под конец дня и мозги уже изрядно кипели, есть чувство что нахуевертил говно-кода даже для себя. Или всё таки пойдёт? Или переделать? Вроде работает https://ideone.com/rnDA2e - вывод ошибки https://ideone.com/4VLZ34 - исправление и вывод двух версий текста
Не всматривайтесь в текст большой строки, он потраченный
>>2702616 Никаких. Что ты вообще услышать-то хочешь? Различия можешь в интернете почитать. Будет первое время непривычно. Если ты макакер, то может быть сложно будет.
>>2702619 >Что ты вообще услышать-то хочешь? Какие подводные при свиче с одного фреймворка на другой, не будут ли на собесах кривить лицо из-за опыта исключительно с другой технологией?
Не могу решить задачу про очепяточников. А именно не могу понять, как мне определять какое слово русское, а какое английское. Пикрил - то что я уже сделал, а именно научился находить слово с опечаткой и кидать его в массив. Первое что приходит на ум - подсчитать количество русских и английских букв, каких букв больше, значит те буквы мы и не трогаем, а другие меняем. Но что если будет слово, например: Of Букв одинаково. Русская о, в английском слове. Как я должен в программе понимать что это именно о нужно заменить, а не f. Вариант про то, что буква f не имеет аналогов в кириллице - тоже не годится, ибо придумать слово где обе буквы двузначные, аля какое-нибудь or, где r похожа на г - не так уж и сложно.
Помогите пожалуйста, я не понимаю. Условия задачи на пик2. Подсказка помогает с самой простой частью (поиска слов с опечаткой), но совсем не помогает в самой главной проблеме.
>>2703451 Единственное предположение, что автор подразумевает, что понимать из какого языка слово - должны мы сами, и ручками получившиеся в массиве слова менять под условия задачи. Но тогда красивого и универсального решения не получится и работать такой код будет только под один набранный текст, а автор хочет, чтобы я лез на какие-то гос.закупки и там "применял" программу. Но как? Программу ведь переписывать для этого надо.
Стойкое ощущение, что я упускаю какой-то момент, но не могу понять какой.
>>2703562 >значит с какой буквы начинается слово, таковым оно и является Я же уже привёл пример с: Оf По твоему это русское слово? Первая буква же русская. Ну или возьмём слово Cock Где заменили две с на кириллицу. Тоже русским слово стало?
В том то и дело, что программа во многих случаях не сможет определить точно какая буква является заменённой, пока программа не определит точно язык этого слова. Я вот нагуглил пару программ от анонов, они все фейлятся на слове cock, выделяя букву о.
>>2703695 В задаче нет условия, что слова должны существовать, зато есть условие выделить первую букву другого алфавита в []. Тебе сразу надо научится делать именно то, что сказано, а не так, как лучше.
>>2703853 >в задаче нет условия, что слова должны существовать Не совсем понял, что ты подразумеваешь под этим. Как эти слова не должны существовать? А это тогда что: "...дан текст, содержащий слова на русском и английском языках..." Ну вот дан текст, в котором СУЩЕСТВУЮТ СЛОВА, они содержатся в нём, это слова на конкретных языках... >зато есть условие выделить первую букву другого алфавита в []. Я повторяюсь в 10й раз. Как программа должна узнавать КАКОЙ АЛФАВИТ В СЛОВЕ "ДРУГОЙ", а какой СВОЙ? Я должен сам программе это "сообщать" и для каждого отдельного слова писать отдельную регулярку? Лол, так а зачем мне тогда вообще регулярки, я просто вот так сделаю: echo "Слова с опечатками..." А потом перепишу сам с клавиатуры эти слова по нормальному и допечатаю для слов эти скобки квадратные: echo "Слова без опечатки..." Вариант в 2 строчки куда лучше массивной ебли с регулярками.
Если я туплю, что я вполне допускаю, то просто скинь мне вариант рабочей программы, да и всё. Я посмотрю как надо было сделать и пойду дальше по урокам.
>>2704486 Вот у них написано 10 месяц с нуля. То есть у них есть какое-то предполагаемое время освоения материала. Почему в часах нельзя написать? Все по разному занимаются, у кого-то после работы один час есть, а кто-то может по 12 часов каждый день ебашить. Мне не понравилось как у них обставлено всё на сайте, как-то всё скрытно как будто меня хотят наебать
>>2704694 Можешь и быстрее пройти, есть люди которые за 5-6 месяцев управлялись, у меня где-то год ушел >>2704733 >как-то всё скрытно как будто меня хотят наебать Зайди на ту же хтмлакадемию или яндекс практикум - там нет возможности учиться по подписке, сразу анальные кредиты на 200к, здесь такая возможность есть. То что у них дизайн ебловатый - это да, раньше в лендосах были на демонстрационные проекты, сейчас их убрали зачем-то
>>2704857 >где-то год ушёл И сколько ты занимался в среднем? С какой регулярностью?
Хуй знает, пачаны. В моём представлении все эти курсы - это как взять серьёзный учебник и расписать его с весёлыми картиночками и разбавляющими водными текстами, дабы не перегружать клиентуру количеством информации на лист а4. Ну и когда речь идёт про курсы на большую специальность, то авторы ещё связывают несколько таких учебников сразу в 1 программу, дабы ты не искал ничего дополнительно. Но так ли долго всё это искать? Гуглишь родмапу на интересующую профессию и просто изучаешь всё что там написано по учебникам и видео. Сильно хуже будет результат что-ли? Ну да, не сможешь написать наставнику с проблемой, чтобы получить ответ "гугли". Будешь иногда затупливать и тратить время на поиск. Однако мне кажется, что когда человек хочет стать "программистом" - он хочет научиться нормально деньги зарабатывать. А тут с тебя требуют мало того, что время на обучение (которое не бесплатно само по себе), так ещё и дополнительно 50-100-200 тысяч. Оправданы ли такие траты? В моём представлении они могут быть оправданы, если ты уже миллионер (баксовый), либо 300к наносек, но нах тебе тогда эти курсы.
Может у меня сформировалось неправильное представление из-за влияния медиа?
>>2704890 >И сколько ты занимался в среднем? С какой регулярностью? Каждый день, я даже время за компом трекал у меня получилось в среднем 2 часа. > все эти курсы - это как взять серьёзный учебник и расписать Для меня хорошие курсы это не учебник, а задачник. Хекслет так и построен - несколько сотен задач несколько проектиков, к которым дается необходимый, но структурированный минимум инфы и ссылку на доп. инфу если она тебе нужна. Сколько я не искал, ничего подобного по пхп кроме хекслета не нашел, зато нашел кучу всяких уебанов типа гоши дударя, хауди хо и марлин дева.
Это значения аргумента функции. Их назначение понятно из названия этого аргумента. Если ты используешь платную IDE, то у тебя в месте вызова будет подсказка вроде
calculateCredit(rate: 1.02, ...)
В такой ситуации я не вижу смысла делать это константой. Или ты в коде
Также, ты дал ссылку на Википедию про ADT [1], и там в разделе "Языки, в которых есть ADT", указан C++ и Python. Ты серьезно? Тогда и PHP включайте в список, у нас тоже энумы есть.
И еще. Ты пытаешься тут принизить PHP, пишешь, что там ООП плохой, менеджер пакетов плохой, а объясни тогда, почему пишут на Си, в котором вообще ничего нет, в котором руками надо зависимости скачивать и поп папочкам раскладывать? А он популярен тем не менее. Вконтакте, например, на нем микросервисы писал для хайлоада.
Вот смотри, ты пишешь "на нем (Го) программы пишут быстрее". Так это и плюс PHP, на нем программы пишутся быстрее, чем на Си или Го. Ты бы попробовал логично рассуждать, а не плеваться, и все бы понял. Время разработки это деньги, чем быстрее пишется код, тем меньше денег уходит из кармана владельца бизнеса.
Говорят, одна из сложнейших проблем в программировании - это придумывать названия. У тебя с названиями переменных пока все на уровне начинающего.
$palindromeCheck - неудачное название, так как эта переменная не содержит в себе "проверку на палиндром". Назови это просто $input (входные данные).
$palindromeCheckArray - не надо к массивам приписывать слово array. Назови это просто $letters (буквы).
$leftCheck - лучше просто $leftPos.
Решение верное. Но есть и другой способ: раз уж у тебя есть массив букв, то можно было бы использовать тут array_reverse для его переворота и сравнения с исходным массивом через === (массивы можно сравнивать, смотри мануал: https://www.php.net/manual/ru/language.operators.array.php ).
Зато скорость разработки и комфорт выше, чем на убогом Го. В Го нет кучи важных вещей, нет симфони, доктрины, и тд, почти ничего нету, это как Си, только со странностями (когда регистр букв управляет видимостью переменной) и сборщиком мусора.
Мне вообще Питон нравится, но в нем нет нормальной типизации и он медленнее PHP.
>>2705149 Спасиб анон. Я над названиями не думаю прям совсем, пишу просто первый образ пришедший в голову, так что особо вчитываться в смысол не нужно. Просто стараюсь не оставлять названия в духе $a или $b, а писать хуйню подлиннее. Это всё-таки не какой-то серьёзный проект, а просто проходные задачки
Не отказывайся от regex101. Там ты можешь написать регулярку, и много строк, и она будет применяться к каждой строке (то есть пишешь каждый номер на новой строке) и ты в реальном времени видишь, что она находит.
Только не пиши сразу сложную регуярку. Начни с простого (например, распознавать только начало номера, или только номера без пробелов) и постепенно усложняй.
Ну и вроде в регулярках совсем немного конструкций, давай я их перечислю:
- точка - любой символ, кроме \n - квадратные скобки - искать один из нескольких символов - звездочка, плюс, вопрос, фигурные скобки - задают число повторений - круглые скобки - группируют символы вместе - вертикальная черта - искать один из вариантов
Тебе нужно понять каждую конструкцию по отдельности, опять же, ты можешь использовать regex101, чтобы увидеть, как они работают.
Если ты никак не можешь понять, в чем ошибка, запости регулярку или ссылку на regex101.
Видимо, phpstan не понимает, что тут preg_replace не может вернуть null (null возвращается, если ты сделал ошибку в регулярке или строка для замены содержит некорретнные коды utf-8 символов).
используй скобки для ограничения зоны действия вертикальной черты:
...(\+7|8)....
> А зачем ставить больше одного пробела?
Пользователь может трясущимися руками ввести 2 пробела вместо одного и с виду номер выглядит для человека нормально. А регулярка его не примет. Это плохо.
> Если бы MVC и прочая чушь на которую ты молишься была бы так полезна
Она полезна с ростом проекта. Если у тебя сайт из 4 PHP файлов по 100 строк каждый, то может быть тебе и не нужны фреймворки, ООП и MVC. Без них может получиться проще.
Но ведь не у всех такие маленькие проекты.
> Но этого не происходит, как думаешь, почему?
Ты забываешь про специфику бизнеса. Она может быть в том, что они берут коробочное решение, чуть-чуть в нем исправляют, отдают заказчику и не поддерживают его далее. В таком случае, дейсвительно, какое им дело до понятности кода, если им не надо его потом поддерживать? Это уже не их проблема.
Я такое же наблюдаю в верстке. Когда заказываешь верстку на стороне, она часто абсолютно ужасная в коде и нечитаемая. Потому что верстальщик сделал, чтобы она отображалась как нужно во всех браузерах, а что код ужасный, использует reset, использует 5 уровней вложенности в SCSS, бессистемные названия классов, его не волнует. Не ему же в нем потом разбираться.
Но я не думаю, что тут какой-то хитрый расчет. Просто Битрикс реально старый и его писали не самые лучшие разработчики, вот они и сделали все на хуках и массивах.
Старый автозагрузчик мог быть только один, так как в PHP нельзя сделать 2 функции __ autoload(). Это значит, что если ты подключал 2 фреймворка и 20 библиотек, и каждая из них хотела свой автозагрузчик, то это было невозможно сделать.
Поэтому от этого отказались и сделали подход, когда каждая библиотека может добавить свой автозагрузчик, и они вызываются по цепочке, пока кто-то не найдет нужный класс.
Хотя при использовании composer мы в итоге имеем ровно 1 автозагрузчик.
И у тебя что-то между пагинацией и таблицей отступов нет. Почему? И у таблицы в заголовке одной ячейки не хватает, наверно ты в нее & nbsp забыл поставить? И надо писать "название радио", а не "имя".
Соответственно когда ты пишешь регулярку внутри строки, ты должен 2 раза писать каждый бекслеш:
$regex = "/\\./" - искать точку $regex = "/\\\\/" - искать 1 бекслеш
Но у строк есть особенность: если ты пишешь бекслеш + какой-то символ, которые не образуют комбинацию, то PHP оставляет их как есть. Ну например, нет комбинации бекслеш + точка, поэтому если т напишешь \. то в строку эти 2 символа вставятся как есть. И получается, что регулярку \. можно написать 2 способами:
"/\\./" - совсем правильно "/\./" - тоже допустимо
Поэтому комбинации вроде \. \+ \[ \( можно писать с одним бекслешем. А вот чтобы искать бекслеш, придется писать 4 штуки. И чтобы искать долллар, придется писать \\$, так как \$ просто вставляет символ доллара:
echo "\\$" - выведет \$ echo "\$" - выведет $
Надеюсь, понятно объяснил.
Кстати, в строках в одиночных кавычках магических комбинаций меньше и там можно почти всегда писать 1 бекслеш (кроме случаев когда ты ищешь сам бекслеш - тут их надо 4 штуки).
Если у тебя сложности, то просто сделай echo "регулярка" и увидишь как твои бекслеши интерпреируются.
Смотри, какая вещь. Концепутально неважно, русское слово или английское, важно, есть ли в нем опечатки или нет.
Поэтому ты можешь выбрать любой алгоритм определения:
- по первой букве - по тому, каких букв в слове больше - по наличию букв, у которых нет аналогичных (например: щ или q) - по наличию сочетаний букв, которых нет в языке - поиском по словарю - свой вариант (прояви смекалку)
Кстати, мне нравятся такие неоднозначности. В реальных задачах такие проблемы у тебя будут возникать постоянно, так что привыкай сразу.
> Букв одинаково. Русская о, в английском слове. Как я должен в программе понимать что это именно о нужно заменить, а не f.
Можно сделать один язык приоритетнее другого и в случае равенства выбирать его.
Зделайте отдельный тред по Битриксу. И гайд запилите пожалуйста. Инфу приходится по крупицам собирать, иногда даже задавать вопрос в тг чате битрикса и оттуда узнавать инфу. Кароче жду треда по битриксу, по-другому не буду вкатываться. Тьвёрдо и чётко - как любят двачеры.
>>2705096 >Год на пыху? Серьёзно? Это ток на хекслете, я еще до него ковырялся. Считаю, что это еще неплохой результат, куча народу учится в универах по 4 года, а потом в техподдержку. А тебе за какое время надо?
>>2705202 >А по сколько часов ты занимался? >Каждый день, я даже время за компом трекал у меня получилось в среднем 2 часа. В редкие дни выходило 4 часа. Но два часа это прям чистое время над чтением-думанием-гуглежом без поссать/покурить/подрочить, больше учебы в меня тупо не влазило. Так это время можно смело на 2 умножать.
>>2705141 ещё раз, что такое - 1.02, 1.03, 1.04? Ответ -то процент в банках, и в банке процент может сменится. По хорошему, такая инфа бы с апи банка приходила, но в таком микропримере все равно было бы неплохо вынести константы в словарь, чтоб отличать в каком банке какой процент. А по поводу $count+=1, в зависимости от контекста в котором это применяется. Если при каком-то условии в коде к $count прибавлялась бы не только единица, то скорее всего да.
>>2705179 Можешь посоветовать в каком порядке приблизительно лучше изучать хекслетовские курсы чтобы более менее органично они шли как по уровню понимания так и по уровню сложности?
>>2705156 >>2705158 >>2705159 >>2705160 >>2705168 Вау, анон, спасибо за такие подробные ответы. >Не отказывайся от regex101. Да, я уже въехал. Он и правда удобен, особенно когда надо со скобками работать всякими. И в регулярках +- разобрался, теперь бы запомнить все функции которые в уроках перечислены... Особенно в повторении. >>2705171 Всё равно в итоге будет криво+косо, тут по хорошему, наверное, надо подключать какие-то библиотеки которые заточены на определение языка слова. Потому что самому это реализовать = целый проект абу точно делает капчу из слов. Сомневаюсь что задача автором задумывалась настолько объемной.
>>2705299 Профессию по пхп можно по подписке проходить, без наставника. Оплачиваешь подписку на любой трек/курс, потом переключаешься на саму профессию.
>>2705522 Неплох PHP Intelephense для vscode, с купленным (или спиженным) ключем. С ключем навигация по коду есть и переименование массовое Главное после установки не забыть @builtin php выключить B настройках прописать "files.associations": {"*.module": "php"}
>>2705511 Ну вроде нашел, искал с февраля, щас на испытательном вторую неделю в битрикс-галерке. За время поисков успел поработать на ип кабанчик, который меня уволил через 3 дня за то, что не умею работать с очередями и не знаю про сервисный слой 🤡
>>2705537 А что не работает? Оно даже с ларкой работает? где магия на магии. Половина кода на статических фасадах, где методы декларированы только в phpdoc.
>Тогда и PHP включайте в список, у нас тоже энумы есть. А у меня хуй огромный. Ну как хуй, залупа уже огромная, а хуй пока нет. Давай запишем меня в список людей с огромным хуем?
>объясни тогда, почему пишут на Си, в котором вообще ничего нет Так все, ушла эпоха. В ядре линукса и винды уже пишут на расте. А в расте все есть. Замечательный язык.
>>2687463 (OP) Сделал задание про айфон в кредит, результат вроде верный выдает, но когда я глянул пример кода, то выглядел он совсем по другому. Так вот, я вообще правильно задание сделал или нет ?
>>2705935 он только покрас синтаксиса поддерживает + автодополнение встроеных в пхп функций и суперглобалс + снипеты Чего нет 1) Корректное автодополнение методов 2) Переход к определениям (в том числе к трейтам), имплементациям 3) Переименование классов неймспейсов сразу со всеми зависимостями и директориями 2 и 3 вообще мастхев
>>2705531 > уволил через 3 дня за то, что не умею работать с очередями и не знаю про сервисный слой 🤡 О, ты наверняка шаришь. Вот ты прошёл курсы, замечаешь ли что тебе не хватает знаний и что какую-то важную информацию там опустили?
>>2706273 >Можно ссылочку? Это скрин из профессии по пхп. Подписываешься, например, на этот трек https://ru.hexlet.io/programs/php-oop , потом открываешь профессию https://ru.hexlet.io/programs/php и вступаешь в нее. Там тот же роадмап будет в личном кабинете. >>2706278 Ну собственно работа с докером, очередями, редисом, работа с апи - как получение данных из чужого апи, так и дизайн своего. Еще рекомендую навернуть годную книгу "Архитектура сложных веб приложений" Аделя Файзрахманова, там как раз есть про сервисный и доменный слой еще и с примерами на ларе.
Числа прописью
пилори21/05/23 Вск 18:52:03№2707008375
Фуф, сделаль (вроде) эту программку. Получилось, конечно, мега-грязно, как мне кажется. Хотя если глянуть на то, сколько у опа ушло строк, то не слишком длиннее (особенно если учесть, как компактно оп вставил массив).
Я когда глянул на требования программы мне аж поплохело, но по факту справился быстрее чем с палиндромом.
Сделать шаблон комплексного компонента news. На главной подключить news.list, на детальной news.detail (Дополнительно) Сделать разбивку по разделам
Кто-то шарит, что значит "разбивка по разделам"? Стоит ли задавать такой вопрос наставнику по стажировке? Или это супертупой вопрос, который можно нагуглить?
Просто как я понял раздел это тупо папка, там делаем страницу и тд. Или это надо юзать компонент section - это имеется в виду?
Я так понял должно быть в базе значение на то какой раздел, и если выбрал "такой" то только такой. А как показывать, на одной все, или разные запросы - думаю за тобой выбор
>>2707374 Я помню, как мне дал подобное ТЗ челик, знакомый только по совместных пьянкам, я был в то время йоба-кодер на асме z80 и i8080, ЛОУРЕАТ каких-то местечковых премий по паскалю, который я не знал. Мне бросили в ебало книжку по дотнету 1.1, передовому в то время инструменту. Я выучил и делал что-то. Контора была съемной квартирой в центре, где мы тусили. Дальше мне лень описывать. Один из тех квартирных челиков добился успеха, получил какие-то лычки от мс, выступал на конвентах, потом в всякие менеджеры, сейчас тем же занимается в омерике. Что стало с остальными это интересно, тот ололо-кабаныч был из золотой молодёжи, скоре всего замутил что-то новое, или сьебал куда-то в Сен-Тропе.
>>2707393 >>2707396 Не, пацаны, это битрикс, если вы не поняли, тут всё по-другому. Я видел один сайт на битриксе, там были разделы: личный кабинет пользователя, страница регистрации/авторизации, главная страница и тд. Т.е. как-то так.
Но в моем задании есть только одна страница есть, для которой будет использоваться компонент news.detail, а какие еще разделы я чет вообще не пойму.
Если невозможно узнать маску подсети, которую выставил провайдер, чтобы задать диапазон адресов, тогда как моча может банить этот пул адресов?
Вот например я вайпаю тред, перезагружая роутер, моча банит подсеть. Как конкретно она по моим айпишникам узнает к какой подсети они относятся и банит её?
Хорошо, что работает, но над кодом надо поработать. Код переусложнен и содержит копипасту.
У тебя в функции spellSmallNumber все тело обернуто в огромный if:
если (условие) { ...тысячи строчек... }
Не надо так. Надо перевернуть условие, чтобы получилось:
если (не выполняется условие) { показать ошибку; }
...тысячи строчек...
Так мы избавляемся от гигантского if и упрощаем функцию. Кстати, если в функцию передают некорректное значение, то принято выкидывать исключение, но если ты их еще не изучил, то можно просто вывести ошибку через echo (но потом изучи исключения и забудь про echo).
> if($int/100 >= 1) { Это можно упростить до $int >= 100
> $int % 100 Это выражение повторяется там раз 15. Нужно вынести его в переменную.
Наконец, функция spellSmallNumber чрезмерно улсожнена. Там много сложных вычислений, хотя ее логика несложная:
- если в числе есть сотни, добавляем слово для них - если $int % 100 больше 0, но меньше 21, то добавляем слово для десятков-единиц - иначе, если $int % 100 > 0, добавляем слово для десятков и, если они есть, то для единиц
Я вижу тут ровно 3 if (+ 1-2 if для учета женского рода). У тебя же порядка 10 if и else. Твой алгоритм переусложнен, в нем есть повторы, его тяжело читать и нужно упростить.
> $result = $word.' '.$word1; Вместо этого удобнее добавлять слова в массив, а в конце функции склеить его через implode().
В функции getWordForm условие тоже переусложнено. Там всего-то нужно проверить:
- если число оканчивается на 11-19, возвращаем 3-ю форму (рублей) - если оканчивается на 1, то 1-ю форму (рубль) - если на 2-4, то "рубля" - иначе, "рублей"
В функции spellNumber много копипасты. Например, есть 3 места, где выисляется число единиц. Нужно убрать повторяющийся код и сделать функцию проще и короче.
Здесь первое выражение ($credit) ничего не делает - оно просто читает значение переменной $credit и отбрасывает результат. Ты можешь либо перенести создание переменной $credit в for:
for ($credit = 40000; ...
Либо же ничего не писать в первом выражении, а оставить лишь точку с запятой:
for ( ; ...
Ты также можешь заменить if на функцию min() или max(), попробуй это сделать.
> $str = preg_replace('/^[а-яё]/u', $firstLetterUpper, $str); тут не нужен preg_replace, тут можно просто отрезать все после 1-й буквы с помощью mb_substr.
> $textSentences = []; Эта строка не нужна. Также, переменную лучше назвать просто $sentences.
> $textSentences[$keySentence] = makeLowerCase Здесь можно использовать $textSentences[] = ... для краткости.
Эти цифры каждая встречаются ровно один раз. Их назначение понятно из названия функции и аргумента функции, в которую они передаются. Константы здесь вводить не требуется.
Лучше учись с самого начала придумывать хорошие названия, погугли, как это делать, если не понимаешь. А то не привыкнешь, будешь потом тестовое задание делать и это станет минусом.
Почему в сберхуйне на php мидла просят техническую вышку в требованиях, а на другие бэк языки (или вообще в каком-нибудь фронтенде) ее не требуют, они ебанутые совсем?
Что-то тут многовато регулярок. Например, первые 2 регулярки проверяют одну и ту же ситуацию: что перед знаком препинания есть пробел. Но для этого ведь достаточно одной регулярки:
пробел, за ним знак препинания
3-я и 4-я регулярки тоже сложноваты, их можно упростить до:
знак, за ним буква знак, за ним больше 2 пробелов
Возможно, ты написал столько регулярок, чтобы обрабатывать сложные ситуации, когда у нас 2 ошибки в одном месте, вроде:
буква ,буква
Тут есть лишний пробел до знака и нет пробела после. Но такие ситуации проще обрабатывать, просто применяя регулярки к строке по очереди, а не одновременно.
То есть, тут лучше сделать регулярки попроще, пусть даже мы не сможем из-за этого применить их все за один раз. Читабельность и понятность кода важнее.
>>2708946 На каком фреймворке пишешь? Если симфони, то говори всем, что джавист. Если ларавель - дотнетчик. А если на каком-то другом, то гофер, там у них всё равно миллион всяких библиотек и фреймворков, единого стандарта нет.
Если честно, ни на каком. У меня конкретно разработка в 3ех разных пакетах, которые другие разрабы ставят через composer install. У нас есть компненты симфони, но не целый фрймворк. Лично я из симфони только конфиг, кэш, валидатор и наверное все
>>2709022 Ты хотил сказать на пыхе дрюкают сайты статейники, заходя на прод по ssh, и правя код через midnight comander, и перезапуская кэш через WP Rocket?
>>2708945 У меня в играх куча созданных персонажей разных классов и ни за одного до конца не прошёл. Так и с программированием - учу уже 4 или 5 язык, но до сих пор ни куда не устроился.
>>2709383 Ну это именно для шиндовиков такой костыль по образу и подобию тех олдскульных коммандеров. В линупсе оно в целом редко применяется, максимум какой-то рейнджер. У меня стандартно тмукс, хотя раньше тоже баловался мс.
А зачем бороться, Java хороший язык (только многословный), можешь ее тоже выучить. Сможешь приложения под Андроид писать, например. Не знаю, правда, как там с вакансиями.
Да и вообще, полезно расширять кругозор и изучать новые языки.
Двухпанельность для копирование и перенесение папочек из одного места в другое.
Я без этого вообще не могу пользоваться файловым менеджером. Сижу на маке, у меня marta стоит. Просто выделил с шифтом нужные файлы или папки и F5 нажал.
У меня батя MC пользуется по привычки, для его кейса лучше на VSC плагин поставить, и прям так файлы править на проде. Но он слишком батя шоб шото менять.
>>2709555 > Сможешь приложения под Андроид писать, например.
И как там в 2016ом? Котлитн уже давно. Да и похуй, разработка под андроид и веб не похожи между собой, то что ты можешь веб писать не значит что у тебя мобили получится делать
>>2709558 С автокомплитом вменяемым это делается быстрее, чем дрочить папочки руками. Разница в том, что в никсах единая точка монтирования, в шиндах каждое устройство это отдельная точка монтирования.
>>2709567 Чел, я сам на десктопе шиндовик и пользуюсь фаром и при необходимости гоняю его по sftp вместо scp для трансфера файлов. Но при сеансе ssh мне нахуй не нужен двухпанельный коммандер, там другие традиции, mc это именно костыль.
>>2709580 Не знаю, с чего можно было сделать такой вывод. Меняюю конфиги и прочие хуитки через ссх в тмуксе и виме. Стеки ахуенные, загибай пальцы. Делаю шелл, авк, перл, пхп, питон. Раньше делал руби, пока он не сдох. Планирую катиться ещё в ноду.
>>2709593 Алсо, единственная моя официальная работа была на шарпе. Сейчас на нём нихуя не делаю, но если оче надо, то что-то бы нахуевертил, но у меня знания примерно версии 2 дотнета, так что это сомнительная хуйня.
>>2709611 Чтобы решать задачки вроде вот тут у меня такая проблемка за сто баксов за пять минут, что по почасовому рейту много больше моего уровня, и не ходить на работу. В целом, направление моей работы это что-то вроде пентеста, но не безопасность, а автоматизация процессов, в том числе серо-черная и продажа СОЛЮШЕНОВ, опробованных такой работой.
>>2708811 Это да, но ментора можно найти в чатиках, многие даже бесплатно помочь готовы - а вот годных задачников по пхп кот наплакал. Там кончно есть подписка с персональным ментором, но стоит в районе 20к/месяц.
>>2708944 "Лучшее враг хорошего". Пыху в полне можешь рассматривать как подмножество джэвы. Современный пхп это язык-франкенштейн, который очень много позаимствовал от джавы. А вообще обучение кодингу можно рассматривать как инвестицию, а хорошая инвестция контр-интуитивна. Пока миллионы джэва-джунов бьются о стену из отказов эйчарок, ты относительно спокойно сможешь пролезть на РАБотку.
>>2709727 Поинтересовался бы для начала есть ли у пхп аналог JPA. Спецификации хуефикации. Создатели пхп вот такие челики >>2701264 с вот такими мыслями. Нет тут нихуя и не будет.
Ты глуп, потому что ты не знаешь, что есть Доктрина, и в ней есть магические методы вроде findByLastname. Они так же малополезны как и JPA. Но хотя бы XML писать не требуется, и то хорошо.
В Доктрине есть магические методы вроде findByLastname. Если нужно больше, то есть findBy, в который можно передать условия и сортировки. Хотя на практике они редко бывают полезны в силу ограниченных возможностей. Обычно нужно писать запрос.
>>2710146 Всем вкатунцам на заметку, дефицит программистов такой что вас будут обучать за деньги, лучшее что вы можете найти это 1C-Bitrix, самый продвинутый фреймворк+CMS для успешных людей, потом сможете еще и Bitrix24 подтянуть, и/или 1С.
И если можете все повторить по нему, и более менее понимаете что вы делаете повторяя действия, то смело идите отзываться на вакансии, и вкат вам обеспечен. Курс конечно не пройти без знаний PHP и HTML, но вы можете их изучать пока его проходите, то есть смотрите урок, что то непонятно изучаете, поняли, продвинулись по курсу Bitrix дальше, и так до конца.
>>2710441 За деньги кабан кабаныча разумеется, не большие, в регионах могут и 20к платить за такое, но это лучше чем за бесплатно обучаться дома без возможности спросить что то у людей, реальных задач, разнообразных проектов, еще кабан кабаныч может и курсы предоставить какие то. Есть дефицит, или его нет не важно, хотя мне кажется что есть, главное есть данная ситуация, и это очень лакомно.
>>2687463 (OP) На Битрикс нужно написать простой пример "обработчик платежной системы". Я глянул здесь https://g-rain-design.ru/blog/posts/payment-handlers-bitrix-d7/ Но я так и не понял, за что отвечают функции initiatePay getPaymentIdFromRequest getIndicativeFields isMyResponseExtended processRequest Для чего они нужны? >initiatePay >Это самая главная функция в обработчике, в ней можно, например, добавить к параметрам обработчика Что за параметры? Для чего они нужны?
>>2710706 initiatePay вроде нужны для дополнения к полям, которые есть в админке. Вот для чего нужна функция getIndicativeFields() И что с ней сделать?
>>2710354 Поясни, кстати, за сорта битрикса. Я так понимаю 1с-битрикс это CMS, где сайты можно мышкой накликивать и одновременно фреймворк, а битрикс24 это уже готовая CRM из компонентов этого фреймворка? Т.е. она сильно больше самого 1с-битрикс?
>>2710354 >И если можете все повторить по нему, и более менее понимаете А как ты поймёшь этот курс? У Битрикса, мягко говоря ужасная дока, даже знаний php и mySql недостаточно, чтобы понимать все это. Инфы мало, если не за кем повторить, то этот курс почти бесполезен. Там видео курсы есть https://dev.1c-bitrix.ru/learning/dev.php Но этого вообще недостаиочно. На youtube в основном про натяжку сайта на Битрикс, а не разработку
>>2711042 Я не хотел тебя демотивировать, может тот анон прав, и сейчас вакансий на Битрикс много, но ля, дока у них просто ужас. Очень нужно, чтобы было за кем повторить. Вот есть статьи от мр. Капучино https://mrcappuccino.ru/blog про битрикс Но этого тоже не достаточно. Вот реально интересно, как можно самостоятельно вкатиться в Битрикс если не считать натяжку
>>2711045 >Я не хотел тебя демотивировать Да нормально всё, я в техподдержке год отмотал это пиздец, губа с глазом перестали дёргаться только спустя 3-4 месяца после увольнения. Какой-то кривой докой меня не напугать
>>2711039 Да вроде все ок, что там ужасного не пойму? Полностью тему не раскрывают, но если что то непонятно то можно еще один курс найти на их сайте конкретно по инфоблокам итд.
>>2711045 У него по D7 полезная информация, но имхо это начинающему не особо и надо, классы какие то, гитлист к аспро компоненту дописал и нормально. Это можно получить с офф.сайта. Более глубокие знания можно уже получить на работе, работая с проектами, советуясь с коллегами.
>>2710248 > А по сколько уроков в день ты проходил? По-разному, если курс простой то мог за день 4-5 пройти, если сложный то над одним уроком мог по нескольку дней сидеть. Если долго не мог решить задачу, смотрел решение учителя, у меня практически в каждом курсе по 1-2-3 подсмотренных задачи.
>>2710146 Два года, первый год проебал на рытье в инфоциганской помойке в поиске курсов, второй год уже нормально учился, при чем половина второго года ушла на ларавель
>>2711570 Нет, потому что не все знания от 1С-Битрикс применимы к Битрикс24, и наоборот. Скорее всего будешь вызывать API из своих скриптов, и именно дорабатывать Битрикс24 тебя не заставят, только писать внешние программы.
Задачи будут в стиле у клиента день рождение, значит создать задачу о поздравлении, по сути вызвать метод на получение клиентов с датой рождения сегоднешнего дня, и если они есть посоздавать задач.
>>2687566 Нуачо. Вполне себе действенный метод для микросервиса. Я бы ещё посоветовал бы накатить workerman и запустить http worker и там все прописать.
>>2711617 пожалуйста накидай годных курсов/сайтов. Мне нужны денюжки на кушать я запасы проедаю уже. А в техподдержку больше не хочу, я бухать начал от того что там работал
>>2712312 Мне надо было вывести новости по разделам инфоблока. То есть на старнице должны быть переключатели как у яндекса, а по клику на название раздела выводились бы новости из этого раздела. Я нашел несколько вариантов, но все силы потратил еще вначале на то чтоб сделать через чистый js, в итоге чистый жс мне пишет что нет функции addEventListener, как я понял это не работает в битриксе и надо юзать их библиотеку, чтоб заработало, но я не осилил.
Потом пробовал через menu.section, через каталог секшон, но чето ниче не получилось. Надо наверное завтра снова пробовать, может мозг обновится и придут какие-то мысли хз.
>>2712319 addEventListener это функция из браузера, битрикс с ней ничего не делает.
Тебе нужно просто взять компонент новостей, задать ему url для разделов, типо /news/sport/ это раздел а /news/sport/moya-krutaya-statya это ссылка на новость, сделать файл ext-menu где просто будешь брать секции и вставлять их как будто у тебя есть разделы настоящие https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=3254
По сути нужно лишь передвинуть один компонент, изменить настройки в нем и меню, и написать строк 10 кода.
>>2712319 Задача очень просто делается, спроси у них на форуме как это делается если не понял что я написал, со знанием того как и что делается это можно за 10 минут сделать лениво.
>>2712385 >>2712383 А это страница будет обновляться или без обновления будет происходить смена разделов? Мне надо чтоб прям на странице чел мог кликнуть по интересующему его разделу новостей и увидеть оттуда новости.
>>2712391 Будет переход на другую страницу. Тебе по заданию нужно сделать без перехода, если нет я бы отказался от этой идеи. Но если по заданию, то сделай сначала с переходом по url, и уже потом навешивай на меню событие onclick, и загружай по ajax новый контент в компонент новости.
>>2712408 >Тебе по заданию нужно сделать без перехода Это дополнительное задание, но я думаю нет смысла не делать это. Чем больше я узнаю и сделаю, тем проще мне будет на работе. А если я не смогу это сделать, значит надо набраться знаний еще.
Спасибо. На канале "Я - кодер" чел сделал через catalog.section.list, но у него там вёрстка своя, думаю вот еще попробую скопирну его верстку и сделаю как он.
Вообще конечно нужен бы какой-нибудь суперкурс 2023 по битриксу от синьора битриксоида, чтоб прям много-много всего рассмотрел, чтоб еще видео было в 1080p, чтоб всё по делу и чётко. И еще бесплатный - на ютубе.
>>2712508 Щяс битрикс это проходной билет. Почти в любой норм компании, которая разрабатывает на битрикс, есть так же задачи по 3 основным фрейворкам. А еще на битрикс они пишут чисто ооп, никакого старого ядра.
>>2712124 >>2711489 Короче разобрался с HTML и CSS немножко. Курочка по зёрнышку клюёт ебатб. Когда открыл урок по ПХП и на пороге появился ХТМЛ я тут же жидко насрал в штаны и подумал ну его нахуй.
А ща намана разобрался ебатб. Ниче служнава в этих ваших ХТМЛ И КСС ебатб
Тыкаться надо тыкаться самому постоянно ебатб. Уроки смотришь нихуя не понятно
>>2712571 Вопрос к знатокам: Правильно ли я понимаю что про ХТМЛ и КСС можно по сути забыть щас. Ну я вкурил как оно работает в общем плане. Как КСС файл устроен, .классы там ебатб и т.д.
Короче вот мой план - месяцок курю ПХП синтаксис, делаю какие нибудь калькуляторы на нём, потом сажусь учить ларавель и битрикс.
>>2712880 отличный план вкатывался также только без битрикса ||правда на первом проекте приходилось на блейде и vanilla.js бахать но потом пересадили чисто на бек||
Не хочешь наши простые задачки на CSS порешать? Они правда довольно старые, но зато относительно простые и для решения одной задачки не надо много изучать, так что ты быстро почуствуешь уверенность в себе: https://github.com/codedokode/pasta/blob/master/html/html.md
Ты можешь перенести HTML/CSS на потом, если сейчас нет времени, но все равно скорее всего их придется изучать. Ну как ты придешь в фирму, тебя попросят меню перекрасить, а ты скажешь, я этого не умею? Ну тогда на этом испытательный срок и закончится.
Все смешано в кучу и идет сплошной стеной кода: и работы с базой данных, и проверка данных, и работа с сессией, и вывод HTML кода. Тебе пока что надо остановиться и научиться разбивать код на части.
Надо сделать все это отдельно. В виде отдельных функций с понятными названиями. Например:
- функция, которая принимает логин/пароль и возвращает, правильные они или нет (проверяет по базе данных) и ранг пользователя - функция, которая делает пользователя "залогиненным" (сохраняет данные в сессию) - функция, которая проверяет, является ли пользователь залогиненным (смотрит данные в сессии)
Далее, используя эти функции, ты сможешь переписать свою стену кода более коротким способом.
Также, "ранг" это просто число или это один из нескольких вариантов (типа: пользователь, модератор, админ)? Если последнее, то тебе надо сделать константы и использовать их:
const RANG_ADMIN = 3;
Или же, что еще лучше (но сложнее), изучить перечисления (энумы) и сделать Enum со списком ролей пользователя.
Примерно так в ларавеле устроено? Сами для каких целей используете Pipeline + middleware? Такая схема сложная в реальной разработке или делают проще? На пике самописный фрейм, не мой. Каждая верхний объект оборачивает нижний, туда идет реквест, наверх идет респонс по psr7
>>2713093 Про это знаю. В этот раз можно не делать защиту от них. >>2713212 Спасибо >>2713261 Спасибо за развернутый ответ. >Если вас такому коду учат Не учат. Нам преподают mysql. Сейчас надо создать бд, нормализовать её, написать к ней веб-приложение с системой регистрации, в котором создать админа, юзера и гостя после чего вывести запросы к бд в браузер. Веб-программирование не преподавали. Совсем. БД я написал и уже нормализовал.
>>2712508 Двачую, резко тред превратился в сборище говноедов, хз откуда столько набежало, с работы на заводе всех поперли чтоле, с этого >>2713339 вообще охуел, лаврика смотреть, читать котерова, шли бы уж сразу в 1С тогда
я принес свой говнокод с курса , памагите 4 имени и цифра индекс массива <?php $a=readline(); $b=readline(); $c=readline(); $e=readline(); $z=readline(); $myarr=array($a,$b,$c,$e,$z); echo $myarr[$z]; ?>
>>2714314 спасибо там всратая задача и я тупой, ща принесу На стандартный вход подается 4 строки и число от 0 до 3 (индекс). Все на отдельных строках.
Вам нужно считать 4 строки и сделать их элементами массива myarr в такой же последовательности, в которой они вводятся. В результате у вас должен быть массив myarr с четырьмя элементами. После этого нужно вывести элемент массива myarr с указанным индексом.
>>2714314 >>2714299 пацаны я решил так что сам еще не дегенерат <?php $a=readline(); $b=readline(); $c=readline(); $e=readline(); $z=readline(); $myarr=array($a,$b,$c,$e); echo $myarr[$z]; ?>
>>2714937 Я даже на целероне ставил PhpStorm, потому что несмотря на ужаснейшие тормоза этой жабопрограммы, он делает работу настолько удобной и простой, что можно и потерпеть, в VSCode текст быстрее набирался, и небыло фризов, но работа с git отстой, автодополнения можно сказать нету, кучи фишек и гибким чекеров ошибок нету, отладчик так себе.
>>2714966 >на целероне Запускал на Core2Duo и не дождался момента, когда можно было бы вводить код.
>>2714968 Я раньше в notepad++ писал и норм было. Даже сайтик для одной конторы сделал и мне 15к за него заплатили. А теперь видите ли надо какую-то монструозную иде ставить, чтобы писать сайты.
>>2715198 >Я раньше в notepad++ писал и норм было. Даже сайтик для одной конторы сделал и мне 15к за него заплатили. Сайтики за 15к можно во встроенном редакторе из админки битрикса писать.
>>2715363 Там подсветка синтаксиса есть и этого было достаточно. Это сейчас все избалованы, что иде сама пишет код. А тогда и такие мелочи были приятны.
>>2715415 >Это сейчас все избалованы, что иде сама пишет код. А тогда и такие мелочи были приятны. Когда тогда? За 10 лет до появление notepad++ IDE уже использовались.
>>2715415 >Там подсветка синтаксиса есть и этого было достаточно Достаточно для чего? Чтобы ебашить баги в прод? А если подсветку убрать еще заебаче станет?
>Это сейчас все избалованы, что иде сама пишет код. А тогда и такие мелочи были приятны. Пиздец, какой же там сквозняк в кукухе если дебаггер и статический анализатор превратились в "баловство". А гит это походу та самая мелочь, которая булки слишком расслабляет.
>>2715866 >гит Как по мне скопировать проект в отдельную папку надёжнее, чем полагаться на какие-то мутные схемы гита. Читал, что можно легко всё запороть, если неправильно команды ввести.
>>2716473 >скопировать проект в отдельную папку надёжнее, чем полагаться на какие-то мутные схемы гита Тебе как вообще, мутные схемы не мешают в интернет выходить? Мобильный телефон не слишком мутная технология? А компудахтер? Код гусиным пером в самый раз писать, а на сервак голубями отсылать, а то схема мутная получается слишком.
>>2716772 С написанием все в порядке, а вот с ОПИСАНИЕМ все плохо.
Это не просто доеб лишь бы доебаться. Ты пойми, что грамотно описать что ты делаешь это гораздо важнее, чем просто написать код.
1) Ты вводишь новые бизнес правила в своем коде. Как они звучат? Это зависит от того понял ли ты задачу. "Первая буква в предложении должна быть заглавной". "Перед знаками препинания нет пробелов" "После знаков препинания один пробел"
Исходя из этих правил тебе и нужно именовать переменные в коде. Ты вроде частично даже начал: firstChar, sentence. Но почему-то на этом остановился. Почему makeFirstCharUpperCase принимает text, да еще и массив? Нам нужно сделать первую букву ПРЕДЛОЖЕНИЯ заглавной. Почему firstChar превратился в upperChar? У тебя нет "upperChar" у тебя есть "upperCase". Это же логично и наглядно, когда ты сначала получаешь firstChar, а потом делаешь его upper.
Почему у тебя функция, которая выполняет сложную логику называется просто fixText? Каждому придется залезть и посмотреть внутрь что она делает. Почему у тебя результат разбиения текста на предложения $text? Во первых ты поменял тип переменной. Во вторых ты затер входящие данные.
2) Твоя функция makeFirstCharUpperCase делает несколько неожиданных вещей. Откуда там trim? Ты не написал что функция удаляет пробелы, ты написал что она делает первую букву заглавной. Почему она принимает массив, а возвращает строку? Я реально несколько минут думал как массив $sentences после preg_replace превратился в строку. А он превратился в строку раньше, почему-то внутри makeFirstCharUpperCase. Что опять таки меняет тип переменной.
3) У тебя совершенно нет структуры в функции fixText. Что тебе по сути нужно сделать? Разбить входящий текст на массив предложений sentences, потом применить к этому массиву набор функций-правил. Первое правило делает первую букву заглавной, второе правило меняет пробелы, третье правило делает все кроме первой буквы ловер кейсом, например. Потом собрать предложения в текст и вернуть.
Если все замечания поправить, то получится вот так https://3v4l.org/hkjXO . Просто и понятно. Посмотри на код с 60 строки. Именно этот код будет постоянно на глазах, с ним будут работать. Тебе не нужно лезть внутрь функций чтобы понять что мы делаем - все наглядно и читаемо с первого взгляда.
>>2718057 Вылезай из крио-камеры, он официально кросс и не плохо показывает производительность. При этом нет тухлой жабьей овер-ресурной пародии на веб. И не надо плюваться от бойлерплейтного Го
Почему нельзя использовать двойные кавычки? Некоторые преподаватели даже ставят сразу двойку, если увидят в коде студента двойные кавычки. Чем они так плохи?
Ну и чем ваш PHPStrom так хорош? Я думал, что в VS Code нет полноценной поддержки фреймворков, поэтому некоторые методы он не видит. А оказалось, что шторм тоже ничего не видит и не знает. Дак какой смысл использовать это лагающее чудовище, если результат тот же самый?
>>2718247 >это лагающее чудовище Откуда вы лезете блядь? У меня шторм запускается меньше чем за секнду. А плагины все "покупаются" там же где и лицензия.
>>2718247 //ctrl + shift + enter - auto semicolon //alt + insert - autocomplete construct //ctrl + alt + L - reformat code //ctrl + alt + shift + L - reformat file/code //ctrl + D - скопировать строку вниз //double shift - поиск, можно задать шорткат для многих вещей, например для emmet - Surround with Emmet //ЛКМ, потом alt + enter - импортируем класс //ctrl + W - выделить строку для редактирования //х2-ЛКМ по слову, затем alt + J - выделяем поочередно все одинаковые строки //затем нажимаем стрелку влево, затем зажимаем ctrl + shift и потом можем выделять //вправо или влево все выделенные строки //ctrl + P в аргументах метода, так можно увидеть, что ожидает на вход метод, что можно получить //shift + f6 - rename all the same
//LARAVEL //alt + Enter на Post ($post = Post::find(1);) - импротировать класс (use App\Models\Post;)
>>2718264 А сам шторм почему такой функционал не предоставляет? Они за что деньги берут? За красивые кнопочки что ли? А если хотите ещё чтобы методы находились, то покупайте платные плагины. И ведь по-любому кто-то ведётся и покупает это всё. Хотя слово покупает тут не уместно, потому что они требуют постоянных платежей, т.е. тебе дают этот функционал на время, пока им денежки отстёгиваешь.
>>2718343 Уася, со штормом идёт по умолчанию только 91 плагин.
>А если хотите ещё чтобы методы находились, то покупайте платные плагины. Это плагины от третьих лиц, чучело. Причем рядом с ними спокойно лежат бесплатные плагины. И чтобы кто-то заплатил тебе бабос за то что можно получить бесплатно нужно сделать очень охуенный плагин, смекаешь?
>И ведь по-любому кто-то ведётся и покупает это всё. Уася, я ни разу в жизни не покупал лицензию шторма, мне её покупал работодатель. Так же как и лицензию на слак и джиру. Ты если узнаешь цену лицензии на джиру для компании с 1к человек, то у тебя волосы на жопе зашевелятся.
>>2718373 Конфлюенс забыл, figma и vcs хранилище (github, gitlab, bitbucket).
Ты как вообще думаешь, сколько человек делают сайт? Загибай пальцы: Бекэндер пишет пхп бек. Фронтендер пишет вуе, реакт фронт. Тестировщик со своими смоук тестами и селениумом хуениумом. Продакт пишет тз и общается с заказчиком. Верстальщик хуярит пиксель перфект верстку под три браузера и пять устройств. Дизайнер рисует красивые кнопочки. Девопс выкатывает все это дерьмо в кубер и ебется с ним. Админ гарантирует что все эти джиры хуиры работают, интернет есть, доступы выданы.
И это только низшее звено. У всех этих людей еще есть начальство в виде тимлидов, а у этого начальства свое начальство. Это я еще не приписал всяких аналитиков и архитекторов. Всех этих людей нужно озадачить и проконтролировать. Каждый их шаг записать и сохранить. Сформировать отчеты, учеты и планы.
Причем это мималОчка. Для средненького проектика. Поэтому если кого-то из этих людей нет, то нужно сразу понимать что либо тут никто никуда не спешит (чего блядь не бывает, все спешат), либо кто-то безбожно кроит и кого-то хотят загрузить двойной или даже тройной работой.
Ещё в VS Code всегда показывается счётчик незакоммиченных файлов, в пхпшторме такого нет и потому всегда забываю коммитить. Начинаю делать следующую фичу и потом вспоминаю, что забыл прошлую закоммитить.
>>2718592 Во первых есть какой-то плагин, который это показывает.
А во вторых КАВО? Какого хуя ты разные фичи в одной ветке делаешь? В шторме есть таск менеджер. Он подсасывает с твоего таск трекера твои таски и к каждой таске привязывает ченджлист и гит ветку. Ты можешь НЕ коммитить текущие изменения и просто переключится на другую таску. При этом автоматически зачекаутится нужная ветка и поменяется ченджлист. Это полезно если нужно быстренько что-то в другой ветке поменять и не лезть руками что-то стешить, анстешить. Но до такой хуйни чтобы в ОДНУ ветку разные таски хуярить и как-то коммитами их разбивать ни один долбоеб не догадался ещё.
Может мне кто-нибудь сказать, почему когда i становится 25, то после нее идет не i = 26, а i = 1? https://ideone.com/gzpdyO Вкратце: Этот код гуляет по массиву, отсчитывая по 5 элементов. Останавливается на 5-ом, удаляет его из массива. И начинает гулять дальше, начиная с 6-го элемента. Если элемент до этого был удален, то он пропустит его. Т.е. будет гулять так: 3, 4, 6, 7, 8, пропустив удаленную 5. Все хорошо работает, пока выбывшее число не 24. В массиве после 24-рех идет 26. 25, как пустое место, он пропускает и должен начать с 26-го. Но. Он начинает заново. Я не понимаю где i меняется на 1.
>>2718843 Нихуя ты зрячий. А DatabaseTools, который заменяет десяток ПРИЛОЖЕНИЙ ты и не заметил. С подсветкой синтаксиса в коде, когда ты буквально можешь на любую колонку в тексте нажать ctrl+q и увидеть таблицу схему и всю хуйню.
>>2718772 Ничего не запустится. Я пробовал изучать асп по книжке 3 летней давности и столкнулся с тем, что примеры не работали, так как требовали того старого дотнета. Про запуск же готового проекта тут и речи быть не может, он просто не запустится.
>>2718843 Нихуя, добавили поддержку редиса наконец-то официально. Вот зачем нахуй нужен шторм. Чтобы вот такой кайфарик тебе дарили. Чтобы ты прямо во время дебага кеш чекал в один клик.
>>2718882 Там дотнет 2.1 был. Книжка Фримана если что. Я не буду в дотнет возвращаться, потому что РНР оказался в разы круче. Теперь жалею, что потратил столько времени на сишарп этот.
>>2718904 >С одного из хороших статик языков общего назначения, перекатился в динамикудресню ограниченного использования. >Радуется этому. Теперь я понимаю почему ты не мог поднять веб сервер, который представляется из коробки в IDE по одному клику.
>>2718998 Я не мог поставить дотнет 2.1 на линукс. Точнее поставил, но он не работал, а выдавал ошибку, что невозможно создать проект. Проблема заключалась в том, что дотнет анально привязан к библиотекам SSL. Если ОС ставит более свежие, то хваленое поделие микрософт уже не способно работать.
Вот даже в первой задачке вроде ничё сложного, но лять, как же сложно включать мозг когда привык сидеть на тупой работе и делать всё по скрипту или бессмысленно скролить харкач.
Короче сначала сам пробую рвя волосы на жопе делать задачу, потом если чё подсказки смотрю.
>>2719543 И как докер мне поможет настроить рабочее окружение? Это всё равно, что набирать код вслепую, а потом отправлять его в докер и надеяться, что там нет ошибок. Очень не удобно.
А вот в случае РНР в любом линупс-дистрибутиве уже есть пакеты для LAMP, просто пишешь нужные команды и всё ставится. Вот сейчас у меня стоит РНР 8 и Ларавель 10, а учусь по книжке по Ларавелю 5 с РНР 7 и всё прекрасно работает. Вообще ни разу не столкнулся с ситуацией, что какой-то код не работает в новой версии. Для шарписта это наверно трудно осознать, ведь там в каждой версии всё переворачивают с ног на голову и надо по сути по новой учить язык и фреймворк.
>>2720235 >пакеты для LAMP Пчел. В коммерческой разработке эта параша не используется. Какой нахуй апач. Какой мускуль. Про совместимость версий вообще пушка. Дура, ты бы почитал какой пиздец в пхп с изменениями конвертации типов в разных версиях. В пхп двойное равно просто блядь нельзя использовать.
>>2720238 В РНР ты оперируешь простыми типами, а в сишарпе для этого накручивают сложные крольчатки. Один LINQ чего стоит и даже сами разработчики не знают какой именно тип он выплёвывает, поэтому там и придумали всякие var или dynamic, что ещё хуже, чем не строго типизированные переменные в РНР. Так что это миф, что в строго типизированных язык прям рай. Я изучал их, там говна не меньше.
>>2720238 В коммерческой разработке вообще используют CI/CD. Просто пукаешь коммитами и оно само как-то там собирается и запускается. А я говорю про рабочую среду, про твой редактор кода и твой интерпретатор/компилятор. Тебе так или иначе нужно, чтобы всё работало на твоей машине, а не в докер-контейнере.
>>2720247 Тебе нужно чтобы все работало как на сервере. А на сервере все будет в докере. Потому что проект нужно поднимать десятки раз если не сотни, а с докером это делается одной командой и все поднимается вместе с сеткой.
>>2720241 Типы во входящих данных всегда приходится определять самому. Даже в ебаном хаскеле у тебя с получением данных из базы будут такие же проблемы как с LINQ. Только вот в пхп эти проблемы литерали везде. Вот тут >>2716772 парень поменял тип данных в переменной несколько раз в одной функции и даже не заметил. Потому что пхп это поощряет, высирая в стандартной библиотеке функции, которые принимают и строку и массив и аллаха, а возвращают вообще все что можно, и результат и false и null блядь.
Имаджинирую твое ебало когда ты будешь сидеть и с дебаггером ловить когда это вдруг строка стала массивом, а когда обратно строкой.
>>2718251 Второй день использую и что-то пользы от него с гулькин нос. Большую часть методов также не видит и надо ручками дописывать. Если в том же вс коде знаешь, что ничего нет, то просто смело пишешь код дальше, а тут каждый раз надеешься на подсказку, а тебе фиг и расстраиваешься. Так что даже в моральном плане шторм не лучше вс кода.
>>2720253 Ну да, а в твоём сишарпе ввели типы, не допускающие null, но в итоге они всё равно могут оказаться с null. Только теперь программисту больше писанины с вопросиками к каждому типу. Ещё всякие оболочки на классах выдумывают, чтобы можно было хранить там данные разных типов, или вообще через рефлексию крутят.
>>2720259 Ты вообще понимаешь разницу между "некоторые типы", которые ты закрываешь своим типом и забываешь навсегда. И ЛЮБАЯ ПЕРЕМЕННАЯ МОЖЕТ БЫТЬ ДРУГОГО ТИПА НА СЛЕДУЮЩЕЙ СТРОЧКЕ?. Ты хоть обговниться, но система типов в пхп это дно, хуже наверное только ванильный жабаскрипт, да и то берешь тайпскрипт и кайфуешь.
>>2720288 Нахуй ты лезешь в разговор если не понимаешь о чем речь?
Пикрелейтед человек написал функцию на ебанутом пхп. preg_split возвращает массив. preg_replace возвращает массив. Какого хуя функция возвращает строку, которая к тому же может быть null и не падает с исключением?
Во-первых, на продакшене часто Докер как раз не используют, он для всяких некритичных сред вроде dev/test
Во-вторых, Докер с точки зрения устройства и архитектуры это уродливый набор костылей и shell-скриптов. Сам Докер-файл это уродливый скрипт, в котором почему-то пишут кучу команд в одну строку через &&, а Докер-контейнер это облегченная виртуальная машина. То есть, вместо того, чтобы решить проблему установки нужных версий программ в отдельной папке они сделали виртуальную машину, к ней зачем-то сделали странный формат образов диска из множества слоев, который доставляет кучу проблем. Также, я помню, в какой-то версии Докера они писали свой userspace маршрутизатор пакетов.
Ну то есть, Докер полезен, но пользуются им только из-за отсутствия нормальных альтернатив.
Эта особенность не так и плоха. Например, БД возвращает тебе число строкой, а ты его складываешь и не надо писать преобразование в int вручную. Если ты все равно бы написал это преобразование, то почему бы его не сделать автоматически? Уменьшаем объем кода.
Что касается преобразования массива в строку, то такого автоматически не происходит. А вот во многих языках, например, в Питоне, строки сделаны итерируемыми (глупый дизайн). Из-за этого ты в Питоне вместо массива строк передаешь в функцию одну строку и функция ее итерирует, ничего не замечая. Глупо сделано. И такое не только в Питоне.
А правильно делать так: у строки должен быть метод для итерирования по байтам, по codepoints, по графемным кластерам:
for byte in s.bytes(): ...
for byte in s.chars(): // по графемным кластерам ...
>>2721008 Чучело. В том и вопрос: куда делся массив? Массив сука где? Весь этот код выглядит так будто в нем идет работа с массивом. Ты попытаешься туда что-то добавить и все это ебнется.
>>2721002 Снова здарова. Просто назови хоть одну крупную компанию, которая не использует докер. В сотый раз готов услышать "пук" и проследить как ты съебываешь в закат.
Не надо уводить в сторону. Ты утверждал, что PHP позволяет вернуть массив из функции, у которой стоит тайп-хинт ?string. Я тебе указал, что ты ляпнул глупость, не проверив. В PHP надежная система типов, а ты не прав.
То, что в коде неудачно названы переменные и ты что-то не так понял это не проблема PHP, это твоя проблема.
Ты пост прочел? Я написал, что Докер плохо спроекированное решение, имеет уродливый дизайн и представляет собой набор костылей. Вдобавок требует рута, имеет API и поэтому представляет собой одну большую потенциальную уязвимость. При чем тут количество компаний, которые его используют?
> preg_replace возвращает массив. > Какого хуя функция возвращает строку, которая к тому же может быть null и не падает с исключением?
Из этого не очень связного текста видно, что ты почему-то решил, что в коде происходит попытка вернуть массив из функции с тайп-хинтом ?string и должно быть выброшено исключение. Но проблема тут в том, что ты сам себе это придумал, а в реальности функция возвращет строку, что соответствует тайп-хинту.
Кстати, говоря о тайп-хинтах, сейчас многие современные языки используют похожую на PHP систему, когда не требуется указывать типы везде. Вот пример из C#:
Добрый вечер! Прошел задачку с кубиками и ии, долго не мог понять почему выводит синтакс ошибку на else, думал может пропустил чего Гуглил и понял, лишние точки с запятой ставлю, после условий они не нужны, в данном случае по крайней мере. Еще ставил везде exit, после каждого блока, оставил только в конце, и вот назрел вопрос, exit ставить после каждого блока так же уместно, или нет?
>>2721547 upd сейчас проверил код еще раз, else так и в ошибку уходит, а esleif все в порядке, нареканий никаких нет, менял местами обе конструкции - ошибки, все получается только с elseif, в чем дело?
>>2721535 >Из этого не очень связного текста видно Ебанько, очевидно что возвращается строка, функция же НЕ ПАДАЕТ. Я тебе об этом написал. И спросил: если preg_split возвращает массив, откуда блядь возникла строка тогда? И еще спросил: причем тут нахуй null? Откуда там может null появиться сука?
И можешь мне не рассказывать что нулл возвращает функция потому что в доке так написано бла бла бла. Вопрос какого хуя оно так написано? Почему эта ебаная функция вместо падения срет говном в результат? Причем эта залупа ИНОГДА сука выдает варнинг, а иногда молча срет нулл. Как твоя функция может высрать нулл вместо строки нахуй, куда эта ебаная строка делась блядь, почему не пустая строка. Просто блядь фрактал отсоса а не язык.
Подскажите, задача с банком(вкладом), написал цикл до миллиона, теперь хочу понять сколько лет пройдет с начала вклада до его миллиона. Не могу догнать что-то, такое чувство, что или функцию надо неизвестную мне, или все настолько просто, что я переусложнил себе задачу. Отдаленное представление о том как выполнить это есть, но написать не могу потому что, не знаю как. Подумал может еще один цикл запустить, нос разными условиями(действиями), но опять же в мануале написано, что этого делать не стоит. Прикреплю цикл по миллиону.
>>2719007 Молодец. Я примерно такой же путь делал. Верстка цсс потом пыхи. Вкатился. Единственное о чем жалею-слишком долго сидел с цсс, начал изучать media верстку на разные экраны и проебал на это месяца 4. Лучше бы сразу пыху учил.
>>2722833 Писал бы ты на джс - с легкостью пакет нашел бы который это делает лол. Уверен что он есть. Они вообще любую хуйню что длинее 1 строчки пакуют и реиспользуют. А потом у них половина интернета отваливается из за индуса который выпиливает свою хуйню из открытого доступа. В ахуе с ленивых пориджей
С регулярками я более-менее разобрался и решаю такие задачи достаточно быстро когда пишу код "простынёй", а вот когда начинаю распихивать по функциям, начинаются проблемы.
>>2723698 Братан, я уже говорил что сначала тебе нужно определиться с чем ты работаешь и что ты собираешься делать. По шагам. Выпиши себе все действия в столбик на русском. Ты пойми, что как ты эти действия не распихивай по функциям их меньше не станет, а когда их все увидишь, то станет проще их разделять и группировать.
1) Ну вот смотри. Что у тебя в этой задаче изменилось по сравнению с предыдущей? Добавился новый концепт: слово. Нам с массивом слов нужно что-то делать. А где у тебя происходит создание массива слов? А нету, у тебя сразу слова задом на перед возникают.
2) Что означает "makeSentemces"? Ты их как иисус создаешь? Ты их генерируешь? У нас есть концепт: текст состоит из предложений (это не всегда так представь себе), мы разбиваем текст на предложения. Так и напиши: splitTextToSentences(string $text): array. "makeReverseWordsInSentence" тоже ерунда какая-то. Во первых если ты переставляешь местами слова в предложении, то почему у тебя предложения на выходе нет? Ты разбиваешь предложение на слова И переставляешь слова местами. Опять неожиданное поведение. Надо разделить на две понятные функции: splitSentenceToWords(string $sentence): array и reverseWords(array $words): array. "makeYodaStyleText" тут автор задачи походу сам Йоду подрубил, makeTextInYodaStyle звучит по человечески.
И завязывай с этим ебучим ideone, эта параша работает кое как да еще и заблокирована нахуй. Все разработчики уже лет десять как пользуются https://3v4l.org .
>>2687463 (OP) >>1008826 (OP) Что такое отложенная инициализация? Для чего она нужна? Как паттерн Одиночка помогает ее реализовать? >Отложенная (ленивая) инициализация (англ. Lazy initialization) — приём в программировании, когда некоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат. Но разве без отложенной инициализации мы не делаем так же? Мы инициализируем объект тогда, когда это нам нужно. Мы можем инициализировать объект и без нужны, но зачем нам это?
>>1008826 (OP) Почему паттерн одиночка нарушает принцип единственной ответственности? Потому что в классе описывается инициализация объекта? Как этот паттерн маскирует плохой дизайн? Пишут про проблемы с мультипоточностью. Относится ли этак проблема к PHP? И требует постоянного создания MOCK Объектов для юнит тестирования. Зачем?
>>2727726 >Что такое отложенная инициализация? >Для чего она нужна? Ну вот есть у тебя сервис, который ходит в базу. А для этого нужно создать объект коннекшена. Ты можешь сделать так что коннектиться будет сразу при создании объекта сервиса, а можешь так чтобы коннектилось только когда идешь в базу.
>Как паттерн Одиночка помогает ее реализовать? Синглтон помогает убедиться что инициализация произойдет только один раз. И у тебя не будет двух коннекшенов к базе.
>Мы инициализируем объект тогда, когда это нам нужно Ты похоже неправильно понимаешь слово "инициализируем". Объект нужно создать, и передать его туда где он используется. Без этого код работать не будет. Так вот то что ресурсоемкая операция будет выполнена это еще не точно. Может мы в базу и не полезем, может у нас кеш есть. А вот то что объект нужно создать это обязательно.
>>2727740 >Почему паттерн одиночка нарушает принцип единственной ответственности? Потому что в классе описывается инициализация объекта? Это одна из причин. Объект должен заниматься своей бизнес логикой. В современном приложении есть специальные сервисы, которые занимаются подсчетом инстансов и менеджментом зависимостей.
>Как этот паттерн маскирует плохой дизайн? Никак не маскирует. Все сразу понятно.
>Пишут про проблемы с мультипоточностью. Относится ли этак проблема к PHP? Не относится. Пхп однопоточная параша.
>И требует постоянного создания MOCK Объектов для юнит тестирования. Зачем? А как ты его создашь? У него же конструктор запривачен. Это хоть мокнуть можно. А если добавишь своему синглтону статический метод getInstance, то вообще пизда - ты и не мокнешь нихуя, да и мокать нихуя не придется т.к. ты метод со статикой внутри нормально не протестируешь.
>>2722799 Я ушел в нихуянеделательный запой на дней 5. Короче покурил немного за SQL , самую прям базу основу. По итогу я познакомился с HTML , CSS , SQL и Линукс еще знаю учил его пару лет назад, тоже там основы.
За пыху сажусь, вышеперечисленное будет куриться по мере возникающих задач моих маняпроектов для портфелио
>>2725791 >А где у тебя происходит создание массива слов? А нету, у тебя сразу слова задом на перед возникают. Да, здесь я изначально думал разделить на 2 функции, но потом решил сократить код.
1) $reversedWords[count($reversedWords) - 1] = makeFirstCharLowerCase($reversedWords[count($reversedWords) - 1]); Если сидишь и думаешь че за хуйня здесь написана, то будь уверен написана хуйня. Не ленись разбивать сложные выражения на части и давай этим частям понятные названия. И не надейся что ключи в массиве будут именно такие, которые ты ждешь. Ты не можешь заставить отправлять в твою функцию массив с определенными ключами. Поэтому используй специальные функции: array_key_exists, array_key_first итд $lastWordKey = array_key_last($words); $lastWord = $reverseWords[$lastWordKey]; $reversedWords[$lastWordKey] = makeFirstCharLowerCase($lastWord]);
Как еще проще? Если массив небольшой, до тысячи элементов. То можно использовать array_shift pop итд $lastWord = array_pop($reverseWords); $lowerCaseLastWord = makeFirstCharLowerCase($lastWord]); array_push($reverseWords, $lowerCaseLastWord);
А можно еще проще. Ты забыл что можно сделать lowerCase ДО перемешивания.
>>2727952 Смотри, пишут, что Синглтон помогает реализовать отложенную инициализацию. public static function getInstance() { $subclass = static::class; if (!isset(self::$instances[$subclass])) { self::$instances[$subclass] = new static(); } return self::$instances[$subclass]; } Вот этот код помогает ее реализовать? Типа если есть существующий объект, то ее возвращает, если нет, то создает новый и возвращает его? В этом и есть смысл отложенной инициализации в Одиночке? Пожалуйста, я запутался, объясни мне, что такое отложенная инициализация максимально по простому.
Анон, тебя никто не банил. Сайт размещен на гитхабе. Возможно, твой провайдер по какой-то причине ограничивает доступ к гитхабу. Надо использовать ссылку https://codedokode.github.io/phpbook/ а не старые домены в зонах ga или gq.
Инициализация - это заполнение начальных значений, для объектов это обычно вызов конструктора. Обычно она делается в начале программы.
При инициализации может выполняться какой-то "тяжелый" код (например: выполнение долгого запроса в базу, чтение большого количества файлов). Это плохая идея, но такое может быть.
Тяжелая инициализация замедляет запуск программы, и хуже того, может быть так, что инициализиованный объект потом не понадобится. Получается, мы зря делали тяжелые вычисления.
"Ленивая" инициализация производится при первом обращении к объекту, когда мы точно знаем, что он нам нужен. Ее можно реализовать множеством разных способов, можно это сделать в самом объекте.
Вот код без отложенной инициализации:
$service = new Service(); // создается сервис и проводится тяжелая инициализация, хотя сам сервис пока не нужен
// ... где-то позже ..
if ($condition) { $service->doSomething();// используем сервис }
То есть, мы делаем в начале тяжелую инициализацию, хотя неизвестно даже, понадобится нам этот сервис или нет.
Вот код с ленивой инициализацией:
$service = null; // создаем переменную для сервиса
// ... где-то позже ...
if ($condition) { if ($service === null) { $service = new Service(); // ленивая инициализация, если объекта еще нет } $service->doSomething(); // используем сервис }
Здесь мы инициализируем сервис, только если он нам нужен.
Ленивую инициализацию можно сделать множеством разных способов. Можно, например, сделать функцию get_service(). Я не советую использовать Singleton и функции вроде get_service(), так как это вредный паттерн, ухудшающий код. Его недостаток в том, что с ним зависимости классов оказываются жестко прописанными в коде и мы не можем их подменить, например, передать что-то другое в качестве зависимости.
> Почему паттерн одиночка нарушает принцип единственной ответственности?
Допустим, у тебя есть класс, отвечающий за регистрацию пользователей. Если ты сделаешь его Синглтоном, то он будет отвечать еще и за создание самого себя. Но это довольно тонкий момент, некоторые скажут, что нарушения принципа единой ответственности тут нету.
> Как этот паттерн маскирует плохой дизайн?
Этот паттерн сам по себе плохой дизайн.
> Пишут про проблемы с мультипоточностью.
Думаю, что это глупость пишут. При использовании блокировок Синглтон может быть потокобезопасным. Для PHP Это неактуально, так как многопоточность в нем обычно не используют.
> И требует постоянного создания MOCK Объектов для юнит тестирования. Зачем?
В тестах нам часто нужно изолировать часть кода (класс или функцию) от других частей. Например, у тебя есть код для пересчета биткойнов в рубли, который делает запрос к серверу, чтобы узнать текущий курс:
function convert_btc_to_rouble(float $btc): float { $client = BtcRateClient::getInstance(); // синглтон $rate = $client->getBtcInRoubles(); // получаем с сервера курс return $btc * $rate; }
Как видно из кода, у этой функции есть зависимость - объект BtcRateClient, с помощью которого она получает курс биткойна с сервера криптобиржи.
Допустим, ты хочешь написать тесты на эту функцию, чтобы проверить, что она правильно работает. Но ты не хочешь, чтобы в тестах делались запросы на сторонний сервер. Так как в этом случае тест будет работать медленно, а также при проблемах с интернетом или сервером тест упадет, и тебе придется тратить время на выяснение причин. Это очень плохо, когда тест падает на правильном коде из-за каких-то не зависящих от тебя причин вроде проблем с сетью. Такие нестабильные тесты нам не нужны.
Но в данном примере ты никак не можешь запретить функции обращаться в сеть. На этот код не получится написать тесты без каких-то хаков, и виной тому синглтон. Поэтому придется отказаться от синглтона и перейти на использование внедрения зависимостей:
Теперь мы можем тестировать эту функцию. Чтобы она не лезла в интернет, мы сделаем мок (моки бывают разных видов, это будет stub):
// наследование нужно, чтобы пройти проверку типов class BtcRateClientStub extends BtcRateClient { // подменяем функцию на нашу public function getBtcInRoubles(): float { return 500_000; } }
Теперь в тесте мы создаем поддельный клиент и передаем его в функцию:
$stub = new BtcRateClientStub(); $result = convert_btc_to_rouble($stub, 10); // проверяем правильность расчетов if ($result != 5_000_000) { echo "Ошибка, ожидалось 5_000_000, а получилось $result"; exit(1); }
В реальности моки не создают руками, а используют библиотеки, которые упрощают их создание. Также, иногда для зависимостей создают интерфейсы, например:
interface BtcRateClientInterface { public function getBtcInRoubles(): float; }
В функции в качестве типа указывают интерфейс:
function convert_btc_to_rouble(BtcRateClientInterface $client, float $btc): float ...
И на основе интерфейса создают 2 класса: реальный клиент BtcRateClient и фейковый для тестов BtcRateClientStub. Функция принимает любой из них.
>>2729614 Спасибо большое за ответы, но я не совсем понимаю, каким образом Singleton реализует ленивую инициализацию, ведь в твоем примере проверяют существование объекта перед выполнением определенного действия if ($service === null) { $service = new Service(); // ленивая инициализация, если объекта еще нет } $service->doSomething(); // используем сервис } А в Singleton есть метод, getInstance(), который просто создает объект. Я правильно понимаю, что getInstance() сам по себе не реализует ленивую инициализацию? А вот такой пример уже реализует $config1 = Config::getInstance(); $config1->setValue("login", $login); Ведь так?
Я не совсем понимаю, что подразумевают под инициализацией. Если мы создаём объект через new, а у объекта пустой конструктор, то мы его просто создали или еще и проинициализировали?
>>2729614 Спасибо большое за ответы, но я не совсем понимаю, каким образом Singleton реализует ленивую инициализацию, ведь в твоем примере проверяют существование объекта перед выполнением определенного действия if ($service === null) { $service = new Service(); // ленивая инициализация, если объекта еще нет } $service->doSomething(); // используем сервис } А в Singleton есть метод, getInstance(), который просто создает объект. Я правильно понимаю, что getInstance() сам по себе не реализует ленивую инициализацию? А вот такой пример уже реализует $config1 = Config::getInstance(); $config1->setValue("login", $login); Ведь так?
Я не совсем понимаю, что подразумевают под инициализацией. Если мы создаём объект через new, а у объекта пустой конструктор, то мы его просто создали или еще и проинициализировали?
Без ленивой инициализации ты создаешь объекты в начале программы, хотя может быть они никогда и не понадобятся. С ленивой ты создаешь их при первом использовании.
> Я не совсем понимаю, что подразумевают под инициализацией. Если мы создаём объект через new, а у объекта пустой конструктор, то мы его просто создали или еще и проинициализировали?
Для простоты считай, что инициализация это выполнение конструктора. Но в общем инициализация - это действия, после которых объект готов к исопользованию. Например, у объекта Config из твоего примера после инициализации все значения параметров уже заполнены.
>>2729728 Опять запутал. Чем твой пример отличается от моего? Тем, что ты уже используешь готовый результат? Почему мой пример не подходит, а твой подходит?
>>2728425 >Если сидишь и думаешь че за хуйня здесь написана, то будь уверен написана хуйня. Не ленись разбивать сложные выражения на части и давай этим частям понятные названия. Понял.
>Ты не можешь заставить отправлять в твою функцию массив с определенными ключами. Поэтому используй специальные функции Почему? Моя функция splitSentenceToWords() возвращает обычный массив с индексацией с нуля, последний индекс n-1. Или это общий совет, применимый ко всем случаям работы с массивами?
>>2729782 >Или это общий совет, применимый ко всем случаям работы с массивами? Да. Посмотри что делает с ключами, например array_ushift. Ты сам можешь не знать что ключи поменял, снаружи массива это никак не проверить. В идеале конечно нужно использовать объекты: коллекции, стеки, очереди итд.
Ты опять не заметил что можно сделать ловер кейс до перемешивания.
>>2729922 Привыкай применять функции к набору данных. По сути ты строишь пайплайн для обработки массива words. 1) Делаем так 2) Потом вот так 3) И наконец вот так У тебя этот стройный порядок нарушен тем что ты лезешь что-то получать, что-то менять. Грамотное именование конечно помогает, но все равно это выглядит странно.
Заметил такой код у одного гуру. Нахуя цикл по массиву, если можно сделать так echo $arr['key']; Нахуя его весь обходить и сравнивать ключи, а если совпал то вывести. P.S это не pub/sub, так что нет двух массивов с одинаковыми ключами
Такой функции нету. Обычно просто заводят переменную и на каждом шаге ее увеличивают на 1. В цикле for такую переменную можно вписать прямо в заголовок цикла:
Это хорошо, что ты ставишь тайп-хинты, это делает код понятнее и помогает обнаруживать ошибки.
В phpDoc вместо array<string> можно писать более кратко string[]
try ... catch здесь можно не писать - PHP по умолчанию при исключении сам выводет подробности ошибки (если, конечео, у тебя в php.ini включен вывод ошибок с помощью директивы display_errors).
Справедливости ради, здесь разбиение на функции сделано более-менее адекватно. Что касается разбиения предложения на слова, то да, можно вместо функции, которая и разбивает, и переворачивает сделать функцию, которая только разбивает, так как для переворота у нас уже есть array_reverse. Так будет чуть чище код.
Что касается названий, то я бы предложил:
- разбить текст на предложения: splitIntoSentences. Слово text можно не писать, так как аргумент и так называется $text - разбить на слова: splitIntoWords
> reverseWords(array $words): array.
Эта функция не нужна, так как есть array_reverse.
> "makeYodaStyleText" тут автор задачи походу сам Йоду подрубил, makeTextInYodaStyle звучит по человечески.
> И не надейся что ключи в массиве будут именно такие, которые ты ждешь. Ты не можешь заставить отправлять в твою функцию массив с определенными ключами.
Мне кажется, ты уже переусложняешь задачу. В данной задаче можно принять, что функция разбиения на слова возвращает массив с индексами от 0 до N-1. Также, ты берешь array_key_last от $words и используешь ее с reverseWords, что странно.
array_key_last() читается чуть лучше, чем count() - 1. А переменную lastWordKey я бы не стал заводить:
Нет. При загрузке страницы с редиректом браузер делает 2 HTTP-запроса и выполняются 2 скрипта:
- браузер делает запрос на /news, запускается скрипт, он возвращает редирект на /news/today. Скрипт завершается, все переменные уничтожаются - браузер делает запрос на /news/today, запускается новый скрипт с нуля
Кстати, как ты можешь заметить, из-за редиректа время загрузки страницы увеличивается, потому что надо сделать 2 запроса вместо одного.
Тут я не согласен. В данной задаче гарантируется, что функция разбиения на слова вернет массив с ключами от 0 до N-1. Можно для надежности еще указать это в комментарии, чтобы сомнений не было.
К сожалению, стандарт phpDoc не позволяет указать это, но phpstan (анализатор кода) содержит такую возможность:
@param list<string> $words
Я, увы, не могу найти, поддерживает ли PhpStorm такую конструкцию. Похоже, они не публикуют список поддерживаемых типов, хотя я знаю, что они поддерживают некоторые типы из phpstan.
Мне кажется, тут не надо придумывать сложности на ровном месте и делать поддержку для случаев, когда ключи идут не по порядку.
>>2730019 Речь о том что ключи массива в пхп вещь по определению не надежная и не проверяемая. Причем в самом пхп есть куча функций, которые эти ключи меняют. Сегодня у тебя гарантируется, а завтра кто-то сделает array_merge с ассоциативным массивом. И будет прав, между прочим, потому что никаких ограничений с твоей стороны на это нет. А еще веселее будет если этот самый ассоциативный массив будет получаться иногда. Гарантированы часы веселья с курением логов и поиском этого бага.
Вместо того чтобы думать где ты уверен, а где не уверен, ты просто используешь функции и закрываешь этот вопрос для себя навсегда. А еще лучше как я уже сказал вместо массивов использовать объекты.
>>2687463 (OP) Кто-нибудь проходил книгу: Symfony. Быстрый старт? Почему у меня контроллер не находит? И ещё заодно вопрос почему домен локалхост работает, а если писать 127.0.0.1 выдаёт ошибку?
Если Симфони работает в продакшен-режиме, то он не заметит, что ты добавил аннотацию в контроллер и не перестроит таблицу роутинга. Нужно выполнить команду php /bin/console cache:clear для очистки кеша.
Если у тебя нет опыта работы, то ты в любом случае стажер или джун.
Сеньор это чуть более высокий уровень, это проектирование, архитектура, очереди, итд. Это все сложно освоить только в теории без практики.
В скриншотах мне не нравится код с Pipeline, выглядит как переусложненное решение.
В Доктрине ты делаешь ошибку, используя в поле comments и массив, и коллекцию одновременно. Это как раз пример вещи, которую обычно изучают на практическом опыте. Также, сейчас вроде можно использовать настоящие аннотации, а не phpDoc.
>>2730679 Короче с контроллерами разобрался, была проблема в файле роутс как у этого чела с симфоникаста. Почему то, хоть и указано что руководство для 6-ой версии https://symfony.com/doc/6.2/the-fast-track/ru/index.html, но в строчке с созданием проекта стоит версия 5.4... А вот с ip так и не понял в чём дело, порты добавляю. При этом если запускать nginx то там именно по ip странички спокойно открываются.
>>2687463 (OP) Есть дистрибутив битрикса на версию php 7.4? Они сделали обновление, что теперь только с php 8 можно ставить, однако сам битрикс не ставится на 8 версию, а установщик не пускает устанавливать дальше, если нет 8 версии php.
>>2733664 А хули осваиваться? Если ты в джанго шаришь, то открывай доку ларавеля и читай. Все будет понятно сразу. А если не шаришь, то пиздуй в шапку как все остальные и не еби мозги.
Насколько хуево писать SQL запрос в laravel? Пытался как-то вывернуться с моделями, но в итоге заебался и чистый SQL написал, мне что-то подсказывает что это не очень хорошая практика
Это нормально, при использовании ORM, использовать обычные SQL-запросы. Например, часто выгоднее получить какую-то сумму одним запросом, чем выбрать тысячи сущностей и считать эту сумму на стороне PHP.
Но если ты не смог написать запрос лишь из-за плохого знания ORM, то очевидно это не повод переходить на SQL.
>>2737691 Если есть задача сбить "узкое горлышко" и оптимизировать sql запрос-тогда лучше делать прямой sql запрос. В любом другом случае я бы советовал использовать модели т.к. они визуально понятней, как и для тебя будут (в дальнейшем) так и для другого разработчика. >>2738035 этот прав
Отозвался на вакуху с зп чуть ниже рынка - похуй, думаю, посмотрю что там. Не сразу понял почему их письмо улетело в спам на почте. Когда открыл - знатно охуел. Как вам тестовое с ТЗ на 40 страниц, господа? Взялись бы на два дня сроком?
>>2739291 Не, мало ли диванон. Не хачу. Там ТЗ на полноценный функционал, с описанием моделей, урлов, какие нужны ответы, валидация, авторизация и тд. Какой-то полноценный бекенд хотят под видом тестового. Я погуглил по конторе - какие-то нонеймы со спизженным названием.
>>2687463 (OP) Сейчас прохожу стажировку и у нас скорее всего будут очень дотошно спрашивать на аттестации, поэтому я хочу хорошо подготовиться Одна из тем - это KISS, DRY, YAGNII. Но я не знаю что мне рассказывать помимо того, что KISS - это делай проще, DRY - не повторяйся, а YAGNII - не реализуй то, что не описано в документации. Но этого же не достаточно, что можно ещё сказать? В DRY есть что то типа единственного источника. А что ещё? Есть Немчинский, он там много чего рассказал, но я не уверен, что это правда. Такое ощущение, как будто половина принципов KISS было взято из YAGNII и не понятно, относится ли принцип облегчение интерфейса (графического вроде) к KISS?
>>2739620 >Одна из тем - это KISS, DRY, YAGNII Это тест на лоха. Ты должен четко и уверенно ответить что это баззворды двадцатилетней давности, вся суть которых сводится к "нормально делай - нормально будет". А если у апологета этой хуйни нет конкретной метркики соблюдения этих "принципов", это вообще верунство и эзотерика.
>>2739373 Нахуй шли это говно и всё. Есть тестовое - значит 1000 человек на место, оно тебе надо? Просто нагугли пхпшные конторки мелкие и сам пиши им, без всякого говна возьмут за еду. Я никогда тестовые не делал, даже собеседований полноценных не было ещё, 3 года опыта.
Всё что надо - ты должен иметь проект на гитхабе, чтобы его показывать как ты пишешь код, этого достаточно.
>>2737759 Потому что КАЛЛЕКЦИЯ от слова кал)) Эта штука удобная, но медленная и дебажить сложнее. Но вообще всё от проекта зависит, не удивляйся.
Чем меньше слоёв абстракций и чем ближе к исходному результату запроса, тем быстрее работает приложение. Однажды ты вообще поймёшь что даже ларавель это неповоротливое говно, постепенно будешь юзать лишь пакеты, потом вообще к чистой пыхе на воркерах придёшь)
>>2737691 А многие вещи на ORM и не сделать. Вообще если средне-сложные запросы, то советую научиться писать чистые SQL-запросы, причём прямо в базе без приложения, а потом уже переписать в билдере.
Этим будешь отличаться от макак, которые до сеньёрства дорастают и не могут даже запрос оптимизировать, не умеют даже having-ом пользоваться.
>>2731059 Елисеев долбаёб в бабушкином свитере, который отпахал на Zend и колленых фреймворках, а теперь пихает эту архитектуру в симфони и ларавель.
Крайне не советую его смотреть, он неактуальный. Вообще лучше не смотреть пиздаболов, которые никогда не работали с симфони, но выпускают свои говнокурсы по 100500 технологиям и фреймворкам, о которых узнали лишь в доке.
>>2739878 >удобная, но медленная Чучело, ты бы хоть открыл блядь на гитхабе код этой коллекции. Это буквально обертка над форычем. А нужна она чтобы вместо трех строчек бойлерплейта писать одно слово.
>дебажить сложнее Эта коллекция покрыта тестами от и до. В её разработку и тестирование вложены тысячи человекочасов. Все что там могло "сломаться" давно было сломано и пофикшено.
>Чем меньше слоёв абстракций и чем ближе к исходному результату запроса, тем быстрее работает приложение. >постепенно будешь юзать лишь пакеты, потом вообще к чистой пыхе на воркерах придёшь) Перечисляю вещи, которые тебе нужны чтобы ты мог назвать свой код "приложением". 1) Абстракция приложения внезапно 2) Http пайплайн. Да, все эти Request, Response, Url и прочее. По psr-7 конечно. Неделька ебли если будешь писать сам. 2) Конфиг. А конфиг нужно где-то хранить и внезапно уметь парсить. Открой спецификацию по YAML и попробуй написать по ней парсер. Когда забъешь хуй и начнешь хранить в массивах сразу поймешь нахуя придумали YAML. 3) DI контейнер. Вот сюрприз, чтобы иметь возможность писать на "чистой" пыхе нужно все сервисы получать через него, чтобы он в соответствии с конфигом все что нужно куда нужно прокидывал. Тут дела ничинают становится веселыми. Потому что 90% пхп сеньоров написание DI контейнера не осилят. Но давай представим что ты забил на рекурсивные ссылки и как-то за месяцок справился. 4) ORM. Тут на самом деле только один вариант, потому что как-то работать на "чистой пыхе" с базой можно только посредством дата маппера. То есть только Doctrine. А доктрина это самый сложный софт написанный на пхп вообще. Если самописный di контейнер еще как-то можно представить, то самописная доктрина это просто невозможно.
Короче. Все в точности наоборот. Чем более "чистым" ты хочешь видеть свой код, тем более сложные абстракции тебе придется для этого задействовать. Хочешь не зависеть от конфига? Используй di контейнер, концепцию которую половина людей просто не поймет, а внутренне устройство вообще никто кроме автора без доки не раздуплит. Хочешь не наследоваться от сторонних библиотек, не вскрывать класс обязательными сеттерами и сохраняться в базу? Используй дата маппер, со всеми его идентити мапами, юнит оф ворками и прочей хуйней.
В том-то и суть что использовать ларавель гораздо проще концептуально. Отнаследовался один раз и все работает. Тебе не надо хитрожопым способом пытаться отследить изменения всех возможных объектов. Не надо городить прокси, чтобы как-то за вменяемое время заполнить приватные свойства.
>>2739964 >Потому что 90% пхп сеньоров написание DI контейнера не осилят А чего там сложного? Просто список факторей, возвращающих уже настроенный и готовый к работе объект. При инициализации этих объектов он сам себя передаёт в фабрику для получения конфигов. Всё остальное - уже навороты. Пишется такое за полдня с перекуром.
>>2739995 >А чего там сложного? Просто список факторей Сразу видно что ты не то что в этих 10%, ты даже не сеньор.
У тебя есть класс, у класса есть конструктор, у конструктора есть параметры. Ты физически не сможешь создать объект не передав эти параметры в конструктор. А эти параметры тоже требуют параметров. Тебе нужно написать сервис, который может создать любой, в принципе возможный объект в пхп со всеми его зависимостями. Смекаешь? Учесть любые ситуации, любые параметры.
Дальше. Нужен конфиг. А конфигу нужен понятный формат: какие параметры обязательны, какой класс, какой тип, вся хуйня. Как указать что синглтон, а что нет, где использовать фабрику, а где просто замыкание.
Дальше. Некоторые сервисы нужно создавать только один раз. То есть нужно хранить инстансы. С менеджментом этих инстансов заебов будет куча.
Дальше. В объект А нужно передать объект Б, в который нужно передать объект А, а мы А еще не создали. Циклические зависимости. Это настолько сложная хуйня, что я сразу предложил эту тему просто скипнуть.
Дальше. Работает вся эта хуйня через рефлексию. Работает относительно медленно. Надо как-то закешировать. Как-то ебать. Кеширование di контейнера в симфони - это произведение искусства. Я даже не представляю каких размеров башку нужно иметь чтобы это осилить в одного.
И все это производит баги баги баги баги. Ты только тестировать эту хуйню будешь неделю. И все равно все не протестируешь и регулярно будешь подрываться на какой-то очередной кипишь: что-то не создалось, не то создалось, не передалось, инстанс пропал, кеш протух, хеш не тот, хуй в рот.
>>2739964 >Это буквально обертка над форычем. Блять, вкатун. Тебе сказали сеньёры с 10летним стажем твоей комманды не использовать коллекции, но ты язык в жопу засунул, в жизни слова сказать на дейлике не можешь опытным и прибежал сюда мериться яйцами со мной на двачах. Давай ты замеришь перфоманс, количество памяти твоя обёртка и массива, потом обмажешь себя говном на камеру?
>>2739995 Ничего там сложного, он просто джун, который кроме крудов ничего не писал. Реализовать ссаный паттерн, который всеми используются, ебать сложно, нихуя себе)
>>2740037 На английском смотреть. Но фреймворк это такая залупа, которой 95% вещей не нужны. Например ну никто в нормальной конторе не пишет фронтенд на бэкенде, отсюда тот же symfony/form с твигом, авторизаций, говновалидациями и горой зависимостей нахуй не нужны. Поэтому по ютубчику посмотри то да сё, напиши своё, используй гугл и доку, а уж на работе полноценно вкатишься в симфони.
>>2740127 >язык в жопу >мериться яйцами >обмажешь себя говном на камеру? У вас в пгт все так изъясняются или это только ты фантазируешь об обмазывании говном и лизании жопы? Вот тебе тест с коллекцией на 400к записей через форыч и через коллекцию (форыч). Разница в пределах погрешности. https://3v4l.org/T1eDo https://3v4l.org/tZruZ Что блядь было очевидно. Обертка в функцию нихуя не стоит, а содержимое коллекции хранится в том же самом массиве.
>Реализовать ссаный паттерн, который всеми используются, ебать сложно, нихуя себе >) Двс тоже везде используется. Реализуешь двс в гараже на токарном?
>Но фреймворк это такая залупа, которой 95% вещей не нужны. Ты там солей въебал? Фреймворку нужны вещи? А сиги этот фреймворк у тебя не стреляет? Фреймворк это просто набор библиотек. В симфони di (ссаный паттерн, написан в перерывах между крудами) вообще не будет загружать сервисы, которые не используются. symfony/form с твигом даже в память блядь не попадут если ты их не используешь.
Я уж не говорю что все фреймворки сто лет как поделены на отдельные библиотеки, которые ты сам в композере прописываешь. Пиздуй дальше искать вылизывания очка и обмазывание говном, используя гугл.
>>2740019 >Сразу видно что ты не то что в этих 10%, ты даже не сеньор. Причина тряски, вайти?
>Ты физически не сможешь создать объект не передав эти параметры в конструктор. Ты не можешь передать в конструктор параметры в месте его инициализации? Хуёво быть тобой?
>Тебе нужно написать сервис, который может создать любой, в принципе возможный объект в пхп со всеми его зависимостями. И в чём проблема?
>Учесть любые ситуации, любые параметры. Например какие ситуации и какие параметры? На вскидку там только неправильное указание имени может быть решается работой через сигнатуры классов\интерфейсов.
>Нужен конфиг. А конфигу нужен понятный формат Ну подгружай пхп-массив из файлика. В простом исполнении покатит, да и не только в простом - помню в Симфони тоже так же работало.
>В объект А нужно передать объект Б, в который нужно передать объект А, а мы А еще не создали. Циклические зависимости. Это настолько сложная хуйня, что я сразу предложил эту тему просто скипнуть. Эту хуйню маме рассказывай. Я уже ответил на эту твою детскую проблему: При инициализации этих объектов он сам себя передаёт в фабрику для получения конфигов, точно так же можно получать любые объекты из него, ВНЕЗАПНО, в процессе инициализации других объектов.
Дальше ебал разбирать двой джунский бред. Попробуй просто поработать с любым контейнером напрямую и поймёшь, что сама идея там простая, а ты сейчас хуйню пишешь.
>>2740127 >Например ну никто в нормальной конторе не пишет фронтенд на бэкенде, отсюда тот же symfony/form с твигом, авторизаций, говновалидациями и горой зависимостей нахуй не нужны. Если у вас не пишут - не факт, что везде так, у нас, был такой проект один и немаленький. Или, например, для того чтобы по-бырику накидать MVP для проверки гипотезы как раз именно через шаблонизаторы и делают. Потом уже никто не мешает разделять фронт с беком и фреймворк позволяет это безболезненно сделать.
>>2740216 >Ты не можешь передать в конструктор параметры в месте его инициализации? Хуёво быть тобой? А какие блядь параметры? У тебя указан первым параметром интерфейс какой-то хуйни. Где ты будешь брать реализацию? А если реализации две? Как ты поймешь что параметр нужно брать из контейнера или из конфига? Бля, чучело, ты просто попытайся хотя бы примерно написать что-то подобное.
>И в чём проблема? Как ты это будешь тестировать? Я даже не про юнит тесты щас говорю. Вот ты высираешь что-то в прод. Оно работает? Когда оно свалится нахуй? Ты будешь пытаться создать объекты с параметрами разного типа? Ты просто создашь пару объектов и забьешь хуй?
>Например какие ситуации и какие параметры? Например в пхп объект может быть функцией, замыканием или ебаным массивом. У тебя тип параметра callable, ты можешь сказать что то что ты прямо сейчас передаешь в конструктор нужного типа?
>В простом исполнении покатит Покатит для чего? Сказать "мама смари я написал конфиг" наверное покатит. А кто будет проверять что все конфиги подгрузились? Кто будет проверять что ничего не дублируется и не перезатирает друг друга? Кто всю эту хуйню будет кешировать?
>Эту хуйню маме рассказывай. Я уже ответил на эту твою детскую проблему: При инициализации этих объектов он сам себя передаёт в фабрику для получения конфигов Дура, ты ведь вообще не понимаешь что написано? В такой ситуации ты никак не сможешь создать объект. И никакая магическая фабрика с гномиками тебе не поможет. Тебе нужно во время создания объекта передать его же самого, а для этого его нужно создать, а для этого нужно передать его самого. Ты будешь пытаться его создать пока все не наебнется по памяти, чучело.
Пиздец, ты даже на джуна не тянешь. Твоя же волшебная фабрика содержит контейнер, который содержит твою фабрику. Об этой хуйне знает любой миддл, потому что рано или поздно ты попытаешься сделать var_dump чего-то типа этой фабрики и все свалится из-за недостатка памяти. Поэтому VarDumper из того же симфони умеет такие циклические зависимости находить.
>Попробуй просто поработать с любым контейнером напрямую и поймёшь, что сама идея там простая Дура, ты бы хоть попытался это написать. Может тогда до тебя бы дошло, что писать по фабрике на каждый класс это максимально тупая идея. Да хули смеяться, даже писать по конфигу на каждый класс это мартышкин труд.
>>2740406 >У тебя указан первым параметром интерфейс какой-то хуйни Речи о рефлексиях сейчас не идёт, ребёночек. Это уже навороты и их необязательно городить если делаешь всё на коленке. Всё прекрасно можно указать в конфигах - куда какие интерфейсы идут.
>>2740406 >Поэтому VarDumper из того же симфони умеет такие циклические зависимости находить. Передаёшь в фабрику сам контейнер и из него достаёшь нужную зависимость онлайн. Если у входящей зависимости есть какая-то другая, то она точно так же в своей фабрике принимает этот же контейнер и точно так же получает из него что надо точно так же онлайн. Всё. Ты ж просто необучаемый истеричный дурачок.
>>2740612 >Передаёшь в фабрику сам контейнер и из него достаёшь нужную зависимость онлайн. Если у входящей зависимости есть какая-то другая, то она точно так же в своей фабрике принимает этот же контейнер и точно так же получает из него что надо точно так же онлайн. Всё. Что "всё" мудень? Мне за тебя загуглить что такое циклические ссылки или что? https://medium.com/@johann.pardanaud/about-circular-references-in-php-10f71f811e9 По английски не понятно? https://3v4l.org/MhPOH Читай по слогам RECURSION. Для пхп это ОБЫЧНОЕ ДЕЛО. А твой "контейнер" если попытается такой объект создать жидко пернет и обмякнет, чучело. Причем из конфига этого объекта ты нихуя не поймешь, потому что там все будет правильно написано, и придется тебе перелопатить все конфиги, а потом еще и что-то отрефакторить. А все это время прод будет лежать. Бля, да кому я объясняю, ты же, чучело, на серьезном ебале думал что типа написал кароч код и ебанул его в мастер, ну а хули должно работать. И похуй что это точка пересечения всего приложения и если там баг, то у тебя тупо весь сервис встанет.
>>2740592 Быстро ты сдулся. Начали с замены фреймворков, а закончили "хуйней на коленке". И кому твоя хуйня на коленке нужна? Ты бы еще uml схему ебанул и радовался что паттерн "реализовал". Пиздец гений. Конфиги у него кароч на массивах, а на каждый класс он создает фабрику и конфиг по всем параметрам.
Пикрелейтед твое ебало, когда где-то в конфиге джун перепутал вложенность массивов, а конфиг размером больше, чем код всего приложения.
>>2740670 >Начали с замены фреймворков Я мимошёл, истеричка. Спросил >>2739995 и ты начал истерику. Вангую, что никакой работы у тебя нет и не было никогда - ты ж ебанутый на голову. Кто с тобой работать будет?
>>2740662 >Читай по слогам RECURSION. Для пхп это ОБЫЧНОЕ ДЕЛО Ты всё равно начинаешь с какого-то одного объекта, вайти. Часто это просто конфиг и переменные окружения, которые требует большинство интеграций, составляющих ядро приложения. Хуй ты инициализируешь какой-то объект рекурсивно самим собой. Перестань хуйню писать и позориться.
>>2740708 >Хуй ты инициализируешь какой-то объект рекурсивно самим собой. В предыдущем же посте я тебя тыкал ебалом в рекурсию, которую ты сам создал. Потому что блядь создание объекта с резолвом зависимостей это принципиально рекурсивный процесс. И так же будет с любым другим рекурсивным процессом. Именно поэтому каждый di контейнер в любом фреймворке умеет такие ситуации обрабатывать. Ясный хуй, ведь ни одно более менее крупное приложение без этого бы не работало нихуя.
Ты же оказался неспособен не то что подобный сервис создать. Ты блядь с третьего поста только раздуплил о чем вообще речь идет. На серьезном ебале пытался рассказывать тривиальную хуйню о том кто кого куда передает. Тебе блядь даже в голову не пришло что передавать можно бесконечно.
>>2740127 >Тебе сказали сеньёры с 10летним стажем твоей комманды не использовать коллекции, но ты язык в жопу засунул, в жизни слова сказать на дейлике не можешь опытным и прибежал сюда мериться яйцами со мной на двачах. я >>2737759 не он >>2739964 анончик...
>>2740997 Так очевидно, что та манька без работы сидит.Она элементарно не понимает как работают контейнеры и пытается гнать тут пургу. Причем делает это очень истерично. Ты бы стал работать с таким ебанутым? У меня бы она через неделю вылетел с работы, пересравшись со всеми.
>>2741238 Жить захочешь - не так раскорячишься. Проблема-то в том что рефлексия в пхп работает слишком медленно. Вот и приходится выдумывать какие-то ебаные прокси как в доктрине.
Именно поэтому атрибуты в пхп как в джаве были максимально уебищной идеей. Работают то они через рефлексию. Если раньше если где-то видишь рефлексию, то это гарантия тормознутого непредсказуемого говнокода. А атрибуты вроде как полезный функционал, не все так однозначно.
Прямо сейчас проекты потихоньку засираются говном, которое взойдет только через несколько лет. В джаве даже без проблем с перфомансом рефлексии говна хлебнули с этими атрибутами. Теперь очередь "джавы для бедных".
>>2741250 Шизик, ты уж определись. Либо >элементарно не понимает как работают контейнеры Либо >Это уже навороты и их необязательно городить если делаешь всё на коленке
Давай я кароч использую заклинание по удалению тебя из треда. Работает безотказно. Скинь сюда свой код. Покажи нам как ты написал di контейнер. Ну или перни "я никому ничего не обязан" и съеби в закат.
У меня есть таблица A, у нее есть поле entity_id, которое может указывать на строку таблицы B либо на строку таблицы C. Какой тип выбрать? Хочется что бы он хранил еще и тип таблицы на которую он указывает, B или С.
>>2741508 >Хочется что бы он хранил еще и тип таблицы на которую он указывает, B или С. Так не делается. Одна колонка - один внешний ключ из одной таблицы.
>Какой тип выбрать? Хочется что бы он хранил еще и Так не делается. Выбираешь обычный тип "число" или "строка" и пишешь туда значение. Даже если ты туда как-то вклячишь "тип", то внутри самого запроса он будет для тебя бесполезен т.к. динамически задать имя таблицы нельзя.
Думаю что ты уже и сам понял что сделать джойн с твоей entity у тебя не получается. И ни одна орм с таким работать не будет. Вот тебе пример нормальной схемы с типом. Примерно так оно все и делается. Рекомендую хотя бы в википедии почитать про реляционные базы и нормализацию данных.
>>2741615 Уверен почти где то возможность так сделать есть, хоть БД и выглядят убожеством из 50х годов.
>Думаю что ты уже и сам понял что сделать джойн с твоей entity у тебя не получается. Возможно с точки зрения стандарта SQL не получится, но я проблем не вижу, сделать вилку, если тип B то выбрать такие поля из таблицы B, если тип C то выбрать другие поля, в поле A.entity_id.TYPE вернуть "B" или "C"
>>2741637 >Уверен почти где то возможность так сделать есть, хоть БД и выглядят убожеством из 50х годов. Тебе ни одна современная nosql база не даст такую хуйню сделать. Проблема не в хранении, запихать ты можешь куда угодно что угодно. Проблема в эффективном получении этих данных.
>Возможно с точки зрения стандарта SQL не получится, но я проблем не вижу, сделать вилку С точки зрения стандарта SQL ты пользуешься реляционной базой и хранишь реляционные данные. С твоим подходом тебе на каждую строку в таблице нужно сделать действие по извлечению "типа" и подстановке его в запрос. Тебе нужна будет одна строчка, а придется проверить весь миллион. Каждый раз. Я уж не говорю что после того как ты нашел тип тебе нужно таблицу заджойнить. У половины строк тип B - джойним B, а у одной строки тип С - джойним С. Ко всем строкам. И к строкам типа B тоже, лол.
Короче. Очевидно что у тебя ошибка в схеме и ты занимаешься ерундой. Как ты и написал реляционным базам под полтинник лет и все проблемы давно обсосаны и решены. Давай рассказывай что ты пытаешься сделать сто пудово очередной EAV для товаров
>>2741679 Не понимаю почему ты думаешь что это будет точно неэффективно, это можно было бы представить внутренне как entity_b_id, entity_c_id с правилом что только один из них может быть не NULL.
Анонушка, а сколько там моделей и URL? Если там 2-3 модели, то вряд ли это настоящий бекенд. А ТЗ на 40 страниц может быть, чтобы проверить твою внимательность и усердие.
Это важные принципы, но тебе надо не заучивать определения, а думать чуть-чуть глубже. Почему мы должны применять эти принципы? Какую выгоду они дают? Если ты инженер, то ты должен уметь обосновать любое решение: почему лучше делать так, а не иначе (а не отвечать "потому, что так написано в учебнике").
KISS говорит о том, что не надо проектировать какую-то сложную систему, когда можно написать простой код. Да, может быть этот код будет не так эффективен и не так расширяем, но зато твой коллега прочтет его за пару минут и легко поймет, как он работает, легко отредактирует и не допустит ошибки из-за непонимания. Мы экономим рабочее время на понимание кода и на исправление багов.
Соответственно, если можно использовать стандартную библиотеку, то лучше ее и использовать, а не городить велосипед, пусть он даже и лучше и быстрее на 50%.
DRY это очень важный принцип. Если ты дублируешь код 2 или более раз, то это очень плохо. Во-первых, при чтении кода коллеге придется читать обе копии и проверять: а они точно одинаковые или чуть-чуть различаются? Во-вторых, при редактировании надо внести изменения во все копии, и очень легко забыть это сделать или внести разные измненения. Дублирование кода это приглашение для проблем в будущем.
Вот тут звучит неправдоподобно. Никто через ORM не получает больше нескольких сотен сущностей, значит памяти там много потратиться ну вообще никак не может. Да и вообще, веб-скрипты много памяти не потребляют, ну типичная цифра от 5 до 50 мегабайт, и я не понимаю, зачем при таких смешных цифрах что-то экономить.
> Например ну никто в нормальной конторе не пишет фронтенд на бэкенде, отсюда тот же symfony/form с твигом, авторизаций, говновалидациями и горой зависимостей нахуй не нужны.
Какую ты глупость сейчас написал. Ты, вместо того, чтобы использовать готовые библиотеки валидации, сделал убогую самоделку без тестов и документации на JS, и делаешь валидацию только на клиенте?
Ну и твое SPA годится только для админок, морду сайта все равно надо делать на твиге, а не на тяжелых тормозных JS фреймворках.
Это похоже на "наследование таблиц", и там есть 3 паттерна, single table inheritance, class table inheritance и еще какой-то table inheritance.
Один из вариантов решения - сделать 2 поля, b_id и c_id и добавить ограничение CHECK, запрещающее ставить оба поля. Одно поле сделать нельзя, так как не получится прописать внешний ключ.
>>2741843 >Не понимаю почему ты думаешь что это будет точно неэффективно Я телепат нахуй. Хули тут думать? Сделай эксплейн запроса и увидишь.
>это можно было бы представить внутренне как entity_b_id, entity_c_id с правилом что только один из них может быть не NULL Ага. Можно еще дохуя всего сделать. Это называется "нормализация данных". Умные люди придумали как правильно хранить данные в реляционном виде чтобы они были связаны, не противоречили друг другу и чтобы ты не городил хуйни.
Ну в общем-то дальше говорить не о чем. Сделать так как тебе захотелось у тебя не получится, тут спорить не о чем - это просто невозможно. Ты либо расскажешь что пытаешься сделать (по прежнему ставлю сотку что пытаешься запихнуть в базу свойства товаров) и тебе расскажут как это правильно делается. Либо ты пойдешь долго и мучительно искать в гугле то же самое.
>>2741883 >а что это? Обычный сервис. Ты же не называешь "конфиг" паттерном. Есть SOLID принцип DIP "принцип инверсии зависимостей". Если коротко, то он про то что твой код должен зависеть интерфейсов. Есть паттерн DI "dependency injection (инъекция зависимостей)". Он про то что зависимости нужно создавать снаружи твоего кода и передавать внутрь уже готовыми. И наконец есть "сервис" DIC "dependency injection container". У него по сути всего пара методов "get" и "has" и он может создать абсолютно любой объект в твоем приложении и в соответствии с паттерном DI и принципом DIP передать в этот объект все его зависимости.
Короче, весь смысл "паттерна" это передавать в конструктор или метод готовые объекты. К тому как устроен внутри DI контейнер это никакого отношения не имеет. Бля, да это любому миддлу очевидно, потому что сам контейнер спрятан за интерфейсом. Какая нахуй разница как он работает. Просто очередное доказательство того что этот >>2741333 баран просто пишет знакомые слова, совершенно не понимая их смысла.
>>2741941 >Если ты не будешь объяснять людям про DRY, то они будут дублировать код и получать проблемы из-за этого. А если не будешь им объяснять что нужно снимать штаны когда писоешь, то они будут ссать прямо в штаны?
Пчел. Это называется трюизм - общеизвестная избитая хуйня. Да еще и без конкретного определения и способа измерения.
>>2741940 >KISS говорит о том, что не надо проектировать какую-то сложную систему, когда можно написать простой код. Сложность системы ты так примерно прочувствовал? Определение "простого кода" нам подгонишь? В каких единицах измеряется "простота кода"? В прикинутых к носу хуях?
>Да, может быть этот код будет не так эффективен и не так расширяем Как померял "расширяемость" кода? Почему простота уменьшает расширяемость? Как простота уменьшает эффективность (каво блядь)? Создание вменяемого интерфейса это упрощение или усложнение кода?
>DRY это очень важный принцип. Если ты дублируешь код 2 или более раз, то это очень плохо. Во-первых, при чтении кода коллеге придется читать обе копии Тут я сразу подахуел. Какие еще нахуй копии? Как такая копия вообще может возникнуть? Типа какой-то еблан скопировал класс и написал "у нас теперь два таких, не забудьте менять оба одновременно"? Более высосанного из пальца примера не придумать. Про два раза тоже хуй пойми откуда ты взял. Я например слышал про https://en.wikipedia.org/wiki/Rule_of_three_(computer_programming) .
На вопросы можешь не отвечать - они риторические. Просто хотел показать что ты на самом деле нихуя не объяснил. Твой DRY будет бесполезной (а может и вредной) хуйней до тех пор пока в его определении не будет конкретно прописано: какие корабли, сколько истребителей сколько повторений, сколько строк можно повторять, как рефакторить: когда извлечение в метод, когда в класс? Про KISS вообще ничего говорить не хочу - максимально абстрактная обтекаемая хуйня, под которую можно что угодно подтянуть.
Гора кривых костылей, лишь бы твиг не изучать. Это никак не отменяет того факта, что у тебя будет грузиться куча тяжелого JS и первые несколько секунд страница не будет ни на что реагировать.
> Сложность системы ты так примерно прочувствовал? Определение "простого кода" нам подгонишь? В каких единицах измеряется "простота кода"?
Ты даешь дизайнеру задачу нарисовать современный, лаконичный и продающий дизайн. В чем ты собрался его измерять? Можно я просто в пейнте за 5 мин набросаю и заберу деньги?
Ты демонстрируешь неопытность и отсутствие знаний. Часто есть простое, но частное или сложное, но более общее решение задачи.
Пример: надо сделать попап для логина. Ты можешь сделать быстро простой попап, но он будет использоваться только для логина. Или же ты можешь сделать универсальную библиотеку для создания любых попапов, но она будет сложнее.
Или тебе надо повесить баннер. Ты можешь его просто по-быстрому воткнуть в шаблон, а можешь спроектировать систему управления баннерами, а можешь пойти еще дальше и сделать систему блоков, которая позволит на любую страницу поместить любой блок, не только баннер.
Или тебе надо преобразовать товар в JSON. Ты можешь написать примитивный код, а можешь библиотеку для сериализации любых сущностей в JSON.
И так далее. Странно, что ты этого не знаешь. Я таких примеров могу привести множество.
Элементарно. Допустим, тебе дали задачу сделать, чтобы у пользователей с рейтингом более 5000 был доступ к премиум-функции. Ты в нескольких местах кода прописываешь
если рейтинг > 5000 то показать ссылку
если рейтинг > 5000 то показать блок сбоку
...
Это и есть копирование кода, и оно тебе аукнется когда тебя попросят поменять условия определения привилегированных пользователей.
Такое ощущение, что ты пишешь бессмысленные вещи просто ради спора. Почему ты решил что "копия" это когда копируешь класс целиком?
> Твой DRY будет бесполезной (а может и вредной) хуйней
Нет. Люди не рождаются с пониманием, как должен правильно выглядеть код. Правила помогают им заметить проблемы и сделать выбор того или иного варианта. Мы заставляем их думать о качестве кода и о его будущей поддержке.
Инженер не должен выбирать решения наобум (как ты предлагаешь делать), он должен сравнивать плюсы и минусы. Правила (точнее, гайдлайны) помогают это делать.
А по твой логике, никаких правил не нужно (раз мы не можем точно указать, сколько символов можно скопировать), и пусть все пишут как хотят. Твой подход приведет к тому, что разработчики будут писать код, который будет требовать больше времени на внесение изменений и увеличивать вероятность возникновения багов при внесении изменений.
Я не могу тебе дать количество символов, но уверен, что если у тебя например, в проекте 10% оригинального кода и 90% это копии кода, то это однозначно плохо, так как каждое внесение изменений требует в среднем в 10 раз больше действий. Этот мысленный эксперимент показывает, что соблюдение принципа DRY может влиять на затраты на разработку. Это не какой-то миф, а самая что ни на есть реальность.
Гайдлайны применяются не только в разработке, их подобие есть в дизайне, архитектуре, музыке, итд.
"Вероятность возникновения бага при внесении изменений" или "затраты времени на понимание логики работы кода" это объективные показатели, которые можно и теоретически рассчитать, и практически оценить (правда, никому неинтересно это, делать, так что можешь этим заняться).
Предполагается, что при следовании гайдлайнам эти показатели будут лучше, чем при их отсутствии.
В пользу гайдлайнов говорит опыт развития программирования и других творческих видов деятельности, а что ты можешь сказать в пользу своей позиции? Просто тебе так кажется? Я не вижу никаких аргументов в твоем посте. Я в защиту принципа DRY привел конкретные последствия, которые будут, если в проекте он нарушается.
Покажи мне SPA сайт, у которого весь JS евсит 35 Кб. Что попусту спорить. Или покажи SPA сайт, который нравится тебе, а я скажу, сколько на нем весит JS.
> А если не будешь им объяснять что нужно снимать штаны когда писоешь
Вот ты далек от жизни, ей богу. Людей в детстве, представь себе, учат, как надо писать, как надо кушать и другим очевидным взрослому человеку вещам. И не только этому. У тебя наверно детей никогда не было, вот ты и не знаешь.
Программист без опыта тот же ребенок, если подумать.
>>2742136 >Инженер не должен выбирать решения наобум (как ты предлагаешь делать), он должен сравнивать плюсы и минусы. Правила (точнее, гайдлайны) помогают это делать. Я тебе только что показал что DRY это не правило. И не гайдлайн. Как ему следовать? Каждые две повторяющиеся строки выносить в отдельную функцию? В отдельный объект? Щас ты начнешь телегу про то что нужно "пользоваться здравым смыслом" и делать все на чуечке. Но пользы для начинающего программиста в этом ноль.
>Гайдлайны >пользу гайдлайнов >Вероятность возникновения бага Пошел хуйню молоть. Что конкретно из твоего потока сознания должен понять начинающий программист? "Нормально делай - нормально будет". Никакой конкретики. Ну кароч сложно не делай, а делай не сложно. Как это "не сложно"? Да хуй его знает.
>а что ты можешь сказать в пользу своей позиции? Ты походу что-то выдумал себе про мою позицию. Я тебе русским языком написал, что правила должны быть конкретными, а не расплывчатой хуйней. А ты с какого-то хуя решил что я за то что никаких правил вообще нет.
Для начинающего пхп программиста: 1) Поставить phpcs https://github.com/squizlabs/PHP_CodeSniffer . И настроить в шторме чтобы он постоянно сканировал код и показывал ошибки. От замечательно проконтролирует и формат и такие штуки как количество параметров в функции и цикломатическую сложность.
Все что требуется от самого программиста - тщательно исправлять все подсвеченные косяки. Чтобы шторм в каждом файле показывал зеленую галочку. Все. Это будет гораздо полезнее чем бесполезный бубнеж обтекаемыми фразами за все хорошее.
>>2742140 То есть если бы тебе в детстве не показали что штаны надо снимать, ты бы всю жизнь сидел в обоссаных штанах? Или вывел бы теорию обоссанных штанов? В штаны не нужно ссать, это не удобно, воняет и все пачкает. Необходимо ссать так чтобы штаны воняли как можно меньше. Бля получилось вполне конкретное правило. Есть метрика "вонь штанов" предложен способ решения проблемы "ссать так чтобы вони было меньше". У меня просто такую абстрактную невнятную хуйню как KISS не получается выдумать.
>>2742506 А вот phpstan я не рекомендую использовать, особенно с пхп 8+. У них там питзда с багами https://github.com/phpstan/phpstan/issues Чтоб ты понимал у симфони на 266 пулл реквестов 575 открытых issue. А в phpstan на 9! пулл реквестов 872 открытых и 5к закрытых. При этом размер и сложность проектов просто слон и моська. И это тулза, которая должна проверять правильность чужого кода. Просто пиздец.
>>2742544 Очевидно что любой сайт с контентом будет весить больше 35кб, ведь 35кб это оверхед от nuxt.js на клиенте, советую тебе, прежде чем огрызаться, посидеть в readonly, почитать что нибудь умное, поэкспериментировать с различными фреймворками, например собери минимальную страницу на nuxt, замерь размер и убедишься в моей правоте.
>>2742657 >например собери минимальную страницу на nuxt Да чет как-то не хочется. Если даже чучело, которое в этой хуйне шарит и эту хуйню пропагандирует, не в состоянии высрать минимальный перфоманс чек. То мне эта поебень тем более не нужна.
>>2687463 (OP) Сколько по времени займёт вкат в битрикс, если заниматься по часа 4 в день? Уровень знаний примерно на могу что-нибудь написюнькать на ларавель, типо блога.
>>2742685 Мне хватило 20 часов примерно, потом пошел на работу там уже всему научили, знал только что есть php_init.php и как инфоблоки создавать в админке.
Понятно, просто привести пример сайта ты не можешь. Ну не беда, я умею гуглить по запросу "examples nuxt js sites". Возьмем сайт https://tochka.com/ как пример. При загрузке страницы там грузится 1,43 Мб (после распаковки получается 3,1 Мб). Что-то не похоже на твои 35 Кб.
Ну и конечно куда же без веб-шрифтов, там грузится 454 Кб шрифтов, до загрузки которых текст не отображается.
Заметь, что это сайт, на который выделен значительный бюджет, и который наверняка оптимизирован. Что творится с низкбюджетными сайтами, можно только гадать.
>>2742855 Ты просто тупой, именно вообще не понимаешь не связей, не причин, не понимаешь как что то доказать или опровергнуть, зачем то начал какие то json приводить в пример, шрифты, это все можно было допустить и на jquery.
Точно так же работают и принципы/гайдлайны вроде DRY или SOLID.
PHPCs сработает только на явную дичь (огромные блоки кода скопированы) и не заметит приведенный мной пример ошибки, где несколько раз копируется условие "если у пользователя рейтинг > 5000". Хотя там дублируется всего 1 строка, это нарушение принципа DRY.
> Щас ты начнешь телегу про то что нужно "пользоваться здравым смыслом" и делать все на чуечке. Но пользы для начинающего программиста в этом ноль.
Я уже написал, для начинающего программиста польза в том, что он начинает обращать внимание на вещи, о которых до этого не задумывался. Программисты не рождаются с пониманием того, что дублировать код плохо.
Плюс, знание принципа упрощает коммуникацию. Ты можешь просто написать в код-ревью "DRY" вместо абзаца текста о том, что плохо дублировать бизнес-логику. По твоей логике, видимо, надо писать абзац текста вместо одного слова.
> Ну кароч сложно не делай, а делай не сложно. Как это "не сложно"?
Что ты дурачка строишь, я привел конкретные примеры выше в постах.
Ты пытаешься все формализовать, но это плохо. Вот, например, в каких-то компаниях есть требование писать phpDoc к каждому публичному методу. И они к функции countUsers, чтобы пройти проверку, пишут комментарий counts users (phpstorm, кстати, сам любит вставлять такие бесполезные сгенерированные комментарии phpdoc и захламлять код. Не знаю, какой идиот туда добавил эту функцию). Как ты формализуешь правило "комментировать функции, но не писать бесполезные комментарии"?
>>2742925 Нормально, уже управляю небольшой командой, если что то конкретное хочешь узнать то спрашивай, 150к зп пока что, но удаленка и много можно чилить.
>>2743084 Добавлю. Я тоже Laravel немного знал, думаю блог мог бы написать, но никогда не осиливал до конца, поэтому за 2 года такой прогресс, там люди еще более скромного уровня приходили.
>>2742873 Бля, клоун. Ты этот гайдлайн читал вообще? >Always give people multiple ways to interact with your app >making sure that the objects they need to use are within their field of view >if your app is running in a Full Space, you may need to request access to information about a person’s head pose Это конкретные правила. По этому гайдлайну любая обезъяна может сделать проверку. А у тебя вместо гайдлайна "ну кароч не делай сложно". Ну и не дублируй код. Но вот этот можно дублировать. А вот бизнес логику нельзя. Что такое бизнес логика и как её отличить? Нууу это сложно. В то же время у дизайнеров: делай это, делай вот так, используй это, это не делай, это можно не делать, это хорошо бы сделать если есть время, данные для этого возьми отсюда.
>PHPCs сработает только на явную дичь (огромные блоки кода скопированы) Phpcs сработает на то на что ты его настроишь. Есть куча стандартов типа такого https://github.com/slevomat/coding-standard
>и не заметит приведенный мной пример ошибки, где несколько раз копируется условие "если у пользователя рейтинг > 5000" Из этого следует что все условия должны быть вынесены в методы? В классы? Есть такой паттерн: спецификация. Все условия должны быть вынесены в спецификации? Вывод блядь из этого какой?
>Программисты не рождаются с пониманием того, что дублировать код плохо. Это очевидная вещь. Опроси сто человек и ни один тебе не скажет: да дублировать код это заебись, функции для ебланов, сру в прод.
>Ты пытаешься все формализовать, но это плохо. Действительно. Формализация убила промышленность, формализация убила юриспруденцию, формализация прямо сейчас рушит жизни. И только в программировании есть отдушина в виде "принципов" которые можно трактовать как тебе захочется и объявлять один и тот же код то простым, то сложным.
>Не знаю, какой идиот туда добавил эту функцию Вкатун, даю инфу: в большей части кода написанного на пхп не указано типов. Вообще. В шапке этого треда гайд, в котором не указано ни одного типа.
подскажите как open server запустить, вот такую ошибку выдаёт, а после того как закрываю окно программа закрывается и пропадает из панели задач. в антивируснике выключил защиту в реальном времени. по поводу файла hosts, его раньше получалось показать командой attrib.exe -s -r -h -a C:\Windows\system32\drivers\etc\hosts сейчас даже так не выходит. ещё почему то после начала всех моих манипуляций винда создала аккаунт администратора отдельно от того которым я пользовался всё время. подскажите что делать я тупой
>>2745271 >>2745494 Я хотел узнать, что в других компаниях используют - у нас ебанутый тимлид написал свою хуйню для докера, которая нормально не рабоатет.
Это вообще норм, что пикрил задачка показалась мне ОЧЕНЬ (ОЧЕНЬ!) сложной? Кому-то она дается легко?
Потратил на нее ровно сути, и то не уверен сейчас, что решил без ошибок.
Прошу посмотреть кого-нибудь, чуть не сошел с ума, пока думал. Похоже, программирование - ну совсем не мое. Надо обладать математическим складом ума, чем, как я выяснил о себе, не одарен.
>>2746562 1) Это ошибка составителя "учебника". На самом деле тут две задачи: одна по теории алгоритмов и математике, собственно создание алгоритма, вторая по имплементации этого алгоритма на пхп.
Очевидно что теории алгоритмов этот "учебник" не учит. Поэтому автор должен был предоставить алгоритм в понятной форме. В 99% случаев программист не придумывает алгоритм, этот алгоритм либо давно придумали за него, либо его структура прописана в тз и это дело бизнеса.
Задача о рюкзаке это вообще прикол не каждому математику доступный. Компании, которые занимаются решением этой задачи в области размещения транзисторов на чипе или в области загрузки груза в контейнеры стоят миллиарды долларов. По сути именно софт для проектирования чипов это то что охраняет весь авианесущий флот США.
2) То что ты написал это не читаемая хуйня. Проще свой код написать >>2746621 , чем понять что тут происходит. Начиная с однобуквенного именования и заканчивая вычислениями в условии. Ты вообще забыл что решением задачи должна быть функция итд. Где понятийный аппарат? "Деньги", "купюры", "количество купюр", "количество доступных купюр". Нихуя нет. Вот так примерно это должно выглядеть: https://3v4l.org/O07Xf . Перевод терминов может быть разный, но сами термины должны быть обозначены.
Запомни главное: ты пишешь код в первую очередь чтобы его потом читать. Если ты не можешь прочитать и понять что происходит, то этот код все равно будет переписан и выброшен.
>>2746562 Где то услышал фразу что программирование не про алгоритмы, а про структуры данных и их преобразование, и мне кажется не стоит забывать их важность, твоя структура данных сложная, из за этого и алгоритм сложный, надо было упростить под алгоритм.
Но в учебнике разрешено использовать "жадный" алгоритм, то есть просто брать купюры начиная с самой старшей до младшей и вычислять их количество с помощью деления. По типу:
- надо выдать 13000 - сначала берем 2 купюры по 5000, остается 3000 - потом берем 1 купюру по 2000, остается 1000 - потом берем купюру по 1000, все, сумма выдана
Соответственно, код получается очень простой, просто 1 цикл делаешь по номиналам купюр и все. Ты же, видимо, решил попробовать решить сложный вариант.
Замечания по коду:
- define устарел, используй const:
const X = 5;
- код трудновато читать. В таком сложном коде нужно было в комментарии написать либо название алгоритма (если он где-то описан), либо описать, зачем нужны массивы $F, $B. А еще лучше - дать им понятные названия. Также, прокомментировать логику алгоритма (зачем мы делаем действия в цикле). Конечно, кратко и понятно описать алгоритм нелегко, но зато ты сможешь прокачать навык изложения мыслей.
Например: "в массиве $F[$sum] указано, каким количеством купюр можно выдать сумму $sum"
- $F, $B, $m очень плохие названия, так как непонятно, что они значат
- вместо этих 2 команд: $F= []; $F[0] = 0 массив можно было создать и заполнить одной командой: $F = [0]; Аналогично для массива $B.
- для BIG_INT в PHP уже есть константа PHP_INT_MAX - это максимальное целое число типа int. Для чисел float есть константа INF, обозначающая бесконечность.
Похоже, это взятый откуда-то алгоритм, к которому прикручено ограничение на количество купюр. Вроде как он выглядит верно, но тут надо подумать, а точно ли он в любой ситуации сможет подобрать нужный набор купюр? Подумаю над этим позже.
Структура данных у него не сложная: один массив, где хранится сколько купюр нужно для выдачи суммы, и второй массив, где хранится какие именно купюры нужны.
>>2748485 Пчел. Все что нужно знать про эту дрисню видно сразу как откроешо доку https://www.workerman.net/doc/workerman/ Вместо документации иероглифы. Со своими проблемами можешь писать сразу сидзеньпыне. Какие вообще могут быть вопросы?
Работяги, нужен совет. Меня посадили за сайт написанный пять лет назад на Битриксе, где половина страниц не открывалась. Кое как я его восстановил, но проблема в том что я больше не хочу разбираться в этом говне, и решил просто его переписать. Так будет быстрее чем Битрикс учить. Благо сайт не большой. Пару форм, афиша, новостной блок, галерея, алминка итп. Вопрос на чем сделать фронт? Сам я работал раньше на реакте. Но для этого сайта нужно сео. Склоняюсь в сторону ларавеля, но не знаю как он фронт выводит и целесообразная ли эта затея вообще?
>>2750610 На ларавеле бекэнд генерится за час если есть конкретный список че генерить. Фронт ларавель выводит как все - высирает html. Гарантирую что больше ебли будет с натягиванием дизайна.
>>2750610 >Пару форм, афиша, новостной блок, галерея, алминка итп Это все стандартные компоненты битрикса, в админке сео настраивается для каждого поста новостей по гибким правилам и для всего сайта в целом, есть редактор новостей итд. Тебе проще битрикс изучить, там все просто.
А что еще ему может быть нужно для сайта с афишей и новостным блоком? Плюс, пишут, что мода на микросервисы уже закончилась, сейчас пишут модулиты (если я не отстал конечно).
>>2752795 >питон гавно Я каждый день молюсь Аллаху за то что он отвел этих курсопидарасов от пхп. Все эти миллионы пицценосцев, которые вкатываются в айти учат этот ебаный бесполезный питон, на котором вакансий хуй да нихуя, и не демпенгуют пхп рынок. Грызутся за эти крошки и не лезут к нам за стол. Слава Аллаху за то что отвел глаза тупорылым хуесосам из скиллбокс.
Аноны, решил задачу на ООП из учебника про ООО ВЕКТОР и антикризисные меры Код: https://onlinephp.io/c/f4ce8 Укажите ошибки, предложите свои варианты как можно было бы написать.
>>2753264 Чтобы на битриксе формочки клепать нужно иметь стекломой вместо мозгов. Потому что за те же формочки литерали на любой другой хуйне тебе заплатят больше.
>>2753267 >Потому что за те же формочки литерали на любой другой хуйне тебе заплатят больше. Ну показывай давай соотношение вакансий, требования и количество откликов для битрикса и "любой другой хуйни"
>>2753273 Сынок, когда пойдешь на свой первую работу молись чтобы это не был битрикс. Это как клеймо, тавро, которое означает "я хуже других, я не осилил доку ларавеля, я в говне".
Еще насупит тот день, когда ты будешь думать не вычеркнуть ли битрикс из своего резюме пока не поздно. Потому что любой пхп программист, который по слабоумию или ради острых ощущений, захочет пойти на битрикс вакансию будет принят с радостью, вперед любого битрикс скота. А вот в обратную сторону нет.
Чтобы вылезти из битрикс болота тебе годами придется доказывать что ты не баран. Что не хуже других, что это просто ошибки молодости. А вылезти захочется. Месяцами, годами смотреть на этот говнокод доведет любого. Как бы ты лично не старался писать нормальный код это гнилое говноподелие всегда будет висеть вонючим баребухом над твоей головой и будет отравлять все.
>>2753256 >А в пхп не массивы а хеш мапы. По массив по определению. Твое определение настоящего массива к этому не относится. В PHP есть Spl классы, это то что тебе нужно.
>>2753267 Только в битриксе программирование это установка плагинов через админку.
>>2753307 Битрикс это то, что рынок требует от пхп программиста. Эти навороченные фреймворки нужны только самим программистам чтобы выебываться между собой и дрочить при мысли какой он классный, как же ему кайфово писать код, но это противоестественно.
>>2753914 >Битрикс это то, что рынок требует от пхп программиста Рынок прямо сейчас требует ассенизаторов. Это повод становиться ассенизатором? А если рынок от тебя потребует пойти на трассу очком торговать - это повод идти торговать?
>Эти навороченные фреймворки нужны только самим программистам чтобы выебываться между собой и дрочить при мысли какой он классный Ты это про ларавель? Про ларавель? Про тот самый ларавель, который написан так чтобы самая конченная макака создала на нем сайт с нуля за один час?
Я поражаюсь тупости некоторых людей. Битрикс говно не потому что это не "фреймворк" и не потому что это "CMS" и не потому что там надо плагины ставить и не потому что он сложный или простой. Битрикс говно потому что он написан студентами за еду. Людьми, которые нихуя не понимают и не знают, много лет назад. Это не шутка и не преувеличение, это факт.
Я не случайно привел пример ассенизатора. Разрабатывая под битрикс ты всегда в положении человека, который выносит мусор за шумной веселой компанией. Эти люди заработали себе на пиво, сводили своих девчонок в кино и давно сделали карьеру подальше от того жуткого говна которое они когда-то написали с похмелья. А тебе с последствиями их веселья жить всегда. Это теперь твоя среда обитания. Ты можешь пытаться замазать их штукатуркой, но тебе постоянно будут напоминать как кому-то было похуй когда он писал системы от которых у тебя горит очко.
>>2753976 >Разрабатывая под битрикс ты всегда в положении человека, который выносит мусор за шумной веселой компанией. > А тебе с последствиями их веселья жить всегда. Это теперь твоя среда обитания. Но в этой мусорке вполне приличные объедки бывают. Все еще лучше, чем увожаемым заводчинином на валы наматываться.
>>2753705 Отстраненные примеры ничего не доказывают. Что такое треугольник или квадрат известно, что такое массив тоже, в PHP array(1,2,3) является массивом.
>>2753976 Я не вижу разницы между Symfony, Laravel, Bitrix итд. Очевидно что можно одинаково быстро, спокойно программировать в процедурном стиле, в Java-Like OOP, в функциональном, те кто видят разницу просто повелись на маркетинговые разводочки, или хотят себя приписать к какой то группе, типо вот я пишу на yii2 и вот это самый топ не то что другие фреймворки. Везде все по разному, объективных критериев для сравнения нет ни у кого, все сравнения и обсуждения пустой треп не имеющий смысла.
>>2754152 >Очевидно что можно одинаково быстро, спокойно программировать в процедурном стиле, в Java-Like OOP, в функциональном Че ты несешь вообще? На пхп уже лет пятнадцать как пишут исключительно в ооп стиле. Бля, да в пхп менеджер пакетов работает по конвенции файл = класс.
>те кто видят разницу просто повелись на маркетинговые разводочки Чучело, маркетинговые разводочки это как раз про Битрикс. Потому что он, внезапно, платный. И кал он потому что вместо бюджета на разработку все вбухали в бюджет на маркетинг. Какой вообще нахуй маркетнинг у опен сорс проэкта. Блядь я тупею уже только от того что эти вещи приходится объяснять.
>типо вот я пишу на yii2 и вот это самый топ не то что другие фреймворки Бред шизофреника. Все актуальные фреймворки сто лет как модульные. Никто не мешает тебе взять логгер, который ты считаешь "топ" и использовать в любом фреймворке. Или вообще использовать eloqent в symfony, или доктрину в yii. В slime так вообще можно выбрать даже di контейнер который нравится.
>Везде все по разному, объективных критериев для сравнения нет ни у кого, все сравнения и обсуждения пустой треп не имеющий смысла. Пердежь человека, который не знает нихуя. Если ты не понимаешь чем симфони от юи отличается нахуя ты что-то пишешь?
>>2754243 >На пхп уже лет пятнадцать как пишут исключительно в ооп стиле. Я не пишу.
>Чучело, маркетинговые разводочки это как раз про Битрикс. Потому что он, внезапно, платный. Я не плачу за него, мне все равно. Я говорю сейчас про пиар в среде программистов.
>Бред шизофреника. По твоему так никто не говорит?
>Все актуальные фреймворки сто лет как модульные. Никто не мешает тебе взять логгер, который ты считаешь "топ" и использовать в любом фреймворке. Тогда получится уже свой фреймворк, теряется одно из преимуществ выбора популярного фреймворка.
>Пердежь человека, который не знает нихуя. Если ты не понимаешь чем симфони от юи отличается нахуя ты что-то пишешь? Все я понимаю, поэтому и пишу, что подобные эмоциональные люди вроде тебя постоянно что то обсуждают, критикуют, только ничего объективного не говорят, не делают замеров сколько строк нужно на ту или иную задачу, не могут привести статистику где видна производительность работы программиста за разными фреймворками, просто пустой треп и много слов, иногда с оскорблениями как у тебя.
>>2754358 >Я не пишу. Не пишешь на пхп или не пишешь в ооп стиле? Мне даже интересно стало, это как вообще? А неймспейсы, а автолоадинг? Как с композером работать вообще? А главное нахуя? Профит от этого какой?
>Я говорю сейчас про пиар в среде программистов. На основе чего строить приложение решает не программист, а архитектор или CTO.
>Тогда получится уже свой фреймворк, теряется одно из преимуществ выбора популярного фреймворка. Guzzle не часть фреймворка, и тем не менее он в 99% проектов. Фреймворк это всего-лишь набор инструментов. Все эти инструменты давно стандартизированы и взаимозаменяемы. И вообще "фреймоврк" это один из десятков пакетов в менеджере зависимостей.
>Все я понимаю, поэтому и пишу, что подобные эмоциональные люди вроде тебя постоянно что то обсуждают, критикуют, только ничего объективного не говорят Бля, а что я тебе должен расписать всю историю Yii2 в посте на дваче? Лекцию тебе прочитать почему даже автор yii, нормальный мужик кста, поперхнется сказать "это самый топ"? Я ебал все это писать, если тебе действительно интересно заходи в дискорд и я тебе расскажу https://discord.gg/9ezsj6tPVy
>>2754567 >Не пишешь на пхп или не пишешь в ооп стиле? Мне даже интересно стало, это как вообще? А неймспейсы, а автолоадинг? Как с композером работать вообще? А главное нахуя? Профит от этого какой? Мне неймспейсы не нужны, автолоадинг тоже, одним require можно подключить вообще все.
>Фреймворк это всего-лишь набор инструментов. Все так, конкретный фреймворк это набор конкретных инструментов.
>Бля, а что я тебе должен расписать всю историю Yii2 в посте на дваче? История какого либо проекта ничего не покажет, ты видимо в принципе не понимаешь как доказать эффективность какого то решения.
>>2754572 >одним require можно подключить вообще все А что "все"? Я просто даже не представляю как у тебя код структурирован. Сколько функция на файл? В других языках есть модули, пакеты. Вызов функции выглядит как UserPackage.getAge(UserPackage.UserData). В пхп же нихуя нет. А если функция одинаково называется? А как понять эта функция к чему относится?
>История какого либо проекта ничего не покажет, ты видимо в принципе не понимаешь как доказать эффективность какого то решения. Бля, загугли что такое RAD.
>Бля, загугли что такое RAD. Мне тогда расскажут как измерить эффективность, и покажут статистику по разным инструментам? Нет, так зачем ты это пишешь? У тебя уже какая то деформация мышления произошла, у тебя оно отсутствует, ты оперируешь ключевыми словами, думая что они сами по себе все доказывают.
>>2754647 >Все классы и функции. Все пять? Или сколько? Вопросы только множатся. >как у тебя код структурирован. Сколько функция на файл? В других языках есть модули, пакеты. Вызов функции выглядит как UserPackage.getAge(UserPackage.UserData). В пхп же нихуя нет. А если функция одинаково называется? А как понять эта функция к чему относится?
>Мне тогда расскажут как измерить эффективность, и покажут статистику по разным инструментам? Нет, так зачем ты это пишешь? Я тебе писал метрику: >тот самый ларавель, который написан так чтобы самая конченная макака создала на нем сайт с нуля за один час Можно сайт за пол часа. Что тебе эта метрика дала? Причем тут битрикс и функциональный подход?
>>2754688 >Все пять? Или сколько? Вопросы только множатся. Открой любой код на С и посмотри, там не будет неймспейсов и загрузчиков классов.
>тот самый ларавель, который написан так чтобы самая конченная макака создала на нем сайт с нуля за один час Что такое конченная макака, что такое сайт? Один час ровно? Это очередные пустые слова, не вижу смысла дальше с тобой что то обсуждать, я уже свое мнение высказал, никаких цифр, никаких статистических данных у любителей поспорить о преимуществах Xframework над Yframework нет и не будет.
>>2754885 Я отлично знаю как пишется процедурный код. Я тебе даже пример привел. Я хочу понять как ТЫ пишешь процедурный код на ооп языке, в котором для этого просто нет инструментов.
>никаких цифр, никаких статистических данных у любителей поспорить о преимуществах Xframework над Yframework Это соломенное чучело, которое ты сам себе выдумал. Никто с тобой об этом не спорил. Я тебе уже раза три написал что никто не рассматривает фреймворк целиком, а выбирает нужные ему инструменты.
>Это очередные пустые слова, не вижу смысла дальше с тобой что то обсуждать Я уже довольно долго пытаюсь понять: а что ты вообще "обсуждаешь"? Ты пытаешься доказать что битрикс "не говно"? Как то слабо, ты этот кал вообще перестал упоминать. Ты пытаешься доказать что на пхп надо писать в процедурном стиле? Тоже слабо, я уже несколько постов безрезультатно пытаюсь вытянуть из тебя как именно ты это делаешь. Что ты обсуждаешь, макакен?
Отвечая на твой вопрос, да, хорошо, когда есть такая структура (не с точки зрения производительности - кому она нужна - а с точки ясности намерений разработчика и понятности кода), но видимо не очень сильно она нужна на практике. Я бы конечно проедпочел иметь такую структуру в распоряжении.
Да, в учебнике об этом не сказано, но желательно указывать типы у аргументов функций (не только array, а например, int, string, bool и тд), у возвращаемых значений и у полей класса:
public string $name;
public function count(array $x): int { ... }
Это сделает код надежнее и понятнее.
> if ($employees->isBoss === true) { > $result += $employees->getBossSalary(); > } else { > $result += $employees->getEmployeeSalary(); > } > } Эту логику правильнее поместить в класс Employee. Так как если тебе надо будет определить зарплату где-то еще, тебе придется копипастить эту логику. Эта логика должна быть в классе Employee.
> if ($employees->isBoss === true) { В такой ситуации можно писать if ($employee->isBoss), так как if как раз ожидает true или false и сравнение не нужно.
Функция array_map создает новый массив, пропуская каждый элемент исходного через функцию, и в $coffee получается массив из количеств выпитого каждым кофе.
Ты можешь возмутиться, как так, создавать целый массив ради подсчета суммы? Расточительно, память не резиновая. Тогда добро пожаловать в темный мир операции reduce. Используя array_reduce, ты можешь найти сумму без создания промежуточного массива, но эта функция настолько запутанная, что я по памяти не могу ее ни написать ни прочитать код с ней. Но, может, у тебя получится с помощью мануала.
Названия профессий надо бы сделать константами, а еще лучше с помощью Enum из PHP 8. Плюс в том, что тогда сразу видно, какие есть профессии, а при опечатке тебе PHP укажет на ошибку. Более того, Enum можно указать в тайп-хинте и сразу видно, какие значения можно передавать в функцию. Ну и вообще, когда есть выбор из нескольких вариантов, правильно использовать Enum или хотя бы константы. Есть только одна вещь лучше Enum - это ADT, но их пока что в PHP не завезли.
> getProfessionInDepartment Это можно было сделать через array_filter + анонимная функция.
> // Руководитель не производит отчетов, чертежей или стратегических исследований > // Руководитель пьет в 2 раза больше кофе > if ($isBoss === true) { > $this->documents = 0; > return $this->coffee = $coffee * 2; > }
Тут ошибка. При создании руководителя ты обнуляешь документы, а если у работника снять признак руководителя, то кто восстановить количество документов обратно? Не надо их трогать, и не надо менять кофе. Надо просто сделать функцию вроде getDocumentCount(), которая вернет 0, если у нас руководитель.
> return $this->baseRate + ($this->baseRate × 0.25); Можно было просто return $this->baseRate × 1.25;
> return 'Не является руководителем'; Это не очень правильно, так как вызывающий код скорее всего никак не обработает этот результат. В такой ситуации (программист ошибся и неправильно вызвал функцию) правильно выбросить исключение, которое аварийно завершит программу.
Список департаментов не надо копипастить несколько раз. Его нужно клонировать, сделав для этого функцию.
Антикризисная мера 1 сделана неудачно с точки зрения ООП и разделения ответственности. Ты должен разбить эту задачу на части и поместить те части, который явно входят в зону ответственности класса, в этот класс. А то, что относится к антикризисной логике, оставить в функции.
Например, ты не должен напрямую ковыряться в массиве $department->peopleInDepartment. Этот массив принадлежит объекту Department, и он им управляет. В идеале, его вообще стоит сделать private (сделай), чтобы у тебя не было соблазна в него лезть. Ты не должен лезть в него снаружи и что-то менять, а ты должен использовать для этого методы у Департамента, вроде:
- получить кол-во работников опр. профессии - отобрать работников опр. профессии - уволить переданных работников - получить руководителя - поменять руководителя
Ты должен сам подумать, какие именно методы сделать, но надо стараться их делать максимально общими и универсальными, а не заточенными под антикризисные меры. "поменять руководителя" это универсальный метод, он может много где пригодиться и его можно сделать. А "уволить 40% инженеров" это явно метод для решения конкретной задачи и его не надо помещать в Департамент.
То есть, подумай, какие операции можно делать над Департаментом и его работниками, и сделай нужные методы. А затем используй их для реализации антикризисных мер.
Это называется "инкапсуляция" - ты не лезешь внутрь объекта, а используешь методы для выполнения операций над ним. Если ты хочешь хорошо знать ООП, ты должен уметь проектировать, какие над объектом можно сделать операции и какие методы нужны. Собственно "понимание ООП" как раз и сводится к умению по описанию задачи выбрать классы, понять, какие у них нужны поля и методы. Те, кто хорошо знают ООП, проектируют удачную ООП модель, а кто плохо - неудачную, которой неудобно пользоваться, в которой сложно разобраться, легко ошибиться.
Я советую примерно такую логику:
- получить работников нужной профессии - отсортировать по рангу (usort) - взять первые N (array_slice) - уволить
Также, иногда тебе хочется указать, что в функцию нужно передать например массив Employee, а не просто любой массив. Используй комментарии phpDoc для этого.
В общем, антикризисные меры пока что никуда не годятся и их надо переделывать.
C довольно паршивый язык по современным меркам. Я бы не хотел на нем писать, так что не думаю, что его надо приводить в пример. А если ты возьмешь Go или Rust, то там будут модули.
>>2754955 >Я хочу понять как ТЫ пишешь процедурный код на ооп языке, в котором для этого просто нет инструментов. В PHP изначально не было классов, почти все расширения имеют процедурную версию. Можешь посмотреть очень старые проекты.
>Это соломенное чучело, которое ты сам себе выдумал. Никто с тобой об этом не спорил. Отлично, ты уже на пол пути к принятию правды. Тебе осталось понять, что означает отсутствие каких либо доказательств того что на Yframework сайт делается медленнее чем на Xframework. Почему никто не может дать объективную информацию о превосходстве ООП над процедурным стилем.
>>2755848 >Что такое современные мерки? Вот это современная мерка: https://www.rust-lang.org/ . Если язык не может то что может раст, то он доживает свои дни.
>Что такое паршивый язык по современным меркам Процедурный язык без модулей - паршивый язык по современным меркам.
>сколько баллов он должен недополучить что бы им считаться Думаю 50 из 100 в пикрелейтед топе это уже очень плохо.
>Почему никто не может дать объективную информацию о превосходстве ООП над процедурным стилем. А почему ты решил что твой стиль процедурный? Я уже какой пост подряд прошу тебя рассказать как ты пишешь код, показать. И ничего. Ты зачем-то приплетаешь C, какие-то "очень старые проекты" какого года? 2008? 2007? Пятнадцать лет назад?
>>2756188 >Вот это современная мерка: https://www.rust-lang.org/ . Если язык не может то что может раст, то он доживает свои дни. Что значит может? Это слишком обширно. Может ли хоть один язык собрать код на расте кроме него?
>Процедурный язык без модулей - паршивый язык по современным меркам. Нет, я хочу понять как определять паршивый ли язык или нет, или это все что нужно? Получается добавив в Си простейшие классы и модули он станет не паршивым?
>А почему ты решил что твой стиль процедурный? Потому что мой код не определяет классов и состоит лишь из процедур.
>Я уже какой пост подряд прошу тебя рассказать как ты пишешь код, показать. Не хочу, не понимаю как это относится к теме.
>>2755844 >В PHP изначально не было классов За что его заслуженно гнобят и за что он стабильно брал первое место в рейтинге худших языков.
>почти все расширения имеют процедурную версию Покажи мне "процедурную" версию guzzle, самого популярного "расширения".
>Отлично, ты уже на пол пути к принятию правды. Тебе осталось понять, что означает отсутствие каких либо доказательств того что на Yframework сайт делается медленнее чем на Xframework. Я тебе уже несколько раз писал, что современные фреймворки помогают создать сайт за считанные минуты. Любому вкатуну в этом треде очевидно что дело совсем не в скорости.
А чтобы понять в чем дело нужно знать какие задачи решает инструментарий фреймворка и с какой целью. А ты этого не знаешь. И поэтому тебе кажется что все вокруг одинаковое. В то время как все настолько разное, что вопрос места в иерархии даже не стоит. Это как сравнивать орбиты меркурия и сатурна и решать кто же ближе к солнцу.
>>2756212 >Покажи мне "процедурную" версию guzzle, самого популярного "расширения". curl
>Я тебе уже несколько раз писал, что современные фреймворки помогают создать сайт за считанные минуты. Любому вкатуну в этом треде очевидно что дело совсем не в скорости. Уже не за час, а за минуты? Быстро прогресс идет.
>А чтобы понять в чем дело нужно знать какие задачи решает инструментарий фреймворка и с какой целью. То есть из за того что я чего то не знаю, ты не можешь сказать почему существует весомая разница в разработке проекта на Laravel, Symfony, Bitrix итд? Если ты не понимаешь насколько это глупо, то скажу прямо, это так не работает, если у тебя есть объективные данные, то ты всегда их можешь предоставить.
>>2756211 >Что значит может? Это слишком обширно. Нет не обширно. Это как раз вполне конкретно. Все фичи раста четко прописаны в документации. То что ТЫ их не знаешь не означает что это какой-то размытый критерий.
>Нет, я хочу понять как определять паршивый ли язык или нет, или это все что нужно? Получается добавив в Си простейшие классы и модули он станет не паршивым? Ты только что придумал C++, Objective-C и джаву.
>Потому что мой код не определяет классов и состоит лишь из процедур. Но сам этот волшебный код ты конечно не покажешь?
>>2756224 >Нет не обширно. Это как раз вполне конкретно. Это может быть конкретно в твоей голове, если ты говоришь про такие общие вещи, а имеешь виду что то более конкретное, то ты должен указывать сразу ссылку на список, жду его.
>Ты только что придумал C++, Objective-C и джаву. C++ и С несовместимы на более низких уровнях, Java от С далека максимально, взять хотя бы модель памяти.
>Но сам этот волшебный код ты конечно не покажешь? Нет. Дай угадаю, ты имеешь предположения о том что такой код нельзя писать на PHP, но сообщить не можешь, почему конкретно невозможно написать такой код, верно?
>То есть из за того что я чего то не знаю, ты не можешь сказать почему существует весомая разница в разработке проекта на Laravel, Symfony, Bitrix итд? Разработка проекта под один фреймворк это целая статья. Я уже говорил что писать столько текста не собираюсь и если тебе действительно интересно я готов рассказать голосом. Ты пукнул жидким и обмяк.
>>2756224 Кстати, ответь на вопрос все же, С с добавлением модулей и простых классов уже будет не паршивым языком? Вместе с препроцессором, отсутствием неймспейсов, ODR? Или все же он будет все таким же паршивым для тебя, и ты оперируешь лишь субъективными ощущениями не привязанными к реальности?
>>2756231 >Курл написан не на пхп. Какая разница? Расширение есть.
>Разработка проекта под один фреймворк это целая статья. Я уже говорил что писать столько текста не собираюсь и если тебе действительно интересно я готов рассказать голосом. Ты пукнул жидким и обмяк. Ну предоставь просто статистические данные на которые ты опираешься, не надо статьи.
Ну или, что бы тебе было проще, представляем что пишем под два и более фреймворка, способов измерения и определения производительности между разными наборами жду.
>>2756228 >Кстати, ответь на вопрос все же, С с добавлением модулей и простых классов уже будет не паршивым языком? Да. Будет менее паршивым чем был.
>>2756240 >Какая разница? Расширение есть. Ну есть? Какое это отношение к процедурному коду на пхп имеет отношение.
>Ну предоставь просто статистические данные на которые ты опираешься, не надо статьи. Статистические данные о том в чем отличие написания кода под симфони? Ты там совсем ебанулся?
>Ну или, что бы тебе было проще, представляем что пишем под два и более фреймворка, способов измерения и определения производительности между разными наборами жду. Один из фреймворков ларавель. Ты выполняешь несколько консольных команд и сайт готов. Ларавель победил. Легко с дураком разговаривать в его терминах.
>>2756249 >Да. Будет менее паршивым чем был. Что значит менее, должен был перестать вовсе, ты просто скажи будет паршивым да или нет?
>Ну есть? Какое это отношение к процедурному коду на пхп имеет отношение. Тем что не нужно работать с классами вовсе. Он же может быть представлен не как встроенные функции curl_init а как объект Curl.
>Статистические данные о том в чем отличие написания кода под симфони? Ты там совсем ебанулся? Именно так, или у тебя только глубоко субъективные выводы которые даже нельзя никак подтвердить?
>Один из фреймворков ларавель. Ты выполняешь несколько консольных команд и сайт готов. Ларавель победил. Легко с дураком разговаривать в его терминах. Что это за набор слов? Повторяю вопрос: Предоставь мне способ измерения производительности работы программиста на определенном наборе фреймворков, и дай определение производительности программиста. Производительность программиста = скорость выполнения работы по созданию сайта. Сайт очевидно тоже должен быть четко определен, какую именно работу будет выполнять программист. Данный вид работы должен быть повторим для других наборов фреймворков, что бы можно было сравнить итоговые результаты.
>>2756266 >Что значит менее А что значит "значит"? Хватит троллить тупостью.
>Тем что не нужно работать с классами вовсе. Он же может быть представлен не как встроенные функции curl_init а как объект Curl. Ты можешь вызывать функции в ооп коде. Бля, ты реально настолько тупой что думал раз код ооп, то в нем нельзя функции использовать?
>Именно так, или у тебя только глубоко субъективные выводы которые даже нельзя никак подтвердить? Как писать код под симфони написано в его документации. Какие блядь статистические данные?
>Повторяю вопрос: Предоставь мне способ измерения производительности работы программиста на определенном наборе фреймворков Беру свои слова назад. Тяжело говорить с дураком даже в его терминах. Зачем измерять производительность работы программиста на определенном наборе фреймворков? Я вообще ни слова про производительность программиста не говорил.
>и дай определение производительности программиста. Я не знаю такого определения. Это вообще шиза.
>какая-то шиза про производительность Если ты спрашиваешь проводил ли я "измерения производительности программистов", то ответ: нет. Если ты спрашиваешь проводил ли кто либо вообще "измерения производительности программистов", то ответ: я таких измерений не видел.
Я не знаю из под какой коряги ты вылез со своим процедурным пхп "как в библиотеках 2007 года", но мерой скорости в современной разработке является "скорость принятия решений" а не скорость написания кода.
>>2756304 >А что значит "значит"? Хватит троллить тупостью. Ты сказал что эти параметры это все что нужно для определения паршивости.
>Ты можешь вызывать функции в ооп коде. Бля, ты реально настолько тупой что думал раз код ооп, то в нем нельзя функции использовать? Я просто сказал что у PHP есть процедурные версии расширений, разве я еще что то утверждал?
>Зачем измерять производительность работы программиста на определенном наборе фреймворков? Отлично, признаем что нам неизвестно, отличается ли скорость выполнения проекта для разных фреймворков или их наборов.
Теперь вернемся к началу обсуждения, я сказал что объективных критериев сравнения нету, ты высказался против этого утверждения, приводи эти критерии.
"Удобство" языка сводится к нескольким показателям: насколько быстро писать на нем код, насколько он выразительный и насколько легко его читать, насколько он понятен итд.
"Выразительность" не очень просто измерить, но наверно как-то можно: сделать N реализаций разных алгоритмов, сравнить кол-во токенов в программе. Сравнить количество возможных токенов итд.
Я этим заниматься не буду, так как это уже работа, а за нее надо платить. Но я могу привести личное впечатление, что не нравится в Си и вызывает желание держаться от него подальше:
- необходимость повторять сигнатуру функции в .h и .c файле - отсутствие аварийного завершения при переполнении в арифметических операциях. Как можно было такую глупость сделать, видимо язык придумывали в спешке без тщательного проектирования. - отсутствие каких-либо средств управления освобождением памяти (это приводит к большим затратам времени при написании кода и часто становится источником ошибок и уязвимостей) - сложно вернуть из функции что-то кроме int, например, строку, так как непонятно, кто должен выделять память под нее, кто освобождать, сколько памяти выделить - в коде нет возможности указать правила работы с памятью. Например, если функция возвращает указатель, то нельзя описать, кто должен освобождать память, на которую он указывает. Как программист, который вызывает функцию, должен понять, как освободить память? Как статический анализатор должен проверять, что память будет корректно освобождена? - отсутствие модулей, что приводит к длинным названиям функций - отсутствие дженериков для описания структур данных - отсутствие структур данных, таких, как список, вектор, хеш-таблица, строка и тд - нельзя вернуть из функции несколько значений - нельзя вызывать функцию с именованными параметрами - нет значений по умолчанию у аргументов функции - отсутствие интерполяции строк - отсутствие нормальных enum (в Си enum это просто int) - отсутствие стандартизации типов, например int может иметь любой размер, хоть 16, хоть 64 бита - отсутствие нормальной поддержки unicode (например, параметр %s в sprintf не позволяет указать число символов) - нет проверки границ при операциях с указателями, и нет возможности включить такие проверки
Отдельно я бы хотел остановиться на указателях. Это большая проблема Си, то, что из кода ничего невозможно про них понять. Вот, например, функция:
char* process_data(char *data);
Глядя на сигнатуру, можешь ли ты определить:
- разрешено ли передавать NULL? - может ли функция вернуть NULL? - сколько элементов находится по адресу data? 1 или несколько? Если несколько, то как определить, сколько? - можно ли передать или может ли функция вернуть указатель на статическую строку? - можно ли передать или может функция вернуть указатель на динамически выделенную строку? - кто должен освобождать память? и как это сделать? (хинт: функция может использовать нестандартный аллокатор) - в какой кодировке передается текст?
Это только те проблемы Си, которые мне пришли в голову. Мне кажется, любой, кто на Си пытался написать что-то сложнее лабораторной работы, натыкался на такие сложности.
>>2756315 Забавно, я так понимаю, внутренняя мысль о том что ты действуешь основываясь на своей эмоциональной информации, а не на реальных данных, заставила тебя позлиться?
К сожалению ты настолько оторван от реальности, что в принципе уже не можешь воспринимать текст, фреймворки которые я перечислял безусловно разные, значение этого слова ты можешь найти в викисловаре. Можешь перечитать мое предложение с викисловарем, тогда возможно сможешь понять что я написал, главное будь внимательнее.
>>2756335 То есть ты ошибся все же в первом определении? Ложность второго я могу тоже легко тебе же доказать, но мне лень, оригинальная моя задумка была в том, что бы показать тебе, как глуп твой аргумент о том, что С нельзя приводить лишь из за того, что ты решил его поместить в какую то выдуманную категорию, и тут нужно заметить что:
1) Даже если он находится в какой то категории, это не значит что мне нужно приводить пример проектов на других языках, так как я хотел лишь дать информацию где посмотреть процедурный код
2) Удобство языка, о котором пишешь ты, чисто субъективное
>>2756331 >я не знаю как устроены современные фреймворки >я не знаю как пишут код под разные фреймворки >я не знаю битрикс >я не знаю как пишут код под битрикс >объективных критериев сравнения нет >разницы разницы между этим всем нет Как называется эта болезнь?
>>2756354 Предполагаю что тебе уже нечего ответить, в таком случае подведу итог: Заметной разницы по объективным критериям для программиста между популярными фреймворками нету, для всех есть сайты с учебными материалами, скорость выполнения работы на всех примерно одинаковая, работа под них есть.
Следовательно можно выбирать любой, или тот который больше нравится субъективно, утверждать что кто то сделал неправильный выбор исходя только из выбора фреймворка не стоит. А при выборе работы лучше смотреть на такие реальные показатели как зарплата, время работы, условия, итд.
В данный момент я пишу на PHP, но конкретный язык здесь большого значения не имеет, я вообще задумался над этим, когда пилил проект на Python, так что позволю себе спросить в нескольких тредах. Что рекомендуете почитать на тему обработки исключений? А именно, меня интересует два аспекта:
1. Как понять, в каких случаях стоит бросать исключения, а в каких нет? Например, есть у меня класс, который производит определённые манипуляции над файлами. Поскольку проект может быть запущен в несколько процессов, файлы я блокирую при работе, и блокировщик используется самописный, потому что так нужно. Блокировщик имеет два метода - заблокировать/разблокировать файл, над которым производятся манипуляции. Возникает вопрос - что делать, если выполняется метод unlock над файлом, который и так не заблокирован? Стоит ли в этом случае бросать исключение, которое говорит - атятя, ты пытаешься разблокировать файл, который не заблокирован? Или вести себя так, как будто файл был разблокирован? По сути ведь, результат такой же, как и при разблокировке. Разница лишь в том, что в данном случае файл изначально не был заблокирован. С одной стороны, если бросать исключение, то это как-то более подробно что ли. Ведь по логике не должно быть ситуации, в которой я пытаюсь разблокировать незаблокированный файл. Если такая ситуация возникла, то это как бы не страшно вообще, но и не то, чего я ожидал. Брошенное исключение будет явно заметно и я что-то изменю в алгоритме. А если так и надо, то сделаю что-то типа `try { $lck->unlock("file.bin") } catch (FileDontLockedException $e) { ... }`. С другой стороны... несколько противоречит KISS, не? В сущности, результатов работы у метода `unlock` может быть два: либо файл разблокирован и свободен для манипуляций, либо нет и лови исключение. Ситуации "файл был успешно разблокирован" и "файл изначально не был заблокирован" по своему результату идентичны. Вот и как решить?
2. Есть две крайности. Одна - всякий раз кидать \Exception. Вторая - для каждой ситуации, в которой может быть брошено исключение, создавать собственный класс. Ну, может, в совсем уж одинаковых ситуациях использовать уже имеющийся класс исключения. Вопрос - как найти в этом золотую середину? Если на первый вопрос ответить "кидать исключение", то достойна ли ситуация "файл изначально не был заблокирован" отдельного класса исключения? А ситуация "ты пытаешься разблокировать файл, который был заблокирован другим процессом, и поскольку флаг forced не был передан - соси бибу"? А ещё какая-нибудь?
>>2756554 Все очень просто. Вместо того чтобы "бросать" исключение пиши goto. Если не знаешь куда goto должно попадать, то это валидная ситуация для исключения - все наебнулось, цирк заканчивает работу, исключение это способ сохранить информацию в умершем приложении.
Если знаешь куда это все должно вести, то поздравляю - ты используешь исключение в качестве goto. Мгновенный телепорт в любую часть приложения без писечек и смс. Чем это плохо все и так знают.
К сегодняшнему дню уже сложился консенсус, что ошибки нужно возвращать, а не выкидывать на волю ветра.
>>2756580 То есть, в идеале класс-блокировщик должен возвращать условный объект LockerResult, который внутри себя содержит всю нужную информацию: получилось ли разблокировать файл, был ли он заблокирован изначально и т. д. и т. п. А я уже по нужде буду писать всякое `if $lockerResult->fileUnlocked() { ... }` `if $lockerResult->fileInitialyDontLocked() { ... }` `if $lockerResult->containMessage("Не получилось заблокировать, потому что уже заблокировано другим приложением") { ... }` И т. д?`
>>2756554 >2. Есть две крайности. Просто кидай везде исключения. Потом, отрефакторишь, когда уже обрисуются в проекте сущности конкретных исключений. ну я так делаюи в итоге везде просто ексепшены и остаются, лол
>>2756603 Да в пхп примерно так и получается. Понятно что это сложно и дохуя возни. Можно договориться кидать исключения, но только на один уровень вверх. Но главное понимать что ты используешь исключение как костыль.
В более современных языках есть специальная конструкции типа Result и Option в rust или монады maybe в функциональных. Го как младший "вовсе дурак" добавляет ошибку дополнительным параметров к результату функции, поэтому всем программистам на го снится конструкция if err != nil , которую нужно добавлять после каждого вызова функции.
> Как понять, в каких случаях стоит бросать исключения, а в каких нет?
Обычно функция бросает исключение, когда не может выполнить свою задачу по какой-либо причине.
Если программист неправильно вызвал функцию (передал ей что-то не то, вызвал ее неправильно) - одноначно бросать, этой программе уже не помочь. Если произошла неожиданная исключительная ситуация (пропало питание в SSD-накопителе и все файлы стали недоступны, или закончилось место на нем) - тоже однозначно бросать.
Такие исключительные, неожиданные ситуации, которых в правильных условиях не может возникнуть в принципе, обрабатывать никак не надо - пусть программа падает и все.
Но в твоем случае с unlock у тебя есть выбор:
- игнорировать ошибку. Может, это нормально вызывать unlock на разблокированном файле, и ничего страшного тут нет. - считаь это ошибкой, но ожидаемой, и возвращать какое-то значение (например, false). Естественно, вызывающий код тогда должен проверять это значение и как-то реагировать. - считать это ожидаемой ошибкой, выбрасывать исключение, ловить его и обрабатывать - считать это ошибкой в программе и выбрасывать исключение, которое завершит программу
Выбор ты делаешь, как инженер, исходя из ситуации, из требований к программе, своего опыта итд. В общем, вариант "игнорировать" мне мало нравится, его стоит применять только в каких-то случаях, когда это выглядит логично. Например, если при удалении файла выясняется, что его уже кто-то удалил до нас, можно это проигнорировать - задача-то выполнена, пусть и не нами.
Ты пишешь:
> Ведь по логике не должно быть ситуации, в которой я пытаюсь разблокировать незаблокированный файл. Если такая ситуация возникла, то это как бы не страшно вообще, но и не то, чего я ожидал.
Значит, в твоей ситуации должно выбрасываться исключение, которое не надо ловить.
Кстати, такую ситуацию иногда удобно решать с помощью анонимных функций:
// автоматически разблокирует файл при завершении функции или выбросе исключения $locker->lock('file.txt', function ($fd) { // работа с файлом });
> Есть две крайности. Одна - всякий раз кидать \Exception
Это неправильный подход, так как нельзя выяснить причину ошибки или ловить определенный вид ошибок. В тестах будет неудобно, ты не сможешь проверить, что выкинуто именно нужное исключение.
Нужно делать свои классы исключений.
> сли на первый вопрос ответить "кидать исключение", то достойна ли ситуация "файл изначально не был заблокирован" отдельного класса исключения?
Можно сделать какой-нибудь общий LockLogicException. Если функция может выбросить только одно исключение, то можно их обобщить в один класс. Хотя класс исключения создать - 1 строка, это не проблема, мне кажется.
Ты можешь сформулировать вопросы, что именно непонятно? В тексте что-то непонятно описано? Или что-то другое непонятно?
Или непонятно, с чего начинать?
Ну начни тогда с класса, который представляет Студента, затем сделай класс, который проверяет, правильно ли заполнены данные в студенте, затем сделай класс для работы с БД, который будет вставлять в нее Студентов, обновлять их и искать по нужным условиям.
То, что ты делаешь, назвается явный возврат ошибок. То есть, ты вместо выброса исключения возвращаешь ошибку в результате. Минус тут в том, что кода становится больше, а если эти ситуации исключительные, которые никак не исправить (а остается только завершить программу), то непонятно, зачем ты тогда писал код для их обработки, когда можно было одной строчкой выбросить исключение.
Ну условно, если отключилось питание диска и файлы стали недступны, не надо возвращать какой-то специальный результат, как-то его обрабатывать, можно сразу выбрасывать исключение, которое завершит программу.
В Rust ничего нового нет. Это называется явный возврат ошибки и имеет тот минус, что тебе надо после каждого вызова функции будет проверять результат, в результате чего получается много кода (в Rust есть немного синтаксиса для упрощения этого).
Иногда это имеет мало смысла. Например, если ты передал отрицательное число в функцию, которая принимает положительные, то нет никакого смысла что-то возвращать, обрабатывать - это бесполезный код.
Да, ты как грамотный разработчик со знанием ООП должен спроектировать удобную и простую структуру классов, по которым будет разнесен код. Следуй принципу единой ответственности.
>>2757021 >В Rust ничего нового нет Ну кое что новое там все таки есть. Но да, конкретно эта конструкция не "новая".
>Это называется явный возврат ошибки и имеет тот минус, что тебе надо после каждого вызова функции будет проверять результат, в результате чего получается много кода То что ты описал это то как делается в го, наивный подход. Я этот подход описал.
То что используется в rust это нечто более сложное. Result это https://en.wikipedia.org/wiki/Tagged_union и нужен он как раз чтобы результат каждый раз НЕ проверять. Более того. Можно преисполниться и писать приложение делая вид, что результат есть, хотя его возможно нет. Получая целые цепочки сценариев, которые схлопываются в ошибку или результат только в самом конце.
Добрый день, аноны. Для меня самое сложное в задаче оказалось сделать ее небольшой и читабельной, что в итоге и не получилось. Времени ушло огромное количество (больше недели), крутил и так и сяк, просто задолбался.
>>2758620 Видно что старался. Но косяки все еще есть.
>>2758805 Чушь полная. Но название очень хреновое. 1) "3DigitNums"? Третий раз тебе пишу: сначала определись с терминами. Разряды, классы, разрядность, порядок числа. Ты представляешь число в виде набора "разрядов". Ты выбираешь один из разрядов. Сразу возникает вопрос: а какой это разряд? К "3DigitNums" у тебя такого вопроса не возникло. А он многое поменял бы в твоем коде. "ValuesFromArrays". Можешь заменять любое неопределенное название на Something. SomethingFromSomething. Как оно, понятно? "Ехал get через get". Почти каждая функция что-то возвращает. Что теперь перед каждой функцией с результатом писать get? "getWordForm" ты же сам пишешь что нужно выбрать "склонение" "getInclinedNames". Так и создай процесс склонения. Сразу и сигнатура функции станет логичной, без "wordForm2". Вообще метод
2) Неправильная работа со "словарем". Массив $spelling это не код, а данные. Данные должны храниться в специальном хранилище и передаваться в твой код как параметр. И тем не менее он почему-то находится посреди кода. А самое хреновое, что ты его зачем-то разделил на две части. Первая почему-то обрывается перед тысячей. А вторая вообще непонятно где.
3) Ну и напоследок совсем детская ошибка: функция, которая переводит числа в текст, почему-то еще и добавляет в конце фубли.
Вообще эта задача уже на грани. Писать её в процедурном стиле на массивах, как деды пятьдесят лет назад это конечно мука. Замени этот дурацкий массив "threeDigitNums" на структуру Number, которая бы внутри хранила все эти разряды, и это был бы совсем другой код. Короче хватит заниматься хуйней, давай начинай ооп. Там ты еще и сраться начнешь.
>>2758971 Нету смысла. Когда в хак въебут столько же человекочасов сколько в симфони и остальные пакеты, которые есть под пхп, тогда всем двачем переедем на хак. А пока - хуй да рука.
тут лучше просто были использовать $lastTwo >= 11 && $lastTwo <= 19, так понятнее, чем пересчитывать числа в списке и проверять, а не пропущено ли одно из них?
Список [0, 5, 6, 7, 8, 9] можно оставить, так как он маленький и простой.
Мне кажется, что логика немного усложнена, когда ты получаешь отдельно массив чисел прописью и отдельно массив слов вроде "миллионы" и потом объединяешь их. Какой здесь смысл делать это в нескольких функциях? Ведь ты не будешь пытаться объединить числа с другими словами, например. Я бы сделал просто одну функцию, которая сразу получает числа прописью, и слова, и возвращает их вместе.
То есть, я бы объединил getInclinedNamesOfPowerOf1000, removeZeroValues, convert3DigitNumsToText в одну функцию, так как по отдельности от них никакой пользы. А то так можно каждую строчку программы в отдельную функцию начать выносить. И такое ощущение, что тут как раз этот случай.
То есть функция должна быть каким-то логически законченным кусочком кода, выполняющим какую-то задачу. В идеале, функцию можно потом использовать в какой-то другой программе. А тут эти функции, по ощущению, выполняют только часть большей задачи.
> function spellSmallNumber(int $number, int $powerOf1000): string
Мне кажется, здесь не правильно передавать $powerOf1000, а правильнее передавать bool $isFemale. Так как это не задача этой функции определять, какой род использовать. Это должен определить кто-то другой, и передать функции нужный род. Это сделает функцию более универсальной. Вот захотим мы, например, получить фразу "две собаки", и как это сделать? А если был бы признак $isFemale, то функция позволяла бы и собак считать, а не только рубли.
Было бы полезно, если бы ты не просто писал, что название плохое, а предлагал альтернативу. А то может, альтернатива еще хуже. Да и как тогда человеку понять, как надо правильно называть функции?
> Неправильная работа со "словарем". Массив $spelling это не код, а данные. Данные должны храниться в специальном хранилище и передаваться в твой код как параметр.
Не согласен. Хранить данные отдельно имеет смысл, если они могут меняться (например: если мы делаем мультиязычное склонение). Если меняться они не могут, то то, что ты предлагаешь, будет просто усложнением кода без необходимости. Условно, если у нас есть функция, получающая название дня недели по номеру, то данные из нее выносить не нужно.
> Замени этот дурацкий массив "threeDigitNums" на структуру Number, которая бы внутри хранила все эти разряды, и это был бы совсем другой код.
Не согласен. Тут как раз массив больше подходит, так как в массиве может быть сколько угодно разрядов, а в структуре фиксированное число полей. Структуры подходят для других целей.
> давай начинай ооп.
Ты забываешь, что ООП в учебнике находится дальше, а это задача из радела "функции", цель которой научиться разбивать код на функции. Ну и я не вижу особо, где тут применять ООП и какие классы можно сделать и какая от этого выгода. Если что-то проще сделать на функциях, то надо делать на функциях.
Ужасно, когда функции вроде get_user_name делают асинхронными. Как бизнес-логику писать в таком стиле, когда у тебя каждая функция асинхронная? Неудобно же. Не надо копировать плохо продуманный, неудачный подход из JS в другие языки. Ищите другие способы.
>>2759005 >Было бы полезно, если бы ты не просто писал, что название плохое, а предлагал альтернативу. А то может, альтернатива еще хуже. Да и как тогда человеку понять, как надо правильно называть функции? >Разряды, классы, разрядность, порядок числа. Речь не о качестве перевода. Речь о терминологии и контексте. Речь о том чтобы в коде были не абстрактные 3Digit и array values, а конкретные вещи. В данном случае это математические "разряды" и "классы". Как они на английский переводятся дело десятое. Важно что термин задает контекст. И этот контекст все меняет. У абстрактной тройки чисел ничего нет, а у разряда обязательно должен быть "класс". [1k] => 121 бам и весь код поменялся.
>Не согласен. Хранить данные отдельно имеет смысл, если они могут меняться Свит саммер чайлд. Данные могут быть из базы. Могут быть частично из базы. Могут быть из кеша. Могут быть из апи. Могут быть в другой кодировке. Могут быть на разных языках. Единственное в чем можно быть уверенным в разработке, так это то что все будет меняться. К тому же это в тренировочной задаче все умещается на одной странице. В реальном коде при таком подходе эти данные будут хуй пойми где. Их натурально придется искать. Я уж и не говорю про проблемы с тестированием.
>Не согласен. Тут как раз массив больше подходит, так как в массиве может быть сколько угодно разрядов, а в структуре фиксированное число полей. Структуры подходят для других целей. Чушь какая. Структура вполне может содержать в себе массив.
>Ты забываешь, что ООП в учебнике находится дальше, а это задача из радела "функции", цель которой научиться разбивать код на функции. И с чего ты взял что я это забыл? Я прямо написал что пора переходить к ооп. Потому что эта задача "из раздела функции" со своей задачей не справляется.
Потому что так код никто не пишет. Если будешь писать код на процедурном языке, то тебя сразу научат что начать нужно с модуля. Ну как научат. Тебе придется создать модуль, определить его функционал и интерфейс. Потом тебе объяснят что нужно создавать наделенные конкретным смыслом структуры данных и писать методы для работы с ними.
А пхп вообще уже давно исключительно ООП язык. И весь современный код на пхп написан исключительно в ооп стиле. Когда у тебя только структуры данных вокруг и есть. Поэтому пассажи типа >Структуры подходят для других целей. ничего кроме недоумения не вызывают. Это не вопрос выбора. В пхп файл = класс. Функциям здесь просто нет места.
>Ну и я не вижу особо, где тут применять ООП и какие классы можно сделать и какая от этого выгода Как я уже говорил, во первых выгода когнитивная: think first, тебе нужно продумать терминологию ДО написания кода. А во вторых: гарантии. Вместо массивов с динамическими ключами, и содержимым которое невозможно проверить, инкапсуляция гарантирует нам необходимую структуру.
>>2758620https://3v4l.org/sBOk1 попробуй возьми отсюда первые три класса и используй их вместо массивов, посмотри как изменится твой код. Вот это будет "процедурное программирование". А если ты используешь ВСЕ классы и допишешь свои, то это уже будет ООП. Суходрочка на массивах, которой вынуждает тебя заниматься учебник на этом этапе абсолютно бесполезна, а судя по результату даже вредна.
>>2759167 Дорешаю все задачи из учебника до ООП, потом немного ООП и вернусь к ней позже с новыми знаниями, так как я устал топтаться на месте с этой задачей. Тред на архиваче есть, так что твой код позже использую.
> Свит саммер чайлд. Данные могут быть из базы. Могут быть частично из базы. Могут быть из кеша. Могут быть из апи. Могут быть в другой кодировке.
Тебе стоит познакомиться с принципом YAGNI. Ты сейчас предлагаешь усложнять код на случай "а вдруг в русском языке поменяется написание чисел". А вдруг мы написание чисел будем скачивать из API.
По твоей логике, поменяться вообще может что угодно. Может в будущем мы перейдем на шестнадцатеричную систему, давай отдельным параметром систему счисления передавать.
Когда поменяется - тогда и будем исправлять.
Может быть и другой вариант: ты нагромоздишь сложную систему с поддержкой API, а потом решат, что написание чисел прописью вообще оказалось не нужно в проекте, а ты уже кучу времени потратил.
> Я уж и не говорю про проблемы с тестированием.
Не вижу проблем с тестированием в данном случае:
assert(spellSmallNumber(23) == 'двадцать три');
> Чушь какая. Структура вполне может содержать в себе массив.
А зачем нам структура из 1 поля?
> Это не вопрос выбора. В пхп файл = класс. Функциям здесь просто нет места.
Это ты сам себе придумал. Функции в некоторых библиотеках есть. Там, где хватит функции, логично применять функцию.
> Если будешь писать код на процедурном языке,
А зачем ты правила из других языков тащишь в PHP? В Риме веди себя как римляне.
> Вместо массивов с динамическими ключами, и содержимым которое невозможно проверить, инкапсуляция гарантирует нам необходимую структуру.
Ты пытаешься усложнить код на ровном месте. По твоей логике, нужно в каждой функции делать проверки всех входных данных? На практике это просто приведет к тому, что у тебя 50% кода будет состоять из проверок входных данных.
> попробуй возьми отсюда первые три класса и используй их вместо массивов
Ты тащишь ООП туда, где он не нужен. Твой код будет по объему в разы больше исходного, при этом не добавляя никакой выгоды. Более того, у тебя не очень правильно спроектирована иерархия классов. Вот у тебя код:
> class NumberToRussianTextSpelling implements NumberToTextSpelling { > public function spell(RankedNumber $number, Dictionary $dictionary): string
Почему в класс, поддерживающий только русский язык, надо передавать словарь? У нас в русском языке есть несколько вариантов написания числа "десять"? Очевидно же, что нету. Это константа, которая лет 100 не менялась и вряд ли поменяется.
>>2759321 >Ты сейчас предлагаешь усложнять код Ошибка. Я как раз предлагаю код упростить. Работать со словарем как переменной гораздо проще чем с хардкодом, который находится где-то в какой-то функции.
>Может быть и другой вариант: ты нагромоздишь сложную систему с поддержкой API Речь идет о получении словаря как параметра функции. Какой бы ни была сложной система получения данных - система их использования предельно проста.
>Не вижу проблем с тестированием в данном случае: >assert(spellSmallNumber(23) == 'двадцать три'); То есть ты не сравниваешь результат со словарем? Ты дублируешь словарь, размазывая дубли данных по тестам. Отличный план.
>А зачем нам структура из 1 поля? Для создания конкретной абстракции, сущности. Для соблюдения инвариантов и сокрытия доступа к массиву.
>Это ты сам себе придумал. Функции в некоторых библиотеках есть. Там, где хватит функции, логично применять функцию. Это просто чушь. Ты не тот процедурный шиз, который тут срал секретным процедурным пхп как в 2007 году?
>А зачем ты правила из других языков тащишь в PHP? В Риме веди себя как римляне. Нахуй ты пишешь если просто не понимаешь о чем идет речь? Весь поинт был как раз в том что на пхп крайне трудно писать процедурный код, как раз потому что в нем нет инструментов чтобы это делать. Именно поэтому я посоветовал поскорее переходить к тому как на пхп пишут: ооп.
>Ты пытаешься усложнить код на ровном месте. По твоей логике, нужно в каждой функции делать проверки всех входных данных? На практике это просто приведет к тому, что у тебя 50% кода будет состоять из проверок входных данных. Опять все наоборот. Инкапсуляция как раз и позволяет избежать проверок. Ты буквально пишешь в сигнатуре функции "СЮДА ТОЛЬКО ПРАВИЛЬНЫЕ ДАННЫЕ". Неправильные данные просто проверку типа не пройдут. Каждая функция должна четко определять что в неё нужно передать.
>Почему в класс, поддерживающий только русский язык, надо передавать словарь? Сынок, это ооп. В ооп у тебя все приложение это огромное дерево вложенных объектов. Все куда-то передается. И все где-то хранится. Переводы написания чисел, хранятся там же где и все остальные переводы, и работает с ними не программист, а переводчик.
Короче. Мне не нравится как идет беседа. Ты постоянно теряешь нить и мало что понимаешь, вплоть до наоборот. То что тебе приходится объяснять что на пхп пишут только ооп код само по себе комедия. Очевидно что код ты нихуя не писал. что ты кукаретик, что не можешь отличить простое от сложного и что я на тебя время тратить больше не хочу.
Етить шизы сцепились из-за простенькой задачки, которая нужна для того, чтобы потренироваться в разбиении на функции вкатуну, который до ООП то еще не дошел...
>>2759272 >Дорешаю все задачи из учебника до ООП, потом немного ООП и вернусь к ней позже с новыми знаниями, так как я устал топтаться на месте с этой задачей. Начинай потом сразу делать бложик на Ларе, не надо тебе никуда возвращаться.
> То есть ты не сравниваешь результат со словарем? Ты дублируешь словарь, размазывая дубли данных по тестам. Отличный план.
Я проверяю результат на соответствие правилам русского языка. Наша цель - выводить числа по правилам русского языка, а не по правилам некоего "словаря", в котором точно так же могут быть ошибки. Ты, по моему, не понимаешь требования к функции.
>>Это ты сам себе придумал. Функции в некоторых библиотеках есть. Там, где хватит функции, логично применять функцию. > Это просто чушь. Ты не тот процедурный шиз
Аргументы закончились, переходим на личности?
>>А зачем нам структура из 1 поля? > Для создания конкретной абстракции, сущности. Для соблюдения инвариантов и сокрытия доступа к массиву.
Это уже костыли какие-то, делать класс только ради того, чтобы поставить тайп-хинты. По твоей логике, и int надо в класс оборачивать? Я конечно так делал (в Питоне, а не в PHP), но для каждой переменной делать по классу это уже перебор.
> То что тебе приходится объяснять что на пхп пишут только ооп код само по себе комедия.
Ты это сам себе придумал. Есть случаи, когда стоит использовать ООП, есть случаи, когда логичнее использовать просто функцию. Я нигде не утверждал, что ООП не нужен.
Только если маленький CRUD уровня студентов, чтобы понять, как устроены приложения. Если же ты начнешь сразу изучать фреймворк, то тебе многое может быть непонятно.
>>2760229 Уровнем зависимости кода от фреймворка. Ларавель RAD фреймворк, его используют когда хотят побыстрее и по дешевле. А когда логика сложная и проект большой, зависеть от фреймворка и бодаться с его проблемами последнее дело. В симфони подход такой, что наследоваться ни от чего не нужно и тянуть к себе в код ничего не надо. Там где у ларавеля четкая круд схема, у симфони полная свобода. Но и вариантов обосраться бесконечно много. Поэтому на проекте с симфони всегда хочешь видеть человека, который понимает что делает.
>>2760267 >Там где у ларавеля четкая круд схема Эта та, которой можно не пользоваться? >В симфони подход такой, что наследоваться ни от чего не нужно и тянуть к себе в код ничего не надо И на чем же твой симфони работает? На святом духе? Ты точно так же зависишь от компонентов симфони как и ларавел
>>2760272 >Эта та, которой можно не пользоваться? Ты этот элокент выбрал чтобы его потом выковыривать?
>И на чем же твой симфони работает? На святом духе? Ты точно так же зависишь от компонентов симфони Сына, ебало на пикрелейтед. Слева - контроллер симфони, справа контроллер ларавеля. Загадка для дошкольников: в чем принципиальная разница? А теперь газку за пивандепалой, малой.
Вижу пердежный метод, который нихуя не делает и который точно так же можно оформить в ларе без использования контроллера. Только какому ебанату это может понадобиться?
И схуев тогда на первом месте не Slim какой-нить? Там из коробки один маршрутизатор и есть. Сиди echo клепай беспонтовые, сколько влезет. А потом, когда на играешься, подключишь библиотечки, чтобы от них зависеть.
>>2760295 Дегенеративное хуйло, пикрелейтед разница между подходом симфони и ларавеля. Давно таких самоуверенных долбоебов не видел. Ларавель он с симфони ровняет.
>>2760302 >без использования контроллера И без использования фасадов, и без использования элокента. Надо следующий шаг просто сделать и написать все без использования ларавель.
>>2760310 Да в принципе похуй, пусть будет слим на первом месте. Какая хуй разница. Все равно из него придется симфони собирать. Di контейнер надо, доктрину надо, конфиг надо. Считай пол симфони уже собрал.
>>2760316 Ой, так выходит, что главное - это зависеть от "правильного" фрейморка. И доктриночки то нужны и внедрение то нужно - одними примерчиками с echo не обойдешься. Ебать ты кекус.
>>2760330 >Ой, так выходит, что главное - это зависеть от "правильного" фрейморка. Бля, в голос проигрываю с тебя. Пикрелейтед означает "зависеть". Я тебе, еблану, сразу сказал в чем разница. Симфони позволяет тебе не наследоваться и не зависеть от кода фреймворка. А ларавель создан блядь для того чтобы делать работу за программиста, как раз за счет того что ты наследуешь готовый код фреймворка. Разумеется блядь ты можешь и не наследоваться, только нахуя ты тогда ларавель выбрал, если не используешь его?
>>2760343 > как и место в мировом списке. О, ебать, еще какой-то список))) Ну показывай. >>2760341 Ебанина, че бы ты там не писал, ты все равно обрастешь зависимостями. И симфони тебе их так же предоставляет, пусть и не столь явно. Еще раз - в твоем топчике по твоей логике на первом месте должен стоять ебаный маршрутизатор без нихуя. Т.е. Слим
>>2760346 >ты все равно обрастешь зависимостями Внешние библиотеки можно просто покрыть интерфейсами, лалка. А прямое наследование просто тебя нахуй вяжет цепью к фреймворку.
>Еще раз - в твоем топчике по твоей логике на первом месте должен стоять ебаный маршрутизатор без нихуя Это не мой "топчик" не похуй, пусть стоит. Главное чтобы ларавель макаки знали свое место у вебстудийной параши.
Эх ты, не понимаешь. Ларавель во многом использует статические методы и как итог, твоя бизнес-логика переплетена с кодом Ларавеля. Ну например, в Ларавель модели наследуются от классов Ларавеля и бизнес-логику часто помещают в них.
Это значит, что ты не можешь использовать такую бизнес-логику в другом проекте на другом фреймворке. А при обновлении версии Ларавель тебе придется перелопачивать весь код.
Более того, Ларавель полагается на статические методы и твой код будет наполнен ими.
В Симфони ты тоже можешь обращаться к классам Симфони, но там можно бизнес-логику практически изолировать от Симфони, а код, взаимодействующий с Симфони, сделать не очень большим и вынести отдельно.
Например: контроллер не наследуется от контроллера Симфони, модели не наследуются от какого-либо базового класса (и там к Доктрине привязаны разве что аннотации), сервисы ни от чего не наследуются, и тд. Если ты изолировал бизнес-логику, то тебе будет легче перенести ее в другой проект, и меньше будет возни при обновлении версии Симфони.
Ну и еще плюс в том, что Симфони состоит из компонентов, и ты можешь собрать свой фреймворк, использовав только часть компонентов, или постепенно их убирать из проекта, если захочется.
>>2760426 Никто не таскает код по разным фреймворкам. А вот перетащить код в новую версию фреймворка это да. Симфони стал таким какой он есть сейчас когда выяснилось, что код написанный для симфони версии 3.6 навсегда останется для 3.6, что он намертво привязан к тому фреймворку.
Та же история с DBAL. Кто в здравом уме меняет базу посреди разработки? Ну вот кароч выходит MySql 8.0, а ты сосешь бибу. Или как убер тратишь несколько лет, миллионы далларов и хуй знает сколько человекочасов на смену версии.
>>2760452 Ничем принципиально не отличается. Просто как раз та проблема с 3.6 и является одной из причин почему фреймворки сейчас состоят из модулей, а разрабы симфони ссут ломать обратную совместимость в новых версиях настолько, что даже забили на PSR.
Не могу понять циклы вообще. Спрашивал у чатжпт, читал саму статью, кажется всё понял, но задание: Напиши программу, выводящую таблицу умножения чисел от 1 до N на самих себя, используя цикл. Программа должна вывести примерно такой результат поставило меня в тупик. Даже не знаю с чего начать. Может кто-то совсем для дебила объяснить? Хотя кажется теорию я понял
>>2760908 Задачу выше я всё-таки решил, другую нет. Задача:Некто кладет в банк 10000 р. Банк начисляет 10% годовых (то есть, каждый год на счету становится на 10% больше, чем в прошлом году). Напиши программу, считающую, через сколько лет в банке будет миллион? Сколько лет будет этому некто? Доживет ли некто до этого дня, если сегодня ему 16 лет? Мой код https://pastebin.com/FMteUXWB Часть задачи про возраст владельца капитала даже не начинал решать. Пробую прибавлять 10% к сумме.
>>2760918 Вообще весьма оригинально получилось. Но ты сам себя запутал.
Цикл состоит из счетчика, вычисляемой части и условия выхода из цикла. Счетчик просто считает количество выполненных циклов. Конструкция for() применяется когда ты знаешь количество циклов. А если не знаешь, то применяется конструкция while. То как ты написал это код рабочий, но как ты сам заметил очень мутный и хитрожопый. C while процесс становится гораздо понятней https://3v4l.org/nX2r3
>>2761011 while там дальше в уроках есть. >Кто-нибудь разбирающийся, поясните, господин выше прав и for не подходит для решения этой задачи или нет? Если задача решена, значит подходит.
>>2761151 Братишка, прям тяжело смотреть сколько труда ты вбухиваешь и насколько неправильный код получается. Тут по каждой строчке почти надо пояснения давать, начиная с комментов и заканчивая косяками самого учебника.
Столько писать и растягивать писанину на несколько постов это просто трата времени. Я могу с тобой несколько часов посидеть и пройтись по коду, но я ебал в формате постов это делать. Если интересно пиши в дискорд https://discord.gg/hB9rSksxUB .
Мне нужно сделать проектик на ларавеле. В этот раз решил, чтобы не изобретать велосипед, использовать для фронтенда какую-нибудь дашбоард панель. Например, вот тут список: https://adminlte.io/blog/laravel-dashboards/ или тут:https://medevel.com/15-laravel-dashboard/ И с удивением обнаружил, что все эти панели крайне жёстко встроены в сам Ларавел. Это не просто какие-то пакеты, которые можно композером скачать и нпм-ом установить - нифига подобного. Это, фактически, модифицированный Ларавел, поверх которого предлагают накатить официальный Ларавел. Там модифицированы контроллеры, модели, кернел. WTF?! Это сраный фронтенд. Зачем его интегрируют в бекенд так, что не отдерёшь? Вот пройдёт месяц или год, я решу переписать фронт на что-то другое. И что делать?
В общем,это я чего-то не понял, или оно так и есть? Есть ли в природе простые фронтенд шаблоны для Ларавела, которыми можно просто пользоваться и которые не лезут в авторизацию, модели, миграции и само ядро движка?
>>2761359 > В этот раз решил, чтобы не изобретать велосипед, использовать для фронтенда какую-нибудь дашбоард панель. >Это сраный фронтенд. Зачем его интегрируют в бекенд так, что не отдерёшь? Чел, это админки, а не фронтенд...
>>2761364 Да, написано, что это дашбоард админ панелс. Но я не улавливаю, в каком смысле они админки? Базовую работу с юзерами даёт UI или Бриз, а остальное ты лепишь сам. Как ими правильно пользоваться?
>>2761526 >Но я не улавливаю, в каком смысле они админки? А какие смыслы могут быть у админки? Администратор управляет контентом, пользователями, следит за трафиком, продажами, еще какой хуйней.
Ты, как разраб, ему там это все настраиваешь, виджеты клепаешь, еще всякую хуету. А суть этих виджетов такая, что ты в админке делаешь формочки, чтобы админ контентом их заполнял, сохраняешь это все в БД, а потом в настоящем фронте подставляешь просто эти данные.
А фронтом у тебя выступать будет, ну, блейд, наверное. Делаешь верстку, цепляешь скриптики и подставляешь, собственно, данные из админки - все, очередной каловый одностаничник готов.
>>2761526 Кароче, не туда ты полез, как по мне. Нахуй оно тебе не нужно. На ларе пишешь АПИ, как фронт используешь Реакт или Вью. Ну или монолит пиши, юзая Инерцию от Ларавел или просто блейд с jq, лол.
Здесь можно было не использовать промежуточную переменную:
if ($this->isBoss) { return $this->getBossSalary(); } else ...
> public function setBoss(): bool Для этой функции не требуется возвращать значение, так как оно всегда равно true и никакой информации не несет.
Названия профессий надо бы сделать хотя бы константами, а в идеале - Enum. Если использовать Enum, то туда же можно засунуть базовые зарплаты, кофе и тд.
> $departmensWithProfession[$department->getDepartmentName()] = new Department($department->getDepartmentName(), $department->getProfessionInDepartment($professionReduction)); }
Здесь не нужно создавать новый Департамент. Тебе нужно получить список сотрудников и сделать с ними какие-то операции. И ты пытаешься использовать Департамент не как модель реального департамента в компании, а как объект-список (такие объекты обычно называют "коллекция"). Но это неправильно. Если тебе нужна коллекция, то ты можешь создать класс Коллекция, и в нем делать методы для сортировки, отбора нужного количества и тд, по типу:
$collection = new Collection( $dep->findEmployeesByProfession(Profession::MANAGER)); // сортируем и берем N первых работников $removedEmployees = $collection->sortBy(fn ($e) => $e->getRank())->take($n); // Просим департамент их уволить $dep->removeEmployees($removedEmployees);
То есть, ты попытался в одном классе совместить функции 2 разных классов, Department и Collection. И методы вроде "сортировать по рангу" или "отобрать N работников" в Department не нужны. Это не задача Департамента, выполнять роль класса-коллекции.
Если ты не ищешь легких путей хочешь расширить кругозор и прокачать навыки ООП-мышления и тебе хочется сделать класс-коллекцию, то сделай, только сделай ее обобщенной, чтобы она не знала ничего о работниках и могла работать с любыми наборами данных: числа, строки, любые объекты и тд. Если тебе любопытно, то в фреймворке Laravel уже есть такой класс коллекций и тут можно увидеть примеры кода с ним: https://laravel.com/docs/10.x/collections#meth
Ну то есть в коллекции могут быть методы вроде "сортировать" или "взять N первых элементов", но не должно быть методов "сортировать по рангу" или "отобрать по профессии", так как в этом случае у тебя получается не универсальная коллекция чего угодно, а коллекция только для работников. И ты вместо четкого разделения задач, которые выполняет каждый класс, их перемешиваешь.
Если же ты ищешь легкий, скучный путь, то можно не создавать класс-коллекцию, а просто работать с массивом работников:
> foreach ($departmensWithProfession as &$department) { >$department->sortRankEmployees(); Не нужно использовать & здесь. Переменная $department указывает на тот же самый объект, что хранится в массиве, и меняя ее, ты меняешь и объект в массиве.
То есть, сейчас основная проблема в том, что ты совместил функции управления департаментом и функции работы с коллекцией объектов в одном классе, а надо их разделить и сделать либо класс коллекции, либо работать с массивом.
Информация для расширения кругозора. Задачи по работе с коллекциями в стиле "отобрать объекты по условию, отсортировать, взять первые N" встречаются очень часто, и во многих языках есть объекты-коллекции на такой случай. Обычно в них используются анонимные функции для указания условий отбора или правил сортировки. Вот пример из Java (не бойся, учить её не надо, просто прочти):
// получить имена студентов старше 18 лет имеющих StandardID > 0 var studentNames = studentList.Where(s => s.Age > 18) .Select(s => s) .Where(st => st.StandardID > 0) .Select(s => s.StudentName);
В PHP есть расширение Ds, которое пытается восполнить отсутствие коллекций в PHP:
1. Почему тема не перекатыается?? 2. Как сделать предварительную компиляцию php, чтобы при запуске он не читал весь скрипт, не разбирал строки, подключаемые либы и пр. тормозящий хлам?