«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб изучающих PHP #115 Аноним 2020/02/12 12:14:48  №1599201 1
php-noob-1.png (33, 500x500)
500x500
cat-cafe-osaka.jpg (155, 1024x683)
683x1024
Acchi-Kocchi-acchi-kocchi-30421025-1007-570.jpg (138, 1007x570)
570x1007
cat-sad.jpg (173, 1024x768)
768x1024
Непонятный сезон стоит за окном, а мы по-прежнему изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.

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

Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.

Предыдущий тред был тут: >>1552970 (OP) . Все старые треды есть в архиве: https://phpclub.tech/ (там есть поиск, так что можно легко найти обсуждение какой-то задачи или ответы на свой старый пост) или ищутся в гугле по словам "клуб изучающих php" и в архиваче.

Мейлач лежит? Есть запасной тред на доброчане: /s/res/23225.xhtml#i46467

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

Правила: ведем себя воспитанно, помогаем новичкам, читаем учебники, решаем задачки, постим ссылки на решения, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 2-3 дня, у него мало времени, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время. Но в треде немало анонимных экспертов разного уровня, так что вряд ли вопрос останется без ответа.

С чего начать

У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не читайте, не сохраняйте, не запоминайте его, он временный). Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то можно начать с него. Он простой и понятный. Там есть задачи, их нужно решать (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению. С другой стороны, если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.

Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Visual Studio Code, Netbeans PHP или PhpStorm (с ним будет удобнее).

Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.

Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.

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

- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony 3/Doctrine 2
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.

Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:

https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md

Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md

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

Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра. Также можно начинать смотреть фильмы и видео на английском.

Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.

- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md

Что почитать

- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
- Новости IT на англ. https://news.ycombinator.com/
- какой-то древний, устаревший, но большой и на русском справочник по веб-разработке, посоветованный аноном: https://starcat.dp.ua/doc/wdh/

Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492

У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.

Платиновые вопросы

- Почему PHP? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу.
- Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Аноним 2020/02/12 12:15:54  №1599203 2
grammar.png (56, 500x644)
644x500
Стоит писать код как попало, а аккуратно. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть. Если каждый будет оформлять код как хочет, будет бардак.

Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.

Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492

Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:

- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)

Вот ссылка на рекомендации PSR, где все это описано подробнее и даны примеры оформления:

PSR-1 (рус.): https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2 (рус.): https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-2-coding-style-guide.md
PSR-12 (англ.): https://www.php-fig.org/psr/psr-12/

Аноним 2020/02/12 12:17:04  №1599205 3
Аноним 2020/02/12 12:21:41  №1599212 4
Аноним 2020/02/12 12:23:36  №1599216 5
>>1599205

Могу, кстати, сразу несколько советов дать по поводу https://github.com/Vladrigos/StudentList/

- сделай папку public, как описано в задаче, чтобы из браузера не были доступны все файлы проекта
- почитай урок про SQL инъекции и используй плейсхолдеры при подстановке переменных в запрос: https://github.com/codedokode/pasta/blob/master/security/sql-injection.md
- почитай урок по DI и явно передавай объект PDO в StudentGateway вместо использования синглтонов: https://github.com/codedokode/pasta/blob/master/arch/di.md

Аноним 2020/02/12 12:52:36  №1599237 6
>>1599212
Осталось это же через ООП запилить
Аноним 2020/02/12 14:42:28  №1599358 7
ну наконец таки перекатили. и полугода не прошло. анчоусы, подскажите, делаю аякс пагинацию и там такой код https://ideone.com/fRquks
он отсылает меня в шаблон, который парсит в нужной мне разметке уже то, что пришло с контроллера. проблема только в том что сам js код проблем не вызывает и ajax не ловит .fail
вместо этого при переходи на любую из страниц пыха мне выдает что undefined variable т.к. видимо из за того, что с контроллера нихуя не прилетает. так вот с чем связано то что ничего не приходит?
Аноним 2020/02/12 14:53:56  №1599369 8
Недавно сделал студентов. Жду негатив <3 https://github.com/Back1ng/students Использовал Singletone для базы данных, как пример антипаттерна, анон сказал попробовать, чтобы знал. Еще и роутинг хотел по другому сделать, но подумал про параметры, и решил сделать так как есть, ведь все равно большего кода тут не будет
Аноним 2020/02/12 16:58:01  №1599501 9
>>1599369
У тебя контроллер наследуется от БД, че за пиздец, во всю используются глобальные переменные. Нет тестов.
Пиздец!
Аноним 2020/02/12 17:23:53  №1599535 10
Пацаны, я паровозик, который смог.
Давайте вместе порадуемся этому.

Тащемта если отбросить обсер с видимостью переменных в функциях, я ломал голову над знаками, которые должны быть в запросе sql. Стаоался там кавычки поставить, запятые как отдельные символы ставить. Но это оказало проще.
Аноним 2020/02/12 19:03:02  №1599681 11
>>1599501
>У тебя контроллер наследуется от БД
Теперь не наследуется

>во всю используются глобальные переменные
Ты про статические методы?

>Пиздец!
Понимаю! =)
Аноним 2020/02/12 19:49:39  №1599739 12
>>1599501
>Нет тестов
Сейчас бы тесты на студентов писать.
Толсто.
Аноним 2020/02/12 19:53:56  №1599741 13
image.png (1, 225x18)
18x225
>>1599681
Нафига вы так пишете? Строки что ли экономите?
Аноним 2020/02/12 20:41:33  №1599770 14
>>1599739
Потом удивляемся, почему в проде никто тесты не пишет
Аноним 2020/02/12 20:57:55  №1599791 15
>>1599770
Какой прод, шиз? Тут учебный проект.
Аноним 2020/02/12 21:01:31  №1599795 16
>>1599770
Тесты заебись писать когда ты сидишь на работе и тебе за это платят, а не с голодухи в поисках вката, или заказа, или обучения.
Т.е. только тогда когда это хоть кому-то нужно.
Аноним 2020/02/12 22:09:23  №1599881 17
>>1599681
Глобальные переменные вроде $_SESSION. Не используй их, потому что тесты потом не сможешь написать. Есть всякие библиотеки, которые позволяют работать с сессиями и куки как с объектами, гугли.
Аноним 2020/02/12 22:13:47  №1599895 18
Сап /pr. Занимаюсь пыхой уже второй год, ковыряю фреймворки потихоньку, немного зарабатываю на фрилансе, вроде получается. Сейчас я студент последнего курса, поэтому летом уже пора искать работу. Но в моей шараге сейчас есть курс по тестированию веб-приложений на питоне. Стоит ли вкатываться? Или забить и подрочить пых ещё пару месяцев?
Аноним 2020/02/12 23:06:41  №1599954 19
>>1599881
>Есть всякие библиотеки, которые позволяют работать с сессиями и куки как с объектами, гугли.
Да ему одного объекта хватит, куда это всё убрать можно. Зачем библиотеки?
Аноним 2020/02/12 23:28:22  №1599962 20
>>1599954
Чтобы по psr все было.
Аноним 2020/02/12 23:28:43  №1599963 21
Суп. Подскажите как фронтенд скотине быстренько влететь в пхп, чтоб без всякой воды и говна для полных новичков типа "что такое DOM, бигоу нотейшон и т.д"? Там на удеми может что-нибудь? Надо по работе, там yii2
Аноним 2020/02/13 01:33:48  №1600007 22
>>1599963
>что такое DOM
>бигоу нотейшон
Тут нет такого - придётся сидеть как новичок.
Аноним 2020/02/13 04:23:35  №1600041 23
Привет, помогите советом:

Пишу бота, как лучше организовать хранения справочника типов ответа?

Есть родительский класс Response,
есть подклассы ResponseImage, ResponseText
Есть таблица в бд response - история ответов.

Как оргранизовать справочник типов Response, чтобы в дальнейшем, знать как правильно обрабатывать историю ответов из бд.
1. Хранить в отдельной таблице response_type(id, class_name), и получать type_id в дочернем классе каждый раз запросом к этому справочнику (поиск по имени класса)? Это увеличит кол-во запросов к бд, на сколько это существенно?
2. Или прописать типы в родительском классе? Тогда каждый раз создавая новый класс-ResponseNew нужно будет изменять родительский класс.
3. Создать справочник в бд по всем типам, а в дочернем классе прописать только его type_id?
Два последних варианта - это вероятность возникновения коллизий в будущем при поддержке нескольких ботов.
Аноним 2020/02/13 04:29:54  №1600042 24
>>1599741
Это случайно получилось, вроде code cleanup в phpstorme
Аноним 2020/02/13 05:45:09  №1600051 25
>>1599895
забей, нахуй не надо. если есть потребность в тестах на питоне - изучай сам.
будет быстрее, эффективней, дешевле.
так что дрочи пых и пытайся щас уже галеру найти где будешь грести, ибо летом после выпуска будет огромная волна студентов, а осенью еще больше. в связи с этим будет как бы проблематично искать будет. алсо, летом все в отпусках и особо вакансий на рынок не выкидывают
Аноним 2020/02/13 06:13:43  №1600062 26
>>1600051
Курсы бесплатные если что, от мэйла. Спасибо за совет, анон.
Аноним 2020/02/13 07:17:50  №1600087 27
Аноним 2020/02/13 07:41:18  №1600103 28
>>1599791
Сразу прививаем хуевые практики
Аноним 2020/02/13 07:42:14  №1600105 29
>>1599795
Во многих ваках спрашивают за тесты с порога.
Если конечно не хочешь пойти в говноконтору, где нет тестов и всё тестируют вручную
Аноним 2020/02/13 11:24:42  №1600316 30
Аноним 2020/02/13 11:24:58  №1600318 31
>>1600316
Если что это переделанная.
Аноним 2020/02/13 11:26:05  №1600320 32
>>1599201 (OP)
Дается массив с числами например
[01,0,1,02,2,5,04,4]
Как убрать из него восьмеричные числа типа 01,02,04.
Аноним 2020/02/13 11:28:37  №1600322 33
>>1599895
Ребят скажите плиз, как в php фриланс вкатится? Если я уже все основы веба знаю, только опыта нет. Можно где-то беслпатно поработать? Заказики повыполнять, постажироваться
Аноним 2020/02/13 13:01:10  №1600426 34
image.png (282, 600x436)
436x600
>>1600103
>учебный проект на 2 с половиной класса
>тесты
Аноним 2020/02/13 13:09:10  №1600434 35
Аноним 2020/02/13 13:19:03  №1600439 36
>>1600426
>Очень трудно написать 2 с половиной теста
Аноним 2020/02/13 13:33:14  №1600448 37
>>1600322
Если ты правда знаешь как верстать, PHP и т.д То ты никогда не согласишься делать что-то забесплатно.
Аноним 2020/02/13 13:39:11  №1600452 38
>>1600448
Так у меня практики нету, я не знаю как монетизировать свои умения. Если я не получу денег но получу опыт, который потом смогу монетизировать, это уже хорошо.
Но да, конечно забесплатно делать это крайний вариант
Аноним 2020/02/13 13:44:50  №1600455 39
>>1600105
Сменил три работы - нигде тестов не писали. Что-то где-то про это говорилось на начале проекта, но потом всегда хуй забивали. Да, это плохо, но далеко не везде их пишут.
Аноним 2020/02/13 14:01:45  №1600467 40
>>1600455
Сейм на двух работах сидел и сижу без тестов и это хуево. Сам для себя пишу тесты в изолированных кусках кода
Аноним 2020/02/13 14:42:32  №1600491 41
>>1600439
А нах? Знаешь зачем тесты пишутся?
Аноним 2020/02/13 14:43:22  №1600492 42
Кто решил все бонусные задачки? Долго решали? Вот собираюсь ими заняться, хочу спросить есть ли ребята которым удалось?
Аноним 2020/02/13 14:44:31  №1600493 43
>>1600439
Иди нах, короч, со своими тестами на студентах, шиз.
Аноним 2020/02/13 15:43:05  №1600546 44
>>1600491
Проверить бизнес логику
Аноним 2020/02/13 15:43:32  №1600548 45
>>1600493
Чтоб тебе на продакшене ни одного теста не было, пидор
Аноним 2020/02/13 15:56:18  №1600561 46
https://career.habr.com/vacancies/1000049256

>Зарплата от 200 000 до 300 000 рублей в месяц. Зависит от количества допускаемых вами ошибок (объективно).
>ошибок

Че за нахер?
Аноним 2020/02/13 16:01:18  №1600563 47
Как на пхп сайт с http на htpps перевести?
Аноним 2020/02/13 16:04:18  №1600567 48
>>1600563
Это уже к веб серверу. Погугли https имя твоего веб сервера. https apache2 Там уже есть инструкции.
Аноним 2020/02/13 16:22:17  №1600582 49
>>1600561
Ну очевидно, что заносчивые люди будут при любом найденном проблемном или спорном моменте качать права и предлагать снизить зп
Аноним 2020/02/13 16:26:09  №1600596 50
>>1600561
Компания еще и полулегальная небось, так как продает акки
Аноним 2020/02/13 21:49:47  №1601092 51
ОПчик, будь добр проверь задачку про регулярки, тема сложная:

https://ideone.com/kieK0K
Аноним 2020/02/13 22:06:10  №1601115 52
>>1601092
>регулярки, тема сложная
да нет всего лишь паттерн матчинг, что искать и на что менять
Аноним 2020/02/13 22:30:57  №1601129 53
Наверное это нубский вопрос, но все же. Вот допустим есть простой контроллер c тайпхинтом int на айди теста, который берет айди и показывает страничку с описанием и прочей инфой или 404, если тест не найден. Все работает, но вот, допустим, если юзер случайно наберет в адресной строке слишком большой айди, который больше допустимого int в php, то ларавель преобразовывает этот большой айди в строку и соответсвенно выскакивает исключение, что в контролер пришла строка, а не int. Как это пофиксить? Через middleware?
Аноним 2020/02/13 23:00:27  №1601135 54
>>1601115
Первый раз с этим сталкиваюсь. В Си такого не было. Хотя с поддержкой сайтов про регулярки не так уж и сложно, но подумать всё равно надо.
Аноним 2020/02/14 02:13:47  №1601181 55
Случайно удалил через DELETE записи в innodb. Как можно быстро сделать откат?
Аноним 2020/02/14 03:35:57  №1601193 56
>>1601129
Я думаю через try catch и typeException, или какие там есть исключения, выдать 404 страницу
Аноним 2020/02/14 07:42:37  №1601267 57
>>1601129
Заменить инт на строку?
Аноним 2020/02/14 19:05:55  №1602133 58
>>1601267
Тогда уже ошибка при запросе в бд будет.
>>1601193
Я проще сделал. В документации нашел, что можно параметры запроса регулярками в роутере фильтровать и поставил от одной до десяти цифр.
Аноним 2020/02/14 22:22:02  №1602256 59
Аноны, Оп, помогите. Хочу сделать опросник, но не могу придумать структуру бд. Т.е есть вопросы и ответы, но не простые. У вопросов и ответов должны быть последовательности, аля "выберите ваш пол: М, Ж". И к каждому ответу разные ветви опросов. И так можно сделать к каждому ответу. Это вообще реализуемо? Еще хочу попробовать сокеты, на пхп же можно их написать? (думаю сделать простенький чат чтобы потестить) Или же такие вещи реализуют на ноде?
Аноним 2020/02/14 22:24:59  №1602258 60
Аноним 2020/02/14 22:29:06  №1602259 61
>>1602256
дополню в бородатые времена была программа элиза она хоть и на лиспе но прочитав код поймешь принцип, работала как чатбот.
Аноним 2020/02/15 03:10:08  №1602336 62
Подбуханный сеньер в пятницу разбирает требования к вакансиям по PHP и около того. Респонс не требуется, но может быть кому-то будет полезно. Смотреть на скорости 1.25, иначе скучно.

https://www.youtube.com/watch?v=ixfsmWVAD_0
Аноним 2020/02/15 03:18:15  №1602340 63
>>1602336
Я просто своего друга учу и делаю ему видео. Если вас тут покажется полезным, могу улучшить звук и закидывать. А так, это не реклама, я просто напился и решил, чобы не поделиться.
Аноним 2020/02/15 03:41:03  №1602344 64
>>1602340
извените за ашипки
я проста бухой слигка
Аноним 2020/02/15 03:42:03  №1602346 65
>>1602344
инфа для нубов от этого не становится менее ценной
Аноним 2020/02/15 03:44:56  №1602348 66
>>1599185 →
>Проще сделать папку, в ней хранить файлы с именами, соответствующим логинам или id пользователей, а не пытаться это засунуть в конфиг. Если пользователей всего несколько, можно и в конфиг, благо YAML позволяет многострочные тексты. От 150 строк ничего страшного не будет, и при желании можно это вынести в отдельный файл и инклудить его.
Да, пользователей всего несколько - 3-ое (Alice, Bob, Tester). Правило ли будет поместить в services.yaml в поле parameters следующие поля: alice_public_key, alice_private_key и т.д, и поместить в них многострочный текст? Как потом получить доступ к этим параметрам Symfony Console?
Аноним 2020/02/15 07:02:55  №1602372 67
>>1602348
Ключи хранятся в отдельной папке. Папка исключена (так как ключи приватные) из систем контроля версий. Ключи берешь через file_get_contents или что-то подобное (к примеру криптобиблиотеки могут принимать файл ключа как параметер). Файлы или именуешь по айдишникам пользователей (как анон выше говорил) или добавляешь в таблицу юзеров поле с именем файла ключа.
Аноним 2020/02/15 07:37:58  №1602387 68
Untitled1.png (40, 1048x649)
649x1048
>>1602256
Что-то типа такого. Три нижних таблицы это если тебе нужно сохранять ответы пользователей (причем каждый пользователь может пройти несколько тестов) для самого теста они не нужны.
Аноним 2020/02/15 10:32:21  №1602615 69
>>1602336
Сорре, протрезвел, грохнул этот видос, стыдобра, лучше потом сделаю нормально и трезвым.
Аноним 2020/02/15 11:11:18  №1602686 70
Аноним 2020/02/15 13:04:33  №1602882 71
>>1599201 (OP)
Аноны, как лучше обрабатывать тяжёлые POST-запросы, многомегабайтные, с BigData в виде JSON'a?

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

Что посоветуете?
Аноним 2020/02/15 13:52:35  №1602977 72
Как в методах полиморфно определить имя класса?
Хочу родительский дженерик-метод, который использует имя класса, но self::class и __CLASS__ возвращают класс-родитель.
Аноним 2020/02/15 14:41:08  №1603039 73
Аноним 2020/02/15 15:23:10  №1603086 74
>>1602977
ОК, я понял.
self => static
Аноним 2020/02/15 15:25:30  №1603088 75
Когда нужно использовать прослойку для модели аля сервис, репозиторий? Если у меня не особо большой проект - есть ли в этом смысл?
Аноним 2020/02/15 17:48:54  №1603289 76
Аноним 2020/02/15 17:59:18  №1603307 77
>>1603088
Репозиторий это абстракция от хранилища. Это нужно чтобы код модели не зависел от конкретного способа сохранения данных.
Профиты будут, соответственно, если хранилище данных придется менять. Некоторые долбоебы думают что это типа переезда с mysql на postgres, но это относится и к переезду на новую версию базы или кешированию.
Так что я рекомендую репозитории использовать всегда. Если проект маленький, то и времени ты на них потратишь немного, а если большой, ну ты понел. Кашу маслом не испортишь.
Аноним 2020/02/15 18:05:24  №1603310 78
>>1601129
Просто кастишь значение к числу (int)$veryBigInt и получаешь максимально возможный int https://3v4l.org/3F9GN
Аноним 2020/02/15 19:46:21  №1603376 79
А можно делать запросы к сфинксу через постгрес клиент, а не mysql?
Аноним 2020/02/16 04:08:06  №1603536 80
Аноним 2020/02/16 04:38:12  №1603540 81
32064275300x300.jpeg (16, 300x300)
300x300
В статье ОПа по исключениям есть такая заметка: "Исключения имеют и недостатки в сравнении с явным возвратом ошибок. Например, они могут быть выброшены при выполнении любой функции, и сложнее становится угадать, как будет выполняться код."
Не могу понять, что имеется в виду. Если исключение предусмотрено разработчиками в описании определенной функции, то оно сработает при любом вызове этой функции, если в ходе ее выполнения условия для выброса исключения будут удовлетворены. Другими словами, если выражение внутри скобок после if будет равно true (1) в if (expression) { throw new Exception("Yada yada yada"); }, то скрипт будет прерван.
Однако то же самое произойдет в случае с явным возвратом ошибок:
if (expression) { die("Yada yada yada"); }
Помогите понять мысль ОПа.
Аноним 2020/02/16 08:47:25  №1603634 82
>>1603540

Явный возврат ошибок это возврат через return.

if (expression) {
return E_NOT_FOUND; // или return new Error('....');
}

Вариант с die() никаких достоинств не имеет и вообще не рассматривается.

Отличия между явным возвратом и исключениями проявляются, когда у нас несколько функций вызвыают друг друга:

function a() { b() ; }
function b() { c(); }
function c() { throw new Exception(".."); }

Глядя на код функции a(), неочевидно, что она может выкинуть исключение. В случае с явным возвратом ошибок в каждой функции стоял бы if + return и это было бы очевиднее.
Аноним 2020/02/16 09:49:17  №1603656 83
>>1603086
Угу, позднее статическое связывание.
Аноним 2020/02/16 14:00:32  №1603967 84
>>1603540
>>1603634
Тут все намного сложнее. Выбрасываемые исключения можно прописать в комменте, тот же phpstorm явно просит тебя это сделать.

А дело все в том что исключения используются как продвинутый goto. Сам goto в пхп ничего криминального из себя не представляет, и ничего действительно запутанного сделать не даст. Вот пример, где мы пытаемся из контекста функции перескочить в другое место https://3v4l.org/f2WLK. Как видишь это нихуя не работает.

А вот пример типичного использования исключений https://3v4l.org/X8QGJ. Как видишь, то чего не смог goto вполне себе могут исключения. Как я уже сказал - этот код ТИПИЧНЫЙ и ты будешь писать точно так же.

Причиной, как мне кажется, является отсутствие возможности нормально вернуть несколько значений, т.к. массивы не типизированы и туплов нет. А так же отсутствие промисов или монады maybe из коробки.
Аноним 2020/02/16 14:29:55  №1604012 85
Продолжаю решение задачи про банкомат, про тот вариант, когда задача не решается жадным алгоритмом https://phpbooktest2.ga/l1/mou-ikkai.html , для решении этого , оп дал такой совет , за что большое спасибо !

>Готового решения, наверно, нету.
"Жадный" алгоритм достаточно прост. Мы сначала вычисляем число купюр большого достоинства, потом кол-во купюр чуть меньшего достоинства, и так до самых мелких. "Жадный" алгоритм работает хорошо, когда каждая купюра в N раз больше другой (где N - целое) и когда нет нехватки купюр.
Например: у нас есть 1x5000 и 3x2000, нам надо выдать 6000. "Жадный" алгоритм выдаст 1x5000 и застопорится. Он тут не применим, так как мы не можем заменить 5000-ю купюру несколькими 2000-ми.
Там, где неприменим "жадный" алгоритм, мы вынуждены перейти к полному перебору всех возможных комбинаций купюр. В общем виде алгоритм выглядит так. Обозначим S - сумма, которую надо выдать, k - количество номиналов купюр, N[1] ... N[k] - количество купюры каждого номинала, A[1] .. A[k] - запас купюр каждого номинала:
- берем все возможные комбинации N[1] .. N[k], где N может быть от 0 до A (то есть, учитываем имеющийся запас купюр и не пытаемся брать больше, чем есть)
- для каждой комбинации проверяем:
- если она в сумме дает S, то сумму можно выдать этой комбинацией
Например, если у нас есть 1x5000 и 3x2000, то мы должны перебрать такие комбинации:
- 0x5000 + 0x2000 (я буду писать эту комбинацию сокращенно как (0, 0))
- 0x5000 + 1x2000 (или (0, 1))
- (0, 2)
- (0, 3)
- (1, 0)
- (1, 1)
- (1, 2)
- (1, 3)
То есть, для каждого номинала мы перебираем значения от 0 до запаса этой купюры. Мы фиксируем значение 0x5000 и перебираем все возможные количества более младших купюр, затем фиксируем значение 1x5000 и перебираем более мелкие купюры снова.
Генерацию комбинаций можно реализовать с помощью рекурсии (функции, вызывающей саму себя). Сделаем функцию такого вида:
generateCombinations(array $A, array $N): array
Где $A - массив запасов купюр (A[1] .. A[k]), например, [1 => 1, 2 => 3] для 1x5000, 3x5000, $N - зафиксированные количества старших купюр. Функция вернет массив всех возможных комбинаций, которые начинаются с комбинации в $N.
Поскольку массив комбинаций может получиться огромным, можно вместо его возврата сделать функцию-генератор, которая выдает комбинации с помощью команды yield, не тратя память на хранение огромных массивов.
Количество таких возможных комбинаций легко посчитать: оно равно произведению запасов купюр, то есть (1 + A[1]) x (1 + A[2]) x ... x (1 + A[k]). Я добавил 1, чтобы учесть вариант, когда мы берем 0 купюр данного номинала.
Такие комбинации похожи на "размещения" из комбинаторики ( https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5 ). Есть готовые "алгоритмы для генерации размещений". У нас не совсем размещение, но очень близкая к нему вещь, можно погуглить эти алгоритмы.
Дальше алгоритм можно оптимизировать. Например, не перебирать комбинации, которые заведомо превышают искомую сумму (вроде комбинации 2x5000, когда надо выдать 6000). Перебирать комбинации не от (0, 0) к (1, 3), а начиная с наиболее близких к искомой сумме.
В любом случае, тут нужна рекурсивная функция. Либо стек.
Для начала, можешь попробовать написать код, который просто выведет все возможные комбинации купюр на экран. А потом уже добавлять проверку, дает комбинация нужную сумму или нет

Я попробовал написать код, который просто выведет все возможные комбинации , рекурсивно не получилось , получилось со вложенными циклами , но если количество номиналов купюр будет от 3 и более , то вложенные циклы никуда не годятся, получается плохой код. Порывшись в гугле нашел , вот такой рекурсивный цикл https://ideone.com/TRasJW , его чуть чуть поменять , и он уже будет выдавать наши комбинации купюр, в самом этом коде я разобрался, но кажется мне , можно сделать рекурсивный цикл намного проще и понятнее, но самостоятельно написать у меня не получилось, поэтому ищу опять совета здесь


Аноним 2020/02/16 15:04:49  №1604059 86
Basic Auth не зашквар использовать в 2020?
Разумеется всё на https будет крутиться.
Аноним 2020/02/16 15:29:14  №1604086 87
>>1604012

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

Начнем с ситуации с одним кубиком. Тут все просто: функция должна вывести числа от 1 до 6.

Теперь, пусть кубиков два. Тогда функция должна вывести все комбинации, начинающиеся с 1 (1 1, 1 2 ... 1 6), потом, начиная с 2, и так до 6.

Если попробовать обобщить это, то можно придумать такую функцию: пусть она получает на вход массив с зафиксированными значениями на кубиках слева. В этом массиве может быть от 0 до N значений. И функция должна перебрать все оставшиеся значения кубиков справа и вывести комбинации.

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

Если ей передан массив с меньше чем N значениями, кроме последнего, то она просто перебирает числа от 1 до 6, добавляет их по очереди к массиву (так, что получается массив на 1 длиннее, чем был передан) и вызвает себя 6 раз с этим новым массивом.

Вот примерный вид функции:

function generateCombinations(int $n, array $values) { ... }

И вот, как она вызывается (для 3 кубиков):

generateCombinations(3, []);

Этот вызов должен сделать такие вызовы самой себя:

- generateCombinations(3, [1])
- этот вызов сделает такие вызовы:
- generateCombinations(3, [1, 1])
- generateCombinations(3, [1, 2])
- ...
- generateCombinations(3, [1, 6])

Далее будут вызываться:

- generateCombinations(3, [2])
- ...
- generateCombinations(3, [6])

Попробуй написать такую функцию, или напиши, если что-то непонятно.

Есть еще другой способ вывести все комбинации без рекурсии. Он проще, но будет менее удобен для решения задачи про банкомат. Делаем массив, состоящий из всех единиц ([1, 1, 1, 1]). Вывыодим его. Увеличиваем последнюю единицу на 1: [1, 1, 1, 2]. Выводим. Если где-то получается 7 - мы сбрасываем ее на 1 и увеличиваем цифру перед ней.

Этот способ тоже можно попробовать.
Аноним 2020/02/16 15:30:58  №1604093 88
authors.jpg (92, 1913x864)
864x1913
Совсем пиздец или сойдёт?

Тестовое задание для стажировки.
Аноним 2020/02/16 15:31:48  №1604094 89
>>1604086
Благодарю , буду разбираться !
Аноним 2020/02/16 15:32:08  №1604096 90
>>1604093
>Совсем пиздец
Это даже мягко сказано.
Аноним 2020/02/16 15:35:46  №1604102 91
Аноним 2020/02/16 16:03:57  №1604152 92
>>1599201 (OP)
> - Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
Это вместе с
> SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery.
?
А если я знаю html, css, js, jquery и git - сколько пхп займёт? Просто в городе пхп требуют в каждой второй вакансии, думаю стоит выучить.
Аноним 2020/02/16 16:27:22  №1604180 93
>>1604093
Если строк в массиве будет миллион че будешь делать?
Аноним 2020/02/16 17:05:23  №1604243 94
>>1604180
Я уже переделал в foreach.
В первый раз не смог додуматься как оформить прост, поэтому сделал через echo.
Аноним 2020/02/16 17:14:44  №1604248 95
>>1604152
Ну тебе осталось выучить SQL, PHP + его ООП, паттерны, хттп\s-протокол, ну и хотя бы один современный фреймворк.
Полгода минимум.
У тебя фактически только фронтенд и бэкенда вообще нет.
Аноним 2020/02/16 17:24:01  №1604256 96
>>1604248
Звучит долго. Это время нужно для хорошего уровня или для начального устройства на работу? Просто я видел вакансии в стиле "вы немного знаете пхп и отличаете бэк от фронта? Го к нам на 20к стажёром". Старт меня и такой устроит.
Аноним 2020/02/16 17:36:55  №1604275 97
>>1604256
>Звучит долго.
Это только до уровня вкатывальщика-джуна на нормальный современный стек. Потом ещё доучиваться надо на работе.
Времена когда в пыху вкатывались за 2 месяца давным-давно прошли. Сегодня так в js вкатываются.

>Просто я видел вакансии в стиле "вы немного знаете пхп и отличаете бэк от фронта? Го к нам на 20к стажёром".
Не видел таких. Это либо на вротпресс, либо кидалово.
В обоих случаях дно.
Аноним 2020/02/16 18:17:02  №1604315 98
>>1604275
>Сегодня так в js вкатываются.
жс только кажется легко там такой ебаный зоопарк с колбеками шо пыха не самое худшее в жизни
Аноним 2020/02/16 18:23:25  №1604325 99
>>1604315
Со всяким поработал, да и работаю. В целом в клиент вкатиться проще, может даже за 2 месяца, если не тупишь. Бекенд (не только на пхп, а любой, в жс тоже) гораздо более широкая тема. Работаю лет 10 уже и только интереснее и интереснее становится расти, а конца и края не видно. Сейчас даже сложно представить, какой объем инфы надо освоить в 2020, чтобы уверенно в бекенд залететь.
Аноним 2020/02/16 18:28:11  №1604332 100
>>1604325
бекенд не устаревает как фронт за полгода и хайпуется так
Аноним 2020/02/16 18:28:28  №1604333 101
Аноним 2020/02/16 20:30:53  №1604613 102
>>1604315
>жс только кажется легко
Он и есть - легко. То же самое, что и Луа, который вообще для мимокроков в индустрии сделан. Собственно поэтому в js такой ажиотаж и много молодых макак.

>там такой ебаный зоопарк с колбеками
Какой зоопарк? Промисы давно завезли. И в чём сложность этих коллбеков?
Там если только с асинком могут быть проблемы, и то только поначалу на ноде той же.

>>1604325
>только интереснее и интереснее становится
Есть такое дело. Чем больше изучаю - тем дальше горизонт.
Аноним 2020/02/16 21:14:06  №1604677 103
>>1604613
>жс
>хоть и говно но общего назначения
>Луа
>встраиваемый
температуры нет? спал хорошо? прими таблеточку
Аноним 2020/02/16 21:31:01  №1604691 104
>>1604677
>общего назначения
>встраиваемый
Вообще не в ту степь полез.
Оба языка позволяют шлёпать код не заморачиваясь с нормальным ООП. Юным вайтишникам он не понятен и сложен.
Аноним 2020/02/16 22:26:24  №1604740 105
>>1604691
>нормальным ООП
ооп как явление костыль фабрики фабрик
>Оба языка позволяют шлёпать код не заморачиваясь
и давно у нас чистые луа вакансии появились?
стек жопаскрипта за последние годы растолстел что скоро больше жабы со спрингом станет, а учитывая вагоны джунов которые повелись на легкость вкота, требования там растут как на дрожжах, это не учитывая подводные айсберги самого языка со слабой типизацией.
Аноним 2020/02/16 23:09:54  №1604767 106
>>1604059
Бампирую вопрос.
Есть смысл базовую аутентификацию на админку ставить на https? Мне по-простому чтоб.
Аноним 2020/02/16 23:21:51  №1604769 107
Может знает кто, какие в ДС есть стажировки по php/битрикс кроме qsoft?