Здесь мы изучаем язык PHP (а также JS/CSS/HTML/SQL) и учимся делать сайты. Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.
ОП довольно занят, но постарается ответить на все вопросы. Также, ответы и решения задач можно поискать в архиве тредов phpclub.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Наши уроки по PHP собраны по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не запоминайте его, он временный). Это учебник для изучающих с нуля. Там есть задачи, их нужно решать. Но если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Если не знаешь как решать, запости код и попроси подсказку или поищи задачу в архиве тредов.
Ты прошел весь учебник? Молодец, но это были лишь основы языка 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
У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.
Платиновые вопросы
- Почему PHP? Потому что вакансий море, и учить легко. - Сайт опять упал!!!!! — Не паникуй, а зайди на https://github.com/codedokode/phpbook, нажми зеленую кнопку Clone or Download -> Download ZIP, распакуй на рабочий стол и получи личную копию сайта, не требующую интернетов. - Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу (ищи в архиве по слову "устроился"). - Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись - Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/ - Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев - Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Код лучше писать аккуратно и оформлять, как принято. Потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Если он будет неряшливым, это будет большой минус.
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть рекомендации PSR-1 и PSR-12. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults() - Название функции начинается с глагола, в стиле «сделайЧтоТо» - не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там - в именах классов используется CamelCase, первая буква большая, «_» может использоваться - мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек - мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела) - ставим тайп-хинты на аргументы функций, результат функций и поля классов
Вот ссылка на рекомендации PSR, где все это описано подробнее и даны примеры оформления:
>>2347315 >любой год >упоминать в качестве мёртвого языка что-либо кроме того, что действительно мертво, а не занимает охуиллиард процентов рынка >что-то кроме кобола, иными словами
ку,захотел написать бота для тг на php. Я правильно понимаю,чтобы он постоянно работал сервер должен быть постоянно включенным и я должен постоянно обновлять страницу со скриптом? кто шарит, объясните ,пожалуйста, как это все работает
>работал эникеем и сталкивался с хуйней под названием битрикс >решил стать веб макакой >именно в этот момент западные компании сьебнули с России >теперь все бэкенд вакансии для джунов/трейни это ебучее битрикс болото Ну и хули делать то? Копаться в этой параше с надеждой на то что через год-два перекачусь в что-то нормальное?
Сап, я возможно, не по адресу, но в шапке увидел знакомые слова (HTML + CSS). Вопрос такой: если нужно создать сайт в одно лицо, то как обычно вы поступаете с фронт-стороной? Верстаете все руками или на каких-то быстрых конструкторах? на каких? Вообще мое основное это java бэк, но наша контора настолько оптимизирована, что приходится разбираться в совсем непривычном
>>2347129 (OP) 4 года назад я увидел этот тред, меня завлек анимешный и ламповый гайд и я решил стать web разрабом. Какая же это была ошибка. Поработал только 4 месяца версталой
>>2347788 обновлять постоянно страницу - плохая идея. предполагаю, что бота делаешь через getUpdates, такой бот в бесконечном цикле получает и обрабатывает новые сообщения. запускать надо через php cli, а не обновлять постоянно страницу. если хочешь хостить на хостинге для сайтов - только webhook. через апи указываешь ссылку на скрипт, телега сама будет слать туда новые события то ли в php://input, то ли в $_POST, не помню
>>2348742 ВЕРСТАЛОЙ НА WORDPRESS, ПОПРОШУ!!!! А если серьезно, увидел задание с таблицей и студентами, охренел, подумал, что лучше стану Frontend... ну и понеслось. А если бы не этот анимешный тред, к web разработке может бы не притронулся. Справедливости ради, сложным для меня в задании со студентами являлась именно верстка
>>2348580 Бамп вопросу. Из проектов есть ту ду лист, список студентов из шапки треда,что-то вроде галереи, сайт с отображением погоды (юзал API)и расписание для разных групп универа. Могу ли я перейти к изучению ларавеля?
>>2348791 Ты задал дебильный вопрос и получил соответствующий ответ.
Иди изучай. Получится у тебя или нет - не знаю. Я видел вчерашних студентов, которые на своей первой работе писали просто охрененные решения и схватывали все на лету. И, в то же время, видел людей, что в профессии по 3-4 года сидят. И они ничего не понимают, могут заниматься только копипастой с форумов.
Я вот лично разрешаю тебе перейти к изучению Ларавеля. Или Симфони. Или любой другой херни. Хочешь - сейчас, хочешь через месяц, хочешь - вчера.
Получится - красавчик. Не получится - вернись через месяц и попробуй еще раз.
>>2348383 Bootstrap или другой CSS-фреймворк. Изучается быстро, даёт вполне невырвиглазный результат, если соблюдать основные правила дизайна (вроде "не более 3-х цветов на странице"), классно не получится, но для нетребовательного заказчика сойдёт. А если нужно что-то красивое и "вкусное", есть бесплатные template'ы, но вот если потом придётся что-то серьёзно поменять на странице, будет беда...
>>2348484 установить сам composer. инициализировать проект (composer init) вызвать composer require author/package А затем пойти читать в доках, как работает сам композер, какие у него есть команды, что такое /vendor/autoload.php, стандарт PSR-4 и так далее
>>2349658 Фуллкеку должно быть поебать на язык: PHP, JS/TS, Python, Ruby, Go, Java/Scala, C#. Я рекомендую начинать с сишки, чтобы ты понимал как оно всё работает. Как напишешь свой первый веб-сервер поверх epoll и первое расширение для sqlite, то можешь браться за свою скриптопарашу.
Если кто-то работал с библиотекой telegram bot sdk, помогите. Не приходят обновления через getWebhookUpdates (). С чем это может быть связано? Setwebhook сделал, все норм.
>>2350277 >nestJS Хуйня перехайпленная. Там нет ничё такова, чего не было бы в express.js. Так, чисто синтаксическим сахарком посыпали, добавили декораторов, которые вообще нихуя не делают. Серьёзно, ты почитай их документацию, они прямо говорят типа "ну да, мы знаем, что всё это одной строчкой обычным express / fastify делается". И сами же приводят список аналогичного кода. Там есть ноль целых хрен десятых полезного функционала: роли, валидации, orm. Но я не думаю, что ради валидаций стоит ставить такого слона на сервер. В остальном, проще поставить обычный express-generator, он плюс-минус mvc тебе сгенерирует.
>>2352387 По крайней мере там typescript и DI из коробки. Уверен что на проекте 1) для чужого дяди 2) когда нет времени вылизывать код 3) на рынке куча интересных вакансий, я на проекте долго не задержусь... ты непременно будешь ковырять вилкой говнокод, в котором 4) нет тестов, потому что говнокод не реально протестировать Так выглядит рядовой проект на express
>>2352404 И чё DI? Они дополнительную сложность добавили в проект. Там, где можно было обычной функцией/классом обойтись, придётся заводить ебучие сервисы, контроллеры, фабрики, хуябрики. А что толку? Ничего же принципиально нового они не дают. Это дрочка ради самой дрочки. Синтаксический сахар.
Ты, по моему, просто не понимаешь, что такое DI. Смысл DI не в том, чтобы городить лишние фабрики, а чтобы решить проблему получения зависимостей для функции или класса.
Как можно запилить в проекте старую версию композера и ларавеля? Предположим на опен сервере выставил седьмую пыху, и нужно все в районе 2017 года, как это все устанавливать в domains?
Поставил PHP8.1, закинул свой проект, который писал под 5 версию. Охуел от числа ошибок и варнингов. Ошибки исправил, большинство варнингов - тоже. Никаких плюсов от перехода на новую версию не заметил.
Ищу компаньона на собственный проект. Вкачу в докер, на простых задачах выучим yii2, познакомимся с работой через api, расскажу за композер. Проект ноукоммерс зарплаты не будет, пилю его для себя. Для чего мне это, спросишь ты, а я тебе не отвечу. Проект уже приелся т.к пилю его больше года, плюс времени стало меньше. Помогу со всеми вводными что бы ты мог вкатиться в it. С тебя знания php и yii2 хотябы на минималках. Интересно? Пиши в телегу @hcan359
какой же ларавель саил копрокал пиздец просто я бы уже образ быстрее ручками собрал припердолив нжинксу чем разбираться почему что и где не дает установить нужные зависимости
в итоге я пытался прикрутить стандартную регистрацию на laravel/breeze. Ок, прикрутил, пытаюсь зарегистрироваться - хуйня какая-то, connection refused. Гуглю часов 6, и потом, чисто случайно, меняю DB_HOST 127.0.0.1 на mysql (имя контейнера), и, о чудо, работает. Но теперь у тебя явно вопрос - а нахуя я вообще трогал DB_HOST и поломал, но все намного интереснее - DB_HOST=127.0.0.1 выдает ошибку при попытке сделать миграцию артисаном. Да. В итоге у меня теперь интересная последовательность действий - меняю дб хост, делаю миграцию, меняю дб хост обратно. Пиздец ваш ларавель дерьмо блядь.
Контейнер докера чем-то напоминает виртуальную машину. Внутри него есть свои виртуальные сетевые карты.
Когда ты на реальной машине коннектишься к 127.0.0.1, ты можешь подсоединиться к программе, запущенной на том же компьютере. Тут 127.0.0.1 обозначает "этот компьютер".
Но в контейнере 127.0.0.1 обозначает не "эта машина", а "этот контейнер". И соответственно, ты не можешь из одного контейнера подсоединиться к другому, используя 127.0.0.1. Ты должен использовать адрес другого контейнера, как будто бы ты подоединяешься к удаленному серверу.
А если ты хочешь со своего компьютера подсоединиться к сервису внутри контейнера (например, к БД), ты тоже должен использовать IP-адрес контейнера или DNS-имя, а не 127.0.0.1
То есть, представляй себе, что каждый контейнер это как отдельный компьютер со своим адресом.
Ты даешь неправильный совет. Если анон сейчас начнет читать документацию Докера, он половину не поймет.
В данном случае сначала надо изучить основы сетевых технологий: что такое сетевой интерфейс, сокеты Беркли (не вебсокеты), протоколы IP, UDP, TCP, что такое маршрутизация и пакеты, система DNS, файл hosts, команды ifconfig, ss, ping.
Далее прочесть в общих чертах про неймспейсы в линукс, не вдаваясь сильно в подробности.
И после этого можно читать документацию Докера.
Докер это не инструмент для новичков-вкатышей. Это для тех, кто знает Линукс и сетевые технологии и свободно ориентируется в командной строке.
mt_rand это генератор, основанный на последовательности чисел. Есть очень-очень длинная последовательность чисел, и генератор каждый раз берет из нее следующее число. Если он доходит до конца последовательности, то он возвращается в ее начало.
То есть, там есть формула, по которой из предыдущего числа получается следующее. И он каждый раз применяет эту формулу.
Приведу упрощенный пример, как можно генерировать псевдослучайные числа (mt_rand устроен во много раз сложнее, я же специально упростил логику для понимания). Пусть у нас формула для генерации следующего числа (y) из предыдущего (x) такая:
y = (11 * x + 7) % 10
%10 значит "остаток от деления числа на 10", то есть, последняя цифра из числа.
Если мы возьмем начальное значение x = 1 и подставим в формулу, то получим новое случайное число y = (11 * 1 + 7) % 10 = 18 % 10 = 8. Если мы подставим в формулу 8, то получим 5. И так далее.
Последовательность чисел, которые сгенерирует генератор, состоит из 10 цифр и выглядит так:
1 8 5 2 9 6 3 0 7 4 1 8 5 2 9 ....
Эта последовательность бесконечно повторяется. Как только мы дойдем до числа 1, мы начнем получать те же числа, что и раньше.
Такие генераторы могут выдавать числа с большой скоростью, но они предсказуемы. Получив несколько чисел, ты можешь угадать, в каком месте последовательности находится генератор, и предсказать, какие числа он сгенерирует дальше.
Для генератора выше, если ты получил числа 8 и 5, то ты знаешь, что дальше он выдаст число 2.
Такой генератор не подойдет, например, для шифрования. Или для организации казино. Вроде бы был случай, когда кто-то разгадал алгоритм работы генератора случайных чисел в игровом автомате и невозбранно обогащался, пока владельцы казино не почувствовали подозрение и не запретили ему посещение их заведения.
Вот еще пример, где нельзя использовать такой генератор. Допустим, у тебя на сайте сделан вход через код в СМС. То есть, ты вводишь номер телефона, сайт генерирует случайный код и высылает его в СМС. Злоумышленник, зная, что ты используешь mt_rand(), несколько раз вводит свой номер и получает несколько кодов подряд. Имея эти коды, он рассчитывает, в каком месте последовательности находится генератор и предсказывает, какие следующие коды будут сгенерированы. После этого он вводит номер телефона жертвы и угаданный код, и получает доступ к его аккаунту.
То есть, mt_rand подходит для ситуаций, где не критично, если кто-то угадает числа.
Для случаев, когда нужна безопасность, предусмотрен random_int. Это криптографически надежный генератор. Он генерирует непредсказуемые числа, но его скорость работы ниже и он не может их генерировать быстро и много.
Если тебе нужно генерировать много криптографически надежных чисел с большой скоростью, то придется раскошелиться на аппаратный генератор случайных чисел. Или использовать современный процессор, в который такие генератор часто встроен (если ты конечно доверяешь Intel или AMD и веришь, что американское правительство не встроило закладки в этот генератор, чтобы обчистить твое казино, прочитать твои сообщения и взломать СМС-коды на твоем сайте).
Привет, Анон, подскажи, оформлял список преимуществ, создал див, сделал его флексом, размеры накидал дочерним и вышло 2 ряда по 4 преимущества, вроде бы все как хотел, но стоят преимущества слева-справа почти впритык, в тз виден отступ пикселей 10-20 без указания его, якобы он такой дефолтный, но почему у меня нет?
А почему отступ должен быть? Отступы надо делать либо с помощью margin/padding, либо сделав ширину элементов меньше, чтобы осталось свободное место.
То есть, если у тебя 2 колонки и ширина элемента равна 50%, то отступа не будет. А если ты сделаешь ее 45%, то оставшиеся 10% превратятся в отступ между колонками.
Если кому-то захочется скачать учебник на компьютер, то заходите на https://github.com/codedokode/phpbook и нажмите зеленую кнопку Code, там выберите Download ZIP.
Господа ПХПшники может кто подскажет как хитро реализовать следующую задачу: Есть страничка на пхп, нужно не дожидаясь загрузки контента (хтмл) отправлять get request на определенный урл. Отправлять не блокируя остальной код. На респонс плевать, главное очень быстро и не дожидаясь респонса и не блокируя рендер контента кидать реквест на определенный урл.
>>2357161 Если я правильно понял (если вообще реально понять хуйню, у которой даже название есть - xy problem), можно открыть tcp соединение через сокет, сформировать get запрос (это несложно - там всего лишь текст), отправить и.. всё, response можно не считывать.
сап тред, просматривал видеоуроки по шаблонам проектирования и столкнулся с непониманием тех строк которые подчеркнул. Зачем они нужны, объясните кто нибудь.
>>2357639 Добавлю, что частично response сосчитать всё-таки нужно, чтобы убедиться, что реквест дошёл. Например, status-line. Но сделать это можно в самом конце.
>>2353688 Что не так, школьник? yii2 уже ~8-9 лет и все работает
Любой фреймворк это набор компонентов роутер контроллер с коллбеками и работа с данными и отображение. Ну и рюшечки типа проверка почты, отправка и все такое.
Ну что вкатуны, как дела? А я сижу, пью кофе дома и работаю на немецкий продукт. Ну как работаю, уже час двачи листаю. Когда то я был как вы, в 2019м году открыл ПХП, установил линукс и начал писать коды эти ваши. А теперь я сижу в тепле и наслаждаюсь весной, пока быдло на заводах за копейки пашет, может на обеде поеду покатаюсь по дорожкам в лесу.
>>2359696 Идут два данмера по Алинору и видят волшебную лавку, на прилавке сидит альфик и лукаво размахивая хвостом, говорит данмерам: - За 99 септимов превращу в имперца Уримал покопался у себя в карманах и нашел 98 септимов, а Азарат у себя 100 септимов. Азарат говорит другу - Давай испытаем заклинание на мне. Если все пройдет успешно, то я отдам тебе лишний септим и ты тоже станешь имперцем. - Давай! - обрадовался Уримал. Зашел Азарат вместе с альфиком в лавку и через пять минут из лавки выходит статный имперец. - Скорее же давай мне септим. обрадовался Уримал. - Найди себе работу чумазый попрошайка!
>>2359696 Да нормально, все - по совету местного анона вкатился по подписке на хекслет, в итоге за 3 месяца освоил больше чем за весь прошлый год. По поводу на рыка труда, мне с дивана кажется, что на пыхе все более менее норм, по сравнению с тем же фронтом и питоном, если говорить про офисные джуновские ваки. Как нашел удаленку на западного барина? Или ты галеру РАБотаешь? Скок платят? Че молодым-задорным посоветуешь?
>>2359943 Да конечно на пыхе збс, конкуренции мало, а работы валом. Я в офисах не работал, сразу удалёнку нашёл на галере(но нормальной, с долгими продуктами без легаси), там 1,5 года проработал. Сейчас удалёнка на продукт на западного барина.
Молодым дам важный совет как найти работу: - Сделать хотя бы один проект нормальный на гитхабе и задеплоить на хост куда-нибудь. - Самому искать МАЛЕНЬКИЕ компании, где НЕТ ЭЙЧАРОВ. Там ты вероятность оффера будет 95% и сразу со старта платят.
Кто поопытнее и ищет вторую работу: Сделать полезную-интересную composer-либу и залить на packagist.
Я тоже не очень понимаю, в чем смысл этого кода. Есть такой подход, когда функции-сеттеры (которые задают какой-то параметр) заканчиваются строкой return $this; и это позволяет вызывать их по цепочке:
$someObject->setA(1)->setB(2)->setC(3);
Но зачем возвращать $this->messenger, я не очень понимаю. Может, это какая-то ошибка?
Вообще, мне не нравится этот паттерн. Я считаю, вместо того, чтобы писать однотипный код, сам язык должен поддерживать какой-то синтаксис для вызова методов по цепочке.
Также, мне не нравится здесь дублирование кода. У функции указан тип возврата MessengerInterface и зачем-то в комментариях это указано второй раз:
@return MessengerInterface
Так не нужно делать. Если ты уже указал тип возвращаемого значения, не не надо его писать второй раз.
PHPStorm это не стандарт, это всего лишь IDE. Я знаю, что PHPStorm любит генерировать бесполезные комментарии, но это не значит, что это правильно. Я думаю, это отключается где-то в настройках.
При этом, PHPStorm умеет парсить тайп-хинты и использовать их для анализа и подсказок. Также и другие анализаторы вроде phpstan умеют читать тайп-хинты.
Что касается PHPDoc, то я не вижу упоминания в документации, что он не умеет парсить тайп-хинты.
Хочу понять, какая структура должна быть у шаблонов.
Вот есть базовый шаблон с повторяющимся хедером, футером, посередине вставляется @yield content, назовем его app.blade.php. Дальше я создаю дочернюю страничку, пусть будет about, которая наследуется от базового шаблона app, описываю секцию, хуе-мое, блять. И таких страничек будет штук 5. Потом я осознаю, что в эти 5 страничек нужно вставить абсолютно одинаковый кусочек кода, не слишком маленький, но и не на 100 строк. Как бы мне это сделать красиво и без копипаста?
Я не написал, что я против PhpDoc. Я против таких PhpDoc, которые просто дублируют тайп-хинты и не несут никакой новой информации. Они бесполезны и лишь увеличивают время на чтение и модификацию кода.
Аноны привет. Мне очень нравится PHP, но пишу я на Golang, где "приложение компилируемое".
Вопрос такой: Что, если я напишу "самописный" движок сайта или сайт(сервис) на PHP, он раскрутится и кто нибудь(кабанчик подсуетится) отожмёт его у меня или возьмёт исходный код немного подправит, изменит "шаблон" и запустит свой аналогичный сайт? Что мне в этом случае делать? Какие методы защиты кода на PHP существуют: бэкдор для своего человека, супер пользователь вшитый в код, обфускация кода? Как защищаете Вы(Ваша контора) свой проект, как защищают крупные компании использующие PHP(Производители коммерческих CMS например)?
>>2361469 Ты в курсе, что пыха серверный язык? Как кабанчик у тебя его отожмет, если он на хостинге крутится, а не в браузере? Ты по сути даже не его видишь, а результат его работы.
>>2361536 В курсе конечно, но в "некоторой" стране можно доступ получить за деньги практически к любым данным. Например к SMS переписке или детализации звонков. Я не знаю как в остальных странах, но предполагаю не сильно лучше. Тем более в некоторых странах требуют, что бы "хостился" именно на их территории, если хочу их домен. Представь какой нибудь "Губер" или "Сенатор" в стране третьего мира захочет получить данные с сервака - думаю ничто ему не помешает или я не прав?
>>2361538 Чел, когда на тебя покусятся кабаны с такими возможностями у тебя будет своя СБ, а тебя самого будут интересовать больше яхты, а не твой пионерский говнокод.
>>2361563 Спасибо за мечты, но в успех я не очень верю. Возможно я пессимист.По теме: Есть знакомый - относительно взрослый дядя, Program Engineer (надеюсь правильно написал должность) который работает на иностранцев. Он тоже пишет, что, если идея которую ты реализуешь годная, то бабки появятся и уже потом будешь думать о безопасности, производительности, оптимизации кода и тд.
>>2360366 Работы валом, что на местных, что на западных. Тем более на пыхе. Я как только год опыта получил - просто игнорил местных, зачем, если есть западные продукты с западной зар.платой и западными условиями.
Здрасьте, что щас с фрилансом на пыхе и реально ли студенту-перваку ворваться на этот дикий запад? Прогал на си, писал сайтики на дженге, на ней же апишку писал, к пыхе не притрагивался но хочу на ней фрилансить.
>>2360900 Если где-то есть повторяющиеся элементы, выносишь их в отдельный файл .blade.php и импортируешь в те, которые нужно. Если есть необходимость его чуток видоизменять (текст, картинки, что-то показывать/убирать и т.д.), то blade шаблоны умеют принимать переменные и с их помощью можно колдовать над шаблонами как хочешь.
>>2347129 (OP) Сука, ну как искать работу? Мрази требуют пхп, ооп, хуяпе, вью, джс, тесты. Коммерческого полгода, а по сути ничему не научился толком. С каждой вакансии в ахуе
>>2362486 >ооп >джс >тесты Это все баззворды, которыми на собесе в голову срут и используют, чтобы непонравившегося кандидата зарубить. В реальности у тебя будет код-лапша без всяких там солид, просто раздробленный по куче классов/методов, и ajax запросы/таблички на жквиери на фронте. >вью Тебя наебать хотят, будешь макакой фулстеком.
>>2362625 >простые морды, если я бэкендер ПРостые морды для бэкендера это jquery + bootstrap, как показывает моя личная практика, лучше уж так чем говнокод на SPA.
>>2362628 Почему обязательно говнокод с vue? Пишу чисто, функционально на vue 3 как на реакте. С jquery у тебя в 99% случаев на проектах встретится говнокод. На жиквери можно компоненты писать в виде плагинов, но все любители жиквери предпочитают лапшу.
>>2362637 >функционально на vue 3 >как на реакте Ты насрал в штаны, дружище. Во vue нет функциональных компонентов, а те, что там называются "функциональными" представляют из себя ничего более, чем статичную рендер-функцию без ветвлений внутри. >С jquery у тебя в 99% случаев на проектах встретится говнокод. У тебя и с реактом/вью 99% встретится говнокод, но в отличии от жиквары - он еще и будет с горой бойлерплейта, который без траты огромного количества времени не разберешь.
>>2362642 Извини, но я в твои в штаны не срал. Это ты сам наделал. cоmposition api позволяет функциональный код писать насколько это возможно в жс и даже использовать this не дает.
>>2362645 >cоmposition api >функциональный код Хватит позорится уже. Твой composition api это буквально конактенация стрех строк: "export default { setup(){" . <Текст твоего компонента> . "}}". Где ты тут функциональное программирование увидел?
>>2362648 В JS даже контекст можно реализовать на замыканиях. Отсутствие контекста и преобладание функций - не гарантирует использования парадигмы ФП. Тот же composition api функционален только в момент инициализации, потом у тебя все равно появляется тобой ненавистный контекст, в отличии от реакта - где весь жизненный цикл компонента выполнен в виде функций. Исключение в виде ErrorBoundary не рассматриваем
>>2362655 И шо? Я против реакта ничего не говорил. Я же не шизик чтобы искать чистые идеальные формы, в практических приземленных вещах как веб фреймверки
>>2362667 Прямиком после выполнения метода setup, когда неожиданно все, что возвращалось из него становится полями объекта внутри прокси, доступ к которым из метода render осуществляется через with(this){}
>>2362696 Ну так вуе заставляет тебя в метод render лезть в 2022? Кстате необходимость shouldComponentUpdate тебя сейчас может заставить класс написать
>>2362698 >вуе заставляет тебя в метод render лезть в 2022? Не заставляет, если ты используешь вуй для генерации статичного HTML. Во всех остальных случаях - заставляет, просто через костыль with, потому что иначе код на вуе побил бы все рекорды по размеру бойлерплейта.
>>2362700 расшифруй пожалуйста. я писал разные многоуровневые меню и, таблицы с динамически подгужаемым контентом в ячейках и всякую другую SPA муру и нигде не использовал render
>>2362708 >я писал разные многоуровневые меню и, таблицы с динамически подгужаемым контентом в ячейках и всякую другую SPA муру и нигде не использовал render <template> в твоем вуй файле это ничто иное, как render()
Вкатился на работу джуном чуть больше месяца назад, вроде и закрываю таски, но очень тяжело вносить изменения в проект которому уже больше чем полгода и у которого твоего кода меньше процента. Иногда бывает за день пишу 5-10 строчек, и то после подробных объяснений ментора, бывают дни без единой строчки кода. Как фиксить? Наверное мерить работу в строках неправильно, но сколько строк в день - норм? Сроков как таковых нет, но мне кажется что если я продолжу вот так писать в среднем 15 строк в день меня уволят нахуй.
>>2362759 Расскажи как вкатывался. Что на собесах спрашивали? Задачки с литкода давали? Лайвкодингом заставляли заниматься? Про пет-проекты узнавали? И как ты вообще пробился, если сейчас на одну вакуху 10000 курсовичков и вкатышей?
Меня удивляют завидки, которые говорят, что пыха давно мертва, ведь почти все сайты на ней крутятся, в том или ином виде. Дайте мне пример языка/фрейма/платформы, где можно так же легко и непринужденно за пару вечеров сделать работоспособный набросок проекта, где было бы такое живое комьюнити, что ответы на все твои вопросы уже есть на форумах, а если произошел экстраслучай, то пыха настолько простая, то можно методом тыка и экспериментов решить проблему самому и даже не понять, как это получилось.
>>2362817 >Меня удивляют завидки, которые говорят, что пыха давно мертва Это из той же серии что и про мёртвые рельсы. Эти дауны, чванливо заявляющие о мёртвых языках только и могут что словоблудить почём зря.
>>2362817 Студенты тупые-зелёные такое говорят, которые с проектами не сталкивались даже. У PHP один минус - нет крупных проектов вроде амазона. Пыха это джава, только для мелких-средних проектов. Работы валом, зар.платы как у всех, вкатиться легче, поднять проект легко, сервера копейки стоят, скорость отменная у пыхи. Оно и хорошо что хейтят с другой стороны - меньше вкатунов, меньше конкуренции у новичков.
>>2362759 Ты полностью проект развернул? Базы должны быть полностью заполнены данными, все пароли предоставлены, все зависимости и утилиты установлены. Документации нет там? Главное проект полностью разверни, плюс в проектах всегда есть костыли, о которых ты можешь не знать.
>>2362867 Ну может, но я не знаю всм берут ли туда на работу или там и так бородатых дядек хватает. Т.е. при релокейте мне кажется сложно на пыхе найти работу уровня айти-гиганта. Ну это и так, на любителя, может кому важно и мечтает попасть в корпорацию какую.
>>2362885 > может кому важно и мечтает попасть в корпорацию какую. Да нахуй они нужны. Я там не работал, но слышал в этих корпорациях платят меньше рынка. И это не только IT компании касается. Зато представляю какой там дрочь, субординация и прочая корпоративная шиза, которую я блять просто терпеть ненавижу.
Вы почему-то ограничиваете выбор "хорошим" SPA на Vue и "ужасным" древним jQuery. Как будто нет других вариантов.
Но, на мой взгляд, реализация произвольного проекта как SPA имеет множество недостатков:
- очень медленная начальная загрузка, требующая передачи огромного объема данных - при этом у разработчиков почему-то не хватает ума впечь нужные данные прямо в страницу, и они делают ajax-запросы - разработчики не умеют правильно проектировать API, чтобы при переходах между страницами отправлялся бы единственный запрос, а не много - страница не отображается при единственной ошибке в любом компоненте, в то время как при использовании HTML ошибка загрузки одного CSS/JS файла или картинки не препятствует отображению страницы - с реактивным стилем написания кода легко сделать так, что приложение будет потреблять много CPU - написание SPA требует по сути написать два приложения: серверное и клиентское. Значительно увеличивается объем работы. - мне не нравится идея делать каждую кнопку отдельным файлом. Это выглядит красиво в концепции, но с таким кодом тяжело работать, прыгая по файлам на 10 строчек. Вы в коде тоже каждую функцию в отдельный файл выносите? - необходимость возиться со сборщиками и упаковщиками кода. На большом проекте, конечно, они все равно понадобятся, но на маленьком можно обойтись и без них. - проблемы с поисковой оптимизацией
Наконец, вы предполагаете, что использование реактивных фреймворков обеспечивает лучшую архитектуру. Но я открываю случайный блог и вижу, как автор пишет fetch() прямо в компоненте. Для тех, кто не понимает - это как если бы в PHP вы писали SQL-запросы и всю логику в HTML-шаблоне. Это вы называете лучшей архитектурой? Это же даже протестировать нормально не получится.
Или возьмите тот же Redux. Они предлагают сделать гигантский switch на 100 опций и на нажатие любой кнопки клонировать все состояние.
То есть, не надо все писать как SPA. Если вы пишете интернет-магазин или развлекательный ресурс с постами и лайками, вам даром не нужен SPA. Если вы хотите отправлять и валидировать форму аяксом, то вам не нужен SPA. Если вы хотите сделать переход между страницами сайта без перезагрузки, то вам не нужен SPA. Если же вы пишете высокоинтерактивное приложение, например, редактор электрических схем или мобильную версию Инстаграма, то вам пригодится SPA.
Лично мне из клиентских библиотек понравился preact (это не реакт). Его идея в том, что у него мало возможностей, но зато он весит всего несколько килобайт и позволяет при желании писать компоненты без компиляции и сборщиков. Если у вас есть простая интерактивная форма, то вполне возможно, что реализация одной формы на preact подойдет гораздо лучше, чем переделка всего приложения на SPA на популярном фреймворке, с весом бандлов под мегабайт и сложным процессом сборки.
> В JS даже контекст можно реализовать на замыканиях.
Можно, и я даже когда-то так делал, когда в JS не было классов, но это плохая идея в сравнении с классами, так как получается код в стиле "функция возвращает функцию", который тяжело читать. Классы читать гораздо проще.
> в отличии от реакта - где весь жизненный цикл компонента выполнен в виде функций.
Ты случайно не намекаешь на использование хуков вроде useState()? Я видел много хвалебных постов про эти хуки, но когда решил прочесть документацию и разобраться, то ужаснулся. То, что подают как лучшее решение, на самом деле превращает код в лапшу в стиле "функция возвращает функцию, которая возвращает функцию".
function Example() { [count, setCount] = useState(0); ...
А вот, как это выглядит с использованием ООП:
class Example { counter = new Counter();
render() { ...
Плюсы кода с ООП:
- объект счетчика создается один раз при создании компонента. С хуками же мы пытаемся создать счетчик при каждом рендеринге. Это просто нелогично. - с ООП класс устроен просто и понятно: есть состояние и есть методы для его изменения. С хуками же у нас функции возвращают функции и это просто сложно читать и, как следствие, легко сломать при редактировании. - функции вроде useState используют костыли (порядковый номер вызова), чтобы понять, к какой переменной мы обращаемся. В ООП таких костылей нету.
Такое ощущение, что люди готовы усложнять код, лишь бы не использовать ненавистные классы. То, что делается на хуках, ,можно сделать аналогично на ООП, только без костылей.
>>2363289 >- очень медленная начальная загрузка, требующая передачи огромного объема данных Решается SSR >- при этом у разработчиков почему-то не хватает ума впечь нужные данные прямо в страницу, и они делают ajax-запросы Решается фреймворками вроде next и nuxt >разработчики не умеют правильно проектировать API, чтобы при переходах между страницами отправлялся бы единственный запрос, а не много Решается http/2 >- страница не отображается при единственной ошибке в любом компоненте, в то время как при использовании HTML ошибка загрузки одного CSS/JS файла или картинки не препятствует отображению страницы Во первых, нужно писать код таким образом, что бы он не выкидывал ошибки. Во вторых, в любом фреймворке есть возможность отлавливать ошибки аналогично try/catch и выводить юзеру соответствующую инфу/производить другое действие/etc. >- написание SPA требует по сути написать два приложения: серверное и клиентское. Значительно увеличивается объем работы. Не согласен. Ты в любом случае будешь писать клиентское приложение (html + js+css) и бэк (любой язык на твой выбор). >- мне не нравится идея делать каждую кнопку отдельным файлом. Это выглядит красиво в концепции, но с таким кодом тяжело работать, прыгая по файлам на 10 строчек. Вы в коде тоже каждую функцию в отдельный файл выносите? Ну так не делай, сделай в одном файле 20 кнопок и экспортируй. Кто тебе запрещает? >- необходимость возиться со сборщиками и упаковщиками кода. На большом проекте, конечно, они все равно понадобятся, но на маленьком можно обойтись и без них. Тут согласен, да. Я так с cmake не заморачивался как с вебпаком. >- проблемы с поисковой оптимизацией Решается SSR >Это вы называете лучшей архитектурой? Нет, выводить отдельную функцию для AJAX запроса и передавать данные из неё в компонент через контекст/провайдИнжекты накмного практичнее. > Это же даже протестировать нормально не получится. То, что fetch можно мокать ты не слышал? >Они предлагают сделать гигантский switch на 100 опций и на нажатие любой кнопки клонировать все состояние. Что ты понимаешь под "всем состоянием"? Тебе никто не мешает вывести в отдельное хранилище логику работы с кнопкой и мутировать только его. >Если вы хотите сделать переход между страницами сайта без перезагрузки, то вам не нужен SPA. Проиграл. Если вы хотите сделать Single Page Application вам не нужен SPA. Сам свои высеры читаешь? > Если вы пишете интернет-магазин или развлекательный ресурс с постами и лайками, вам даром не нужен SPA >Если же вы пишете высокоинтерактивное приложение, например, редактор электрических схем или мобильную версию Инстаграма, то вам пригодится SPA. Тут даже без комментариев.
>>2363329 >Классы читать гораздо проще. Когда у тебя в классе есть конструктор и пара методов - несомненно. А вот когда у тебя компонент переваливает за сотню строк все значительно хуже. В функциональщине в таких случаях ты точно знаешь что у тебя за состояние и что за метод его мутировал, а вот в классах... Когда у тебя в состоянии больше одного поля код превращается в лапшу. Попробуй сделать компонент с 3 считчиками и 3 кнопками, которые увеличивают соответствующий ей счетчик и потом посмотри на количество бойлерплейта. Аналогичная проблема происходит, когда ты пытаешься расширить логику компонента, в функциональном компоненте тебе просто надо один раз написать useState, в классовом тебе надо менять единственное состояние компонента, возможно далеко не в одном месте. Аналогичная проблема в компонентах вуя, которые не используют композишн. Ну и на последок: классы из-за своей специфики в JS работают медленно.
>>2362809 На собесе спрашивали по синтаксису, фишки ларавела, солид, рест. Никаких задач и кода. Правда было условие, что для отклика нужно приложить свой пет-проект. У меня был простой файлообменник на ларе. Как отправил пет проект, через пол часа уже договорились о собесе, там не ответил на примерно 15% вопросов (по фичам лары в основном), сам собес где-то минут 20 длился, на след день написали с оффером. Было 20 откликов на эту вакансию, но уверен что большинство не посмотрели что нужен петпроект или надеялись без него договориться. Вопросы совсем простые были, я хз в чем сложность у предыдущих кандидатов была, я даже не готовился, это был первый собес, планировал просто узнать какие вообще требования и вопросы, резюме за 15 минут нарисовал
>>2347129 (OP) Доброго времени суток, форумчане. Просветите в вопросе о микросервисах. Знаю что есть разные протоколы для связи между сервисами, типа http, amqp. И так вот: допустим есть микросервис-шлюз на него делает запрос пользователь(хочет что-то получить). Шлюз в свою очередь дергает нужный микросервис путём помещения job'a в очередь rabbitmq. В итоге обмен данными между сервисами происходит асинхронно, каким тогда образом шлюз должен дождаться ответа от сервиса, чтобы вернуть пользователю?
Я подозреваю что в таких случая общение между сервисами реализуется по другому, например http. А такой синхронный тип общения между сервисами самый частный получается rabbitmq редко юзается?
>>2365032 Делаю всего по немногу прост. Так сказать подавашка. Хотелось бы гит заполнить чем-то полноценным. К тому же, в резюме то надо что-нибудь показать. А то на собес и не позовут
После реализации файлообменника из шапки на yii уже можно пытаться найти работу, или стоит потерпеть и сделать ещё и крупный проект из шапки на laravel/symphony? А на удалённую работу вкатиться получится?
Вопрос по Yii2. В туториале ошибка валидации отображается красным цветом. Почему у меня черный? Как сделать красным?
На stackoverflow есть только один топик с такой проблемой. Решения предлагаются такие 1. В лоб прописать css. 2. Залезть в vendor и нахимичить с ассетом бутстрапа.
Я правильно понимаю, что вторым лучше не заниматься? Есть ли другие способы кроме прописывания css?
>>2366497 Как фрейм вообще можно учить? Это ж не анатомия тебе и не французский язык. Его надо понять и применять. Попробуй-ка выучи для меня набор гаечных ключей, их форму, размерный шаг, допуск до микрона. Ты спросишь, нахуя? Да просто так. Ты скажешь, нет, пошел отсюда нахуй, когда они понадобятся, я просто откручу гайку или болт и все. Так же и тут. Учить надо пыху или французский, потому что его применение в чистом виде нихуя тебе не даст. Что в разговоре, что в кодировании. Его нужно применять с какой-то целью. Считай, что язык это отдельные слова. А фреймворк это грамматика, словарный запас, пунктуация, и все в одном флаконе. Найди себе француженку и пизди с ней на ларавеле.
>>2366652 Анон, меня ведь не обманывают глаза при поиске вакансий на hh? Laravel действительно самый популярный фреймоворк в рф на данный момент с которым будет проще всего устроиться?
>>2366667 Без понятия, я никогда в жизни не работал программистом. Более того, я не знаю, что сейчас популярно на галерах. Но твой месседж звучит логично.
Аноны, помогите мыслями. Такая задача: есть сервис (фронт на вью) и апишка (бек на ларавел). Как мне сделать jwt авторизацию в данном случае? Погуглил и ничего путного по теме нет. Алсо, резонно ли вообще разделять так сервисы? Или проще все в один проект запихнуть?
>>2366667 С ларавелем иногда возникает ощущение, что в нем ничего нет по сути, как на голой пыхе пишешь. Самое ценное кверибилдер, некоторые мидлвары по умолчанию, очереди, простенькое DI, как раз такое какое нужно для мелко средних проектов (не в пример симфони). Коллекции - обычно спорят о их нужности, но пользоваться ими легко. Научился пользоваться моделями и кверибилдером, который возвращает коллекцию моделей - понял 50% ларки. Главное разобраться как модели устроены и работают с данными из запросов с помощью магических методов (все данные в модели хранятся в массиве атрибутов). полезные утилиты config, env, app_path, storage_path и др. Миграции Все остальное вторично. Всякие там форм реквесты.
>>2366709 Гуглил плохо. Но авторизацию на jwt делать плохо. jwt хорош кода имеет короткий срок гидности и тебе не нужно рефреш токены всякие выдумывать.
>>2366746 Аутентификации и авторизации точнее. Для авторизации однократных действий жвт подходит. Например схема с жвт авторизацией 1) Фронтенд проходит обычную сессионную аутентификацию на ларке. У фронтенда есть кукисы что пользователь залогинен. 2) Есть микросервис, который тоже торчит в интернет. Например отправка сообщений в телегу. Микросервис не должен позволять отправлять сообщения кому попало. Но микросервис сам не занимается авторизацией пользователя на отправку. 3) Фронтенд говорит ларке дай жвт на отправку сообщения. Поскольку фронт аутентифицирован в ларкиной сессии, он получает жвт 4) Фронтенд посылает команду микросервису отправить сообщение и дает ему этот жвт. 5) Микросервис делает запрос ларке на проверку жвт. Если все ок то микросервис отправляет сообщение в телегу. 6) Все этот жвт больше не нужен.
Сап. Подскажите, как называется штука, которая позволяет избежать get-запросов на странице и вместо этого генерить отдельную "директорию". Например, как у вк: vk.com/id111 вместо того, чтобы было vk.com/profile.php?id=111
Здравствуйте. Гайд по вкату в шапке треда актуален? Планирую вкатываться, но по php как то мало гайдов. В основном все дрочат фронтенд, там каждый пук обсосан до мелочей
>>2365148 Yii-шник с полугодовалым стажем, планирую сваливать на ларку. Взяли на первую работу после курсов от webformyself (есть на ютуб), когда предоставил в качестве резюме магаз оттуда. Yii для старта конечно подойдёт, но вот потом начинаешь задумываться о более вкусных штуках, особенно когда скроллишь hh. Так что советую подумать, оно тебе надо?
Есть смысл сейчас это покупать? https://www.chitai-gorod.ru/catalog/book/1095225/ Если нет, что можете посоветовать? Сорри за копи-пост с ньюфаг-треда, надо уже к завтрашнему дню подобрать книгу в подарок.
>cli НИ В КОЕМ СЛУЧАЕ НЕ ИСПОЛЬЗУЙ! Используй официальный тулинг в виде vite, который разрабатывается самим автором vue. Он, кстати, поддерживает не только vue. https://vitejs.dev/guide/
>>2369169 Главное не используй cli. Это не просто мусор весом в несколько сотен мегабайт, туда еще и периодически всякие трояны попадают. гугли node-ipc
Насколько сильно изменился laravel с 2018 года? Суть в том, что я учу фронтенд фреймворк vue. А язык php знаю лишь чуть чуть, прошёл часть учебника по php до ООП из ОП-поста этого треда. И я хочу посмотреть на youtube примеры приложений на vue с бэкендом. Очень часто на youtube попадаются плейлисты, где делают приложение в связке laravel и vue. Дело в том, что эти плейлисты старые, годов 2018 - 2020.
Насколько сильно с 2018 года laravel изменился? Будут ли у меня в 2к22 году тонны ошибок из-за того, что я пытаюсь запустить старый код 2018 года?
>>2369673 Ларка-то 5 от 9 не прям особо сильно отличается отличается, конечно, в дохуя местах, но основа та же самая по сути своей и синтаксис не менялся, а вот вуй...
Аноны. Вопрос по ларе. Создаю кастомное правило валидации что запись существует в бд можно было бы конечно дефолтный exists сделать но там бы спагетти получлось и прикол в том что первичный ключ это uuid. И если формат неверный, то мое правило все равно пытается отработать и закономерно 500 ошибка что uuid имеет неверный формат. Как правильно поправить?
>>2370114 Не совсем подходит. Я короче заимплиментил какой то там интерфейс и у меня в правило валидатор записывается. И там я уже проверяю есть ли ошибка или нет. В любом случае спасибо за отклики.
>>2371760 Тавтология получилась. В общем, тебе надо при загрузке страницы сразу запускать полный её рендер, без ожидания асинхронных запросов и подобного
>>2362759 >Сроков как таковых нет Сроки ставят либо на типовые задачи, либо отбитые долбоёбы с фриланс-бирж всем подряд. Если пишешь кастомный функционал, то никакие сроки тебе ставить не будут - как их считать то? Ну скажут тебе неделю на какую-то таску, а там неучтены костыли будут, и выйдет 2. И хули толку от этих сроков тогда? Пальцем в небо. Обычно смотрят чтобы ты коммиты делал, а не волынил по неделе.
>мне кажется что если я продолжу вот так писать в среднем 15 строк в день меня уволят нахуй. Классика, лол.
>Наверное мерить работу в строках неправильно В закрытых тасках меряют обычно. Таски закрываются значит всё правильно идёт. Остальное от лукавого.
>>2373567 >подводные? no hire с подтвержденным попытом 5 лет, работающими в проде приложухами. Даже не отказывают, а просто собесят и съябывают в закат.
>>2373567 Подводные в том, что все эти знания нужно применять в проекте. Сами по себе они бессмысленны. На собеседовании вопросы задают так: "С вставить нужное работал? А с вставить нужное?"
И только самые отбросы (которые хотят ставку тебе понизить) будут гонять по вопросом пыхи, ларавел джс и т.д.
Все моя субьективщина и опыт, на истину не претендую. Но у меня было так.
>>2373593 Ну слушай, так то и на senior вакансии требования на бумажке совсем не сложные. Такое же знание пхп, ларавел, вью, гит. Но вот опыт работы с этим, вот что важно. Я первую работу нашел спустя примерно 4 месяца, с учетом того, что меня устроил друг. Только через год работы я начал немного понимать, что к чему. Знания из курсов и роадмапов вообще не пригодились по сути. Советую как можно скорее искать работу, там научишься.
Ты можешь применять знания в личных проектах. Вот, для примера, блог одного человека, который решил каждые пару месяцев делать по маленькому и в идеале прибыльному проекту (правда, у него уровень не джуниора и он делал проекты не для поиска работы, но блог сам по себе довольно вдохновляющий): https://tinyprojects.dev/
> будут гонять по вопросом пыхи, ларавел джс и т.д.
Это приходится делать, потому что в резюме все Львы Толстые, а по факту нет.
У меня ощущение, что помеченные синим блоки (nice-to-have) это тоже обязательно. Знать только красные блоки будет маловато. Как это так - знать SELECT, но не знать JOIN. Никуда не годится.
С другой стороны, знать Yii и Wordpress не требуется, если вы с ними не планируете работать.
Не хватает основ линукса и командной строки. Не хватает шаблонизаторов. Не хватает ORM и связанных с ними паттернов: ленивая загрузка, identity map, unit of work.
Насчет паттернов: много бесполезных паттернов вроде registry или service locator, абстрактная фабрика, и мало полезных вроде паттернов для ORM или паттернов для работы с БД (TableGateway, Data Mapper).
Насчет ООП. Тут, увы, материалов по ООП мало (вообще, во многих учебниках и туториалах с ООП беда). В Роадмапе я вижу ООП рассматривается всего лишь с двух сторон:
- синтаксис классов и объектов со ссылкой на документацию - паттерны проектирования со ссылкой на сайты или книги
Посередине между этими двумя направлениями не хватает важной вещи: самой концепции ООП, понимания, зачем оно нужно, какие плюсы дает, где и как его использовать (без паттернов) и где его использовать не надо, и как его использовать правильно.
Мне это хорошо знакомо, так как я сам, когда начал свою карьеру не знал ООП, а знал только синтаксис. То есть, я знал, что такое класс и объект, как их описывать, создавать, как вызвать методы, но не понимал, зачем они нужны и, подозреваю, успел налепить много кода сомнительного качества. Например, я не понимал, зачем в нашем приложении использовались классы, если можно обойтись без них. Или, если уж мы решили использовать классы, то почему бы не сделать все на статических методах, чтобы не надо было создавать объекты.
Вот этой информации вы не найдете в документации по PHP. Она описывает только синтаксис. И не найдете в книгах по паттернам, так как они рассчитаны на тех, кто уже знает ООП. А если вы полезете в паттерны, не зная ООП, то толком ничего не поймете.
И мне кажется, по этой причине, то есть из-за непонимания, у людей "ООП" ассоциируется с чем-то излишне переусложненным. Хотя это очень полезная и важная идея, улучшающая качество кода.
По ООП роадмап дает ссылку на oodesign, а там по сути рекламируются две книги:
1) Head First OO Analysis & Design. Я пролистал книгу, и она не объясняет что такое ООП, а предполагает, что читатель это уже знает. Примеры кода на Java (она довольно похожа на PHP). В первой же главе есть сеттеры и геттеры, и никто не объясняет, чем они лучше, чем публичные свойства. Опять же, предполагается, что читатель знает про инкапсуляцию.
Также, мне не понравилось, что до начала полезной информации идет более 30 страниц бесполезных вступлений и мотивирующих страниц.
Из нее можно научиться полезным вещам, но решения там не всегда удачные. Например, в первой главе рассматривают пример кода для базы данных гитар с поиском по ним. Идея объединить характеристики гитары и фильтр для поиска к классе GuitarSpec неудачная, так как это не позволяет нам делать поиск по цене, поиск с несколькими значениями одного параметра, и тд. Нужно сделать отдельный объект GuitarFilter.
Пример про магазин гитар хороший, но примеры с дверью для собак очень оторваны от реальности и ООП там не особо и нужен.
>>2374398 >Посередине между этими двумя направлениями не хватает важной вещи: самой концепции ООП, понимания, зачем оно нужно, какие плюсы дает, где и как его использовать (без паттернов) и где его использовать не надо, и как его использовать правильно. >Вот этой информации вы не найдете в документации по PHP. Она описывает только синтаксис. И не найдете в книгах по паттернам, так как они рассчитаны на тех, кто уже знает ООП. А если вы полезете в паттерны, не зная ООП, то толком ничего не поймете. Меткое наблюдение, и где вот этот промежуточный слой добывать, методом собственных проб и ошибок?
Что у тебя за сайт, что тебе понадобился клиентский рендеринг? Блог? Интернет-магазин? Корпоративный сайт? Там выгоднее рендерить все на сервере. SPA там не нужен, он только ухудшит скорость загрузки и удобство пользования сайтом. И поисковую оптимизацию.
SPA это не только плюсы, но и минусы, и надо их взвешивать, прежде чем использовать.
Если же ты делаешь не сайт, а какое-то приложение, например, редактор смешных картинок или генератор цветовых схем, то конечно, выгодно реализовать приложение на клиенте. Но опять же, может быть не надо весь сайт заворачивать в SPA, а только блок с генератором цветовых схем.
Для продвижения в поисковых системах ты делаешь рендерящиеся на сервере текстовые страницы с описанием твоего чудо-приложения, или например, страницы с популярными цветовыми схемами. А сам редактор индексировать и оптимизировать не надо. Ты же не думаешь, что Гуглобот зайдет к тебе и будет там двигать рычажки для подбора цветов? Гуглобот будет индексировать лишь страницы популярных цветовых схем.
То есть, у меня ощущение, что SSR мало когда нужен. Для классических сайтов с текстом и картинками мы рендерим все на сервере и отдаем HTML. А для приложений не нужна индексация интерактивной части приложения в поисковике, достаточно индексировать текстовые страницы и сгенерированный контент.
Или в том же интернет-магазине ты можешь сделать каталог и страницы товаров на серверных технологиях, а блок оформления заказа на интерактивных технологиях. И этот блок как раз индексировать не требуется. То есть, SSR тут тоже не нужен.
Если у тебя что-то промежуточное, например, аналог Инстаграма, то тут придется извернуться, чтобы картинки и индексировались гуглом, и просматривались через SPA. Инстаграм, как я понимаю, генерирует для Гугла отдельную страницу для каждого пользователя. То есть, он отдает Гуглу только контент (картинки), но не приложение с лентой, лайками, комментариями, подписками.
Честно говоря, выглядит как антипример для микросервисов. Вместо того, чтобы слать все запросы на один и тот же бекенд, мы делаем несколько бекендов и количество запросов от этого увеличивается, а как и увеличивается шаткость и оверинжиниренность такой конструкции.
Я думаю, что твой пример больше бы подошел для случая, когда один сайт дает другому разрешение что-то сделать. Иначе описанная тобой схема просто не имеет смысла.
Насчет разеделения на фронтенд-бекенд: это зависит от того, какой у тебя сайт. Если ты сам не понимаешь, зачем нужно разделять, то наверно в твоем случае это не нужно.
То есть, никто не начинает писать фронтенд на вью потому, что это модно. Обычно для этого есть какая-то важная причина.
Например, ты пишешь приложение для подбора цветовых схем и без использования вью получается куча лапши, которую ты хотел бы упростить за счет грамотного применения архитектуры MVC и data-binding. Даже в этом случае, возможно, что ты сделаешь не все приложение на SPA, а лишь интерактивный блок с редактором схем.
> Как мне сделать jwt авторизацию в данном случае?
При логине фронтенд отправляет на бекенд запрос на авторизацию. В запросе содержится логин и пароль. В ответе от сервера приходит JWT токен с содержимым вроде { "id": id пользователя, "issued": время выдачи }.
После этого фронтенд добавляет этот токен во все запросы, которые требуют авторизации.
Никакого рефреша не нужно. Если ты хочешь, чтобы пользователь никогда не перелогинивался, то разрешаешь использовать токен вечно. Если хочешь чтобы он логинился заново каждый месяц, то ставишь соответствующее ограничение и отказываешься принимать слишком старый токен.
Набор гаечных ключей "учить" не надо. А набор сверл или фрез? А станок с ЧПУ? Или ты предлагаешь взять первую попавшуюся фрезу (не зная, для каких материалов она подходит) и нажимать случайные кнопки на станке?
Ты долго на работе не задержишься с таким подходом.
То, что в папке vendor это сторонние библиотеки и править там что-то просто глупо. Так как при обновлении библиотеки все твои правки будут перезаписаны.
В твоем случае, скорее всего эту надпись выводит какой-то виджет, который отвечает за вывод полей формы. Тебе надо посмотреть, какие классы и правила CSS применены к этой надписи, узнать, как можно заменить стили форм на свои, и в своих стилях прописать нужные тебе правила.
А зачем в твоем примере rabbit? Его добавление выглядит как лишнее усложнение. Проще отправлять запросы напрямую.
Очереди событий, однако, имеет смысл использовать для надежного сохранения каких-то данных, если сами сервисы ненадежные. Например, ты пишешь госуслуги и у тебя есть сервис обработки заявлений на смену налогообложения. Сервис кривой и ненадежный, и если ты передаешь заявление пользователя в него, то он легко может его потерять.
Здесь мы используем очередь. Мы кладем заявление пользователя в очередь, а сервис налогообложения берет его из очереди и, если заявление успешно обработано, помечает заявление выполненным. А если сервис не смог обработать и упал, то заявление остается в очереди. Теперь заявление не потеряется.
Заметь, что если твой сервис надежный, то очередь становится не нужна. Но скорее всего сервис надежный как раз потому, что внутри него уже организована очередь - может не на основе rabbitmq, а например, в базе данных, но это все равно очередь с точки зрения архитектуры. И потому вторая очередь тут не нужна.
Другой пример использования очередей - фоновая обработка задач. Пользователь загружает на сайт видео, и тебе надо его конвертировать, но это медленно. Ты добавляешь задачу на конвертацию в очередь, и фоновый скрипт рано или поздно дойдет до нее и выполнит. А если не выполнит, то задача останется в очереди. Опять же, вместо rabbit ты можешь использовать очередь на основе БД.
То есть, попробуй при проектировании подумать, зачем тебе нужна очередь и что она дает. Никто не проектирует архитектуру наугад, каждое решение на чем-то основывается, есть причина, почему делают так, а не иначе.
>>Классы читать гораздо проще. > Когда у тебя в классе есть конструктор и пара методов - несомненно. А вот когда у тебя компонент переваливает за сотню строк все значительно хуже. В функциональщине в таких случаях ты точно знаешь что у тебя за состояние и что за метод его мутировал, а вот в классах...
Я ничего не понял. Если ты напишешь компонент на 1000 строк, используя useState, он вряд ли будет легче для понимания, чем ООП-компонент на 1000 строк. Решение тут состоит в том, чтобы не писать слишком большие компоненты, а не заменить ООП на его имитацию через костыли.
> Попробуй сделать компонент с 3 считчиками и 3 кнопками, которые увеличивают соответствующий ей счетчик и потом посмотри на количество бойлерплейта
В ООП мы можем вынести логику подсчета в класс Counter и создать три экземпляра класса:
class DemoComponent { #counter1 = new Counter(this); #counter2 = new Counter(this); #counter3 = new Counter(this);
render() { ... } }
Не вижу, чтобы этот код был бы сложнее чем код с использованием useEffect/useState. По моему, он даже проще.
Про расширение компонента я не очень понял, где это надо и как тут хуки могут помочь.
> классы из-за своей специфики в JS работают медленно.
Классы и объекты в JS очень хорошо оптимизируются, если ты не пытаешься на лету создавать или удалять свойства и методы, а определяешь их один раз заранее.
ООП наоборот логичнее, так как ты в нем создаешь все поля и методы один раз при создании объекта, а с хуками ты объявляешь поля заново при каждом вызове функции рендеринга. Это просто противоречит здравому смыслу.
>>Если вы хотите сделать переход между страницами сайта без перезагрузки, то вам не нужен SPA. > Проиграл. Если вы хотите сделать Single Page Application вам не нужен SPA. Сам свои высеры читаешь?
Для перехода между страницами без перезагрузки достаточно добавить известную библиотеку на десяток килобайт, которая перехватывает клики по ссылкам и грузит страницы аяксом. Мы получаем переходы без перезагрузки, отличную поисковую оптимизацию, не написав ни строчки клиентского кода.
Вконтакте, если мне не изменяет память, когда-то работал по такой схеме.
А ты, судя по ответу, думал, что навигацию без перезагрузки без многомегабайтного SPA и API не реализовать? Можно только пожалеть тех, кто тратит деньги и время там, где это не требуется.
>>- очень медленная начальная загрузка, требующая передачи огромного объема данных >Решается SSR Мы придумали себе проблему и героически ее решаем.
>>разработчики не умеют правильно проектировать API, чтобы при переходах между страницами отправлялся бы единственный запрос, а не много > Решается http/2 Это не поможет, если следующий запрос зависит от предыдущего.
> Не согласен. Ты в любом случае будешь писать клиентское приложение (html + js+css) и бэк (любой язык на твой выбор).
Да, только вывод данных на стороне сервера проще, так как нам не надо делать никаких аякс-запросов, нам не нужно никакое хранилище, не нужно поддерживать его в корректном состоянии ит.д. То есть, вывести профиль пользователя на сервере в разы проще, чем на клиенте.
Личные проекты вместе с изучением документации и туториалов дадут достаточный для джуниора уровень.
>>Это приходится делать > Ну делай, мне с такими не по пути
Тебе не по пути с компаниями, которые хотят отбирать только компетентных специалистов и отказывают тем, у кого нет достаточных знаний? Которые нанимают только лучших из имеющихся на рынке? (задумчиво чешущий подбородок смайлик)
Не знаю. Попробуй читать разные уроки, книги и туториалы и может быть в сумме ты наскребешь что-нибудь.
По многим темам нет хороших уроков, например по HTTP на русском я как-то искал информацию и ничего толком не нашел. По концепциям ORM тоже нету ничего.
>>2374485 А если тебе нужно вывести профиль пользователя, чат и проводки из бухучета, а на другой странице чат, баланс и интерактивные видоуроки по системе, а если нажимаешь на кружочек сверху, то чат уезжает в угол и счезает , а вместо чата открывается профиль пользователя, а если в проводках нажмешь на символ человечка, то открывается модальное окно с исхдящим звонком к коллеге, а если коллега начнет редактировать провоки у себя, то ты будешь видеть у себя изменения... абырвалг ... абырвалг ...
>>2374489 Как связаны отбор компетентных специалистов и вопросы по пхп, ларе? Если человек имеет опыт, проекты, нахуя ему знать в чем там отличие =, == и === (как пример).
Я не беру в расчет такие компании как вк, яндекс и подобные. Где кандидатов куча и они отсеивают их алгоритмами, которые в работе не применяешь
Неплохая идея. Если ты опубликуешь код на Гитхабе или где-нибудь еще, то я могу раскритиковать его и указать, что можно исправить.
Для более глубокого понимания разработки я бы советовал так же покрывать код тестами. Они тебе помогут убедиться, что код написан правильно и помогут обнаружить проблему, если ты вдруг при рефакторинге что-то сломаешь.
>>2376127 Вкатунам тесты кажутся чем-то нереально сложным, обычно. Вряд ли он это будет делать. Хотя ничё вообще сложного в этом нет. Достаточно видосиков посмотреть немного.
>>2376276 ну естественно то над чем ты сейчас работаешь ты будешь тестировать (дебажить) через дебаг или вручную. тесты не для этого - тесты для поддержания кода. чтобы последующие правки ничего не поломали. к тому же они документируют код, по тесту можно понять чего ждет (и не ждет) метод. плюс в системах со сложными связями это может помочь, т.к. иногда при правках одного места ломается другое, а заметить сразу не выходит. а тут поправили че надо, запустили юнит тесты и убедились в том, что вероятно все нормально но то что нерабочий тест бесполезен это правда, и на поддержание тестов тоже нужны ресурсы и время, которое иногда выделить сложно..
Насчет фреймворка, то вот на что стоит обратить внимание:
Ты в composer.json использовал и auto-load, и autoload и require. Чтобы не сомневаться, открой документацию по composer https://getcomposer.org/doc/04-schema.md и проверь, какие ключи там можно использовать в конфиге. Удали некорректные ключи.
> class Request{ > public function getPath(){ > $path = $_SERVER['REQUEST_URI'] ?? '/';
Это не очень правильно, точнее совсем не правильно. У тебя класс Request всегда берет данные из глобальных переменных. Это значит, что ты к примеру не можешь создать Request с какими-то вручную заданными данными. Более того, непонятно вообще в чем тогда смысл создавать объект Request, если можно было просто сделать функции вроде getPath(), которые делают то же самое.
Также, советую ставить тайп-хинты у функций, указывать типы аргументов и возвращаемых значений. Это повысит читабельность кода и позволит быстрее обнаруживать ошибки.
> $path = substr($path, 0, $possition); Для этого есть стандартная функция parse_url().
> if($callback === false){ > echo "404"; При ошибке 404 надо не выводить на экран число 404, а отдавать правильные заголовки с кодом 404. Но в любом случае, это не задача роутера что-то выводить. Логичнее было бы вызвать какой-то заранее определенный обработчик.
Вообще, роутер ничего не выводит. Он лишь определяет, какой обработчик надо вызвать. Если твой роутер не только разбирает URL, но и вызывает обработчик, то это правильнее называть Front Controller.
Насчет Yii, ты можешь изучить его для начала как относительно простой фреймворк, но если ты захочешь взять что-то посовременнее, то есть микрофреймворк Slim и Symfony.
Без тестов очень неудобно. Например, ты поменял класс, который используется в нескольких местах и теперь должен протестировать вручную кучу функционала.
А если ты захочешь сделать большой рефакторинг, то может понадобиться перетестировать вообще все приложение.
Или ты захочешь обновиться с PHP7 на PHP8, опять же, надо все вручную перепроверять.
Или ты написал модуль, и хочешь, чтобы его кто-то другой не сломал. Опять же, тесты тут помогут.
Отсутствие тестов приводит к тому, что разработчики боятся делать какие-то большие изменения, а просто дописывают свой код, не заботясь об архитектуре.
>>2376699 хех, ты исправил папку где я уже не работал, я на время отложил разработку мвс фреймврка из за того что мало что пока знаю, уже сегодня-завтра перепишу по новой всё, что бы выглядело нормально
>Насчет неймспейсов да с этим я уже разобрался не беда
>Также, советую ставить тайп-хинты у функций
да я хотел колегу спросить про это, просто не знал как они зовуться, теперь знаю, уже нашёл статью на хабре и буду изучать
>При ошибке 404 надо не выводить на экран число 404, а отдавать правильные заголовки с кодом 404. Но в любом случае, это не задача роутера что-то выводить. Логичнее было бы вызвать какой-то заранее определенный обработчик. ну, для себя для теста я пока сделал так, что бы было ясно, на продакшене я конечно же делаю иначе
>Насчет Yii, ты можешь изучить его для начала как относительно простой фреймворк
да я уже заметил, я уже на 6 уроке, тобишь почти прошёл, буду ещё доку читать и разбираться более глубоко, в yii2 прям досконально хорошо реализована модель мвс
>то есть микрофреймворк Slim и Symfony
да, их я тоже буду изучать, я впринцыпе не так давно изучаю пыху, а точнее две недели, потому не так много знаю, времени у меня до сетября, думаю за это время освоюсь
Я впринцыпе довольно сильно зайнтересован в изучений пыхи потмоу планирую много времени изучать
Не знаю как правельнее выразиться, но скажу как есть
дай свои контакты телеги/слаки/матрикс/что угодно, я буду переодичестки писать и спрашивать всякую интеерсную хуйню, я вижу ты кое что да знаешь. будет интересно попиздеть, если что заранее модешь написать мне в телегу @suityan
Сап, хочу вернуть boolean значение из sql запроса для проверки существования email function emailExists($email) { $conn = new mysqli('localhost', 'root', 'somePass', 'Students'); return $conn->query("Select case when exists(select * from students where email='$email') then cast(1 as bit) else cast(0 as bit) end ;"); } Однако выдает ошибку синтаксиса sql near 'bit) else cast(0 as bit) end' at line 2. В чем собственно ошибка и как ее можно исправить?
>>2377135 А как в таком случае определить зависимость от запроса в бд? То есть мне нужно, чтобы функция возвращала true при наличии записи с указанной почтой, и соответственно false при ее отсутствии.
Ну вот вы выучили language_xи может даже какие-то фреймворки/либы, далее что? Вы понимаете что сейчас рыночек схлопнулся, и если вы не мид+ от 3х лет, то конкуренция очень большая. Требуются знающие кадры чтобы сходу делать упругие вещи, там задачи реально не тривиальны.
>>2378030 а ваще мне настолько похуй стало на поиск стажировок на пыхомакакена, что я просто уже f# дрочить стал фор фан. именно фарш, который вообще не выстрелит
>>2378030 это не что-то запредельное или недоступное, >>2378030 качественно работаешь, проявляешь трудолюбие в своем деле, после этого приятные цифры уже вопрос времени.
>>2379141 Если ты не наживаешься на доверчивых людях, то сделай себе кредитку (в Тинькофф например тебе просто на следующий день после заполнения формы на сайте привезут домой и можно уже пользоваться) или подключи овердрафт на дебетовой карте и возьми эти жалкие 1300 рублей, за займ на 6 дней даже проценты платить не придётся, сколько взял столько вернёшь.
>>2374981 На торрентах - дмитрий лаврик php и альберт степанцев profit Там как раз mvc пилят с нуля по типу yii2. ORM которая возвращает объекты, view на основе буферизации с $this->render('main', ['model' => $model])
>>2379653 >Изучи html Кстати есть какой-нибудь хороший сжатый справочник-памятка? Я как-то по верхам нахватался и часто путаю/забываю вещи. inb4 htmlbook
>>2380337 Вообще без разницы, это просто инструмент, который будешь использовать. Важно понимание как оно работает просто. А по фреймворку базовые вещи за вечер освоить можно.
Если фанбой какой-то то можно так достаточно долго в скорлупе просидеть, но это ваше дело
В этой задаче в учебнике под спойлером есть правильная цифра - 61270 р.
В твоей программе явно ошибка. У тебя в предпоследний месяц после уплаты остается долг 4138 р. В следующем месяце ты выплачиваешь его одним платежом, хотя к нему еще должны добавиться процент и комиссия и получится больше 5000.
Попробуй поменять сумму кредита на 4 000 и проверить расчеты вручную. Должно получиться 6123 р.
>>2380706 Я видел эти гайды, во-первых, у меня open server, а во-вторых, все равно не работало по ним пока я не добавил php.debug.executablePath в settings.json
Сап, слоны. Вкатываюсь в Laminas (a.k.a. Zend framework). Использую phpstorm и nginx. Не понимаю, как их подружить. Вот у меня есть nginx с конфигом, который хуй пойми, работает ли. Есть в phpstorm скелет приложения, который я могу запустить на встроенном веб-сервере пыхи через терминал. А как сделать так, чтобы nginx взял весь этот код и начал юзать? Нужен просто правильный конфиг, и сервер автоматически будет подключать интерпретатор на запросах, а phpstorm - это чисто редактор текста? Или я всё равно должен как-то запускать сервер в phpstorm?
Во-первых, ты можешь захотеть как-то преобразовать контент перед отдачей. Например, если браузер поддерживает сжатие, то сжать его. Для этого ты накапливаешь контент в буфере и сжимаешь его перед отдачей.
Или может быть, у тебя какой-нибудь древний сайт и ты таким образом редактируешь контент на нем, не трогая его код. Или может быть ты вырезаешь лишние пробелы из HTML.
Во-вторых, представь, что у тебя посередине вывода страницы произошла ошибка. Ты не можешь ничего сделать - ни вывести сообщение об ошибке (так как оно перемешается с кодом страницы), ни вывести страницу целиком. В случае буферизации ты при ошибке можешь показать страницу ошибки, так как ничего еще не отдано, а содержимое буфера просто отбросить.
Но есть и минусы. Без буферизации ты можешь начать отдавать контент гораздо раньше, а с полной буферизацией ты должен сначала сгенерировать страницу целиком, и только потом отдавать. Использование полной буферизации увеличивает время до получения первого байта ответа и замедляет загрузку страницы на время, в течение которого она генерируется.
То есть, без буферизации ты можешь хоть с первой строчки скрипта начинать отдавать данные в браузер, а с буферизацией скрипт должен выполниться до конца, прежде чем что-то будет отдано.
Анон >>2381287 упомянул, что буферизация может ускорить отдачу контента. Такое возможно, но маловероятно. Такое бывает, если ты не используешь буферизацию и твой сервер отдает контент очень медленному клиенту, до которого долго идут данные. То есть, ты в PHP делаешь
echo "<html>";
И PHP стоит и ждет, пока клиент примет и подтвердит получение данных. Но сейчас обычно PHP отдает контент не клиенту напрямую, а в nginx, а nginx принимает данные быстро и охотно, потому такая ситуация маловероятна (и кстати по этой причине nginx способен улучшить производительность сервера).
Что касается кук и заголовков, то обычно во фреймворках их напрямую никто не ставит, а используют объект Response, потому проблемы с их отправкой нету. Буферизация для этого не нужна.
Не понял как найти эту тему в мануале (это наверное не по пхп вопрос вообще), я хотел узнать поподробнее про строку пути, вот например <a href='index.php'>Ссылка</a>(в данном случае вызывается файл из самого корня), когда в папке домена много подпапок и там тоже есть такой же файл index.php. Мне надо было сделать <a href='../index.php'>Ссылка</a> чтобы вернуться к корректному файлу скрипта в одной из подпапок, так вот не хотелось бы экспериментировать, а знать правила построения пути к файлам.
>>2382610 https://puzzleweb.ru/en/html/8_links2.php Все, нашел. Теперь только небольшой вопрос чем отличается просто 'index.php' от './index.php', по идее оба одинаково вызовут из текущей директории файл.
Сап, пыхари. Собираюсь в php вкатываться, живу в России. Есть три вопроса:
1. Сильно ли порушился внутренний рынок вакансий внутри страны после 24-го? Уменьшились ли зарплаты? Если да, то насколько в среднем?
2. Насколько я понял, php не востребован в Европе/США, но при этом востребован в России и странах СНГ. Действительно ли расклад такой, или я ошибся в своих наблюдениях?
3. Реально ли выйти на вакансию джуниора? Слышал краем уха, что php-джуниоры не нужны, и работодатели в РФ ищут как минимум миддлов. И я-то в принципе мог бы поработать годик на фрилансе, и соврать, что у меня был коммерческий опыт. Если бы не одно но: крупные фриланс-биржи уходят из России, а финансовой подушки хватит мне месяцев на 10, не больше. Если буду пахать часов 9-10 в день без выходных, то смогу ли выйти на позицию джуниора через 10 месяцев, или лучше вкатываться в какой-нибудь другой язык?
По твоей ссылке приведены не все возможные формы относительных URL. Общее правило такое, что мы можем откинуть один или несколько компонентов URL слева и получится относительный URL, например:
http://example.com/page.html?a=1#target - это полный URL //example.com/page.html?a=1#target - без схемы /page.html?a=1#target - без authority (хост, порт и авторизация) ?a=1#target #target - тут остался только последний кусочек от URL
Странно, у меня обычно идеи появляются каждый день, но некогда их реализовывать. Правда не идеи коммерческих проектов, а всяких свободных программ и библиотек, или идеи по улучшению существующих программ. Я очень хорошо научился замечать всякие недоработки в программах и интерфейсах и у меня обычно всегда есть идеи, что можно улучшить.
Впрочем, иногда их удается реализовать. Например, я недавно задался вопросом: какие слова и сочетания слов мы чаще всего используем в коде? Проанализировал код большого проекта, выбрал самые часто встречающиеся сочетания и добавил их как сниппеты в редактор. На все это ушло несколько часов.
Например, напечатав prifqi я получаю
private function |(): ?int {
}
pri значит private, f - function, q = ?, i = int
Кстати, самые часто употребляемые слова это $this-> и return. Я сделал для них сниппеты с буквами t и r. Ну и дополнительные сочетания вроде rn для return null.
Тут конечно анон может возразить, что в профессиональных IDE уже встроены хорошие подсказки, Нужно всего лишь купить такую IDE, но их проблема в том, что они очень общие и там есть куча ненужных функций, так что если ты начнешь писать rn, то тебе скорее всего вывалился куча нерелевантных подсказок вроде редко используемых PHP-функций.
Я даже поймал себя на мысли, что может быть имеет смысл это как-то автоматизировать, чтобы IDE анализировала проект и автоматически выдавала самые вероятные подсказки (используя теорию вероятности) вместо редко используемых функций или классов.
Ну и может тебе будет интересно почитать блог, человек создает всякие простые проекты и даже с некоторых пытается заработать какую-то копеечку: https://tinyprojects.dev/projects
>>2382667 > Насколько я понял, php не востребован в Европе/США, но при этом востребован в России и странах СНГ. Действительно ли расклад такой, или я ошибся в своих наблюдениях?
Не ошибся. Если хочешь перекот в Европу, то паралельно изучай Golang.
Аноны, как настроение? Можно, я для поддержания общения буду иногда задавать тупые вопросы, на которые мог бы найти ответы в гугле или в документации, сюда? Здесь ведь все мои друзья, и мне интересно мнение анонов!
Заранее благодарен.
Чем отличается echo от print_r? Что лучше использовать?
Мимо вкатун, хех. Желаю всем отличного дня, а себе - удачи.
>>2383566 П.С. И почему если из 100 извлечь квадратный корень, записать в переменную, то var_dump выводит - float? А если же озвести в квадрат, то var_dump выводит - int? Вроде ведь и 10 и 10000 - целые числа? Или это - вопрос высшей математики уже?
>>2382667 > Слышал краем уха, что php-джуниоры не нужны, и работодатели в РФ ищут как минимум миддлов. Правда. Но если IRL вакансию и можно найти(в крупных городах, естественно), то на удалёнке скорее всего лососнёшь тунца. Никому не нужен джуниор на удалёнку. Даже хороший и толковый.
>>2382667 > Если буду пахать часов 9-10 в день без выходных, то смогу ли выйти на позицию джуниора через 10 месяцев, или лучше вкатываться в какой-нибудь другой язык? И да, не сможешь.
>>2383653 Я это написал же. Вопрос в другом - Почему это значение именно float, а не int? Получается, потому что квадратный корень можно извлекать и из дробных чисел, поэтому для удобства приняли, что даже если результат от извлечения корня будет целым, то просто везде будем писать float, чтобы не делать лишних движений?
Но дробное число при возведении в квадрат тоже может быть дробным, а целое - будет целым, но после возведения 100 в квадрат возвращается int.
Возможно, ты подумал, что целые числа всегда имеют тип int. Это не так.
Тип int позволяет представлять целые числа от примерно -9×10¹⁸ до 9×10¹⁸ (в 64-битной версии PHP, в 32-битной предел около 2 миллиардов). Числа этого типа представлены точно, то есть каждая цифра в таком числе правильная. Мануал: https://www.php.net/manual/ru/language.types.integer.php
Тип float позволяет хранить и дробные, и целые числа примерно от -10³⁰⁸ до 10³⁰⁸ (в 64-битной версии). Этот тип неточный и сохраняет только первые 14-16 цифр числа, а остальные цифры теряются (но их количество не теряется). Хуже того, многие дробные числа вроде 0.1 нельзя точно представить в формате float. Также этот тип интересен тем, что в нем есть отрицательный ноль -0, минус и плюс бесконечность и NaN, "не число". NaN можно получить, если вычислить sqrt(-4). Мануал: https://www.php.net/manual/ru/language.types.float.php
Как видишь, целое число может быть и типа int, и типа float. Обычно целые числа представлены типом int, но они могут превратиться в float если выйдут за допустимые пределы или если станут дробными. Например, если ты поделишь int(5) на int(2), то получишь float(2.5).
Функция вычисления корня возвращает тип float. Так сделано, потому что корни чаще получаются дробными, чем целыми и функция, которая всегда возвращает int, была бы бесполезна.
Тут можно спросить: а почему, когда результат целый, он не преобразуется обратно в int?
Перечитай написанное выше: float это приближенный тип. Если после извлечения корня из 10 000 ты получил float(100), то ты не можешь быть уверен: это точно 100 или это на самом деле 100,000 000 000 000 000 1 и последняя цифра просто не сохранилась. Так как мы не можем гарантировать, что там ровно 100, мы не хотим преобразовать число в int. Обычно, если число превратилось во float, в int оно само уже не вернется.
Конечно, эту проблему можно решить: можно преобразовать результат в int, возвести в квадрат и сравнить с исходным числом. Если они совпадут, значит, результат действительно целый. Но это надо заморачиваться и писать дополнительный код, и наверно просто никому это не нужно (но ты можешь написать свою функцию, которая будет это делать, если есть желание).
echo может выводить только строки и числа. print_r и var_dump выводят данные любых типов, например, массивы. print_r и var_dump предназначены больше для отладки, чем для использования в реальном коде. Выбирай, что использовать, в зависимости от ситуации.
>>2347129 (OP) Заливаю проект на прод сервер. Проект laravel + vue. Сервер работает, но фронт выдает ошибку 404 (redirected you too many times.). Нода установлена. В чем проебался? На локальном работает все заебок. Видимо, вью установлен как-то неправильно. Может, делал кто-нибудь подобное?
>>2382667 >1. Сильно ли порушился внутренний рынок вакансий внутри страны после 24-го? Уменьшились ли зарплаты? Если да, то насколько в среднем? Сильно - вакансий в разы меньше стало.
>2. Насколько я понял, php не востребован в Европе/США, но при этом востребован в России и странах СНГ. Действительно ли расклад такой, или я ошибся в своих наблюдениях? В РФ тоже почти не востребован - все на ноде делают. Или питоне.
>3. Реально ли выйти на вакансию джуниора? Слышал краем уха, что php-джуниоры не нужны, и работодатели в РФ ищут как минимум миддлов. Да. На позицию джунов ищут миддлов, на позицию миддлов - синьёров. Без опыта делать там нечего, тем более сегодня.
>Если буду пахать часов 9-10 в день без выходных, то смогу ли выйти на позицию джуниора через 10 месяцев, или лучше вкатываться в какой-нибудь другой язык? Лучше в питон тогда - там легче учиться. Или в жс.
> В РФ тоже почти не востребован - все на ноде делают.
Нода - не лучший выбор. Например, ты можешь обратиться к несуществующему полю объекта и не будет выдано никакой ошибки. Куча легаси. Нет тайп-хинтов, то есть невозможно делать большие проекты. Асинхронность, что доставляет много неудобства при написании обычной бизнес-логики.
Ну и твое утверждение не проходит проверку на hh:
разработчик php, вся Россия - 3432 вакансии разработчик node, вся Россия - 1311 вакансий разработчик python, вся Россия - 4315 вакансий
Ты бы потратил минуту, прежде чем выдавать свои фантазии за реальность.
Что касается Питона, он мне нравится и я его использую (numpy, sympy, sqlalchemy, плюс в нем есть библиотеки для нейросетей), он дает высокую скорость написания кода, но в нем нет проверки типов в рантайме, mypy выдает очень много левых предупреждений, и его производительность, как я понимаю, ниже, чем у PHP, так как в Питоне больше ценят простоту кода, чем оптимизацию.
Погугли вопросы к собеседованию. Новичков без опыта спрашивают по теории, то есть, то, что описано в официальном мануале PHP, ООП, реляционные СУБД, джойны, транзакции, блокировки, внешние ключи. Какие фреймворки/библиотеки знаешь.
>>2384748 Да не пишут бек на ноде без тайпскрипта уже. Инкрементальную компиляцию почти не замечаешь. Типизация в общем лучше чем в пхп 8, но в пыхе добавляют фичи в язык"шоб было как у шарпе с жавой", а в js мало кардинальных улучшений.
>>2347129 (OP) Есть спецы по вордпрессу? Есть один сайт. Залез в базу, а там в поле post_content таблицы wp_posts текст поста хранится с html тегами. Это нормально? Пробовал гуглить, но ничего не нашел.
>>2384748 >разработчик php, вся Россия - 3432 вакансии 80% - параша уровня завода по заёбистости и зарплате. Что смыс циферками мерятся если на пыхе 90% это сайтики на вп и битриксе, а у остальных нормальная разработка?
>>2384864 > Нужно учить то что востребовано и на что есть спрос там где живешь/собираешься работать. И что же востребовано в России? PHP? Кулстори, Боб. Кулстори. Расскажи ещё.
На пьиЭйчьПьи работает ~80% всех сайтов. Это нужно дорабатывать и обслуживать. На рыночке в целом спрос есть.
Это просто инструмент, кому-то может нравиться или нет технология, но свои функции она выполняет. Если дахуя фанбой можешь дрочить голанг и попробовать устроиться)) или хз чего ты там фанбой, зарабатываешь уже? будь честен для начала хотя бы с собой
>>2384893 Ну вот я выбираю записи из бд, мне их надо на страницу все отобразить, а там у каждой записи timestamp вместо времени человеческого, как поступить лучше?
>>2384896 Не знал про такое, спасибо. Читаю эти книги по пхп и как рыба об лед бьюсь, в жизни все равно вещи по-другому делают. Хз как устраиваться куда-то вообще.
Пытаюсь создать проект Laravel , ввожу команду php composer.phar create-project --prefer-dist laravel/laravel mysite , получаю сообщение To enable extensions, verify that they are enabled in your .ini files: - C:\php\php.ini Что это означает и что делать?
У тебя не установлены (или установлены, но не включены в php.ini) какие-то расширения PHP, которые требуются для Laravel. Какие именно, должно быть написано в сообщении об ошибке.
>>2385104 А, это эксклюзивно к битриксу относится, я так и думал. Кстати как ты его начал изучать? У меня в регионе вроде пользуется спросом, в вакансиях зачастую идет вместе с пхп.
>>2385117 Начинал в 2019 в июне вкатываться. Начал с фронта как и большинство вкатунов. Потом забросил, даже не осилив жс. Потом через 3 месяца снова начал пытаться, у меня случилось горе, и я снова сдался. Потом через полгода начал изучать C# по метаниту, прошел где-то до делегатов, охуел от сложности всего и снова сдался. Потом я наконец пришел в пхп, его уже довольно основательно изучил по разным ресурсам, уже и задачи на кодварсе решал, правда несложные, максимум 5кую. Параллельно немного изучил sql и фронт. Ну и тоже периодически бросал, возвращался и так вот до начала этого года. С начала года начал пытаться в Битрикс, т.к. подумал, что это изи вкат во ВСЕХ планах. Но оказалось изи вкат только в плане количества вакансий и меньшей конкуренции.
Я думал, что Битрикс это хуяк-хуяк и готово, что не надо тут много думать и шарить, не надо долго изучать и т.д. Это вообще неправда. Тут много надо всего тоже знать, много раз случается такое, что чего-то нет в доке, каких-то микропроблем велик шанс вообще не суметь загуглить, потому что большинство их решает на изи, а кто нет... Тот я. Благо есть телеграм-канал по битриксу для разработчиков, где почти всегда находится добрый человек, который ответит на твой пустяковый вопрос. Уже раз 5 мне там помогли. Плюс можно через поиск сообщений нагуглить в этом канале свою проблему, тоже бывало находил решения.
Щяс вот на обучении был в компании одной с середины мая, все задания сдавал вовремя, жду результатов. Могу и на стажировку попасть. Хотя все мне на дваче говорили, что это плохая компания, раз она набирает на стажировку не сразу, а после какого-то обучения. Типа это неправильно. Как по мне, а как еще отсечь полных аутов и незаинтересованных людей? Если только набирать сразу джунов, но они почему-то не делают этого. Нас из 50 человек вкатунов осталось меньше 10-ти. Обучение ес что бесплатное было.
В общем, за всё время вкатунства, это первый раз, когда мне удалось зайти так далеко, да еще и заинтересоваться всей этой темой. Я седня сдал ласт задание и был нереально рад, что смог его сделать. Завтра уже продолжу учиться с радостью. Щяс позволю себе посмотреть аниме перед сном.
>>2385745 Я вообще конкретно про битрикс интересовался, может хорошие курсы или книги, но твоя история тоже интересна. У меня тоже уже несколько раз руки опускались и сам я очень медленно все делаю в плане обучения. Там наверное надо бац-бац кабанчикам быстро все.
>>2385764 Ну хорошие курсы только от самого битрикса, еще можно посмотреть Михаила Базарова. Остальное только по крупицам собирается с опытом и гуглением.
>>2385872 Ну вот написано же >Свойства класса могут быть определены как public, private или protected. Свойства, объявленные без явного ключевого слова области видимости, определяются как общедоступные (public) Я делаю вывод что можно объявлять без указания области видимости и будет назначено public. Так вот я не могу просто написать свойство класса $x без всего, пишет ошибку.
> Определять константу почти всегда лучше с помощью define(), потому что тут больше возможностей и меньше вариантов «поймать» ошибку.
Это неправильный вывод. Объявлять лучше с помощью const, так как это более чистый синтаксис и он (наверно) лучше понятен статическим анализаторам кода. define можно использовать только если const не работает.
Да, такая рекомендация есть в стандартах. Я думаю, это ради читаемости, чтобы было видно, что поле публичное, а не то, что ты пока не решил, каким его сделать.
>>2386067 Просто мне показалось странным, что методы пропускает без указания, а свойства нет. Там похоже ноги растут из старых версий пыхи где надо было var писать.
ну что за хуйня? уже весь интернет перелопатил. Заливаю проект на сервер, а он выдает 404. Хотя на локальном все отлично работает. в чем ошибка то блять?
>>2374485 >достаточно добавить известную библиотеку на десяток килобайт, которая перехватывает клики по ссылкам и грузит страницы аяксом. Мы получаем переходы без перезагрузки, отличную поисковую оптимизацию, не написав ни строчки клиентского кода.
>>2386372 Сижу обновляю приложение на РНР, которое я написал на заказ в одно лицо на plain PHP + MariaDB + Bootstrap +JS/jQuery + SCSS + Gulp + RabbitMQ + Java.
Бизнес, основанный на этом приложении, принёс владельцам около 1 млрд рублей за 5 лет. Я получил за это время свои скромные 2-3 М, параллельно работая над другими подобными проектами.
Работать буду до утра, и могу ответить на вопросы по программированию и фрилансу. хуи не сосу, бочку не делаю
>>2387532 Define "что-то". Могу из формы значения в базу писать и потом выводить их через echo. Но так никто не делает ведь да, там какие-то шаблонизаторы нужны и т.д.
Это PDO? Тогда в нем есть fetchAll(). Однако, в него не надо передавать текст SQL запроса. Ты ведь уже указал текст запроса при вызове prepare(). Вот мануал (и там есть примеры кода с fetchAll): https://www.php.net/manual/ru/pdostatement.fetchall.php
Кто выдает ошибку? Твоя IDE или при выполнении кода реально возникает ошибка?
Не надо писать цикл с fetch, если тебе нужны все записи, то лучше использовать fetchAll().
>>2387643 Я читал урок и в принципе понимаю как поделить обработку формы и "шаблон", который вызывает через action этот обработчик, но вот этих сторонних шаблонизаторов не касался. Сейчас на чистом не пишут, только фреймворки и CMS? И предполагается что джун уже знает это все чтобы с 1го дня с этим работать?
В такой ситуации ты можешь попробовать проверить, правильные ли имя пользователя и пароль, подключившись вручную из командной строки:
mysql -uroot users
Если происходит такая же ошибка, то придется немного заморочиться.
Тут https://askubuntu.com/a/763359 пишут, что теперь подсоединиться к mysql как root можно только если ты залогинен в систему как root. Работать из-под root это очень плохая идея, потому нужно создать в MySQL нового пользователя и дать ему права на все базы данных. Для этого коннектимся к БД, используя sudo:
sudo mysql -uroot
Далее, создаем нового пользователя БД:
CREATE USER 'имя пользователя'@'localhost' IDENTIFIED BY 'пароль';
Обрати внимание на @localhost - это значит, что пользователь сможет подключаться только с твоего компьютера, снаружи под ним нельзя зайти.
Далее, даем новому пользователю все виды доступа ко всем таблицам всех баз данных:
GRANT ALL PRIVILEGES ON звездочка.звездочка TO 'имя пользователя'@'localhost' WITH GRANT OPTION;
И применяем изменения:
FLUSH PRIVILEGES;
Если ты хочешь дать доступ не ко всем базам данных, а только к одной, то пиши ... PRIVILEGES ON базаданных.звездочка ...
в общем спустя какое-то время подумал - нафиг это программирование, вот это всякое айти там да. бездушно это, не лежит действительно к этому душа так сказать.
>>2388396 >>2388400 Ну в битрикс вкатывайся. Там не нужны алгоритмы, надо просто разбираться в самом битриксе, в ООП, в MVC, которое у битры немного другое, немного скуль, немного фронт. Хотя где-то много фронта, т.к. нет отдельного, по-разному короче.
Я к тому, что тут проще вкатиться, конкуренция меньше, знаний надо меньше. Надо лишь разобраться в устройстве всего битрикс фреймворка и всё.
>>2388396 Действительно дефицит, только как ты написал СПЕЦИАЛИСТОВ. А джун нахуй нужен? Чтобы его учить? Ты хоть 2 года учи дома за проектами свой ларавел, разработка это совсем другое. В компании будешь учиться с нуля, это никому не нужно
>>2388671 Обучать есть смысл, если работа узкопрофильная. А на пхп у кабана всегда найдется работник с подходящим опытом. Даже если поиск будет долгим это профитнее чем учить новичка с нуля.
Ты не прав. Джун, если он дома тщательно изучил HTML, CSS, PHP, ООП, фреймворк, СУБД, алгоритмы, проектирование интерфейсов, очень полезен.
Во-первых, ему можно давать всякие простые рутинные задачи. Вроде пройтись по сайту и поменять везде синие кнопки на зеленые. Это не требует больших умственных усилий, и дешевле отдать это джуну за пачку лапши, чем платить гору золота миддлу или сениору. Плюс джун со знанием интерфейсов заодно красиво выровняет съехавшие кнопки.
Во-вторых, правка всяких мелких багов вроде того, что при вводе номера телефона длиннее 15 символов база выдает ошибку. Джун, конечно, потратит много времени, но зато в процессе хорошо разберется в коде.
Джуну можно поручать и разработку. Например, сениор написал гениальный алгоритм поиска. А джун сделает для него страничку с формой и показом результатов. Или сениор сделал красивую форму, а джун добавит в нее ссылки на политику приватности и условия использования.
Естественно, везде речь идет о сообразительном джуне, готовом разбираться в коде и любящем читать англоязычную многостраничную документацию. Если это какой-нибудь выпускник курсов по информатике, которого учили только числа Фибоначчи считать, или вкатыш, не понимающий ООП и не желающий читать мануалы, но считающий, что он заслуживает средней зарплаты по отрасли, то конечно, толку от него 0.
>>2388742 Откуда вы это берете пздц. Тут одни диваны-вкатыши сидят? Какие-то абстракции в голове придумываете, как можно джуна занять и за что ему все таки заплатить. Такое может написать только тот, кто в компании никогда не работал
кароче решил изучить этот ваш пиэйчпи. буду каждую неделю теперь отписывать об результатах. сам я работаю полу эникеем полу админом так что я не вкатывальщик, похуй искать работу по этой залупе или нет посмотрим. до этого програмирование вообще не изучал по факту(так в шараге проходили но я ничего не делал)
Ну и может быть, как опытный, ты расскажешь никогда не работавшему в компании человеку, кто у вас занимается прикручиванием форм обратной связи, перекрашиванием кнопок и правкой текста условий использования сайта? Исключительно сениоры с 10 годами стажа?
>>2389009 Я умею подключаться к mysql, делать запросы, еще могу решать задачки на кодварсе, еще задачки с ОП книги, еще... Синтаксис ООП знаю, но применять пока не умею, только собираюсь писать свой фреймворк по гайду. Потом мб свой целиком зделаю, хотя зачем, тут ведь главное понять внутренности плюс-минус, а потом уже переходить к популярным фреймворкам типа битрикса или ларавель или симфони. Оттуда уже делать какой-то проектик, хотя это сложно когда нет поставленной задачи, за которую тебе заплатят. Но один проект заставить себя можно сделать. Правда до конца не получилось пока ни разу.
Такой синтаксис называют "грамматика". Грамматика - это набор правил, который определяет, как можно составлять конструкции (вроде выражения или оператора if) из элементов. Имея грамматику, мы можем разобрать (распарсить) программу на отдельные части.
Элементы делят на два вида: терминалы и не-терминалы. Терминалы это элементы, которые нельзя разделить на части, а не-терминалы - это составные элементы, которые собраны из других терминалов или не-терминалов.
Например, мы можем сказать, что выражение 2 + 2 это не-терминал, так как оно составлено из трех терминалов: ЧИСЛО 2, +, ЧИСЛО 2.
Если мы хотим описать грамматику, то мы начинаем с того, что описываем все терминалы, а затем описываем, как из них можно составлять не-терминалы, и в итоге получаем финальное правило, которое определяет, как составляется программа.
Небольшая сложность заключается в том, что в PHP, как и во многих языках, две грамматики: первая (лексическая) грамматика определяет, как из символов (терминалов) составляются токены (не-терминалы). Вторая грамматика (синтаксическая) определяет, как из токенов (которые теперь являются терминалами) составляются более сложные конструкции и в итоге сама программа.
Например, лексическая грамматика может выглядеть так:
ЦИФРА (не-терминал) - это '0', '1', ... '9' БУКВА это 'a'...'z' ПОДЧЕРКИВАНИЕ это '_' ЦЕЛОЕ_ЧИСЛО - это одна или более ЦИФР ИМЯ_ПЕРЕМЕННОЙ - это '$', затем (БУКВА или ПОДЧЕРКИВАНИЕ), затем 0 или более (ЦИФР, БУКВ или ПОДЧЕРКИВАНИЙ)
Здесь ЦИФРА - это не-терминал. Но в синтаксической грамматике ЦИФРА и ИМЯ_ПЕРЕМЕННОЙ будут уже терминалами, и они могут использоваться так:
ПРИСВАИВАНИЕ - это ИМЯ_ПЕРЕМЕННОЙ, '=', ВЫРАЖЕНИЕ
Правила грамматики по-английски почему-то называют productions.
Для описания правил грамматики есть стандартные синтаксисы вроде BNF (очень старый и неудобный), ABNF, EBNF.
>в общем спустя какое-то время подумал - нафиг это программирование, вот это всякое айти там да. бездушно это, не лежит действительно к этому душа так сказать.
>>2388464 у меня вопрос вообще не в том что не осилил, это не проблема в чем-то разобраться.
просто залипать в кампуктер значительное время для меня не очень хорошо, а занимаясь разработкой это так есть по факту, считай работаешь + в свободное время учишь либы/фреймворки.
https://stackoverflow.com/questions/1831610/how-to-develop-a-mvc-framework-from-scratch - тут рекомендуют сначала хорошо разобраться в MVC на уже существующих фреймворках. Хотя на других ресурсах рекомендуют сделать свой по гайдам, чтоб разобраться в нутре MVC фреймворков. Трудно сказать, что лучше. Выбери свой путь. Я решил изучать уже существующие. Сначала один, потом другой для сравнения. Потом мб напишу свой для развития.
Есть ли разница между != и <> сравнением, может по приоритету? Или это для тех кто пришел из других языков (не знаю где правда такой оператор сравнения).
>>2390529 Я после шараги 2 месяца чилил, потом за 2 нашел) Был на двух собесах, на первом сначала отказали, потом через неделю написали на почту "вы ещё не трудоустроились?" Ну а я уже был на другом месте. Как-то легко меня берут.
>>2390637 Хихихм, привет. Лару учил откровенно говоря мало, так как учёба и другие обстоятельства. Дописал файлообменник до вида более менее, решал задачи, структуры данных какие-то реализовывал, сейчас пишу сайт с новостями, на чистой пыхе. С июля (закончится сессия как раз) буду дрочить лару и жс, проектом на ларе будет форум (имидж борда, кто как хочет). В общем-то, все неплохо, хотя могло быть намного лучше
Почему sql запросы так долго выполняются? Я например беру данные с бд и сравниваю их с данными из формы и это происходит долго, секунды 2(да для меня это долго)
>>2390654 А, по поиску работы. Разослал в компании 4 наверное. В одной посмотрели резюме но ответа не было, в другой отказали (я решил мало ли меня удалённо могут взять, написали что возможно вернутся к моей кандидатуре, но это пиздеж очевидный ) и в других нашли разработчика до того как даже глянули резюме. Как-то так
Это не очень нормальная цифра. Обычно запросы занимают миллисекунды или меньше.
Во-первых, дело может быть не в запросе, а в чем-то другом. Попробуй запустить консоль MySQL (если ты используешь MySQL) и выполнить запрос напрямую с параметром SQL_NO_CACHE:
SELECT SQL_NO_CACHE x FROM y WHERE ... ;
MySQL напишет, сколько времени выполнялся запрос. Если там не 2 секунды, а 2 миллисекунды, то очевидно дело не в базе.
Если запрос выполняется медленно, то можно поискать причины. Для начала сделать EXPLAIN, то есть добавить в начало запроса EXPLAIN и выполнить:
Ты увидишь план выполнения запроса и можешь посмотреть, оптимально ли он выполняется. Ищутся ли данные по индексу быстро или же без использования индекса идет полный перебор таблицы с миллионом записей. Если полный перебор миллиона записей - то надо оптимизировать запрос или доабвлять индексы.
Наконец, даже если индексы настроены правильно, но у тебя очень много данных, а базе ты выделил очень мало памяти, то данные будут постоянно читаться с диска, а это небыстро.
Если твой проект не секретный, то ты можешь запостить тут запрос, вывод EXPLAIN и сколько у тебя всего записей в таблицах и может кто-то увидит причину проблем.
Подскажите где посмотреть примеры кода других людей? Интересует php laravel на гитхабе только? а как искать? пишу в поиск laravel, а там одни package (либо вообще элементарные проэкты вроде блогов), а мне проекты интересно посмотреть
>>2389653 Учти только, что MVC это минимальная база для джуна. По-хорошему ещё надо микросервисную архитектуру понимать, а там уже SOLID, юнит-тесты, обязательный ООП, полезно знать структуры данных хотя бы базовые и прочее такое. Хотя если собираешься на вордпрессе говнокодить, то необязательно. Но учти, что это именно программерская база, а не только веб-макаки.
ООП и юнит-тесты никак не связаны с микросервисами. Наоборот, монолит, скорее всего окажется лучше и удобнее, чем гора микросервисов. Монолитная архитектура самая лучшая для большинства компаний. Микросервисы, впрочем, имеют смысл, когда у тебя масштабные проекты уровня Яндекса.
Например, у Яндекса есть сервис, который рассчитывает оптимальный способ добраться из точки в точку, и этот сервис используется и Яндекс-Картами, и Яндекс-доставкой, и где-то еще. Без микросервисов тебе бы пришлось дублировать код. Это пример случая, когда микросервисы действительно помогают. Яндекс использует микросервисы не потому что они прочитали про них в блоге, а потому что они разбираются в архитектуре. А компания анона использует микросервисы, потому что прочитали про них в блоге. Возможно, поэтому эта компания не Яндекс.
Но если у тебя небольшой или среднего размера продукт, то заводить микросервисы это лишняя головная боль на ровном месте. Особенно глупо заводить микросервисы в надежде, что повысится качество кода. Если у тебя плохой код, то надо учиться писать хороший код, а не надеяться, что микросервисы тут чем-то помогут (не помогут).
Также, можно услышать, что микросервисы позволяют использовать разные языки программирования. Согласен, если у тебя высоконагруженный сервис, то можно, как Вконтакте, писать свои хранилища на Си или на Расте, или Го. Но если ты не способен осилить эти языки, то наверно микросервисы тебе не очень-то и нужны.
>>2347129 (OP) Ананас, подскажи что лучше начинать учить вместе с php, сервер apache или ngnix на linux?
Установил на второй ноут ubuntu, никогда им не пользовался но вроде весело все идет, сейчас думаю какой сервер поставить. О apache двойственные впечатления, пердолинг с htaccess заебал для статичных сайтов (учился), и говорят он устарел вообще и тормозит быстродействие.PHP разработчики пользуются же VDS а не виртуальными серверами как я понял?(git там,laravel) я же по сути любой сервер(ngnix или apache) на этот VDS могу поставить, и панель управления типа ispManager? Правильно мыслю или лучше все учить для рынка?
>>2391089 Можешь позже изучить пердолинг серверов, мне за полгода работы один раз пришлось менять конфиг нжинкса, я про него на тот момент нихуя не знал, но за пару часов нагуглил и пофиксил, больше ни разу его не приходилось трогать
Если бы вы сейчас вкатывались в серверную часть веба чтобы начали учить python/django или pho/laravel. На питоне могу писать простенькие скрипты по работе, но есть ощущение что на позицию джуна бекендера на пистоне не найти, а на пхп есть хоть какие-то шансы. Вообще задумка такая, что нати работу на пхп и как более менее втянусь голанг учить. Норм план или хуйня, айти в РФ всё и вообще надо огород сажать?
>>2347129 (OP) Сап, аноны. Убедительная просьба не кидаться говном, мб есть тут люди шарящие за битрикс. Как отсортировать элементы в catalog.section по конкретному значению множественного свойства типа список? Т.е. есть свойство "Тэги", значения "Популярное", "Рекомендуемое" и т.д. У элемента могут быть выбраны хоть все сразу. Мне же нужно отсортировать каталог по этому свойству, чтоб сначала шли элементы у которых проставлено значение "Популярное"
>>2390867 Хули ты тут высрал? Анон прав, монолит в подавляющем большинстве выигрывает, хотя бы тем что его разрабатывать проще. На кой хуй ебаться с кучей сервисов маленькой команде разработчиков, когда речь идет о небольшом интернет магазине? Или у тебя все разрабатывают огромные проекты по типу какого-нибудь контакта?
Анончики, можете сразу полить меня говном, но все же. Я устраиваюсь в некоторую контору, не на программерскую должность, и тестовое задание получил в виде требования написать модуль с использованием связки ZF1+extJS3.4.
Сразу говорю, работать мне с этим точно не придется, как и с всем остальным, я там вообще на совершенно другую должность, но задание именно такое. Как вы понимаете - это древнеебучие копролиты, и из коробочки оно нихера не работает, композер давится, ZF тулза от первого фреймворка давится зависимостями, а древние проекты с гита не разворачиваются по разным причинам, в основном связанным так же с тем что это древнее ебучее говно слона.
Можете порекомендовать как и откуда вообще начать с этим работать? Повторюсь, я из совершенно другой сферы микроконтроллеры/асм/си, и для меня всё это вот ПИЗДЕЦ как сложно.
"Микро"сервисы это когда проект состоит из нескольких отдельных компонентов, которые связаны между собой по сети. У каждого компонента обычно своя база данных.
Данные можно пересылать и через SOAP, но сейчас обычно используются более современные технологии вроде HTTP+JSON, JSON-RPC, ProtocolBuffers, Thrift, очереди сообщений и тд.
Пример: я хочу получить какие-то данные из БД. В монолите я просто захожу в консоль MySQL, пишу запрос с 8 джойнами (а я хорошо умею использовать джойны) и получаю нужные данные. В микросервисном проекте я должен потратить во много раз больше времени, писать какие-то кастомные скрипты, чтобы добиться того же. Хотя, может есть какая-то компания, которая за большие деньги дает возможность делать поиск в распределенных базах данных?
Пример 2: у меня монолитный проект. Он написан на одном языке и я могу прочесть и исправить любое место в коде. А у микросервисников каждый проект написан на своем языке, потому что его автор считает что это самый лучший язык в мире. В итоге разработчик микросервисов большую часть времени занимается изучением языков и фреймворков вместо полезной работы.
Пример 3: есть много функций, которые нужны в разных частях проекта. В монолите это не проблема, а что делать в проекте на микросервисах? А если сервисы на разных языках?
Я кстати, когда-то давно решал похожую проблему, генерировал классы для JS кода из PHP-классов (только поля и константы, без методов), чтобы иметь возможность работать с моделью и на сервере и на клиенте и не заниматься копипастой.
Пример 4: в монолите я жму на название функции и перехожу к ее определению. А в микросервисе я попадаю на функцию отправки запроса в другой сервис и не могу перейти к определению в один клик.
И, кстати, часто микросервисы пишут без документации на API. То есть, разбирайся, какие там параметры и что они значат.
По моему, микросервисы от хорошей жизни не пишут. Если у тебя данные вмещаются в пару дорогих серверов и команда менее 20 человек, то тебе это все просто не нужно.
И еще плюс монолиты: его обычно можно развернуть на компьютере, в то время как микросервисы отъедают память гигабайтами и часто вообще систему нельзя у себя развернуть целиком.
А что, что ты пишешь про тесты, я вообще не понял. Тесты без проблем используются в монолитных проектах.
Не согласен. Во-первых, Нода асинхронная, а бизнес-логика в большинстве случаев синхронная. Во-вторых, Питон имеет гораздо больше возможностей и обеспечивает более высокую скорость разработки.
Нода вообще сейчас занимает странное место. Если ты хочешь удобный язык, пожертвовав скоростью выполнения, то есть Питон. Если ты хочешь высокую скорость, то есть Раст, если ты хочешь удобную асинхронность и высокую скорость, то есть Го. А какие плюсы у Ноды?
> Zend Framework requires no special installation steps. Simply download the framework, extract it to the folder you would like to keep it in, and add the library directory to your PHP include_path
Ну и ты бы написал, что за ошибки пишет композер, может у тебя просто чего-то не установлено?
Я из любопытства посмотрел страницу zf1 на packagist, и там из зависимостей только PHP >= 5.2.11. Я также из любопытства сделал composer.phar require zendframework/zendframework1 и он установился без ошибок на моем Линуксе.
Какие костыли им приходится изобретать из-за отсутствия приватных свойств. Хотя, если подумать, константы экспортируются, потому эти свойства не такие уж и приватные. Я надеюсь, что они хотя бы не руками это пишут, а какая-то волшебная кнопка в редакторе это генерирует.
Также, в Ноде очень неудачно выбрали слово const для однократно присваиваемых переменных. Константа это неизменное значение, и имена констант обычно пишутся большими буками:
А они используют const для обычных переменных, это запутывает при чтении кода. Хуже того, "константы" в Ноде не такие уж и постоянные:
const cant_change_this = []; cant_change_this.push(1); // никаких ошибок
Как было бы сделать правильно: использовать другое слово, например, val, и запретить изменение содержимого однократно присваиваемой переменной. Хотя, последнее может быть сложно реализовать. Но константами это точно назвать нельзя.
И еще, почему-то разработчики на Ноде не любят называть вещи своими именами и объявляют функции как константы, то есть вместо:
Очевидно, что первый вариант намного лучше: прочитав первое слово, уже понятно, что перед нами функция. А во втором варианте нужно прочесть всю строку, и найти в ней стрелку, спрятанную среди знаков равенства, прежде чем поймешь, что у нас функция, замаскированная под константу.
То я хочу, чтобы я мог добавить какую-то пометку вроде @property и JS для меня сгенерировал бы конструктор, который заполнит это свойство и геттеры-сеттеры, которые позволят мне обращаться к этому полю:
let test = new Test(10); test.someProperty = 20;
А этого нету. На эти грабли во всех остальных языках программирования уже наступили, и яваскриптщики, похоже, тоже хотят наступить.
При этом, естественно, я бы хотел выбирать, что сделать:
- сгенерировать геттеры и сеттеры - сгенерировать только геттеры - перенаправить обращение к свойству в выбранную мной функцию - сгенерировать конструктор или методы вроде "получить все свойства"/"обновить все свойства" - сгенерировать методы для сравнения или хеширования объектов
Так что я не понимаю того анона, который сказал, что Нода лучше Питона, хотя в Питоне описанное выше есть, а в Ноде нету. Это есть в Питоне, в Свифте, в C# если не путаю.
Ты пишешь странные вещи. Во-первых, копипастить нет никаких проблем, если твой редактор поддерживает команды "увеличить отступ" и "уменьшить отступ" (все нормальные редакторы кроме какого-нибудь легаси времен DOS это поддерживают).
Во-вторых, если ты копипастишь код на JS, тебе точно так же надо поддерживать в нем правильные отступы.
Каждый называет функции как хочет, никакого единообразия.
Ну и, конечно, ужасный синтаксис со стрелками. Стрелочные функции предназначены для ситуаций, когда функция маленькая и передается в какую-то другую функцию:
array.map(e => e.name)
Это не значит, что слово function устарело и теперь надо везде писать громоздкую и плохо читаемую конструкцию с const. Я подозреваю, это функциональщики хотят сделать JS код похожим на их функциональные языки, где функции объявляются через равенство. Но JS это не функциональный язык и у него есть свой синтаксис, и код должен быть читаемым, а не похожим на твой любимый функциональный язык.
Похоже, разработчик на Яваскрипте не слышали, что можно делать разные классы исключений и проверять эти классы. Тогда хотя бы IDE будет подсказывать и проверять их имена.
Ну и отдельно минус им за то, что нагородили там кучу .then вместо использования await. Эта асинхронность в Ноде полезна в 1% случаев и только мешается в 99%.
Если такой код написали функциональщики, то, конечно, желания когда-либо использовать функциональные языки у меня поубавилось. Императивный код однозначно лучше хотя бы тем, что в нем не пишут return на 70 строк и гору из then.
>>2392080 Так это одно и тоже по сути - await это синтаксический сахар просто, который так же работает через промисы, просто декларация более привычная, но это так же асинхронно работает.
>>2392024 >Какие костыли им приходится изобретать из-за отсутствия приватных свойств. Уже как несколько лет есть. > это запутывает при чтении кода Запутывает только тебя, когда ты пишешь на JS больше одной недели - привыкаешь. > "константы" в Ноде не такие уж и постоянные Потому что объекты передаются по ссылке. Тут абсолютно логичное поведение. Для неизменяемых объектов в JS есть Object.freeze >Очевидно, что первый вариант намного лучше Нет, не очевидно. Ты забываешь про минификацию >найти в ней стрелку Зачем ты ищешь стрелку, если тебе IDE цветом показывает, что это функция? Даже если ты в блокноте пишешь код, то наличие скобок после = сразу говорит о том, что эта функция. >>2392033 >пометку вроде @property Уже есть в планах на 2023. >в Питоне описанное выше есть А в ноде есть нормальная асинхронность, лучшая производительность, интеграция с SPA-фреймворками, более дешевая цена разработки.
>>2392073 Причем тут вообще JS, если это очевидная проблема макаки-формошлепа, который это писал? Говнокодить можно и на питоне и на пыхе и на чем душе угодно.
>>2392144 Ну вообще есть концепция, одна из, что исключения нужно использовать при критических ошибках в логике программы, а если речь идет об ожидаемом поведении: вроде как пользователеь что не так ввел - то тут лучше воспользоваться паттерном увдедомлений.
>> "константы" в Ноде не такие уж и постоянные > Потому что объекты передаются по ссылке. Тут абсолютно логичное поведение.
Зачем мы используем const? Чтобы сказать читателю кода, что эта переменная не изменится, и чтобы защититься от случайного изменения. Если ты массивы и объекты при этом разрешаешь изменять, то весь смысл const теряется. const для массивов и объектов по сути ничего не значит.
И это точно не константа.
>>Очевидно, что первый вариант намного лучше > Нет, не очевидно. Ты забываешь про минификацию Ты пишешь странные вещи. При чем тут минификация? Я говорю про исходный код, который мы пишем и читаем, мне неинтересно, как он поменяется при минификации. Мне безразлично, если минификатор перепишет константы на функции или наоборот.
> Зачем ты ищешь стрелку, если тебе IDE цветом показывает, что это функция? Я смотрю код на Гитхабе и там никак цветом не показано, что это функция. Более того, ты не прочел мой аргумент, читай внимательно. В случае с function ты понимаешь, что это функция, увидев первое слово, а в твоем случае я должен просмотреть глазами всю строку, найти в ней нужное место и убедиться что оно нужного цвета.
IDE, конечно, может улучшить восприятие плохого кода. Но это не значит, что можно писать плохой код.
Если уж ты упоминаешь IDE, то я замечу, что IDE может так же подсвечивать другим цветом переменные, которые не меняются, и слово const становится ненужным - просто ставь везде let и пусть IDE подсвечивает их разными цветами.
> А в ноде есть нормальная асинхронность, лучшая производительность, интеграция с SPA-фреймворками, более дешевая цена разработки.
только вот код на Ноде, судя по npm, нечитаемая лапша.
Ого, очень рад, что тред жив и ОП ещё тут спустя столько лет! Когда-то тоже тут сидел и много задачек решал, даже делал калькулятор с парсингом дробных значений и вектор в стиле ФП. Сейчас работая фуллстеком столкнулся с необходимостью синхронизировать код между PHP и TS/Dart, вручную это делать было утомительно, а автоматические решения не удовлетворяли требованиям - какие-то инструменты вроде grpc заставляют всю архитектуру приложения менять, какие-то инструменты вроде swagger заставляют писать большие yml/json. Подумал, что было бы удобно просто отметить нужные PHP-классы и как-то одной командой получить TS/Dart. Сделал, в проде больше чем полгода: https://github.com/riverwaysoft/dto-converter
Что думаете? Под капотом работа с AST и кодогенерацией. Планирую добавить больше документации (сейчас её мало так как in-house инструмент) + описать внутреннее устройство в большой статье на хабре.
Я когда-то давно тоже делал конвертацию PHP классов в JS, чтобы можно было работать с моделью и на сервере и на клиенте. Правда там все было в разы примитивнее, копировались только константы и публичные поля, и еще, по моему, генерировались геттеры/сеттеры, чтобы модель могла слать события при изменении свойства (вью слушало эти события и обновляло картинку на экране).
В твоем коде, на мой взгляд, слабое место, что все поля экспортируются по умолчанию. Если этот код доступен на клиенте (в виде JS или внутри мобильного приложения), то легко представить ситуацию, когда один программист добавляет в класс какое-то поле, и оно автоматически появляется на стороне клиента и раскрывает важную информацию злоумышленникам. Было бы, возможно, логичнее, помечать поля аннотацией, что они "общедоступны".
И даже если код используется только на сервере: другой программист видит, что в сущности есть недокументированное, но полезное поле, и начинает использовать его. И теперь ты не можешь убрать это поле, потому что другой сервис сломается.
Что касается swagger, то для PHP есть инструменты для его генерации через DocBlock-аннотации. Хотя, если у тебя есть хорошие DTO, то может быть swagger можно генерировать как-то из них. Swagger хорош как язык документирования API, то есть ты передаешь коллегам не кучу TS-классов со словами "на, разбирайтесь", а человеко- и машинночитаемую документацию.
Ну и иногда в описанной тобой ситуации за основу берут описание класса/интерфейса на IDL. Это не конкретный язык, а скорее разновидность языка. Пример IDL можно увидеть в спецификациях DOM, в исходных кодах Chrome/Firefox.
5 не нужна, можно изучить последнюю версию + прочитать на сайте PHP список изменений между последней версией и PHP7.4. У них есть удобный список того, что поменялось в каждой версии: https://www.php.net/manual/ru/migration81.php