«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб изучающих PHP #109 Аноним 2019/04/13 18:41:20  №1380485 1
php-noob-1.png (33, 500x500)
500x500
cat-cafe-osaka.jpg (157, 1024x683)
683x1024
cat-sad.jpg (194, 1024x768)
768x1024
1393868342827.jpg (87, 1024x764)
764x1024
Здравствуй, заблудший анон. Заходи. Пока чьи-то ракеты бороздят просторы космоса и даже возвращаются обратно, мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.

В нашем треде отвечают почти на все вопросы, только бампайте каждые 5 дней. И не разводите флуд, если вам скучно, лучше сходите промочите ноги на улице, например.

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

Предыдущий тред был тут: >>1353705 (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? — Да, однозначно. Посмотри любую вакансию.
Оформление кода Аноним 2019/04/13 18:44:00  №1380488 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 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)

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

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
Аноним 2019/04/13 18:46:15  №1380489 3
Аноны, я постараюсь в ближайшие пару дней проверить оставшиеся посты в прошлом треде >>1353705 (OP) но вы можете напомнить о себе тут, чтобы точно не забыть.
Аноним 2019/04/13 20:15:21  №1380536 4
Как выглядит реальная работа мечты в нерезиновой для php программиста, уже не вкатывальшика? У меня после пары лет в мухосранской конторе php ассоциируется с переработками, вечным дедлайном, с заказчиками с которыми ты должен общаться лично, задержками микрозарплаты, древнем пека на селероне. Есть ли смузихлебные места в Москве для пыхарей?
Ответы: >>1381544 >>1381548
Аноним 2019/04/13 20:39:54  №1380549 5
Решаю список студентов и возникли некоторые вопросы.

1. Будет ли хорошим решением получать объект студента статическим методом из класса-помощника?
Например:
$student = Utils::createStudentFromGlobals();

2. Хорошим ли решением будет хранить введенные студентом данные на стороне сервера, чтобы в случае вывода ошибки при валидации вставлять их в html-атрибут value?

3. Можно ли вызывать встроенные в php функции из логики шаблонов? Да и обычные функции, ведь они могут содержать в себе сложную логику.
Или всё что серьезнее if/else/for/foreach низяяя?

4. Я забрёл слишком далеко и начал тестировать с phpunit валидатор студента, а у меня в нём большинство методов защищенные. Пришлось использовать Reflectionclass для получения доступа к ним, это нормальная практика?

И про валидатор, в нём самые часто используемые конструкции по типу измерения длины строки/проверки на пустоту, я обобщил в отдельные методы. Как вам такое решение?

5. Вопрос по тестированию.

Например у меня есть метод валидации имени студента. Он умеет:

1. Проверять переданное значение на пустоту.
2. Проверять длину на min, max значения и возвращать соответствующие ошибки.
3. Проверять регуляркой на кириллические символы.

В конце возвращает массив с ошибками или null.

Для каждой способности этого метода писать отдельный тест-метод?

Надеюсь, не отнял много времени. Заранее спасибо!
Ответы: >>1380793 >>1383810 >>1394736
Аноним 2019/04/13 22:50:49  №1380575 6
Напоминаю ОП-у глянуть мое из прошлого треда.

> Оп, глянь, как будешь свободен, финальное задание по верстке твое "Webpaint". Остальные аноны тоже можете указать на ошибки.

https://codecoshauni.github.io - сама страница.
https://github.com/codecoshauni/codecoshauni.github.io - ну и код.
Ответы: >>1398384
someApprentice 2019/04/14 08:07:19  №1380679 7
Надеюсь мой ответ не потеряется >>1380677
Аноним 2019/04/14 08:29:05  №1380690 8
tmp23.jpg (125, 1173x382)
382x1173
Продублирую в новом ИТТ треде:


>>1380456
>У тебя как-то странно сделано, что параметры сохраняются в $this->get. Это значит, что если ты с помощью функции linkMaker() создашь 2 анонимных функции, то одна будет влиять на другую (параметры, переданные в одну, отобразятся в другой). Это неправильно.

>$this->get
Так ведь там весь массив гет из реквеста, а не просто место для сохранения. Параметры не столько сохраняются, сколько апдейтятся - меняется только один, за который отвечает ссылка, и она пересобирается с новым значением.
Ну и разные функции нет смысла создавать - всегда один гет-массив приходит в запросе и с ним работаем.
Вообще, задумка была такой, что замыкание передаётся в шаблон под каким-то именем, где просто вызывается как на пикрелейтед. Меняются только запрошенные параметры, остальные не остаются как были. Ну и пустой писанины чтоб поменьше.

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

>если мы меняем сортировку, то надо сбрасывать пагинацию
Зачем? Количество записей ведь не изменилось. Я вот со своей этой функцией поигрался - вполне юзабельно вроде. Страницы жмёшь - меняет страницы, сортировку меняешь - сортировка только и меняется, что нажали - то и выводит.
Ответы: >>1394737
Аноним 2019/04/14 10:56:04  №1380793 9
>>1380549
>2. Хорошим ли решением будет хранить введенные студентом данные на стороне сервера, чтобы в случае вывода ошибки при валидации вставлять их в html-атрибут value?

Вот например ошибки из валидатора и данные введенные в форму я передаю в шаблон в виде двух массивов $errors, $formData.
В шаблоне к каждому полю где они будут выводиться, нужно прикручивать проверку на существование значения в массиве во избежании предупреждения об ошибке от пхп?

Есть несколько вариантов решения этой проблемы, какой бы лучше выбрать?
https://ideone.com/1B8bMH
Ответы: >>1380807 >>1394736
Аноним 2019/04/14 11:16:36  №1380807 10
>>1380793
Дошло, что можно использовать в шаблоне объект студента
<input type="text" value="<?= $student->getFirstName()"?>
Ответы: >>1394735
Аноним 2019/04/14 20:14:26  №1381544 11
>>1380536

есть:

badoo
yandex
avito
lamoda
8bit
travelata
tutu

и куча других менее известных, но тоже достойных контор
Аноним 2019/04/14 20:18:49  №1381548 12
>>1380536

Возможность личного общения с заказчиком - на мой взгляд, это большой плюс. Разработчики, понимающие бизнес, обычно ценятся выше.
Ответы: >>1381592
Аноним 2019/04/14 22:13:54  №1381592 13
>>1381548
>Разработчики, понимающие бизнес
Какой бизнес? По доставке еды, е-коммерце, грузоперевозки, Б2Б, сотни других?
Сам-то понял что сказал? У тебя жизни не хватит чтобы всё это понять.
Умей своё дело делать хорошо и не пытайся лезть в чужое.
Аноним 2019/04/15 10:12:43  №1381736 14
Котаны, в документации, в примерах функции зачастую типа такая запись аргументво что идут в функцию:

public PDO::prepare ( string $statement [, array $driver_options = array() ] )
или
mail ( string $to , string $subject , string $message [, mixed $additional_headers [, string $additional_parameters ]] )

Почему тут конструкция типа '[,' - т.е. сначала скобка квадратная а потом запятая. Зачем квадратные скобки?
Ответы: >>1381737
Аноним 2019/04/15 10:15:11  №1381737 15
>>1381736
Это значит, что аргументы в скобках не обязательны
Ответы: >>1381740
Аноним 2019/04/15 10:20:55  №1381740 16
>>1381737
Спасибо.

А еще кстати подскажите порядок работы или где почитать по почте:
Я делаю форму с отправкой почты. Читал что правильнее это все реализовывать не просто через вызов mail() - но устанавливать отдельный почтовый сервер, и уже на него отправлять из пхп письма.
Ответы: >>1381833 >>1394735
Аноним 2019/04/15 11:33:31  №1381775 17
Сап аноны, я тут новенький. Пару дней ковырял задачу на опечатки в регулярных выражениях были траблы с типами данных. Задачу решил, но хочется что-бы кто-нибудь оценил. Буду рад если скажете где и почему было написано хуёво и как сделать лучше. Алсо реквестирую каких-нибудь статей про типы данных в PHP.
Сама программа: https://ideone.com/rg3cAy
p.s. Старался в комментарии на английском. Может быть понятно, а может и нет.
Ответы: >>1381796 >>1394735
Аноним 2019/04/15 12:02:48  №1381792 18
Как хранить длинную SQL комманду в классе работы с бд?
Ответы: >>1383121 >>1385180
Аноним 2019/04/15 12:16:56  №1381796 19
Ответы: >>1381814
Аноним 2019/04/15 12:24:06  №1381799 20
так, при регистрации валидатор симфони ругается: data.password\tThis value should not be blank.
null
ConstraintViolation {#1123
-message: "This value should not be blank."
-messageTemplate: "This value should not be blank."
-parameters: []
-plural: null
-root: Form {#594 }
-propertyPath: "data.password"
-invalidValue: null
-constraint: NotBlank {#905 …}
-code: "c1051bb4-d103-4f74-8988-acbcafc7fdc3"
-cause: null
}

помогите пж нубасу)
Ответы: >>1381836
Аноним 2019/04/15 12:48:25  №1381814 21
Ответы: >>1381815
Аноним 2019/04/15 12:57:57  №1381815 22
>>1381814
Твои комментарии только мешают просмотру кода, для скриптов на 30 строк они точно не нужны, особенно на каждый пук. Плюс отделять нужно для лучшей читаемости кода пустыми строками блоки этого кода.
Какие вообще статьи про типа данных ты хочешь? Просто прочитай в пхп мануале про все типы существующие и результаты их сравнения.
Ответы: >>1381823
Аноним 2019/04/15 13:14:27  №1381823 23
>>1381815
Спасибо. Со стороны на код не смотрел. Действительно пиздец.
Так лучше: https://ideone.com/mdzzN7
А по типам данных. Что-нибудь про массивы и их нюансы(многомерные, как лучше обращаться к данным внутри них и т.д.) + про конвертацию данных в слаботипизированных языках для лучшего понимания. Я читал официальные мануалы, но все равно ощущение что, что-то не догоняю.
Ответы: >>1381842
Аноним 2019/04/15 13:28:48  №1381833 24
Ответы: >>1382162
Аноним 2019/04/15 13:30:07  №1381836 25
>>1381799
Тебе же прямым текстом написано, в чем проблема.
Аноним 2019/04/15 13:54:07  №1381842 26
>>1381823
Сравнение разных типов и их преобразование я понял, просто написав все возможные варианты сравнения и операций с ними, потом смотрел, что выведет интерпретатор. Вообще в мануале хорошие таблицы есть,как будут сравниваться и преобразовываться типы.
Аноним 2019/04/15 14:00:02  №1381844 27
>>1380459
>Есть очереди задач для этого.
Ты имеешь в виду какой-нибудь rabbitmq? Из пушки по воробьям же. Мне нужно просто отправить юзеру view сразу, до того как долгий таск завершится. Я до этого писал всякую шляпу на fat free framework и там есть функция abort, которая делает нужное
https://fatfreeframework.com/3.6/base#abort
Я вполне способен залезть в исходники и посмотреть, что она там делает и перенести это в симфони, но ведь скорее всего это уже там есть и мой велосипед всяко будет хуже.
Аноним 2019/04/15 14:49:58  №1381869 28
>>1380485 (OP)
Говорю говорю и еще раз говорю. Пхп на уровне развития стремится стать жабой, когда сама жаба уже существует. С каждой версии все похожее и похожее.

Писать на этой ссанине - себя не уважать. Нормальные люди пишут на питоне\рельсах\жабе. Пхп - кусок дерьма.

У меня есть одногруппник который пытается еще алгоритмы на нем писать. Стоит ли рассказывать об его анальной ебле и рендере красивой хтлм странички?
Ответы: >>1381885 >>1381900 >>1382971
Аноним 2019/04/15 15:22:15  №1381885 29
>>1381869

Что ты тогда забыл в нашем треде, болезный? Иди и пиши на том языке, который тебе нравится, только почитай сначала https://habr.com/ru/post/315152/
Ответы: >>1381912
Аноним 2019/04/15 16:02:42  №1381900 30
>>1381869
Рыночек решает. На питоне юэкенд-вэба меньше во сколько раз? В 10? В 20?
Я сам терзался выбором между пхп и питоном. К питону естественно лежала душа. Но выбрал пхп потому что тут через месяц уже можно искать какую-нибудь удаленку и хоть по минимуму монетизировать свои знания.
А то вкатывальщики годами решают тестовые, и сосут хуи.
Пока ерохи организуют вэб-студии в которых херачат на джумле сайты и делают деньги, причем GET от POST запроса не отличают тру стори.
Лично я решил дрочить технологии бека на пхп. Синтаксис питона я знаю. Если вдруг вэб перевернется - перекачусь в питон. Или в JS на котором я тоже уже по мелочи зарабатываю. Клепая калькуляторы и прочее.
Аноним 2019/04/15 16:20:42  №1381912 31
Аноним 2019/04/15 23:13:18  №1382113 32
Аноны, как можно сделать по другому?
http://sandbox.onlinephpfunctions.com/code/36216a124252e2f05ed9d0a55dd1238d7931c980: ошибка

http://sandbox.onlinephpfunctions.com/code/7ab17081d971e1361863d569f390cdd85a382b46: пофиксил добавлением пробелов в строках 7-20.

Есть вариант найти максимальное кол-во символов в строке (32) и дополнить все строки где кол-во символов <32 пробелами. Но мне кажется что можно сделать мудрее
Ответы: >>1394735
Аноним 2019/04/16 06:33:09  №1382148 33
Анонче, подскажи, а то я застрял. Делаю грамматического нациста, хочу сделать проверку по отсутствию знака препинания. Идея такая я делаю preg match all с preg set order< затем дампую. 0й массив. Но как мне ограничить регулярку так, что бы выводилась вся фраза с ошибкой, а не кусок? Я думал таком варианте
'/s|^. - это либо символ начала строки либо ограничивающий пробел.
\.\S - условие замены
.\s|.*\. - ограничение по пробелу или концу строк
Я хочу что бы сделав дамп 0го массива вылезли все ошибки. Но почему - то даже правильные последовательности тоже выдаются. Где я перемудрил? По возможности намекните т к хочу допереть сам
Ответы: >>1394734
Аноним 2019/04/16 07:11:35  №1382162 34
>>1381833
>>Свифтмайлер
В нем уже реализован SMTP транспорт? Или еще нужно ставить почтовый SMTP сервер?
Аноним 2019/04/16 12:54:15  №1382304 35
image.png (405, 1610x862)
862x1610
Двач, как в Splunk'e составить поисковый запрос , результатом которого будет список уникальных заявок, заполнение которых было полностью завершено?
Аноним 2019/04/17 04:39:03  №1382653 36
В задании про список студентов оп говорит, что валидатору инфы о студенте нужно в конструктор передавать объект tablegateway, чтобы валидатор мог, например, смотреть, есть ли а базе такой email. Контроллерам тоже нужно будет вызывать методы tablegateway, чтобы работать с базой. Значит в конструктор контроллера надо передавать тоже этот объект tablegateway? А если у меня объект контроллера в роутере создаётся, то сначала объект tablegateway нужно в роутер передавать прямо из index.php? Это и есть Di?
Ответы: >>1382741 >>1385181
Аноним 2019/04/17 09:33:13  №1382741 37
>>1382653
>объект tablegateway нужно в роутер передавать
Классы получают только те зависимости, что нужны для их собственной работы и ничего лишнего. Если представить, что у тебя будет сотня сущностей то под каждую гейтвей в роутер передавать? Херня ведь получится.
DI - это класс-контейнер который содержит в себе все нужные зависимости соединение с БД, настройки нужные, гейтвей твой. Достаточно передать в роутере только его, а не целый список барахла. Уже в конструкторе контроллер сам берёт из контейнера нужные ему зависимости.

Но вообще гугл в этом деле очень помогает.
Ответы: >>1382746
Аноним 2019/04/17 09:42:33  №1382746 38
>>1382741
Настройка и связь с бд у меня в bootstrap.php лежит, там же создаётся и объект tablegateway. Вопрос в том,правильно ли я понял, что контроллеру можно просто объект этот передать, как передал валидатору (по совету опа), или это разные вещи. Больше никакого барахла не будет, проект же небольшой(список студентов).
Походу я немного запутался уже в этих абстракциях.
Ответы: >>1382756
Аноним 2019/04/17 09:45:46  №1382747 39
олды 1.jpg (9, 311x350)
350x311
Пых-удаленщики на месте?
Аноним 2019/04/17 10:10:12  №1382756 40
>>1382746
>контроллеру можно просто объект этот передать
Конечно можно. Только, бога ради, не в роутере - ему вообще не положено знать о таких вещах.
Ответы: >>1382791
Аноним 2019/04/17 11:24:22  №1382791 41
>>1382756
А как тогда? Роутер же создаёт контроллер нужный и запускает его метод начала работы.
Ответы: >>1382986 >>1382989
someApprentice 2019/04/17 13:17:55  №1382907 42
Ошибка постинга: В сообщении присутствует слово из спам листа.

https://pastebin.com/iPSf8D9z
Ответы: >>1388353 >>1388926
Аноним 2019/04/17 14:48:16  №1382971 43
>>1381869
>Икспердное мнение
>У меня дногруппник...
Ну ты понял, да.
Аноним 2019/04/17 15:25:30  №1382986 44
>>1382791
>Роутер же создаёт контроллер нужный
Вообще не его обязанность, как по мне. Можно роутер сделать конструктором объекта Route, т.е. настоящего маршрута, который отрабатывает в данный момент.
В него, например, передавать имя контроллера, метода, параметры вызова(гет\пост и тд), ну уже потом в него и передавать зависимости, Хотя тут контейнер тоже удобнее будет.
Ну а потом $Route->run(), который собирает всё это дело воедино и посылает на рендер.
Уж лучше так, чем в роутер гейтвей сущности пихать.
Ответы: >>1383031
Аноним 2019/04/17 15:29:39  №1382988 45
Аноны, подскажите нубу, почему если у меня сервер nginx, то нужно ставить php-fpm, а если apache то просто php.
В чём между ними разница?
Ответы: >>1394734
Аноним 2019/04/17 15:29:39  №1382989 46
>>1382791
А вообще, с таким подходом ты просто обречен убрать инициализацю gateway из bootstrap и запихнуть её в сам контроллер. Конструктор или прямо в методе.
Ответы: >>1383031
Аноним 2019/04/17 16:17:41  №1383012 47
Аноны, сейчас нахожусь на испытательном в небольшой компании, php программист. Опыта в php только 2 месяца.
Мне кажется что я неправильно подхожу к процессу. Трачу много времени на задачи, в которых в итоге добавляю 5-10 строк. Как быстро читать код, понимать его логическую структуру и т.д. Когда только начинал, читал код тупо как текст, услышал, что так нельзя, а как правильно хз. Как быстро находить файлы и директории с нужными кусками кода в файловой структуре. Иногда с одной страницы отсылается форма на другую, или аякс, и приходится долго искать где происходит вся обработка. Так же чую что остановилось развитие. В метро читать что то без практики не вижу смысла, а дома уже нет сил после рабочего дня(как раз таки из за того что стопоришься на легкой хуйне и это изматывает и угнетает)
Ответы: >>1383016
Аноним 2019/04/17 16:18:12  №1383014 48
Аноны, сейчас нахожусь на испытательном в небольшой компании, php программист. Опыта в php только 2 месяца.
Мне кажется что я неправильно подхожу к процессу. Трачу много времени на задачи, в которых в итоге добавляю 5-10 строк. Как быстро читать код, понимать его логическую структуру и т.д. Когда только начинал, читал код тупо как текст, услышал, что так нельзя, а как правильно хз. Как быстро находить файлы и директории с нужными кусками кода в файловой структуре. Иногда с одной страницы отсылается форма на другую, или аякс, и приходится долго искать где происходит вся обработка. Так же чую что остановилось развитие. В метро читать что то без практики не вижу смысла, а дома уже нет сил после рабочего дня(как раз таки из за того что стопоришься на легкой хуйне и это изматывает и угнетает)
Ответы: >>1387763 >>1388197
Аноним 2019/04/17 16:20:15  №1383016 49
>>1383012
>Как быстро находить файлы и директории с нужными кусками кода в файловой структуре
Я пришел тупо к тому, что ищу через поиск.
В пых-шторме правый shift 2 раза тыкаешь и вводишь название файла.
Быстрее, чем мышкой крутить список файлов получается.
Ответы: >>1383018
Аноним 2019/04/17 16:23:39  №1383018 50
>>1383016
Это то да, но например хочешь найти где задается какой нибудь класс, а имя файла не знаешь, я щас тупо git grep юзаю, но даже на это иногда уходит много времени
Ответы: >>1383029
Аноним 2019/04/17 16:42:18  №1383029 51
>>1383018

В IDE обычно есть команда "перейти к классу". В Саблайме я жму Ctrl + Shift + R и набираю часть имени класса. Плюс, обычно файл должен называться так же, как и класс, потому я жму в Саблайме Ctrl + P (поиск файла по имени) и набираю часть имени класса и файл находится.

Изучай особенности редактора и IDE, иначе будешь очень медленно и неэффективно работать.

Если речь про то, что надо понять, кто обрабатывает запрос к странице /somepage, то тут надо смотреть, фреймворк там или что-то самописное:

- если фреймворк - читаем мануал про роутинг и идем в конфиг роутера или еще куда-то
- если самопис - то изучаем код, начиная с index.php и смотрим, как реализован роутинг.

В крайнем случае, можно сделать поиск по файлам (Ctrl + Shift + F) по регулярке "\bsomepage\b" и посмотреть, что найдется.
Аноним 2019/04/17 16:48:48  №1383031 52
>>1382989
>>1382986
Вообще почитал я про контейнеры у опа и это не так уж и сложно, как я думал, сделаю через него лучше и объект контейнера запихну в роутер.
Ответы: >>1383060
Аноним 2019/04/17 16:54:53  №1383037 53
https://ideone.com/N3PEgY

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

Просто год задаётся понятно, а вот как сделать, чтобы переменная перестала постоянно считаться от 16 - не знаю. Если местами переставить, то сайт будет думать, что я к нулю прибавляю, а не к 16, если оставлять так, то он каждый раз заново берёт старое содержимое...
Ответы: >>1383040 >>1385180
Аноним 2019/04/17 17:00:02  №1383040 54
Ответы: >>1383041 >>1383047
Аноним 2019/04/17 17:01:36  №1383041 55
>>1383040
Бля, я идиот. Спасибо.
Аноним 2019/04/17 17:13:19  №1383047 56
>>1383040
Там ещё убрать можно лишнюю переменную, просто оставить $oldDude++ в цикле, и её же выводить в строке.

Я просто почему-то не понял, что ++ будет перезаписывать функцию самую первую со значением в 16.
Ответы: >>1383281
Аноним 2019/04/17 17:42:01  №1383060 57
>>1383031
>не так уж и сложно
Это ещё и удобно, уж поверь.
Аноним 2019/04/17 18:46:00  №1383079 58
Чёт хз, задачка с айфоном пиздец какой-то. В программировании всё такое душное и непонятное?
Ответы: >>1383080 >>1383081 >>1385180
Аноним 2019/04/17 18:49:53  №1383080 59
>>1383079
Всё же легко, ты чего? Там вообще учебник сделан так, что поймёт и умственно отсталый.
Ответы: >>1383083
Аноним 2019/04/17 18:49:57  №1383081 60
>>1383079
Дайте решение хоть, посмотрю как это вообще решается, перед тем как забить.
Ответы: >>1383084
Аноним 2019/04/17 18:51:19  №1383083 61
>>1383080
Ну я понимаю что написано в коде, но сам придумать и добавить что-то не могу.
Аноним 2019/04/17 18:56:00  №1383084 62
Ответы: >>1383090
Аноним 2019/04/17 19:07:46  №1383090 63
>>1383084
Это не решение. Там же надо сделать так, чтобы сумма в минус не ушла, а в ноль, только остаток чтобы выплатился.
Ответы: >>1383106
Аноним 2019/04/17 19:55:31  №1383106 64
Аноним 2019/04/17 20:34:42  №1383121 65
>>1381792
Константа класса или локальная переменная в методе
Аноним 2019/04/17 23:04:47  №1383151 66
Ответы: >>1385179
Аноним 2019/04/18 04:43:15  №1383193 67
Зачем оп с списке студентов советует создать константу пола (const GENDER_MALE) в модели студента, если мы и так в конструктор будем пол передавать и записывать его в обычное поле, как и все остальное?
Ответы: >>1383195 >>1383545 >>1385179
Аноним 2019/04/18 04:47:47  №1383195 68
>>1383193
Шоб везде писать

$vasya->setGender(User::GENDER_MALE);

if ($vasia->getGender() === User::GENDER_MALE) {
...
}
Ответы: >>1383372 >>1383545
Аноним 2019/04/18 07:45:25  №1383281 69
>>1383047
Да, можно. Я поправил именно то, что анон просил.
Аноним 2019/04/18 09:54:49  №1383372 70
>>1383195
>$vasya->setGender
не скрепно как-то
вася должен быть сразу создан с правильным гендером безо всяких сеттеров
Ответы: >>1383408 >>1383858
Аноним 2019/04/18 10:39:33  №1383408 71
>>1383372
Вот я и спросил, зачем тут const. Лишний код только придется писать,типа если переданный пол в конструктор == male, то $this->gender = GENDER_MALE.
Ответы: >>1383428 >>1385179
Аноним 2019/04/18 11:31:01  №1383428 72
>>1383408
Это позволяет держать значение male только в одном месте. Из любого места кода я могу обратиться к константе Student::GENDER_MALE и мне не важно, что там за значение (m/male/man/muzhskoj что только не пишут). Не нужно бегать править контроллеры, сервисы, валидаторы, тесты только потому что приняли "архитектурное" решение сменить 'female' на 'f'.
Аноним 2019/04/18 15:30:55  №1383545 73
>>1383193
>>1383195
Не читал ваш срач, но вам нужен https://github.com/myclabs/php-enum

Использую это говно во всех проектах, зависимость есть, брат жив.
Охуенная штука. Позволяет тайпхинтить енумы.
Ответы: >>1383546 >>1383602
Аноним 2019/04/18 15:35:22  №1383546 74
>>1383545
Заибца подтащил. Крепкого тебе смузи.
Аноним 2019/04/18 16:50:49  №1383602 75
>>1383545
Список студентов я хочу без всего со стороны написать, а так спасибо.
Ответы: >>1383611
Аноним 2019/04/18 17:00:41  №1383611 76
>>1383602
>без всего со стороны написать
В чем сакральный смысол данной идеи?
Ответы: >>1383631 >>1385178
Аноним 2019/04/18 17:20:37  №1383631 77
>>1383611
Ни в чем, просто хочу.
Аноним 2019/04/18 19:21:34  №1383734 78
Аноны, подскажите можно ли делать так:
\tfunction __construct(int $countOfPerson,int $tier,int $leader){
\t\t$this->countOfPerson = $countOfPerson;
\t\t$this->tier =(!isset($tier))?0:$tier;
\t\t$this->leader =(!isset($leader))?0:1;
\t}
В конструкторе есть переменная $tier и $leader. Могу ли я сделать их необязательными?
Ответы: >>1383743 >>1385178
Аноним 2019/04/18 19:45:10  №1383743 79
>>1383734
Используй значения по умолчанию.
Аноним 2019/04/18 23:58:15  №1383810 80
>>1380549
1. Зависит от обстоятельств. Есть такие принципы, как SOLID.
S - единственности ответственности. Грубо говоря каждый класс отвечает за что-то свое. Поставь вопрос - за что отвечает как Utils ? Если ответ не слишком большой - норм.
4. Нет. Скорее всего ты пишешь юнит тесты. В них (да как и почти в любых тестах) ты тестируешь только открытый функционал. Тестировать закрытые функции = себя не уважать.
5. Тестируй по отдельности, тестируй как они работают вместе. Это нормально.
Ответы: >>1383813 >>1385178
Аноним 2019/04/19 00:30:41  №1383813 81
>>1383810
>Есть такие принципы, как SOLID.

Book authors want to sell books
Ответы: >>1383838
Аноним 2019/04/19 03:47:07  №1383838 82
Аноним 2019/04/19 06:13:31  №1383858 83
>>1383372

А если над персистентным Васей совершают операцию по смене пола?
Ответы: >>1383864
Аноним 2019/04/19 06:21:55  №1383864 84
>>1383858
Тогда удаляем объект Вася из нашего консервативного ООП.
Ответы: >>1385178
Аноним 2019/04/19 06:28:09  №1383866 85
Аноны, ну нахуя эта пидораха что запилила пхп сделала эти тупые
'->' вместо православной '.' ?
Я понимаю что это вкусовщина и в сущности ниче не решает. Просто мне никрасива.
Ответы: >>1383897
Аноним 2019/04/19 07:34:39  №1383897 86
>>1383866
Точка - оператор конкатенации.
Вероятно, это говно еще с пыха 3 пошло.
Ставлю очко, что конкатенация появилась раньше ооп.
Ответы: >>1383992
Аноним 2019/04/19 09:03:17  №1383949 87
Привет треду и Опу.

Сидел с вами с 16 по 17 год, успел сделать список студентов, MVC сапера на JS и половину файлообменника. К несчастью, у меня начались проблемы с глазами – нечто похожее на синдром "сухого глаза". Работать с пекой стало сложно, особенно с текстом, глаза устают минут за 10, пришлось завязать с программированием. Капли, очки, и лазерная коррекция не помогли, как и разные жк мониторы и шрифты. Но ближе к сути.

Я хочу заказать e-ink монитор Dasung Paperlike HD 2019 из Китая за 60к (кому интересно вот пример работы модели 2018 года https://www.youtube.com/watch?v=vLhcM9gsOEU , моя модель с более низким инпут лагом), который должен помочь мне вернуться обратно к программированию и в этот тред. Я думаю, что он мне поможет, т.к. я могу пользоваться e-ink книгами без усталости. И мне стало интересно, какие у меня теперь будут проблемы непосредственно с программированием. У монитора частота экрана около 6гц и инпут лаг 100 мс. Пока вижу следующее:

– Тяжело будет работать с монохромной IDE без раскрашивания синтаксиса. Но, думаю привыкнуть можно будет;
– Монохромный фронтенд тоже настораживает. Вряд ли я смогу работать с фотошопом (или смогу?). Также тяжело будет работать с JS анимацией из-за инпут лага;
– Хотел параллельно с вебом изучить геймдев, но с такой частотой это, наверное, вряд ли возможно – нужно больше 6гц;

Вообще, у меня опасения в основном по фронтенду, но т.к. я его не успел достаточно изучить за 2 года вката (не успел сделать задание Опа на макет), возможные проблемы для меня найти сложно. Хотелось бы послушать анона, что он может придумать и добавить к минусам осознанного дальтонизма. Часто ли при работе бэкэндером приходится работать с фронтэндом, например? На этот монитор много положительных отзывов программистов, может все не так плохо, на самом деле.
Аноним 2019/04/19 09:22:57  №1383965 88
>>1383949
Ясен хуй во фронт путь заказан.
Твоя стезя теперь - это бек. Там вообще проблем быть не должно.
Аноним 2019/04/19 09:24:42  №1383966 89
>>1383949
Ну и попробуй сидеть на минимальной яркости за обычным монитором.
Может, прокатит.
Ответы: >>1383972 >>1385178
Аноним 2019/04/19 09:30:12  №1383972 90
>>1383966

Пробовал, не помогло. Вообще, я много чего перепробовал по советам отсюда https://forum.ixbt.com/topic.cgi?id=28:29319 (оказывается не я один такой), от старых мониторов с CCFL подсветкой до Mactype (рендеринг шрифтов как в маке на винду), все бесполезно, кроме электронных чернил.
Аноним 2019/04/19 09:49:43  №1383979 91
>>1383949
>два года вката
>делает какие-то оп задания
ты это, не спеши
Ответы: >>1383985
Аноним 2019/04/19 09:52:17  №1383981 92
>>1383949
Что за mvc сапёр? Или это не опа задача?
Ответы: >>1383985
Аноним 2019/04/19 09:57:25  №1383985 93
Ответы: >>1383986 >>1383991
Аноним 2019/04/19 09:59:04  №1383986 94
Аноним 2019/04/19 10:07:31  №1383991 95
помню я как-то написал калькулятор на джаваскрипте за несколько дней, там было под четыреста с лишним строк кода и куча корнер кейсов, ну и он работал примерно как виндовый с отслеживанием серии операций, никогда не думал калькуляторы оказывается сложнее простой игры

потом правда забил учить кодинг только недавно снова начал

>>1383985
а зачем тут мвк? да и вообще пхп, я такое за день или два напишу на джаваскрипте
Ответы: >>1384041 >>1385177
Аноним 2019/04/19 10:09:13  №1383992 96
>>1383897
>>Точка - оператор конкатенации.
Ой спасибо что сказал.
Я просто ною на тему.
Ответы: >>1384044
Аноним 2019/04/19 11:10:24  №1384041 97
>>1383991
>никогда не думал калькуляторы оказывается сложнее простой игры
Это еще че, попробуй напиши калькулятор, обрабатывающий серии операций, со скобками - еще и алгоритмы придется подтянуть и синтаксический анализатор написать, а там и до своего япа недалеко, лол.
Ответы: >>1384052
Аноним 2019/04/19 11:14:53  №1384044 98
>>1383992
Ну ныл бы тогда хуле конкатенация точкой, а не плюсом, как во всех остальных языках.
Аноним 2019/04/19 11:20:24  №1384052 99
IMG20190419211904.jpg (55, 711x905)
905x711
>>1384041
он у меня серии операций и обрабатывал но без скобок - как обычный виндовый же - заряжаешь серию не ограниченной длинны он её и посчитает
вот собственно скин с кодпена, он там до сих пор висит, сам кодпен не хочу постить там везде говнища
Ответы: >>1384086
Аноним 2019/04/19 11:50:24  №1384086 100
>>1384052
Тупо в eval пихал ввод?
Ответы: >>1384102
Аноним 2019/04/19 11:52:58  №1384090 101
Есть ли у этой параши будущее?
педалю ублюдочный проект на работе, без фреймворков и стандартов. Местами ссанина прямиком из 2005 где запросы в базу и html в одном цикле.
Новый код пишем нормально, но старое переписать не дают.
Думаю уволиться и искать новую работу, но не знаю на какой технологии.
Есть ли смысл искать работу ещё на рнр (аппелируя к тому, что у меня уже есть опыт), или лучше выкатываться куда подальше?
Алсо, ненавижу фронтенд и избегаю его всеми силами.
Ответы: >>1384098
Аноним 2019/04/19 11:59:13  №1384098 102
>>1384090
Ищи работу пых+го с перекатом в го, базарю, еще захочешь.
Есть прям такие вакансии: "Ищем пыхарей с перекатом в го".
Когда есть проект на пыхе, а его перепердоливают на го.
Как раз шанс выучить го и съебать от пыха.
Аноним 2019/04/19 12:04:01  №1384102 103
>>1384086
нет, строка сплитится по пробелам и парсится, т.к. проверки типа - нельзя ввести две точки подряд или два математических символа подряд и т.п. на уровне ввода то это безопасно, ну а потом результат округлялся до определенной точности чтобы он в экран влез (это только верхняя строчка могла как в виндовом скипаться влево со знаком <<) и т.п.

наверное можно было и в эвал скормить я что-то не подумал
Ответы: >>1385177
Аноним 2019/04/19 12:40:04  №1384130 104
Опчик, можешь глянуть 1 задачу по ООП? 200 строк это нормально, или я его сильно раздул и нужно пытаться писать более сжато?
https://github.com/Leorne/VektorCompany/blob/master/Vektor.php
Почему когда я делаю свойства класса Position - private (33 строка), то методы которые должны возвращать эти значения возвращают 0? (Все кроме getTotalEmployees, с ним всё ок)
Аноним 2019/04/19 12:51:09  №1384135 105
>>1384130
У меня вектор с антикризисными в 700 вышел, лол, оп проверял, про размер ниче не сказал.
Ответы: >>1384176
Аноним 2019/04/19 13:49:44  №1384176 106
>>1384135
А, там продолжение задачи по Вектору. Я, выходит, только 1 часть сделал.
Аноним 2019/04/19 14:50:52  №1384216 107
>>1384130
Приватные поля не видны наследникам.
Аноним 2019/04/19 18:26:16  №1384401 108
err1.jpg (51, 920x203)
203x920
>>1384130
>200 строк это нормально
Есть топовый хинт - каждый класс в свой файл класть.
Комментариев мало. Хотя бы 30% от кода - 50 строк, по паре рабочих на каждый класс и метод.
Пикрелейтед старайся избегать. Хорошо считается когда 1-3 параметра у метода\функции, больше - хуже.
Docker GooseBumps 2019/04/19 23:55:34  №1384524 109
Привет тред, есть вопрос по Docker + Symfony(сифон), в контейнеризации новичок. Вопрос следующий, у меня есть приложение на сифоне которое я хочу засунуть в докер. Прочитав большое кол-во статей, я не донца понял, как это реализовать. На многих бордах люди просто описывают как развернуть среду вокруг сифона(Apache,MySQL и тд), а потом просто загружают свою приложку. Меня интересует вопрос, можно ли создать образ в который будет сразу встроено мое приложение, чтобы я просто мог скачать образ и запустись его с уже готовым приложением. У меня была мысль создать докер файл в котором прописать команды на скачивание с гита моего проекта, но будет ли этот подход грамотный с точки зрения архитектуры и концепции докера?
Ответы: >>1385086 >>1385175
Аноним 2019/04/20 15:39:10  №1384989 110
>>1383949

У нас на работе есть фронтендер. У него два моник: один для кода (е инк), второй для анимации (жк). Возможно, тебе тоже покатит писать код там, где комфортнее глазам, а на интерфейсы изредка поглядывать через стандартный монитор.
Аноним 2019/04/20 18:52:39  №1385086 111
>>1384524
Короче, создай пару образов докера, пойми как это говно работает.
>как развернуть среду
Ну так так все и происходит. Записываешь команды в докерфайл на установку софта, как обычно на сервере.
Файлы можешь записать внутрь на постоянку или монтировать разделы во внешнюю систему.
В докера есть докерхаб для распространения + есть кубернетис, но до этого тебе пока далеко.

Сначала просто разверни все зависимости твоего приложения в докере
Ответы: >>1385164
Аноним 2019/04/20 23:13:04  №1385164 112
>>1385086
Ок, спасибо за совет. Тогда отпишусь по итогу что получилось, быть может кому пригодится.
Аноним 2019/04/21 00:34:58  №1385175 113
>>1384524

Докер часто используют для решения проблем с зависимостями. В Линуксе часто нельзя стандартными средствами установить несколько версий языка программирования или какой-то библиотеки, потому Докер используют, чтобы засунуть внутрь контейнера программу и ее зависимости, не влияя на окружающую ОС. То есть, тебе нужен PHP версии X с определенными зависимостями, и ты пишешь Докер-конфиг, который берет базовый образ ОС, скачивает исходники нужной версии PHP, компилирует их (либо устанавливает из репозитория ОС), ставит нужные расширения.

Для примера, вот конфиг из Dockerhub для PHP7.3 на основе минималистичного образа Alpine: https://github.com/docker-library/php/blob/a5c895da277a71578af9561b0e282e6cb0764434/7.3/alpine3.9/cli/Dockerfile

В нем скачивается исходный код PHP, устанавливается компилятор и производится сборка (подозреваю, что не быстро). Описание этого и похожих конфигов есть тут: https://hub.docker.com/_/php

То есть Докер тут используется для того, чтобы можно было установить PHP с зависимостями независимо от того, какая используется ОС. Стандартными средствами это часто сделать нельзя - в репозитории ОС может быть только одна версия PHP, и пакетный мемеджер не позволяет ставить несколько разных версий PHP одновременно.

В Windows для этого раньше использовались "портабельные" приложения, которые просто ставились в нужную папку со своими зависимостями, не влияя на систему, и наверно в Линуксе можно было бы сделать так же, используя хитрые bash-скрипты, но люди почему-то используют Докер.

После того, как ты сделал конфиги для PHP, MySQL, Nginx, ты используешь docker-compose для того, чтобы запускать контейнеры с ними и связывать между собой. Код приложения внутрь образа не помещается, а просто монтируется туда (в определенную папку). В итоге, разработчику надо лишь запустить Докер, чтобы поднять локальную копию приложения. Это в теории. На практике, тут куча подвохов:

- в Windows/Mac Докер работает в виртуальной машине, и возможно замедление работы в сравнении с нативными приложениями
- прокидывание папки с PHP-кодом в виртуальную машину тоже работает не так быстро
- часто разработчик настраивает конфиг, как ему удобнее, но при этом конфиг не работает у другого разработчика
- образы требуют места на диске, сборка занимает время
- демон Докера большой, сложный, и работает из-под рута

То есть Докер используют в dev-среде, в CI (для прогона тестов), а на продакшене часто админы не разрешают разворачивать Докер.

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

- тратится лишнее время на сборку образа
- надо как-то решать задачу бесшовного деплоя. В мануале, например, https://docs.docker.com/compose/production/ дается вариант только деплоя с даунтаймом при переключении.

Что ты хочешь сделать, я не очень понимаю. Зачем тебе делать образ с кодом твоего приложения внутри? Ты его передаешь какому-то заказчику? Если нет, то непонятно, зачем это тебе нужно.

> У меня была мысль создать докер файл в котором прописать команды на скачивание с гита моего проекта, но будет ли этот подход грамотный с точки зрения архитектуры и концепции докера?

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

Я должен сказать, что Докер ни разу не запускал, так что советую получше изучить документацию к нему.
Ответы: >>1385184 >>1385265
Аноним 2019/04/21 00:35:38  №1385176 114
>>1384130

Когда ты столкнешься с реальными проектами, ты поймешь, что 200 строк - это ерунда. На практике каждый класс помещают в отдельный файл.

Код у тебя по моему не соответствует форматированию PSR, например, пробелы вокруг "равно" хаотично расставлены. Если ты будешь использовать IDE, то там код форматируется одной кнопкой. Также, см. второй пост треда про другие способы отформатировать код.

> private $nameOfDepartment;
Достаточно просто $name. В данном случае удлинение имени переменной не дает никакой новой информации.

> public function setPosition(string $name,int $countOfPerson,int $tier =1,int $leader = 0){
Этот метод содержит захардкоженный список профессий и не позволит добавить новые, не меняя старый код. Лучше убрать создание работников из Департамента и принимать на вход уже созданного работника. Департамент ведь нанимает людей, а не создает.

Комментарии лучше писать сверху, а не справа, а то строки получаются длинные.

> abstract class Position{
>\tpublic $payment;
Лучше использовать protected, а то у тебя можно без всяких проверок записать что угодно в эти поля снаружи. То есть сделай инкапсуляцию: доступ к свойствам снаружи есть только через методы, которые не позволят задать некорректные значения.

> function __construct(int $countOfPerson,int $tier,int $leader){
У тебя один объект Position представляет целую группу работников. Это неудобно, так как ты не можешь одному из этой группы повысить ранг, например. В части задачи про кризис это тебе помешает.

> \t\tif ($tier != 1){
>\t\t $this->payment += ($this->payment($tier0.25-0.25));
Здесь ты смешал в одном поле 2 разных значения: базовую ставку и итоговую зарплату.

Также, у твоего объекта работника есть серьезный недостаток: зарплата считается только при создании. Если мы повысим работнику ранг, зарплата не обновится. А по идее зарплата должна обновляться при изменении любого влияющего на нее свойства (подсказка: проще всего ее вообще не хранить).

> public function getTotalPayment(){
Стоит указывать тип возвращаемого функцией значения.

> class Manager extends Position{
>\tpublic $payment = 500;
У тебя класс-наследник должен указать базовую ставку для профессии. Но это никак не описано в коде и никак не проверяется. Легко забыть это сделать. Лучше объявить абстрактные методы вроде getBaseSalary, тогда не определить их в наследнике не получится.

> $sellDepartment->setPosition('manager',12);
Вместо названия лучше было бы использовать встроенную константу, возвращающую имя класса: Marketer::class. Так при опечатке будет выдана ошибка. У тебя же опечатка будет молча проигнорирована, что очень плохо - это не позволяет сразу увидеть ошибку и придется потратить много времени на отладку.
Ответы: >>1387082
Аноним 2019/04/21 00:36:24  №1385177 115
>>1384102

Лучше без eval. С ним код разбирать труднее.

>>1383991

MVC там чтобы изучить MVC и научиться отделять модель от представления, понять, какие есть подходы к реализации data-байндинга. Почитал бы комментарии к задаче. Так-то, конечно, саперу полноценный MVC не нужен.

>>1383949

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

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

Возможно, тебе еще подойдет вариант распечатывать какие-то материалы и читать с бумаги. Как плюс, можно делать пометки на них.

С играми да, тут сложнее. Обычно они довольно динамичные, если не считать каких-то стратегий.

> Часто ли при работе бэкэндером приходится работать с фронтэндом, например?

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

Монитор, если есть такая возможность, стоило бы посмотреть вживую перед покупкой.

Аноним 2019/04/21 00:37:03  №1385178 116
>>1383864

В этой задаче редактирование предусмотрено на случай ошибок при вводе данных. Так что Васю все же надо оставить.

>>1383966

В некоторых ЖК мониторах минимальная яркость соответствует наибольшей амплитуде мерцаний подсветки.

>>1383810

> Тестировать закрытые функции = себя не уважать.

Дело тут не в уважении, а в том, что приватные функции - это деталь реализации. От класса требуется предоставлять выполнять определенные требования, а как он это делает - его личное дело. И если мы будем в тестах закладывать знание внутреннего устройства класса, то нам их придется переписывать при любых изменениях. А это неудобно.

>>1383734

..., int $tier = 1, ..

Это описано в мануале PHP.

>>1383611

Изучить, как устроено веб-приложение, а не изучить, как настроить фреймворк.
Аноним 2019/04/21 00:37:34  №1385179 117
>>1383193
>>1383408

Для случаев, когда есть выбор из нескольких значений, эти значения принято обозначать константами. Плюсы: защита от опечаток; видно, какие есть вообще варианты значения; видно, что это не случайная строка; автодополнение в IDE.

То есть Student::GENDER_MALE говорит гораздо больше, чем просто строка 'male' или число 1.

И в конструктор ты будешь передавать сразу константу.

>>1383151

> if (($answer == $this->answer) || array_search($answer,$this->deviation) != FALSE){

Тут явно что-то неправильно сделано. Для ответа с погрешностью тебе надо лишь проверить, что ответ находится в диапазоне (правильный ответ - погрешность; ответ + погрешность). То есть обычные сравнения больше/меньше.

> if (property_exists($question,'options') == TRUE){
> echo "Варианты ответов:\n";

А вот это неправильно. Это какой-то костыль. Тут получается, если у нас есть 10 видов вопросов, мы должны написать 10 ифов. Правильнее было бы сделать так: сделать в вопросе метод printQuestion() и пусть каждый вопрос сам определяет, как его надо выводить. Так мы можем добавлять новые типы вопросов, не трогая старый код.

> Правильно ли
> function checkTotalAnswers пытаться поместить в класс Questions?

Думаю, что нет, так как Question представляет один вопрос, а функция работает со множеством вопросов.
Ответы: >>1385271
Аноним 2019/04/21 00:38:09  №1385180 118
>>1381792

Просто как обычную строку. Я против констант для этого, так как:

- запрос выносится из кода, в котором он используется, код труднее читать
- непонятно, зачем это нужно: мы будем использовать этот запрос где-то еще?

>>1383079

Я сразу предупрежу, что у тебя какое-то неправильное отношение. Сложные задачи для программиста - это челлендж и возможность к развитию, возможность поломать голову и получить удовольствие, а не "душная" вещь.

Задачка решается примерно так:

- прибавляем проценты и комиссию к остатку долга (!не вычитаем ничего пока!)
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000

«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.

>>1383037

Вообще, у тебя тут все очень просто. Возраст сейчас = начальный возраст + сколько прошло лет.

Что касается ++, это $x++ это короткая запись для $x += 1, а это короткая запись для $x = $x + 1. То есть мы вычисляем $x + 1 и записываем это назад в $x.
Аноним 2019/04/21 00:38:31  №1385181 119
>>1382653

Если следовать принципу DI, то да, в контроллер надо передавать нужные ему объекты (зависимости) снаружи. Соответственно, создание контроллера мы поручаем DI контейнеру, который и передаст ему эти зависимости. Роутер берет контроллер из контейнера, а не создает сам.

Но на практике контроллеры часто исключают из DI, так как это все равно не повторно используемый код, и просто передают в конструктор контроллера только DI контейнер, а контроллер уже сам берет из него то, что ему нужно. Это отступление от принципов DI/IoC.

И роутер (который на самом деле Front Controller, а не просто роутер) можно исключить из DI по той же причине.

> А если у меня объект контроллера в роутере создаётся, то сначала объект tablegateway нужно в роутер передавать прямо из index.php? Это и есть Di?

В DI обычно объекты создает DI контейнер, а не роутер. В роутер проще передать DI контейнер и брать контроллеры из него. Хотя, если тебе очень хочется, можно и для роутера задействовать DI, передавая в него все объекты контроллеров снаружи, и сам роутер поместить в DI контейнер.

Ответы: >>1385271
Аноним 2019/04/21 03:10:52  №1385184 120
>>1385175
В одном из тестовых заданий на стажировку была задача предоставить докер образ по окончанию работы, поэтому задался таким вопросом.

А насчёт prod версии и докера, то на мой взгляд довольно удобно поставлять докер образы, тк у кого то Postgre или sqlLite, а кому то нужен Nginx вместо Apache.

Спасибо за инфу, буду анализировать.
Ответы: >>1385293 >>1385809
Аноним 2019/04/21 08:45:21  №1385265 121
>>1385175
В итоге удалось разобраться и составить свой Docker-compose файл для проекта(на Symfony). Ты оказался прав, это нелогично запихивать исходники в контейнер, гораздо проще таскать среду и подгружать все через гит и композер.

Если кому пригодится, то исходники на гите, стек - phpmyadmin, apache, php7.2, mariaDB.

https://github.com/GooseBumpsOS/docker-symfony
Ответы: >>1385875
Аноним 2019/04/21 08:47:53  №1385271 122
Аноним 2019/04/21 09:23:29  №1385293 123
>>1385184
У обычного разработчика в общем случае будут установлены как postgres, так и sqlite.
ОП всё правильно расписал, для zero downtime деплоя в докере из коробки ничего нет, есть bash-костыли на гитхабе. Сервер нужно чистить от старых образов, как-то это всё хозяйство мониторить. В итоге ты будешь вынужден платить за kubernetes или за сервисы амазона. Мы через это прошли и в итоге избавились от докера везде, где возможно - проще один раз за 20-30 минут поднять проект, чем постоянно возиться с докером, ждать сборки образов. Как плюс - на всех проектах PHP самой новой версии, так как если локально обновили PHP c 7.1 на 7.2, то и все проекты нужно перевести на 7.2, иначе локально могут не работать. Ну и на маке докер работает очень медленно, нужны опять костыли вроде docker-sync.
Ответы: >>1385303
Аноним 2019/04/21 09:41:13  №1385303 124
>>1385293
ахах, сейчас как раз смотрю общую лекцию по Kubernetes.

А как без докера решать такие проблемы?


Ответы: >>1385876
Аноним 2019/04/21 12:25:01  №1385809 125
>>1385184

Я думаю, что там требовалось сделать именно Докер для dev-среды. То есть сделать образы с PHP, nginx, MySQL, PHP-FPM и связать их через docker-compose, чтобы все это можно было бы запустить одной командой.
Ответы: >>1388192
Аноним 2019/04/21 12:50:36  №1385875 126
>>1385265

Обычно внутрь контейнера код никто не загружает, его просто примонтируют (то есть код лежит на хосте, а у контейнера есть доступ к этой папке). Папка задается командой VOLUME: https://docs.docker.com/engine/reference/builder/#volume

Если надо, можно почитать информацию на сайте dockerhub, там и по PHP, и по MySQL есть подробнейшие пояснения:

- https://hub.docker.com/_/mysql
- https://hub.docker.com/_/php

Зачем тебе apache, не очень понятно, использовал бы nginx сразу, раз у тебя php-fpm.


Ответы: >>1385920
Аноним 2019/04/21 12:53:10  №1385876 127
>>1385303

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

Если используется пара серверов (веб-сервер + сервер БД), то это все настраивается руками без докеров. Если потребуется переезд, то просто на новом месте разворачивается полный бекап.
Аноним 2019/04/21 13:44:24  №1385920 128
>>1385875
>Зачем тебе apache, не очень понятно, использовал бы nginx сразу, раз у тебя php-fpm.

Мой косяк, не заметил, подправил.
Аноним 2019/04/22 04:47:42  №1386332 129
Объясните долбоебу про front controller.
Ответы: >>1386341 >>1386423
Аноним 2019/04/22 05:38:40  №1386341 130
>>1386332
В public лежит index.php и .htaccess. В последнем прописаны настройки апача - происходит редирект любых юрлов в index:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

А index уже обрабатывает их как тебе надо, вызывая нужные контроллеры, например, вроде так.
Аноним 2019/04/22 08:13:50  №1386423 131
Аноним 2019/04/22 13:16:54  №1386695 132
Что за хуйня с этим ебучим Eloquent?

Пишу запрос через орм. Возвращается пустой массив.
Распечатал сформированный орм запрос:
select `type`, SUM(`duration`) AS `sum_duration` from `megafon_calls` where `telephony_id` = ? and `time` > NOW() - INTERVAL ? HOUR group by `telephony_id`, `type`
- Все нормально блять, если его вставить в пых-админ, он выполнится как надо.
Но в коде возвращается пустой массив.
Пиздец.
Тупо голый sql написать что ли? Заебался уже.
Ответы: >>1386920 >>1394734
Аноним 2019/04/22 18:51:21  №1386920 133
>>1386695
Ты бы свой eloquent запрос что ли прислал

Аноним 2019/04/22 21:47:45  №1387082 134
>>1385176
>Когда ты столкнешься с реальными проектами, ты поймешь, что 200 строк - это ерунда.

Да я спрашиваю к тому, чтобы знать: раздут мой код или нет. Если можно сделать в 100 строк, а я сделал в 400 - значит я написал не так хорошо как мог

>Лучше убрать создание работников из Департамента и принимать на вход уже созданного работника.Департамент ведь нанимает людей, а не создает.

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

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

Правильно ли я понимаю, что желательно для всех свойств класса ставить protected/private, а для считывания/записи нужно делать public методы с проверкой и выдачей ошибки в случае чего?

>У тебя один объект Position представляет целую группу работников. Это неудобно, так как ты не можешь одному из этой группы повысить ранг, например. В части задачи про кризис это тебе помешает.

Неужели для каждого рабочего свой обьект создавать? Ранг повысить я смог, если нужно повысить 4 человека с 1 ранга до 2, то с группы людей 1 ранга(кол-ва человек) отнимаем 4, и создаем новый обьект в департаменте с рангом +1 (с кол-вом человек = 4 ).

>Вместо названия лучше было бы использовать встроенную константу, возвращающую имя класса: Marketer::class.

Не совсем понял. Обьявить в начале кода 4 константые Manager,Engineer и т.д?

>Здесь ты смешал в одном поле 2 разных значения: базовую ставку и итоговую зарплату.

Т.е базовая ставка у всех одинаковая, а итоговая зависит от ранга и является ли работник лидером?

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

ОП, спасибо тебе огромное что уделил время
Ответы: >>1387094 >>1393246 >>1394576
Аноним 2019/04/22 22:12:15  №1387094 135
>>1387082
>Если можно сделать в 100 строк, а я сделал в 400 - значит я написал не так хорошо как мог
главное какой вариант легче читать и поддерживать
Аноним 2019/04/23 14:29:20  №1387384 136
Нихуя не понимаю mvc, помогите долбоёбу
Аноним 2019/04/23 17:22:39  №1387455 137
image.png (97, 259x194)
194x259
>>1387384
Я вообще ничего не понимаю с этим долбанным SQL. Набираю уже где-то первую космическую на одной жопной тяге.

Правила меняются постоянно от запроса к запросу, от типа переменной к другому типу переменной. Заебало такое поведение уже. Где-то можно напрямую переменные в строку лепить - где-то нельзя.
С группировкой тоже возился долго и пришлось костыль писать, так потом выяснилось что мой костыль и не костыль вовсе. Оказывается в "GROUP BY" нельзя биндить переменную. Но везде можно. А тут нельзя - читайте документацию. Где-то там на триста-сраной странице пару строк написано про это. Или гугл доёбывайте, но на русском только шизики срут - трахайте по английский пожалуйста. Рады были вам помочь.
Ну охуеть теперь. И всем норм. Говноедство какое-то массовое.
Ответы: >>1387703 >>1394734
Аноним 2019/04/23 17:52:42  №1387469 138
>>1387384
я тоже не совсем понимаю
модель ладно, это база данных
вью понятно, это фронт-энд
контроллер... щито такое контроллер? бэкэнд с роутингом и запросами к базе данных? вроде логично, но фронт-энд, бэк-энд и база данных есть у большинства приложух, а мвк считается специфической композицией
Ответы: >>1387476
Аноним 2019/04/23 17:57:34  №1387476 139
>>1387469
>модель ладно, это база данных
Это бизнес-логика. То есть сама суть процесса, который ты программируешь. Там не только база данных.
>контроллер... щито такое контроллер?
То, что склеивает модель и представление. Она обычно трогает модель за разные места, а результат этого действия отдаёт представлению(вью).
Ответы: >>1387484
Аноним 2019/04/23 18:12:50  №1387484 140
>>1387476
как все сложно
я рад что есть спы, вот они точно по мне
Аноним 2019/04/24 08:07:46  №1387703 141
>>1387455
Ето и есть процесс обучения.
Ответы: >>1387794
Аноним 2019/04/24 10:07:44  №1387763 142
>>1383014
Это что за компания, где берут с 2-мя месяцами опыта?
и сколько платят?
Ответы: >>1387771 >>1387786
Аноним 2019/04/24 10:27:08  №1387771 143
>>1387763
Меня вообще без опыта взяли. Ебошу бэк для мобилочек теперь.
Ответы: >>1387915
Аноним 2019/04/24 10:40:33  №1387775 144
Как начать отписываться по зказам на фрилансе? Не могу просто начать, боюсь что не справлюсь и испорчу профиль и все в этом духе. Хотя опыт есть, я сейчас работаю веб макакой, но тут все просто. Тебе выдают таск и знай делай, и с заказчиками тоже иногда общаюсь
Ответы: >>1388199
Аноним 2019/04/24 11:34:16  №1387786 145
>>1387763
в смысле? все люди когда-то начинали свою первую работу не имея опыта
Ответы: >>1387915
Аноним 2019/04/24 11:46:58  №1387792 146
Почему меня фолловят на гитхабе, если я ещё ничего не выкладывал? За звёзды другим проектам могут?
Аноним 2019/04/24 11:49:42  №1387794 147
>>1387703
Да ето так.

Однако от этого не легче - довольно сложно работать с системой, в данном случае, MySQL, если она ведёт себя как девка на свидании и постоянно ломается и нарушает свои же правила.
Аноним 2019/04/24 11:53:42  №1387796 148
Аноны, подскажите - разбиваю url строку в массив.
$url = "posts-new/test?page2=2&page3=3";
$params = explode('&', $url);

результат:
$params = Array
(
[0] => posts-new/test
[1] => page2=2
[2] => page3=3
)

Какого хрена? Я же в качестве разделителя амперсанд "&" использую?
И когда я просто печатаю url на страничке - "&" меняется на "?". почему так?


Аноним 2019/04/24 12:51:10  №1387823 149
>>1387796
У пыха встроенный функционал есть для разбора УРЛов. Не надо вручную всё это .
Ответы: >>1388239
Аноним 2019/04/24 15:32:45  №1387915 150
>>1387786
>>1387771
Так он указывает что вообще в пыхе два месяца опыта.То что могут взять без опыта РАБОТЫ я понимаю, но ведь для этого нормально знать уже надо.
я так думаю
Аноним 2019/04/24 22:52:53  №1388192 151
>>1385809
> сделать образы с PHP, nginx, MySQL, PHP-FPM и связать их через docker-compose, чтобы все это можно было бы запустить одной командой.
Но зачем? В репозиториях докера уже всё это есть.
А ещё есть уже даже собранное решение. Devilbox
Ответы: >>1388990
Аноним 2019/04/24 22:56:32  №1388194 152
>>1387796
Как же ты так, функцию explode узнал, а про GET и POST запросы и суперглобальные переменные нет. Вот тебе наводка. Иди гугли. Найдёшь что ищешь.
Ответы: >>1388239
Аноним 2019/04/24 22:59:27  №1388197 153
>>1383014
Забей, пока ты просто плохо знаешь проект, будешь тупить. Подольше его попердолишь, уловишь структуру и логику даже если её нет, лол, всё равно запомнишь где что и установишь закономерности и будешь уже по проекту хорошо ориентироваться.
Аноним 2019/04/24 23:01:12  №1388199 154
>>1387775
В таком случае, голодать. Как поймёшь, что либо пишешь заказчику, либо завтра жрать нечего будет, страх уйдёт.
Аноним 2019/04/24 23:04:25  №1388200 155
>>1387384
Model - тут логика, обработка данных, работа с БД.
View - всё просто. Шаблоны, вёрстка. В общем, всё что показывается пользователю тут.
Controller - звено между пользователем и логикой. Принимает данные, преобразует типа, собрать аргументы в массив и прочее по мелочи, передаёт в модель.
Аноним 2019/04/25 02:21:07  №1388212 156
>>1380677

> Сообщение - это конкретная запись сообщения имеющая все данные о нём, от содержания до автора, id, даты публикации и т.д., а сообщения - это запись какие сообщения принадлежат какому пользователю и/или диалогу. Т.е. "сообщения" хранит ссылки для пользователя на id конкретного сообщения.

Это лучше назвать "message_to_user" или "user_message", как-то так. Тут https://www.sqlstyle.guide/ru/ советуют придумывать оригинальные имена, но в данном случае это трудно.

Твои названия сбили меня с толку, и скорее всего, собьют и других людей.

> Такая схема была предложена вами при обсуждении моей задачи чата на чистом JS:

Да, я имел в виду, что если мы делаем каждому пользователю свою копию сообщения, то хорошо бы эти копии связать с помощью какого-то id. Чтобы можно было например их редактировать или удалять все вместе.

И еще, у тебя в таблице "текстовое_сообщения" есть ссылка на диалог. Но ведь сообщение постится в один чат. Значит, у тебя для чата у каждого пользователя есть своя "копия" диалога со своим id? Вот такие вещи стоило бы пояснить заранее, увы, я этого не понял сразу.

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

При таком подходе есть проблема - в огромных чатах при отправке накладно получается делать 1000 копий сообщения, и в плане загрузки CPU, и в плане хранения на сервере. Для таких случаев можно попробовать такую идею: есть создатель чата, он создает "ключ чата" и сохраняет на сервер (или же сервер сам его генерирует). Каждый подключающийся к чату получает этот ключ и может шифровать и расшифровывать сообщения. Минус - когда один ключ есть у кучи людей, это не очень-то надежно. Но если это публичный чат, то и так любой может подключиться к нему и читать его. Чтобы отключившиеся от чата не могли больше читать его, надо периодически обновлять ключ чата. Те, кто отключился, не получат новую версию ключа.

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

> Я думал об этом и предполагал, что у psql есть встроенная поддержка этого, и как оказалось, действительно есть

Это хорошо, что там есть поддержка наследования, но стоило бы проверить, как это реализовано и нет ли там сильного замедления запросов при таком подходе. Если физически это сделано как одна большая таблица, то скорее всего все ок.

> Этот массив был бы объектом с одним свойством этого самого массива?

Зависит от ситуации, скорее всего объектом с полями. Ну например, у нас есть фильтр по товарам, который мы передаем в функции и получаем из функций, преобразуем. Логично делать его не массивом, а нормальным объектом с полями: мин. цена, макс. цена, категории, цвета, бренды, поиск по названию и тд. Я имел в виду, что в такой ситуации выгоднее использовать объект с методами, проверкой типов, чем просто непонятный массив, в котором непонятно даже какие поля есть.
Ответы: >>1388352
Аноним 2019/04/25 02:21:36  №1388213 157
>>1380688

> Ну и разные функции нет смысла создавать - всегда один гет-массив приходит в запросе и с ним работаем.

Суть не в том, что ты создаешь эту анонимную функцию всего один раз. Суть в том, что это можно было сделать нормально аж несколькими способами:

- не использовать анонимную функцию, а использовать объект, каждый генератор ссылок - это новый объект
- использовать анонимную функцию, но хранить данные в замыкании, а не в $this, так что каждая функция изолирована от других

Любой из этих вариантов решил бы проблему нарушения изоляции генераторов ссылок друг от друга. Ты же выбрал плохой вариант, который может вызвать баг, и вместо исправления пишешь о том, что ты создаешь всего лишь 1 генератор. Это так не делается. В реальном проекте завтра кто-то попробует создать второй генератор ссылок и получит баг. Не надо писать такой код, который легко использовать неправильно и получить баг.

>> если мы меняем сортировку, то надо сбрасывать пагинацию
> Зачем? Количество записей ведь не изменилось.

Обычно сортировку используют, чтобы показать, например, самые большие или самые маленькие баллы. Или первые фамилии по алфавиту. Для этого надо перейти на 1-ю страницу при смене сортировки. Если ты меняешь сортировку и оставляешь ту же страницу, то не очень понятно, для чего это нужно. Ты не получаешь ни самые большие, ни самые маленькие баллы, а что-то из середины списка.

Везде переключают на первую страницу при смене сортировки, насколько я знаю.

>>1381843

Этот подход довольно плохой. Он мне не нравится. Во-первых, не всегда это работает, зависит от конфигурации сервера, и может получиться, что у юзера будет крутиться кружок загрузки, пока твой скрипт что-то там считает якобы в фоне. Во-вторых, php-fpm на такое не рассчитан. Там может быть ограничено число рабочих процессов, и в неудачном случае они все могут оказаться заняты этими вычислениями и некому будет обслуживать другие запросы пользователей. В-третьих, тут нет обратной связи - ты запустил вычисление, а чем оно закончилось, неизвестно. Также, часто на php-fpm ставится таймаут на время работы скрипта.

Если у тебя какой-то простой случай, не требующий очереди задач, редко вызваемый (типа генерации какого-то отчета, который генерируется минуту), то проще просто сделать страницу с кнопкой и кнопкой запрашивать скрипт аяксом, а тот скрипт генерирует отчет и возвращает. Тут ты хотя бы в итоге либо получишь отчет, либо какую-то ошибку и можно будет нажать кнопку еще раз.
Аноним 2019/04/25 02:22:00  №1388214 158
>>1382020

> Делаю грамматического нациста, хочу сделать проверку по отсутствию знака препинания.

Проще всего искать так:

- в начале идет любая буква
- за ней пробелы
- за ней слово "а" или "но"
- за ним граница слова

>>1383863

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

>>1383892

Я взял привычку всегда их ставить, и к таблицам, и к полям. Они отображаются во всяких визуальных программах для работы с БД вроде phpmyadmin.
Аноним 2019/04/25 02:31:02  №1388216 159
>>1387125

> Можно вместо создания бесконечного количества ссылок создать поле с типом ARRAY и помещать в него все ссылки (UUID) на необходимые данные.

Можно, но это будет денормализация. Допустимо, но лучше сначала спроектировать нормализованную схему, а только потом денормализовать. И что там с внешними ключами?

> Participant:
> -messages UUID[] //массив из uuid сообщений

Это плохо масштабируется, так как у пользователя могут быть тысячи сообщений. И мы не можем быстренько выбрать часть из них. Хотя, тут стоило бы сделать микробенчмарк, а не гадать.

>>1388116

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

Во втором варианте можно считать результат, никуда его не сохраняя, в отличие от первого.
Аноним 2019/04/25 05:24:27  №1388239 160
>>1388194
>>1387823
Блэт. Господа, не нужно тумана.
Почему "?" меняется на "&" просто скажите
Ответы: >>1388378
Аноним 2019/04/25 06:51:11  №1388284 161
>>1387796
Только что переписал твой код себе и у меня как надо разбилось, на 2 строки до и после амперсанта.
Ответы: >>1388384
Аноним 2019/04/25 06:55:25  №1388288 162
>>1387796
Попробовал и в интерпретаторе у себя и на онлайн сервисе на 5 и 6 пыхе, все работает как надо.
Ответы: >>1388289 >>1388384
Аноним 2019/04/25 06:56:08  №1388289 163
someApprentice 2019/04/25 08:52:57  №1388352 164
Ответы: >>1388928
someApprentice 2019/04/25 08:58:31  №1388353 165
Напомню посмотреть ещё этот вопрос, который мог быть не замечен из-за ошибки спам-листа >>1382907

Простите что так много вопросов, тяжело очень.
Аноним 2019/04/25 09:37:04  №1388378 166
>>1388239

Попробуй запустить свой код на ideone и, если он работает, так как ты описал, то дай ссылку с подтверждением. Я думаю, что explode работает как надо, и ошибка в чем-то другом, или ты просто что-то перепутал.
Ответы: >>1388385
Аноним 2019/04/25 09:46:31  №1388384 167
>>1388288
>>1388284
Такое случается если ты парсишь именно url, полученный например через $_SERVER['QUERY_STRING']
Аноним 2019/04/25 09:49:49  №1388385 168
>>1388378
explode работает как нужно.
Это какая то особенность именно url возвращаемого $_SERVER['QUERY_STRING']
Более того - распечатай именно $_SERVER['QUERY_STRING'] на странице - и увидишь что "?" в нем заменен на "&"

Если просто строку парсить - то explode работает как нужно.
Ответы: >>1394733
Аноним 2019/04/25 12:06:32  №1388460 169
Почему Symfony такой убогий фреймворк?
Ответы: >>1388994
Аноним 2019/04/26 02:38:14  №1388926 170
>>1388324

> Однако, как бы подход с массивами не казался элегантным, у него есть один недостаток - для всех ORM можно переопределить условие для взаимоотношений между таблицами (прим. One-To-Many, Many-to-Many) для сущностей. В SQLAlchemy, похоже, такая возможность есть https://docs.sqlalchemy.org/en/13/orm/join_conditions.html#specifying-alternate-join-conditions , а в Доктрине я такой возможности не нашел. Она есть?

Я думаю, что нету. Судя по https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/annotations-reference.html#annref_joincolumn там связь делается только через колонку с внешним ключом и никак иначе.

Я еще должен предупредить, что, может быть, где-то придется делать SQL-запросы напрямую, если это будет давать значительную разницу в времени выполнения запроса.

> // Получить все сообщения получателя

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

>>1382907

> Значит, нужно на серверной стороне написать такой клиент, который будет подписываться на все сообщения, валидировать их, сохранять в БД, а затем только перенаправлять клиенту пользователя.

Обычно WAMP и websocket используют как PubSub-брокер (про PubSub: http://design-pattern.ru/patterns/pubsub.html ). PubSub - это технология, когда есть программа-брокер, и к ней могут подсоединяться издатели и подписчики. Подписчики подключаются к брокеру и подписываются на интересующие их каналы или "топики". Издатели подключаются к брокеру и шлют сообщения в выбранные ими каналы. И брокер пересылает сообщения только тем подписчикам, кто подписан на канал. Список каналов нигде не хранится, это просто строка, которая позволяет отобрать получателей сообщения. Каналы/топики нужны для маршрутизации сообщений, чтобы клиенты получали только нужные им события, а не все подряд, что происходит в системе.

WAMP-сервер (программа, которая принимает вебсокет соединения на стороне сервера) обычно и служит брокером PubSub.

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

Пример. Клиент (браузер) подсоединяется к WAMP-серверу. При этом код в браузере устанавливает постоянное веб-сокет соединение с WAMP-сервером, автоматически переподсоединяясь при обрыве. Используя функционал PubSub, он подписывается на канал msg-for-1234, где 1234 - это id залогиненного пользователя.

Когда кто-то шлет пользователю 1234 сообщение, серверный скрипт подсоединяется к WAMP-серверу и публикует это сообщение в канал msg-for-1234. WAMP-сервер передает это сообщение всем подписанным на канал msg-for-1234 клиентам. В данном случае это один браузер. Ему отправляется сообщение по вебсокет-соединению, и после получения браузер генерирует событие, и вызывается какой-то коллбек в JS коде. Таким образом JS код узнает о приходе нового сообщения, и отображает его на экране.

При этом обычно используются и обычные аякс-запросы, и вебсокет. Когда пользователь запускает клиент, тот получает список последних сообщений обычным АЯКС-запросом, а вебсокет используется только для получения новых сообщений с момента запуска клиента. Еще, иногда вебсокет используется только для уведомления о новых сообщениях, а само сообщение запрашивается АЯКС-запросом. Также, можно не полагаться только на вебсокет, а дополнительно раз в N минут делать классический АЯКС-запрос - на случай, если сообщение где-то потерялось, или на случай, если у нас был разрыв вебсокет-соединения и в этот момент пришло сообщение (так как WAMP вроде бы не гарантирует их сохранность и работает по принципу best effort).

Еще, тут надо помнить о безопасности: подключиться к каналу msg-for-1234 должен иметь возможность только пользователь 1234, а не кто угодно. То есть нужна какая-то авторизация на WAMP-сервере.

Так как pubSub - ненадежный механизм, использовать его для отправки сообщений с клиента не стоит. Тебе надо рассмотреть другие варианты:

- AJAX
- RPC в WAMP

RPC - это "удаленный вызов процедур". Ты с клиента делаешь вызов какой-то функции на сервере, передаешь ей параметры, а в ответ получаешь либо результат, либо ошибку. Это наверно подойдет для твоей задачи.

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

Опять же, не забудь про авторизацию. А то кто угодно сможет отправлять сообщения от имени пользователя.

Вот пример вызова RPC из документации autobahn-js:

// 4) call a remote procedure
session.call('com.myapp.add2', [2, 3]).then(
function (res) {
console.log("Result:", res);
}
);

Можно сделать что-то вроде:

session.call('message.send', { to: 5678, cyphertext: 'zzzzzz', auth: 'xyz1234' }).then( ...);

На стороне сервера ты должен будешь "зарегистрировать" процедуру message.send и тогда брокер будет перенаправлять вызов от клиента твоему серверу, он обработает его и пошлет ответ, который брокер перешлет клиенту. Ты упоминаешь crossbar, и в нем есть пример "компонента", который регистрирует RPC и отвечает на вызовы:

https://github.com/crossbario/crossbar-examples/blob/master/getting-started/3.rpc/client_component_rpc_callee.py

Там есть функция utcnow(), и клиент (браузер) может ее вызывать удаленно, используя session.call().

callee в название файла обозначает "вызываемая сторона", в отличие от caller - "вызывающая сторона".

Тут конечно надо еще поподробнее изучить crossbar, если ты хочешь его использовать, чтобы понять, как он работает, как оптимальнее его настроить, итд. Нужно его потестировать, итд.

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

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

Потому, возможно, тебе придется делать дополнительную авторизацию на уровне RPC, например, передавать какой-то токен в RPC функцию отправки сообщения.

> // нужно проверить что это делает именно сервер
> // для этого я решил создать jwt со свойством isServer: true

Можно так, да. Хотя выглядит как усложение, конечно.

> Вопрос прост - Как вынести это n-ое количество проверок в отдельную архитектуру?

Там есть какие-то роли, может быть их можно использовать. Сделать роли "фронтенд/браузер" и "бекенд".

Ответы: >>1393712 >>1393712
Аноним 2019/04/26 02:45:40  №1388928 171
>>1388352

Упс, теперь и я не могу так просто постить этот текст: https://pastebin.com/J8ePkQCK

Подозреваю, это из-за слова на буквы "к", "о", "н", "ф".
Ответы: >>1389946
Аноним 2019/04/26 07:59:25  №1388990 172
>>1388192
Чтобы разобраться как это работает
Аноним 2019/04/26 08:00:59  №1388994 173
>>1388460А
Вынужден не согласится, пишу на нем около года, после того как понял логику разрабов, то все стало просто замечательно
someApprentice 2019/04/27 06:29:21  №1389598 174
Ответы: >>1393712 >>1394587
Аноним 2019/04/27 11:10:09  №1389781 175
Если планируете перекатываьтся за границу, то забейте на пхп. он мертв в развитых странах.
Говорю на своем опыте. я перекатился в израиль и тут нет вакансий. нода в 2 раза востребованей. самые топовые языки тут это с#, питон и джава
Ответы: >>1389802
Аноним 2019/04/27 11:29:56  №1389802 176
Аноны, какой редактор посоветуете?
Я пишу в VScode, но сейчас стал писать больше, и блядь VScode даже с плагинами не устраиваетили я его настроить не могу. Я хочу порядочные автодополнения, что бы редактор нормально искал методы используемого класса, что бы показывал нормально аргументы вызываемой функции.

>>1389781
У меня смутное ощущение что когда ты въедешь в саму сферу - выбор платформы это дело пятое. Какая разница на чем MVC реализовывать, если ты понимаешь как это делать. Не вижу особой разницы в этом случае между например пхп или питоном. Тем более пхп7 быстр. Думаю что он свои позиции отвоюет. JS до 2015 тоже был ссаниной, а сейчас развился и расхайпован что пиздец.
Если это не так - то уже разъясните иную точку зрения.

Ответы: >>1389813 >>1390167 >>1394587
Аноним 2019/04/27 11:40:32  №1389813 177
>>1389802
П.С.
Я к чему - я сам выбирал в какой бекенд вкатываться, выбирал между пхп и питономи нодой. Я на тот момент знал только синтаксис этих ЯП.
По итогу порешал рыночек, и количество информации. На пхп проще заработать на первый доширак, если суетитьсяособенно удобно если у тебя уже есть работа и ты вкатываешься по вечерам. Сейчас пришел к выводу что понимание предметной области значит больше чем конретный ЯП.
Может я нуб, но я реально не понимаю какая разница между пхп и питоном в типовых задачах.

С нодой отдельная песня. У нее своя ниша, а за ее рамками не понятно зачем она нужна. Хотя и на ней можно магазины ебашить, ток нахуя.
Ответы: >>1389824
Аноним 2019/04/27 11:46:33  №1389824 178
>>1389813
П.П.С
Вот что мне реально не нравится в пхп - то что он не создает процесса. Рожден что бы умереть короче. Ну и конфигурационные файлы сервера - то еще говно.
Но опять же, наверное пхп можно запустить как постоянный процесс, но про это я ничего не знаю пока что.

В ноде создал объект сервера http, поставил событие listening - это как то солиднее на мой взгляд.
Ответы: >>1394587
someApprentice 2019/04/27 14:32:23  №1389946 179
Ответы: >>1394587
Аноним 2019/04/27 18:03:45  №1390167 180
Аноним 2019/04/27 19:22:18  №1390215 181
image.png (18, 265x559)
559x265
image.png (9, 1626x41)
41x1626
На собеседовании не сделал одно задание, подобное которому когда-то пытался сделать, но были проблемы.
Есть многомерный массив папок и файлов, вложенных в папки, пустые папки, либо просто файлы в корне.
$folders=array("Папка А"=>array("Папка B"=>array(), "Папка C"=>array("Файл 1", "Файл 2", "Файл 3"), "Файл 10", "Файл 11", "Файл 12"), "Файл 20", "Файл 21", "Файл 22", "Папка G"=>array());

Нужно вывести деревом как на пикрилейтед 1 с помощью функции рекурсии.

Проблемы возникают в том, что массив "Папка A" считается как ассоциативный и не идёт ключём [0], к примеру, в итоге возникают сложности с форичем. Пикрил 2.

Для начала пытался без рекурсии вывести. Более менее работает такой код, но по-ебаному совсем.

foreach ($folders as $key=>$value){
echo "$key - $value<br>";
if(is_array($value)&&count($value)>0) {
foreach ($value as $tmp=>$key2){
echo "$tmp - $key2<br>";
if(is_array($key2)&&count($key2)>0){
foreach ($key2 as $tmp2=>$key3){
echo "$tmp2 - $key3 <br>";
}
}
}
}
}
Ответы: >>1390217 >>1390238 >>1390358
Аноним 2019/04/27 19:24:42  №1390217 182
Аноним 2019/04/27 20:03:33  №1390238 183
>>1390215

Это решается элементарно. Обходим массив, если значение элемента это строка, то перед нами файл. Если значение - это массив - то перед нами папка, вызываем себя рекурсивно для вывода содержимого папки с отступом.

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

Твой код никуда не годится, так как в нем заложена фиксированная глубина вложенности.
Ответы: >>1390365
Аноним 2019/04/27 22:23:07  №1390358 184
>>1390215
https://ideone.com/xFFy4I
А ты не рано по вакансиям ходить начал?
Рекурсия это штука из основ проганья.
Ответы: >>1390365
Аноним 2019/04/27 22:39:20  №1390365 185
>>1390238
Спасибо.
>>1390358
Да я уже успел поработать немного. Рекурсию я знаю, проблема была с деревом этим.
Что у тебя в $de должно идти в функцию?
Ответы: >>1390366
Аноним 2019/04/27 22:45:48  №1390366 186
>>1390365
>Что у тебя в $de должно идти в функцию?
Глубина рекурсии.
Аноним 2019/04/29 13:04:33  №1391581 187
Почему так много хейта в стороны пхп?
Ответы: >>1391583 >>1391618 >>1394579
Аноним 2019/04/29 13:08:06  №1391583 188
>>1391581
>эти дебилы ITT
Сам-то как думаешь?
Ответы: >>1391585
Аноним 2019/04/29 13:10:31  №1391585 189
>>1391583
Не знаю.
Начал учить жс, пхп, так везде натыкаюсь на хейт этого всего.
Какой-то абсурд.
Ответы: >>1391588
Аноним 2019/04/29 13:14:13  №1391588 190
>>1391585
>Начал учить жс, пхп
Дебильными вопросами на мейлопараше срешь?
Олигофреном себя показываешь?
Ответы: >>1391591
Аноним 2019/04/29 13:17:37  №1391591 191
>>1391588
Нет. Я вообще редко тут пишу что-то. В основном за ссылками из шапки захожу.
Почему ты такой агрессивный?
Ответы: >>1391592
Аноним 2019/04/29 13:20:38  №1391592 192
>>1391591
>Нет.
Малаца, значит.
А вот большинство ИТТ (и, хаха, "комьюнити" говнопыхыпы) и срет и показывает - дебилы же.
Потому что подобное к подобному, уже который год.
Ответы: >>1391912
Аноним 2019/04/29 14:07:34  №1391618 193
>>1391581
По наблюдениям могу сказать, что хейтят в основном посторонние диваны, которые услышали что-то такое от других диванов на заре своей голожопой юности. Так и продолжают крякать одно и то же чётко показывая свой уровень перед теми, кто в курсе дел.
Любому более-менее изучавшему ПХП обычно очевидно, что это вполне нормальный язык для веб-разработки со всеми современными фичами. Которой к тому же ещё и активно развивается.
Ответы: >>1391659
Аноним 2019/04/29 15:07:44  №1391659 194
>>1391618
>нормальный язык
Что характерно, по поводу местного сборища имбецилов возражений нет.
Ответы: >>1391911 >>1391912
Аноним 2019/04/30 05:25:35  №1391911 195
Аноним 2019/04/30 05:26:04  №1391912 196
>>1391592
>>1391659
Перед вами пример типичной токсичной мрази, а по совместительству хейтера PHP.
Аноним 2019/04/30 06:00:28  №1391936 197
Ого! АзиаткаПХП-кун всё ещё на дваче! Вот это поворот. Я думал ты уже - всё.

Алсо, собираюсь использовать пхп для системного скриптинга. Почему? Потому что я могу. По кр. мере пока мне так кажется. Сокеты есть. Птредс есть. Всякие fork есть. Что ещё нужно? Да вроде всё.

Какие подводные?
Ответы: >>1392059 >>1394579
Аноним 2019/04/30 10:02:33  №1392059 198
15463027517740.jpg (25, 338x486)
486x338
>>1391936
>пхп для системного скриптинга
С веб-мордой? Обязательно надо с веб мордой.
Ответы: >>1392438
Аноним 2019/05/01 04:30:20  №1392401 199
Имеет смысл делать свой mvc или использовать фреймворки?
Ответы: >>1392404 >>1392451 >>1394579
Аноним 2019/05/01 04:39:27  №1392404 200
>>1392401
Шел 2020 год. MVC все еще воспринимался пыхарями как килерфича.
У нас в Китае казнят за изобретение нового иероглифа, если ты не обяснишь зачем он нужен.
Ответы: >>1394579
Аноним 2019/05/01 07:15:53  №1392437 201
есть хороший курс по ларе для новичка?
Ответы: >>1392608
Аноним 2019/05/01 07:17:19  №1392438 202
>>1392059

Да, и что ты мне сделаешь? Это всё будет работать на локалхосте.

Хочу запилить сетевой демон, который будет выполнять как одноразовые, так и бесконечно выполняемые команды в виде дочерних процессов и осуществлять менеджмент этих процессов. Чтобы не заходить по ssh и не пердолиться в консоли и тмуксы, а хуяк и запустил всё одной кнопкой и сидишь, откинувшись на спинку кресла, и смотришь как всё работает.

Как тебе такое?
Ответы: >>1394579
Аноним 2019/05/01 08:17:38  №1392451 203
>>1392401
Разобраться в любом случае придётся - все ходовые фреймворки работают по этому принципу. А лучший способ это сделать - собрать свой велосипед. Да и у ОПа есть по этой теме кое-что.
Ответы: >>1392460
Аноним 2019/05/01 08:43:23  №1392460 204
>>1392451

Тут тебя ждет разочарование, потому что способов релизации MVC фреймворка столько, сколько понимания, что значит M, что V, а что C и что с чем "рационально" объединить и на сколько объединить.

Там болото, анон. Не лезь. Возьми какой-то один популярный фреймворк и тщательно разберись.
Ответы: >>1392626
Аноним 2019/05/01 13:15:55  №1392608 205
Ответы: >>1392664
Аноним 2019/05/01 13:46:13  №1392626 206
>>1392460
>потому что способов релизации MVC фреймворка столько
Выбирай любой. Или три.

>Там болото, анон. Не лезь.
Да и вообще нахуй это надо. Сразу на завод - говно месить лопатой. Там разбираться не приходится.

А ещё руками иногда нагляднее получается попробовать.
Ответы: >>1392679
Аноним 2019/05/01 14:44:58  №1392664 207
>>1392608
на слух английский не понимаю,че нибудь письменное есть?
Ответы: >>1392823
Аноним 2019/05/01 15:16:49  №1392679 208
>>1392626
>Да и вообще нахуй это надо. Сразу на завод - говно месить лопатой. Там разбираться не приходится.
Самый годный совет
Аноним 2019/05/01 19:42:54  №1392823 209
>>1392664
Можешь их на ютубе смотреть с субтитрами
Аноним 2019/05/02 03:39:14  №1392888 210
Аноны, я выучил PHP со всеми этими ООП и теперь могу писать свои велосипедные сайты.

Скажите, изучать Laravel сложнее, чем всё то, что я уже изучил? Или будет проще?
Ответы: >>1392905 >>1393253 >>1394576
Аноним 2019/05/02 06:21:20  №1392905 211
>>1392888
>Скажите, изучать чем всё то, что я уже изучил?
Откуда мы знаем что тебе будет проще? Это же всё индивидуально.

Берешь изучаешь. Если что-то не понятно сюда задаешь вопрос по языку, а не психологии.

>Или будет проще?
Будет проще, если начнешь изучать.

Вообще, вот тебе совет... (В информатике) первым шагом перед решением задачи, это сбор информации и оценка сил и времени на это задачу.

Поищи примеры/посмотри на ютюбе... Научись самостоятельно добывать информацию.
Аноним 2019/05/02 13:52:08  №1393036 212
Аноны, есть вопрос. Допустим, я хочу агрегатор сделать. С самим сайтом понятно все - просто выдаёт все из базы. А как в общих чертах правильно делать часть, которая все тащить будет в базу с других ресурсов? Может за папкой проекта на сервере будет ещё одна со скриптами, которые cron будет запускать, например, каждые 5 минут. Они будут каждые 5 минут сгребать все базу?
Ответы: >>1393393 >>1394575
Аноним 2019/05/02 22:16:23  №1393246 213
Ответы: >>1394576
Аноним 2019/05/02 23:17:08  №1393253 214
>>1392888
>Аноны, я выучил PHP со всеми этими ООП
Это примерно несколько сотен строк достаточно примитивного кода в процедурном стиле из разряда сел и написал в один файл скрипт.

>Скажите, изучать Laravel сложнее, чем всё то, что я уже изучил? Или будет проще?
Это несколько тысяч строк достаточно нетривиального кода, размещенного в сотне взаимосвязанных файлов, архитектура mvc и паттерны проектирования.

Ответы: >>1393254
Аноним 2019/05/02 23:26:13  №1393254 215
>>1393253
Благодарю за понятный мне ответ.
Аноним 2019/05/02 23:28:51  №1393255 216
>>1380485 (OP)
140к на руки с опытом 2,5 года в дс на пыхе - это успех?
Ответы: >>1393265
Аноним 2019/05/03 01:17:35  №1393265 217
>>1393255
Расскажи как устраивался на работу, какие вопросы были ? Что нужно знать/уметь делать чтоб устроиться ?
Ответы: >>1393335
Аноним 2019/05/03 08:23:54  №1393335 218
>>1393265
Учил пыху в этом самом треде (тут всё ещё тот же помогающий ОП? не верится, что столько времени прошло).

Без задней мысли после полугода аутирования в треде пошёл на собесы, спрашивали базовые вещи, про ООП, наследование, типы данных, sql.
На джуна ничего не надо УМЕТЬ, но надо знать, и главное, показаться ТОЛКОВЫМ.
всё изи:
1) принципы ооп
2) solid
3) паттерны GoF
4) кто-нибудь спросит про сортировки, но хз, надо ли тебе в такую контору (мейлсру и прочие спросят 100%, рога и копыта нет)
5) новые фичи php7+
6) базовый sql, простые запросы и джоины, про индексы могут спросить
Аноним 2019/05/03 08:28:30  №1393338 219
>>1393335
А по верстке и js спрашивают?
Ответы: >>1393348
Аноним 2019/05/03 08:54:46  №1393348 220
>>1393338
ну... если ты на бекендера идёшь, то нет. Если на фуллстек (не иди туда), то могут, а могут и не спросить.
Когда на первую устраивался, то js даже в глаза не видел. Взяли и в итоге ковырял всё, даже css, попутно научившись. Но это дно-места. В нормальных конторах такие вещи разделены между разными специалистами
Аноним 2019/05/03 09:04:55  №1393353 221
>>1393335
>2) solid
>3) паттерны GoF
Ебать, в первый раз такое слышу.
Ответы: >>1393374
Аноним 2019/05/03 09:12:43  №1393358 222
>>1393335
А надо свои проекты показывать ?
Ответы: >>1393360 >>1393362
Аноним 2019/05/03 09:15:35  №1393360 223
>>1393358
При всех или наедине с эйчаркой?
Аноним 2019/05/03 09:21:28  №1393362 224
>>1393358
меня не просили. Но в резюме прикреплял ссылку на гитхаб с выполненным заданием "кошки-мышки" (не знаю, есть ли оно ещё в шапке), лол. На одном собесе попросили про него рассказать даже.

Сейчас скажу, что большинство не смотрит гитхабы, но, если посмотрят, то это плюс и тебе, и конторе (тк адекваты).
Аноним 2019/05/03 09:52:36  №1393374 225
>>1393353
>solid
Без этого твой код никому не нужен так как будет нечитаемой лапшой.
>паттерны GoF
Как-то сомнительно, что такое у джуна спрашивают. Нелогично это получается - про наследование спросили и тут же про паттерны? Это немного разные уровни ООП.
Ответы: >>1393376
Аноним 2019/05/03 09:54:09  №1393376 226
>>1393374
>>solid
>Без этого твой код никому не нужен так как будет нечитаемой лапшой.
В смысле без полного набора: solid, kiss, dry
Ответы: >>1393384
Аноним 2019/05/03 10:11:12  №1393384 227
Ответы: >>1393428
Аноним 2019/05/03 10:11:50  №1393386 228
Объясните пожалуйста.
1) Как реализовать конструктор в классе, который реализует паттерн TableDataGateway? В примере ОП использует PDO и конструктор выглядит так:
public function __construct(PDO $pdo) { ... }
а я использую mysqli могу ли я написать
public function __construct($conn) { ... }?
Так же не понятно, что мне писать в самом конструкторе? Подключение к базе данных или что?
2)С исключениями я тоже не понял. Могу ли я их не использовать, а писать просто
$conn = new mysqli ($hn, $un, $pw, $db);
if($conn->connect_error) die($conn->connect_error);
?
Аноним 2019/05/03 10:16:54  №1393389 229
>>1393386
Насчет первого вопроса я просто не понял зачем оп написал PDO в функции, что это за уточнение?
Ответы: >>1393398 >>1394575
Аноним 2019/05/03 10:21:52  №1393392 230
>>1393335
Какие вообще шаблоны проектирования ты использовал за это время в работе реальной?
Ответы: >>1393394
Аноним 2019/05/03 10:22:24  №1393393 231
Аноним 2019/05/03 10:23:24  №1393394 232
>>1393392
команда, фабричный метод, абстрактная фабрика, декоратор, фасад. Дохуя на самом деле, если ты не битриксовая шлюха, то без них никуда.
Аноним 2019/05/03 10:26:27  №1393396 233
>>1393386
>а я использую mysqli
зачем? Юзай pdo
>Подключение к базе данных или что?
не смотрел пример ОПа, но в классе PDO коннекшн уже же будет установлен?
>С исключениями я тоже не понял. Могу ли я их не использовать, а писать просто
можешь. Зачем тебе только это? Твой die() выйдет из программы и всё, а исключение можно обработать и продолжать работать дальше.

Привыкай к ним, die и exit в реальном коде не встретишь
Ответы: >>1393514 >>1393514
Аноним 2019/05/03 10:34:25  №1393398 234
>>1393389
>PDO в функции, что это за уточнение
гугли type hinting и вообще научись гуглить простые места, ебать, тебе весь php.net пересказывать?
Аноним 2019/05/03 10:40:30  №1393400 235
>>1393335
А на 140 к какие вопросы на собесе были? Что по английскому у тебя?
Ответы: >>1393617
Аноним 2019/05/03 10:51:53  №1393402 236
>>1393335
Как вообще рынок пыхи оцениваешь, свалить в другой стек не думал? Не надоело?
Ответы: >>1393617
Аноним 2019/05/03 11:44:40  №1393428 237
Аноним 2019/05/03 11:49:12  №1393429 238
>>1393386
>а я использую mysqli могу ли я написать
>public function __construct($conn) { ... }?
Да просто оберни mysqli в класс и всё.
Я бы тогда ещё и интерфейс сделал, чтобы можно было как через ПДО ходить, так и через твою обёртку.
Ответы: >>1393514 >>1394575
Аноним 2019/05/03 13:01:28  №1393456 239
>>1393335
160к за год (точнее 11 месяцев)
Ответы: >>1393617
Аноним 2019/05/03 13:50:01  №1393471 240
Насколько плохо делать проверку на instanceof внутри класса-родителя? Типа

[CODE]class A {

function test() { if ($this instanceof B) doSomething(); }

}

class B extends A {}[/CODE]

Просто пришел к тому, что в функции test() класса А надо реализовать функционал, специфичный для класса B, при сохранении всего существующего функционала. Причем эта проверка будет запрятана на глубине одного цикла и try-catch, то есть нельзя выйти из ситуации кодом типа [CODE]class B extends A { function test() { parent::test(); doSomething(); } }.[/CODE]

Как выйти из ситуации, или такое норм?
Ответы: >>1394054 >>1394571
Аноним 2019/05/03 16:24:09  №1393514 241
>>1393396
>>1393396
>Юзай pdo
В книге, которую я читаю, используют mysqli. Мне его использовать удобней.
>PDO коннекшн уже же будет установлен?
Не понял
>Зачем тебе только это?
Да вот собственно вопрос. Оп пишет что исключение сокращает код, только у меня чет наоборот. Ну и нигде нормального объяснения про исключения не могу найти.
Так же видел, что нельзя использовать класс Exception. С классом Exception вопросы. Мне нужно создать свой класс, который унаследует Exception? А что в нем писать?
Ну и не понятно зачем отлавливать ошибку если можно вместо die
отправить HTML страницу с ошибкой. Но в задании этого нет, так что делать я этого не буду.

>>1393429
Во во, тоже вопрос. ОП вроде тоже писал про обертку mysqli или не он. Что это значит? Зачем нужно? Как реализовать я даже не спрашиваю. И что так mysqli не любят?
Аноним 2019/05/03 16:31:06  №1393518 242
14846769968690.png (45, 532x495)
495x532
привет,я снова вернулся в это тред,спустя стольких месяцев,чтобы вы порадовались
пхп гавно
Аноним 2019/05/03 17:21:33  №1393541 243
>>1393514
>про обертку mysqli
>Что это значит?
То и значит - оберни в класс функционал mysqli, который тебе нужен.
>Зачем нужно?
Банально удобнее работать с такими вещами через объекты.
Ну и по ТЗ нужен ООП.
>Как реализовать я даже не спрашиваю
Объяснять дольше чем класс писать. С этой хренью любой ждун за 10 минут справится. Гугл подоёбывай по этой теме.
Аноним 2019/05/03 18:05:46  №1393551 244
15531688312970.png (1239, 1268x1446)
1446x1268
Привет ребята, первый раз в треде. Что учить чтоб вкатиться в пхп?
На данный момент что я сделал:
-Самостоятельно написал на паттернах и ООП примитивную цмс.
-Калькулятор на джаваскрипте
-Лэндинги на ларавел
-Немного опыта коммерческого на вордпрессе когда-то был.
Одно собеседование провалил, спрашивали по бутстрапу и фронту, хотя шёл на ларавел-позицию.
Тестовое задание провалил на другую вакансию, реализация мини-гугла с 100.000 строками в БД, на jquery и пхп(завалил фронт)


В общем наверное буду дальше дрочить ларавел и попробую начать вью, если спрашивают и фронт, я правильно делаю? Не нужно идти в битриксы и подобное? Там вообще с улицы берут, а на иностранные фреймворки порог какой-то довольно высокий.
Ответы: >>1393553 >>1393560 >>1394575
Аноним 2019/05/03 18:11:31  №1393553 245
>>1393551
>-Лэндинги на ларавел
Как ты их писал, если во фронт не можешь, а он там главное?
Ответы: >>1393556
Аноним 2019/05/03 18:21:00  №1393556 246
>>1393553
Ну это просто примитив на ларке, шаблон скачал на хтмл, распилил блэйдом, красивых джквери-модулей прикрутил. Данные все через БД просто в учебных целях.
Аноним 2019/05/03 18:28:09  №1393560 247
>>1393551
>На данный момент что я сделал:
И сколько времени ушло на поднятия скилла до уровня "я слелал" ?
Ответы: >>1393561
Аноним 2019/05/03 18:32:52  №1393561 248
Ответы: >>1393563
Аноним 2019/05/03 18:35:51  №1393563 249
>>1393561
А такой результат за 8 мес это ок ли не ок ?
Ответы: >>1393564
Аноним 2019/05/03 18:41:35  №1393564 250
>>1393563
А хрен его знает. С одной стороны я фундаментально готовился, с другой стороны я только окунулся в фреймворки, ведь никому чистый пхп не нужен.
Может и ок, учитывая что я сам без курсов и сам программу делал себе. Думаю на курсах это гораздо быстрее дело шло.
Ответы: >>1393566
Аноним 2019/05/03 18:46:09  №1393566 251
>>1393564
Я в этом не шарю, просто смотрел зп джунов в ДС, и решил зебажать сюда.
ИМХО чет вам на джуне мало платят, Да, конечно, джун только начало и перспективы на 300к/сек, но в начале мало.
Ответы: >>1393568
Аноним 2019/05/03 18:47:02  №1393567 252
index.jpeg (7, 225x225)
225x225
Есть тут вообще кто ларавел тоже изучает?
Ответы: >>1393569 >>1393583
Аноним 2019/05/03 18:51:32  №1393568 253
>>1393566
Да и не на джуне тоже не много. Зарплаты из вакансий на собесах косят. Так что беги от сюда зайчик забегайчик.
Аноним 2019/05/03 18:53:56  №1393569 254
>>1393567
как ты можешь изучать эту мерзость?
Ответы: >>1393570
Аноним 2019/05/03 18:56:21  №1393570 255
Ответы: >>1393571
Аноним 2019/05/03 18:57:17  №1393571 256
>>1393570
тормознутый и на пхп
Ответы: >>1393572
Аноним 2019/05/03 18:58:23  №1393572 257
>>1393571
И что ты на нём разрабатывал? Покажи.
Ответы: >>1393575
Аноним 2019/05/03 18:59:53  №1393575 258
Аноним 2019/05/03 19:16:31  №1393583 259
Аноним 2019/05/03 20:41:28  №1393617 260
>>1393400
>Что по английскому у тебя
с англ ок, на русском тех литру не читаю в принципе
>А на 140 к какие вопросы на собесе были
очень много вопросов по sql и по безумным джоинам. В остальном вопросы разные, от логических задачек в яндексе (не взяли) до вопросов про то, как реализован массив в ядре пхп
>>1393402
>Как вообще рынок пыхи оцениваешь
в рашке большой, но разный, серьёзное погромирование только на симфони и немножко лара, его мало, в остальном пхп рынок это дно уровня вордпресса и битрикса, это путь в никуда и дерьмо полное, не тратьте время. В европе он побольше, но всё равно так себе, слишком дурная слава у пыхи. Хотя язык хороший
>>1393456
не понял

>>1393514
>которую я читаю, используют mysqli
и что блядь, я говорю тебе, это дерьмо в приличном обществе даже не упоминают, а ты
>Мне его использовать удобней.
Просто погугли mysqli vs pdo php и почитай тонны текста.
>Оп пишет что исключение сокращает код
оп всё правильно пишет, любой новичок поначалу не понимает, зачем нужны исключения. Я тебе дал пищу для размышлений по поводу того, что die безусловно заканчивает работу программы.
>Ну и нигде нормального объяснения про исключения не могу найти.
exception почти в неизменном виде есть в Java/Php/C++/C#/js, написаны килотонны паст и разбито много копий, а ты не можешь найти объяснения. Главное качество погромиста - умение гуглить, запомни.
>зачем отлавливать ошибку если можно вместо die
вот прям так и загугли. Только не на русском, конечно

Аноним 2019/05/03 20:55:28  №1393623 261
>>1393617
на чём пишешь? Перспективно учить ларавел сейчас для пыхи?
Ответы: >>1393628
Аноним 2019/05/03 21:06:55  №1393628 262
>>1393623
пишу на симфони.
>Перспективно
да. Спрос есть и разработка на ларе зачастую попадает под категорию "серьёзное программирование". Но если есть выбор, делай в сторону симфони.
Ответы: >>1393714 >>1393724
Аноним 2019/05/03 21:19:15  №1393636 263
Как выполняется код в пыхе при одновременном запросе? Представим ситуацию, что два пользователя(или больше) нажали одновременно одну кнопку, которая общается с базой данных. В этом запросе берётся ид последней записи(count всех записей), создаётся новая запись и берётся её ид. Возможно ли, что возьмётся ид второй созданной записи(тип сначала от первого юзера, потом от второго)? Или лучше самостоятельно присвоить ид +1 от последнего?
Ответы: >>1393656 >>1394575
Аноним 2019/05/03 22:07:10  №1393656 264
>>1393636
Пых сам не обрабатывет http запросы. Запросы обрабатываются сервером (apache, nginx) затем на каждый запрос создается (гурбо говоря) отдельный процесс php, которому через стандартный ввод stdin и переменные окружения передаются параметры запроса. Данные попадают в массив $GLOBALS. Все запросы обрабатываются независимо.

Пых сам не обрабатывет SQL запросы. Он соеденяется с СУБД и передает через сокет запрос. СУБД выполняет запрос независимо от процесса PHP

id записи в базе данных обычно автоматически инкрементируется при создании новой записи. На момент выполнения запроса к СУБД таблица блокируется на запись для других запросов (грубо говоря). Все изменения с таблицей будут последовательны.
Ответы: >>1394166 >>1394573
someApprentice 2019/05/04 06:49:49  №1393712 265
>>1389598 -> >>1388926


>>1388926
>> // нужно проверить что это делает именно сервер
>> // для этого я решил создать jwt со свойством isServer: true
>
>Можно так, да. Хотя выглядит как усложение, конечно.
Мне хочется сделать проверку на сервер как проверку на обычного пользователя. То есть, при установки приложения сделать в БД первого пользователя с именем root, и дальше делать все проверки от него.

Это очень удобно:

def authenticate(token):
... return user

# if user.name == 'root':
if user.email == 'root@crypter.com' #понадёжней т.к. уникальный идентификатор
...

Следует сделать скрипт, который будет принимать все credentials, выполнять всю установку, а на выход выдавать все хэши и токены. Возможно генерировать сразу .env файл.

Как обычно делаются такие файлы? Через Докер (не разу с ним не знакомился)? Приложение становится всё больше мултиязычным и делать этот скрипт на каком-то из языков не логично. Лучше сделать это на системном языке и чтобы он был кроссплатформенный. Можете что-нибудь посоветовать пожалуйста?


Вопрос по синтаксису или скорее архитектуре Питона:

Я создавал модели в соответствии с задуманной схемы БД и из-за наследования в ней, мне пришлось делать наследования и в моделях - такое поддерживается и "приветствуется" в выбранной мной ORM.

Чтобы описать проблему, следует сперва показать код https://repl.it/repls/PoliteHappyScales

Как можно заметить, при инициализации приложения возникает ошибка в text_message.py. Поискав в интернете, я выяснил что это проблема называется cyclic dependency inheritance.

Чтобы решить её, я вынес все наследования в отдельный модуль: https://repl.it/repls/PowderblueInsidiousCubase

Я правильно поступил?
Ответы: >>1394573
Аноним 2019/05/04 06:59:58  №1393714 266
>>1393628
Сколько часов в неделю уходит на работу + обучение не считая обедов и прочего отдыха?
Ответы: >>1393737
Аноним 2019/05/04 07:32:59  №1393724 267
15531687310600.png (157, 680x753)
753x680
>>1393628
А какой фронт? Это нормально когда я пришёл на джуна по ларке, а меня спрашивают кроме ларки ещё по реакт/вью и бутстрап? Что бы ты посоветовал, углубляться в бэк или распыляться на фронт, чтобы найти работу?
Ответы: >>1393737
Аноним 2019/05/04 07:46:43  №1393729 268
>>1393617
>от логических задачек в яндексе
Что за задачи хоть были? Такие которые не решаются обычными смертными без анало-математического мышления или все таки к ним можно было подготовиться?
Че вообще думаешь? Это же получается ты не попадешь на верхушку ITяндекса ЛОЛ, как переживешь?
Ответы: >>1393737 >>1394571
Аноним 2019/05/04 08:08:44  №1393737 269
>>1393714
если интересный проект на работе, то работаю все рабочее время (7 часов примерно), а дома отдыхаю. Если проект так себе, то половину времени на работе прокрастинирую. Дома сейчас мини проект на расте пишу ради фана + один пупен-сорс на пыхе. Пару часов вечером, иногда 0.

>>1393724
>Это нормально
in the grand scheme of things это хуёво, тк нормально, когда есть деление: бекендеры, фронты (у нас есть алсо отдельные верстальщики, то есть фронты только js пилят). Я, например, вообще не разбираюсь в современном js и не особо хочу разбираться. И не страдаю.

Но очень часто (вот прям очень) конторы берут себе фуллстеков, и на дуде игрецов и жнецов и швецов (экономят). Ясное дело, что один человек не может (ну просто не хватит сил у него и нервов) разбираться хорошо и в беке, и в бд, и в продвинутом современном js. Так что экономия выходит боком.
Сам начинал в подобном месте. Начинать там нормально, но как решишься работу менять, уже ищи внимательнее. И всегда на собесах прямо спрашивай, не придётся ли ковырять фронт.

>Что бы ты посоветовал
только углубляться. Хороший фронт/бек всем нужен. Фуллстек - ни рыба ни мясо, нужен только рогам и копытам для экономии.

>>1393729
логические, не относящиеся к матеше. Чисто как из мы-вам-перезвоним-тредов про лампочки и переворачивания монеток.
>как переживешь?
ну сейчас не попал, но тоже оч хорошее место нашёл. Через год примерно снова буду искать и опять в яндех попробую, хули нет. Подготовлюсь получше, всё в наших руках
Ответы: >>1393751
Аноним 2019/05/04 09:04:32  №1393751 270
Ответы: >>1393756
Аноним 2019/05/04 09:19:00  №1393756 271
Аноним 2019/05/04 18:12:51  №1394054 272
Аноним 2019/05/04 20:02:30  №1394148 273
image.png (14, 149x572)
572x149
Антошки, памагите. Есть два массива, оба ассоциативные. Смысл таков, что значения первого и ключи второго идентичны. Как скрестить таким образом, чтобы получился массив с ключами первого и значениями второго массива? Разумеется все лишние варианты просто игнорить за ненадобностью.
Ответы: >>1394160 >>1394185 >>1394571
Аноним 2019/05/04 20:12:33  №1394160 274
>>1394148
Тебе функций для работы с массивами что ли мало?
Ответы: >>1394162
Аноним 2019/05/04 20:13:21  №1394162 275
>>1394160
Их дохуя и нет ни одной нужной. По крайней мере единственная, что по описанию подходит - требует равное количество элементов в обоих массивах.
Ответы: >>1394174 >>1394200
Аноним 2019/05/04 20:15:55  №1394166 276
>>1393656
>Пых сам не обрабатывет http запросы. Запросы обрабатываются сервером (apache, nginx) затем на каждый запрос создается (гурбо говоря) отдельный процесс php, которому через стандартный ввод stdin и переменные окружения передаются параметры запроса.
Ваш пых совсем не умеет в демонизацию и асинхронность?
Ответы: >>1394178 >>1394181 >>1394569
Аноним 2019/05/04 20:23:01  №1394174 277
>>1394162
Тогда ручками делай.
Ответы: >>1394179
Аноним 2019/05/04 20:25:23  №1394178 278
Аноним 2019/05/04 20:25:54  №1394179 279
>>1394174
Ну, у меня только такой вариант в голову пришёл "Ну раз нет функции, которая могёт это ебануть сама. То юзать внутренний указатель массива и прогонять через цикл, брать значение элемента из первого массива и на его место подставлять значение элемента второго массива, после отправляя указатель на следующий элемент". Насколько это тупо?
Аноним 2019/05/04 20:26:20  №1394181 280
>>1394166
Он же интерпретируемый.
Ответы: >>1394184
Аноним 2019/05/04 20:27:48  №1394184 281
Аноним 2019/05/04 20:27:58  №1394185 282
>>1394148
Вырезать значения из второго, создать третий массив и записать туда ключи первого, значения второго.
Ответы: >>1394197 >>1394218
Аноним 2019/05/04 20:33:21  №1394197 283
>>1394185
А выборку нужных как делать? Мне же не рандомные нужны, а вполне конкретные. Значения первого = ключи второго. У меня в этом проблема, как эту выборку сделать, дабы ебануть третий массив.
Ответы: >>1394198 >>1394208
Аноним 2019/05/04 20:33:47  №1394198 284
>>1394197
Значения перовго = ключи второго, значения которых и нужны.
Аноним 2019/05/04 20:33:54  №1394200 285
>>1394162
Жопой прочитал документацию, ищи еще.
Даю подсказку: решение в одну строку, используется две функции, обе array_*. И ты близок к истине: твой вопрос задан верно, что есть 50% успеха — одна из функций именно скрещивает массивы.
Ответы: >>1394202 >>1394240
Аноним 2019/05/04 20:35:16  №1394202 286
>>1394200
Удвою.
Я как минимум 3 способа увидел.
Аноним 2019/05/04 20:42:45  №1394208 287
>>1394197
> Как скрестить таким образом, чтобы получился массив с ключами первого и значениями второго массива?
>Значения первого = ключи второго.
Ты сам определиться не можешь что тебе нужно? Научись для начала задачу описывать чётко.
Ответы: >>1394214
Аноним 2019/05/04 20:45:02  №1394214 288
>>1394208
Второй для описания принципа скрещивания. То есть в первом массиве значение идентично нужному ключу второго массива, значение которого мне и требуется для получения массива аля:
ключ первого массива => значение второго массива.
Ответы: >>1394226
Аноним 2019/05/04 20:49:29  №1394218 289
>>1394185
Ты специально так коряво написал?
Аноним 2019/05/04 20:55:28  №1394226 290
>>1394214
То есть тебе нужны элементы второго массива с ключами 1,9, 17, 25, 33, 41, 49, а условие какие ключи задаётся первым массивом?
Ответы: >>1394227
Аноним 2019/05/04 20:56:59  №1394227 291
Аноним 2019/05/04 20:58:27  №1394228 292
>>1380485 (OP)
Читая коменты повышаю самооценку.
Ответы: >>1394233 >>1394569
Аноним 2019/05/04 21:03:17  №1394233 293
>>1394228
Она у тебя настолько низкая, что ты на нубасах её повышаешь? Хуёво быть тобой.
Аноним 2019/05/04 21:13:11  №1394240 294
>>1394200
Даже не приблизился. Что функции хоть делают? Мне даже приблизительно трудно представить как это действие на две части делить.
Ответы: >>1394245 >>1394248 >>1394261
Аноним 2019/05/04 21:17:08  №1394245 295
>>1394240
Думаю, что надо взять значения одного массива и ключи другого, потом сделать схождение.
Ответы: >>1394247
Аноним 2019/05/04 21:17:57  №1394247 296
>>1394245
Что такое схождение? Я заебался гуглить термины в этой документации. Нигде нет описания, что это такое. Только задачи мол сделай схождение.
Ответы: >>1394258 >>1394571
Аноним 2019/05/04 21:18:01  №1394248 297
>>1394240
Можно ещё тупо фильтрануть.
Можно форичем сделать.

Кто больше?
Аноним 2019/05/04 21:26:25  №1394258 298
>>1394247
А что у тебя там требовало одинаковых по длине массивов? Можно ведь и нулями недостающее заполнить. Хотя это не лучшее решение.

Какое раздолье бля.
Аноним 2019/05/04 21:28:20  №1394261 299
>>1394240
Одна меняет местами ключи и значения, другая ищет пересечения ключей в двух массивах.
Ответы: >>1394267 >>1394269 >>1394283
Аноним 2019/05/04 21:34:22  №1394267 300
>>1394261
А, ну и затем у тебя есть два одинаковых по длине массива. Далее применяешь ту самую функцию, которую ты уже нашел.

Ты главное, помни, потом этот код читать тебе и другим. Пиши так, чтоб понятно было, в том числе тебе. Поэтому можешь и foreach забомбить.
Аноним 2019/05/04 21:35:37  №1394269 301
>>1394261
Ты лучше скажи, как удалить все значения массива после конкретного элемента? Ваще похуй, можно от ключей отказаться и перевести всё в обычный массив или ещё как. Главное оставить в массиве определённое количество значений, с первого и до определённого. Допустим, двадцатого.
Ответы: >>1394273 >>1394569
Аноним 2019/05/04 21:42:44  №1394273 302
>>1394269
В документации всё есть.
Аноним 2019/05/04 21:55:05  №1394283 303
>>1394261
Лол, получилось! Спасибо, антоша! Как тебя отблагодарить?
Ответы: >>1394286
Аноним 2019/05/04 21:58:24  №1394286 304
>>1394283
Ты молодец. Можешь выпить чаю за мое здоровье.
Ответы: >>1394287
Аноним 2019/05/04 21:59:33  №1394287 305
Аноним 2019/05/05 00:47:51  №1394323 306
На какой стул сесть? Linux или vagrant?
инфибо опенсервер
Ответы: >>1394377 >>1394386
Аноним 2019/05/05 07:50:29  №1394377 307
>>1394323
Конечно LAMP, убунту ставь и учись.
Аноним 2019/05/05 08:14:26  №1394386 308
image.png (52, 690x630)
630x690
image.png (105, 1193x693)
693x1193
>>1380485 (OP)
Помогите криворукому поставить тему на юйку (yii2)
делал по этому гайду https://medium.com/@jsnook_58598/how-to-use-a-bootstrap-4-theme-with-yii2-974a6dcca986
ошибка пик 1
бандл у меня пик 2
или отправьте читать тему в документации на которой я проебался
>>1394323
Да что удобнее то и ставь
вамп от лампа не прям чтоб особо отличается, по моему первому впечатлению по крайней мере
Ответы: >>1394569
Аноним 2019/05/05 11:12:49  №1394459 309
image.png (102, 1064x569)
569x1064
>>1393617
Не хотел засорять, но с исключениями остались вопросы
>и что блядь, я говорю тебе, это дерьмо в приличном обществе даже не упоминают, а ты
Ну так я это прочитал в бестселлере, который имеет 4 издание. Тебя в яндекс не взяли так что не знаю про какое общество ты говоришь. Но так как я не считаю яндекс каким то топовым местом и перейти на PDO мне не трудно

>оп всё правильно пишет, любой новичок поначалу не понимает, зачем нужны исключения.
Вот смотри как выглядит задача, которую я программирую(задача ОПа). Есть список студентов в БД. Мы должны к нему подключится. Если подключение не удалось я НИЧЕГО НЕ ДЕЛАЮ. Все, прога завершает свою работу. Естественно на боевом сервере нужно было бы вывести красивую ошибку, но сейчас не про это. Мой вопрос заключается вот в чем. Зачем использовать исключения, если:
1) Этот код занимает больше места чем тот вариант который я написал;
Сравни
try {
$dbh = new PDO('mysql:host=localhost;dbname=""', $user, $pass);
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}

и

$conn = new mysqli ($hn, $un, $pw, $db);
if($conn->connect_error) die($conn->connect_error);

Ну кстати первый вариант с pdo, а второй с mysqli. Я просто не знаю как можно сокращено написать с pdo. Где то их вооб
2) Так еще вместо die() если это нужно конечно можно было бы подключить файл с выводом той красочной страницы с ошибкой, мол НЕ УДАЛОСЬ ПОДКЛЮЧИТЬСЯ С БАЗОЙ ДАННЫХ, ПРИНОСИМ ИЗВИНЕНИЯ.

Короче, суть в этих словах: если не знаешь, как обрабатывать - не обрабатывай никак. РНР прекрасно справляется с базовой обработкой и сам.
Ловить исключение только ради того чтобы поймать - бессмысленно.
Поэтому лучше оставить всё как есть, а ловить исключение только тогда, когда точно знаешь, что хочешь сделать, поймав.


Я это все пишу не для того чтобы поспорить. Просто мне кажется так мы сокращаем строчки кода вроде бы без ущерба.
Ответы: >>1394511 >>1394569
Аноним 2019/05/05 11:14:05  №1394460 310
Анонасы, помогите советом нубу.

Как вообще в PHP отслеживать ошибки в коде?

У меня стоит nginx + php-fpm + mariadb.

При возникновении ошибки сервер выдают ошибку 500.

Сколько не гуглил, сколько не менял кофигурационный файлы - всё бестолку.

Что посоветуете?
Ответы: >>1394511
Аноним 2019/05/05 13:08:13  №1394511 311
>>1394460

Ошибки должны писаться в логи, если только ты их не отключил. Логи в линуксе находятся в /var/log, а также читаются утилитой journalctl. Изучи, как устроено логгирование.

>>1394459

Можно использовать mysqli, она тоже поддерживает исключения, только их надо включить. Без них тебе придется после каждой команды ставить if и проверять результат, что утомляет. Про исключения у меня есть урок, прочти, если еще не читал: https://github.com/codedokode/pasta/blob/master/php/exceptions.md и после этого можешь задавать уточняющие вопросы.

Но я должен предупредить, в некоторых книгах эту библиотеку используют только потому, что она похожа на более старую библиотеку mysql, и авторы, чтобы не переделывать код, написанный для mysql, просто добавили в функции букву i (mysql_query -> mysqli_query). Но зачастую код, писавшийся для mysql, некачественный, и лучше бы они его переписали с нуля. Да и mysqli имеет некоторые отличия и авторам книг лучше было бы код переделать с нуля, а не механически заменить названия функций (например, mysqli поддерживает плейсхолдеры, а mysql - нет. И авторам стоило бы перевести свой код на их использование, а не подставлять данные в запрос вручную, как это делалось в mysql).

То есть, полезно пролистать официальный мануал по mysqli, чтобы правильно ее использовать.

> Я это все пишу не для того чтобы поспорить. Просто мне кажется так мы сокращаем строчки кода вроде бы без ущерба.

Как раз хорошо, что ты задаешь вопросы. В программировании, как и в других инженерных науках, все решения принято обосновывать. Что касается сокращения кода - я тут его не вижу. Выбросить исключение - это одна строчка. Написать свой класс исключений - 3 строки (class X extends \Exception {}).

Если библиотека поддерживает выброс исключений (mysqli и PDO поддерживают), то их использование экономит строчки, так как тебе не надо руками писать if() после каждой функции работы с БД, которая может вернуть ошибку. Это упомянуто в моем уроке.
Аноним 2019/05/05 13:09:08  №1394513 312
>>1393386

> а я использую mysqli могу ли я написать
> public function __construct($conn) { ... }?

А ты читал урок про DI? Прочти, если не читал: https://github.com/codedokode/pasta/blob/master/arch/di.md А то я не вижу смысла пересказывать уже написанное там.

В ООП мы используем разделение ответственности, каждый класс отвечает за что-то свое. Соответственно, устанавливать соединение с БД - это не задача класса TableGateway, потому мы передаем ему уже готовое соединение в конструктор, примерно как ты написал, только стоит еще тайп-хинт добавить.

> С исключениями я тоже не понял. Могу ли я их не использовать, а писать просто
> $conn = new mysqli ($hn, $un, $pw, $db);
> if($conn->connect_error) die($conn->connect_error);

Прочти урок про исключения и там написано, чем это плохо. Ну как минимум у тебя проблема в том, что ты пользователю показываешь ошибку, которая ему нафиг не нужна, так как он не программист, при этом ты (разработчик) об этой ошибке не узнаешь, так как она не пишется в лог. Потому стоит почитать про существующие решения в моем уроке: https://github.com/codedokode/pasta/blob/master/php/exceptions.md

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

>>1393514

> Ну и не понятно зачем отлавливать ошибку

В случае выброса исключения тот, кто вызвал функцию, решает, что делать в случае исключения. В случае die() он решить ничего не может. Плюс, тут нарушается разделение ответственности. С какой стати класс для работы с БД может показывать HTML страницу? Ему никто этого не разрешал.

Если в программе есть разделение ответственности, то класс работы с БД лишь сообщает об ошибке, но не решает, как ее обрабатывать. Показ страницы ошибки - это не его зона ответственности. Ты пока воспринимаешь программу как одно целое и не разделяешь ее на слабосвязанные части.

>>1393617

В твоем посте избыток категоричности стоило бы заменить на изобильность пояснений.
Ответы: >>1394643
Аноним 2019/05/05 15:23:46  №1394567 313
Помогите долбоёбу.
Вроде как основы php начал понимать ООП вроде как тоже понял, но когда дошёл до паттерных, фреймворков стал тупить пиздец. Где лучше всего их изучать ? Прошу скинуть каких-нибудь годных уроков.
Ответы: >>1394637
Аноним 2019/05/05 15:26:47  №1394569 314
170-312

>>1394459

Твой код с try/catch написан неправильно. try/catch если и ставят, то только 1 раз, в самом начале программы, а не вокруг каждого вызова функции. Потому код там будет выглядеть так:

$dbh = new PDO('mysql:host=localhost;dbname=""', $user, $pass);

Что, очевидно, короче, чем если бы мы еще писали после него if с проверкой результата.

Глобальный обработчик исключений ставят либо с помощью set_exception_handler, либо с помощью try/catch в самом начале программы.

>>1394386

У тебя какая-то ошибка синтаксиса - какой-то лишний символ (например: неразрывный пробел), или какая-то слишком старая версия PHP, или какое-нибудь двоеточие вместо точки с запятой, или русская буква вместо латинской.

Попробуй этот файл вставить в ideone и проверить, будет такая же ошибка или же другая. Если такая же - то дело именно в символах.

>>1394269

array_slice. Не ленись, открой раздел про функции работы с массивами и прочитай список с краткими описаниями. Это все равно на собеседовании могут спросить.

Вот, читай список тут: https://www.php.net/manual/ru/ref.array.php

>>1394228

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

>>1394166

Для демонизации там есть php-fpm. Зачем нужна "асинхронность", если синхронный код писать проще и он понятнее, я не понял. Но если тебе хочется мучаться с промисами и евент-лупами, то ReactPHP к твоим услугам.

Синхронность это плюс: синхронный код проще. В отличие от языков вроде ноды, где код писать тяжело. То, что PHP умирает после каждого запроса, это плюс: у нас нет утечек памяти. В отличие от языков вроде ноды или руби, где (вроде бы) нет профайлеров памяти, по крайней мере бесплатных, и при утечке люди просто тупо прибивают приложение по крону, чтобы оно не отъедало всю память, так как не могут найти эту утечку.

Хотя есть ситуации, где нужен именно асинхронный код. Тут, конечно, все корявенько, но сама возможность есть.

И я не считаю, что нода это что-то плохое, но есть ситуации, где PHP просто удобнее использовать.

А еще, PHP хорошо оптимизирован, есть типизация и у нас готовят JIT.
Ответы: >>1394581 >>1394643
Аноним 2019/05/05 15:28:30  №1394571 315
>>1394247

Я тоже такой термин не слышал никогда.

>>1394148

Сделай foreach'ем либо через intersect_key.

>>1393471

Очень плохо. Идея ООП в том, что ты можешь в наследнике заменить или обернуть метод, а если тебе понадобился instanceof, то ты делаешь что-то неправильно. Плюс, предок не должен знать о своих наследниках. Как автор кода может знать, кто именно в будущем будет наследовать его класс, а? В ООП принцип открытости для расширения - любой может в будущем унаследовать твой класс и ты не знаешь даже, сколько у него будет наследников.

Ты в предке пишешь название класса-наследника. Это неправильно.

Тебе надо правильно проектировать классы, думать о том, какая у каждого зона ответственности. Конкретный совет дать не могу, так как пример у тебя абстрактный. Можно попробовать вынести дублирующийся код в отдельный метод.

>>1393729

Задачи из яндекса легко гуглятся. Мне в общем они нравятся, интересные и есть над чем поломать голову. Я вообще люблю задачи, которые не могу решить сразу.

Ответы: >>1394590
Аноним 2019/05/05 15:29:48  №1394573 316
>>1393712

По поводу импортов: я не очень понимаю, зачем ты в model/message.py импортируешь наследников. Обычно импортируют только то, что нужно в данном файле. И обычно наследник импортирует предка, а не наоборот. Потому я думаю, эти импорты надо просто убрать:

# models/message.py
import text_message
import voice_message

Зачем они добавлены? Странно, что у тебя предок зависит от своих наследников (что они ему нужны).

Также, ты похоже выбрал Concrete Table Inheritance, возможно, что запросы к ней потребуют лишних UNION, судя по мануалу: https://docs.sqlalchemy.org/en/13/orm/inheritance.html#concrete-table-inheritance

> Следует сделать скрипт, который будет принимать все credentials, выполнять всю установку, а на выход выдавать все хэши и токены. Возможно генерировать сразу .env файл.

Я думаю, достаточно только сгенерировать токены. В .env может быть еще куча других параметров. Но можно, конечно, выдавать заготовку .env файла.

> Как обычно делаются такие файлы? Через Докер (не разу с ним не знакомился)?

В dev среде можно использовать docker-compose для оркестрации докеров с отдельными приложениями. Докер, как правило, используется чтобы упаковать в образ программу с нужными ей библиотеками, например, определенную версию Питона или Ноды, чтобы ее не надо было устанавливать в систему руками. Код твоего приложения в докер-образ не кладется, а подмонтируется в него как внешний раздел. docker-compose заниамется тем, что просто запускает несколько докеров (например: микросервис авторизации и основное приложение). На Винде и Маке Докер запускает код в виртуальной машине с линуксом, а файлы прокидываются через сетевую файловую систему со всеми вытекающими.

Ты можешь найти готовый пример приложения на PHP + nginx + mysql в докере и разберешься, я думаю.

> Лучше сделать это на системном языке и чтобы он был кроссплатформенный. Можете что-нибудь посоветовать пожалуйста?

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

>>1393656

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

Ответы: >>1397648
Аноним 2019/05/05 15:31:07  №1394575 317
>>1393636

Обычно есть несколько отдельных рабочих процессов PHP и оба запроса будут обрабатываться параллельно. Для получения id записи в MySQL надо использовать LAST_INSERT_ID() или одноименную функцию в PDO или mysqli, не надо делать кривой велосипед. В Postgres надо использовать сиквенсы (генераторы уникальных значений) для этого.

Описанные тобой способы неправильные и могут давать ошибки.

>>1393551

Подучи HTML/CSS/JS. Вряд ли ты сможешь осилить фронтенд-фреймворки не зная толком JS. Ну и мне кажется, тебе надо дальше проходить собеседования, есть шанс, что куда-нибудь возьмут.

Заодно можно поизучать теорию по БД, виды связей, нормализация, древовидные данные, индексы. оптимизация и тд.

>>1393514

Наследования исключения делается в простейшем варианте так:

class SomeException extends \Exception {}

Далее при желании можно добавлять поля и методы.

>>1393429

Я думаю, что если стоит задача сделать что-то более универсальное, то можно взять готовую библиотеку вроде Doctrine DBAL, где уже есть все нужные обертки.

>>1393389

Это тайп-хинт (контроль типов). Изучи его и используй по возможности везде.

>>1393036

Если твой скрипт может выполнить задачу за 5 минут, то да, можно так. Если не может, то надо запускать реже.
Ответы: >>1394600
Аноним 2019/05/05 15:32:06  №1394576 318
>>1392888

Будет сложнее, но я советовал бы поковырять код Ларавел, чтобы учиться дальше.

>>1393246
>>1387082

> раздут мой код или нет

Нет.

> Сделать в департаменте массив из работников, который будет содержать в себе все виды работников? Не совсем понял где тогда создавать работников, ведь я вызывал метод

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

$saleDep = new Department(..);
$ivan = new Engineer(...);
$saleDep->employ($ivan);

> Правильно ли я понимаю, что желательно для всех свойств класса ставить protected/private, а для считывания/записи нужно делать public методы с проверкой и выдачей ошибки в случае чего?

да, это называется "инкапсуляция". Паста:

=============

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

Кроме нескольких публичных методов, остальные методы и свойства закрываются от доступа снаружи модификаторами private или protected. То есть с объектом снаружи ничего нельзя сделать, кроме вызова публичных методов.

Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название публичных методов (и может быть комментарии к ним). Также, это упрощает изменение кода: если какое-то свойство имеет уровень private, то доступ к нему возможен только из того же класса и тебе не надо бегать по всему коду и смотреть что там с этим свойством делается, тебе достаточно просмотреть один файл с этим классом.

При инкапсуляции автор класса таким образом задает ограничения, что можно делать с объектом.

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

Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.

Если проводить аналогии, то можно представить кофе-машину. Ты нажимаешь кнопку (=вызываешь публичный метод) и получаешь кофе (=результат вызова этого метода), при этом ты не видишь что происходит внутри нее и тебе не надо в этом разбираться.

Вот пример класса с использованием инкапсуляции:

// Объект представляет собой ломаную линию из нескольких сегментов
// Показаны только публичные методы, остальное скрыто
class PolyLine
{
public function __construct(float $x, float $y) { ... }

// Добавляет еще одну точку к ломаной
public function addPoint(float $x, float $y): void { ... }

// Посчитать общую длину линии
public function calculateLength(): float { ... }
...
}

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

- создать ломаную, указав начальную точку
- добавить к ломаной еще одну точку
- посчитать длину ломаной

Вот пример использования этого класса:

$line = new PolyLine(1, 1);
$line->addPoint(2, 2);
$line->addPoint(4, 7);
echo $line->calculateLength();

При этом код может проверять передаваемые значения, например, не разрешать 2 раза добавлять одну и ту же точку. Здесь не приведен код методов и мы не видим приватные поля и методы, но нам это и не требуется - и так понятно, как использовать класс.

==================

> Неужели для каждого рабочего свой обьект создавать?

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

> Не совсем понял. Обьявить в начале кода 4 константые Manager,Engineer и т.д?

Они уже встроены в каждый класс, их объявлять не надо, можно сразу использовать: Manager::class. Прочти мануал https://www.php.net/manual/ru/language.oop5.constants.php

> Т.е базовая ставка у всех одинаковая, а итоговая зависит от ранга и является ли работник лидером?

Это 2 разные вещи. С одной стороны, если мы меняем ранг, то базовая ставка не меняется, а зарплата меняется. С другой стороны, мы можем повысить человеку базовую ставку и зарплата тоже поменяется.
Аноним 2019/05/05 15:34:28  №1394579 319
>>1392401

Не знаю, наверно лучше брать фреймворки. Но могу дать урок про MVC: https://github.com/codedokode/pasta/blob/master/arch/mvc.md

>>1392438

Пожалуйста, Symfony Process для запуска процессов в блокирующем режиме, ReactPHP process для асинхронного управления (будет немного больно).

Но, возможно, тебе проще будет написать bash скрипт.

>>1392404

MVC это не "фича" (особенность) чего-то. А архитектурный паттерн.

>>1391936

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

>>1391581

Это делают те, кто не осилил прочесть https://habr.com/ru/post/315152/

А вообще, я проблемы не вижу, не нравится - не пиши. Может у них проблемы какие-то, или их на работу не берут, или им просто скучно и они пытаются флуд развести, или это проявляется эффект Даннинга-Крюгера.

Аноним 2019/05/05 15:37:44  №1394581 320
>>1394569
>Твой код с try/catch написан неправильно. try/catch если и ставят, то только 1 раз, в самом начале программы, а не вокруг каждого вызова функции. Потому код там будет выглядеть так:
ну, кстати, тут я бы поспорил. Разные мнения на этот счёт, моё таково, что в try catch надо оборачивать каждый (в разумных пределах) вызов функции, где возможен выброс исключения, и которое ты планируешь обработать.
Ответы: >>1394582 >>1394733
Аноним 2019/05/05 15:38:38  №1394582 321
>>1394581
то есть несколько try/catch в одном коде это ок, особенно если разные исключения ловятся и они в разных местах возникают
Ответы: >>1394733
Аноним 2019/05/05 15:43:23  №1394587 322
>>1389946

> Для этого нужно проверить, что конференции между этими пользователями не существует. То есть нужно найти двух Получателей с одинаковым Диалогом и чтобы этот Диалог был приватным.

Такие запросы с джойнами будут плохо работать на больших нагрузках. Они же почти не оптимизируются индексами никак и требуют перебор строк. Возможно, тут придется сделать денормализацию, например, добавить в Dialog либо в Participant дополнительные поля. Чтобы, например, запрос бы имел вид

SELECT FROM Participant WHERE user = ? AND partner = ? AND private =1

Это ложится на индексы. Но, конечно, денормализацию стоит делать во вторую очередь.

> Можно я оптимизацию БД оставлю на последнее?

Можно. Но я просто хотел подчеркнуть, что мессенджеры это высоконагруженные штуки и там приходится об этом думать. И о шардинге, если ты хочешь, чтобы проект расширялся. Потому мы сначала проектируем нормализованную схему, а потом смотрим на типичные запросы и оптимизируем схему для них.

Более того, часто под мессенджеры даже пишутся специализированные хранилища.

Насчет reply - а недостаточно тут просто сделать поле в сообщении "replyToUuid" со ссылкой на исходное сообщение? Без вложений.

Так, схема выглядит хорошо. Позже стоит продумать операции, которые будут выполняться (их явно будет больше, например, может понадобиться постраничное получение участников огромного чата). И как их оптимизировать.

Также, в таблицах вроде Conference_Reference можно не вводить отдельный uuid, а использовать например составной ключ (uuid конференции + id юзера). Возможно, так будет проще. А может и нет.

>>1389824

То, что он умирает, во-первых, делает его stateless, во-вторых, исключает утечки памяти, которые возможны в node-приложениях. Это зачастую плюс, а не минус. Ты знаешь, как в ноде искать утечку памяти, есть ли для нее бесплатные профайлеры памяти?

>>1389802

По идее в VSCode умное дополнение есть, оно называется intellisense или как-то так и его надо ставить отдельно для каждого языка.

>>1389598

> Я думаю, что пока подходы к авторизации методов WAMP не изучены, следует писать сырой код на if'ах, а подход с роутингом взять на заметку и держать в уме. А как думаете вы?

Я, увы, так хорошо авторизацию в WAMP не знаю и сейчас не могу подсказать. Разделение прав нам обязательно нужно будет при подписке, чтобы клиент не мог подписаться на чужие сообщения (кстати, я сейчас себя поймал на мысли, что возможно, другие разработчики этим не озаботились и в интернете куча уязвимых WAMP-серверов).

Возможно, придется использовать роутер и в нем проверять переданный клиентом токен. Или вместо id пользователя в идентификаторах каналов использовать трудноподбираемый токен (new-msgs-for-112345678765432) - тогда может быть, авторизация для подписки не потребуется.

Ответы: >>1397648
Аноним 2019/05/05 15:50:38  №1394590 323
>>1394571
> Конкретный совет дать не могу, так как пример у тебя абстрактный.
Спасибо за ответ. Всегда приятно читать твои объяснения.

Реальный код такой. Есть класс WebReader, который удобная для меня обертка над file_get_contents, контекстами стримов и $http_response_header.
В нем есть метод doRequest(), внутри которого while и try-catch, и идет запрос через file_get_contents, собственно. В catch обрабатываются исключения, которые кидает file_get_contents. Если исключение такое, что это просто сбой http-запроса - крутим while снова (отправляем новый запрос). Если что-то другое, пробрасываем исключение наружу, конец.
Он не абстрактный, готовый класс для запрос в интернет. Но от него я наследуюсь, если конкретному сайту нужны специфические заголовки, или сохранить-отдать специфические куки. TheSiteWebReader, например. Я все это закладывал при проектировании, поэтому работает замечательно.

И вот пришла беда: на одном из сайтов, на который я лезу через TheSiteWebReader, file_get_contents выдает такую ошибку, которую я могу починить немного починив запрос конкретно для этого сайта, но ни для какого другого. Единственное место, где я могу это починить - глубокие кишки WebReader->doRequest(). И мне нужно проверять, что я TheSiteWebReader, потому что для других сайтов чинить эту ошибку нельзя.

Что делать? Выделить содержимое catch во вспомогательный метод типа WebReader->tryToRepairTheRequest(), а затем при необходимости переопределять этот метод в классах-наследниках? Это будет нормально - передать ему исключение, на основе которого он либо изменит свойства класса (модифицирует запрос), либо кинется переданным исключением, если он не может починить запрос?
Ответы: >>1394733
Аноним 2019/05/05 16:15:40  №1394600 324
>>1394575
Просто сразу не мог додуматься до того, что в ларавеле после $var->save(), смогу взять из неё же id =)
Аноним 2019/05/05 16:29:50  №1394604 325
сколько лара выдерживает запросов?
Ответы: >>1394732
Аноним 2019/05/05 16:32:25  №1394606 326
зашел сюда а тут все то же что и года 3 назад, ничего не меняется, анончик учи жс пока не поздно
Аноним 2019/05/05 16:37:13  №1394607 327
Привет ОП, у меня возникли вопросы:

1. Хелперы/Сервисы это место куда мы выносим бизнес-логику, что-то вроде внутреннего api приложения? Это нужно чтобы наш контроллер оставался тонким, так?

2. Утилиты это классы со статик методами, служащими аналогом обычных функций? Я так понял их используют потому-что для функций нельзя использовать автозагрузку.

3. Стоит ли делать отдельный класс роутера для списка студентов?
Ответы: >>1394656 >>1394659 >>1394730
Аноним 2019/05/05 18:01:57  №1394637 328
>>1394567
Можешь написать CMS свою по уроку Зинченко на ютубе, тогда вклинишься в настоящий ООП, а если фреймворк, то какой тебе нужен?
Аноним 2019/05/05 18:32:37  №1394643 329
>>1394569
>Твой код с try/catch написан неправильно. try/catch если и ставят, то только 1 раз, в самом начале программы, а не вокруг каждого вызова функции. Потому код там будет выглядеть так:
Так стойте, что это значит? А что тогда должен ловить try/catch?

>>1394513
Вот посмотри мой код, пожалуйста. Где тут ошибки. Мне нужно оборачивать запрос $dbh->query($query); в try/catch? Если да, то какую ошибку функция query() может выбрасывать? Тоже PDOException?

<?php
require_once __DIR__ . '/login.php';
try {
$dbh = new PDO('mysql:host=localhost;dbname=', $un, $pw);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Подключение не удалось: ' . $e->getMessage(); //$e->getMessage() не нужно писать, получается?
}

$query = "CREATE TABLE student (
id SMALLINT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
surname VARCHAR(50) NOT NULL,
gender ENUM('male', 'female') NOT NULL,
groupNumber VARCHAR(5) NOT NULL,
email VARCHAR(30) NOT NULL UNIQUE,
totalPoints SMALLINT UNSIGNED NOT NULL,
yearOfBirth YEAR NOT NULL,
localOrNonresident ENUM('local', 'nonresident') NOT NULL,
PRIMARY KEY (id)
)";

$dbh->query($query);
$dbh = null;
?>
Ответы: >>1394656 >>1394732
Аноним 2019/05/05 19:01:20  №1394647 330
были такие кто уже на 2 задании застряли?
Аноним 2019/05/05 19:41:31  №1394656 331
>>1394643
Я не оп.
Популярное решение - это централизованный обработчик исключений в ядре твоего фреймворка, как можно ближе к точке входа. В зависимости от режима DEVELOPMENT/ PRODUCTION ты можешь выводить ошибки на экран или молча логировать в файл Собственно единая точка входа и для этого тоже нужна.
>>1394607
Я не оп.
Под хелперами обычно понимают методы/функции шаблонизатора, хотя зависит о терминологии конкретного фремворка.

Сервисы обычно имеют отношения к Dependency Inversion https://ru.wikipedia.org/wiki/Принцип_инверсии_зависимостей фреймворка. Предполанается что ты пишешь в ооп стиле. У тебя куча классов зависящих друг от друга наследованием и композицией (когда один инстанс класса содержит ссылку на инстанс другого класса). Чтобы инстанцировать класс тебе нужно, предварительно инстанцировать кучу других классов, от которых он зависит путем композиции. DI во фреймворке:
1 позволяет обобщеным образом описать зависимости между классами (иногда автоматически интроспекцией получается инстанцировать класс)
2 позволяет осуществлять замену классов зависящих от друг друга наследованием или наследующих один интерфейс

Ты дожен понять что DI это не дополнительный улучшизм, а основной метод содания объектов во фрейймворке. Сервисы это классы твоей бизнес модели как ты выразился. Если твой класс ниотчего не зависит то тебе ненужно вставлять его в DI Собственно ты приходишь к утилитам.
Аноним 2019/05/05 19:57:34  №1394659 332
>>1394607
Смотри, тут такая штука. Во-первых, ООП и MVC-фреймворки используются повсеместно, потому вопрос, надо ли их знать, по моему, лишний, если только ты не мечтаешь копаться в старом-престаром давно написанном быдлокоде. ООП — не новомодное изобретение, его используют в коммерческой разработке с 80-х годов, кстати, так что это вполне проверенный временем подход. MVC тоже появился (правда немного не такой, как в вебе) как способ упростить разработку десктопных приложений с окошечками примерно в то же время.

Чем ООП помогает в разработке? Тем, что позволяет не свалить код в одну кучу из функций и переменных, а разложить по отдельным классам. Очевидно, что чем больше объем кода, тем больше должно быть порядка и организации, иначе все спутывается, код становится труднее понять (то есть он становится менее качественным), из-за этого появляются баги, и в итоге на борьбу с ними уходит чуть ли не больше времени чем на разработку.

И ООП и MVC пытаются сделать код лучше за счет разделения его на части. В случае ООП, мы делаем каждую сущность отдельным классом и помещаем в него код для работы с ней. Например, в случае файлообменника, очевидно, что там будут объекты «файл», у них будут свойства типа имя, дата загрузки, может быть еще что-то.

При правильном проектировании каждый класс занимается своей задачей, в них есть инкапсуляция (возможность закрывать доступ к свойствам и методам с помощью private/protected), и потому часто тебе не надо лазать по всему коду, а достаточно изучить и подправить только один класс. Это очевидно упрощает разработку и жизнь программиста.

В ООП есть наследование. Это позволяет модифицировать поведение какого-то класса из сторонней библиотеки, не меняя его код. На функциях ты такое вряд ли сделаешь без костылей (пример - Друпал, там сделано но на костылях).

При использовании MVC, мы тоже разделяем код на части: код для отображения данных (View), код для хранения и изменения данных (Model) и код для приема команд от пользователя и управления view и model (Controller).

Наконец, есть еще один момент. Программисты обычно не работают в одиночку, а вместе. Если это не коммерческая разработка, а Open Source, все равно, кто-то присылает патчи, кто-то захочет форкнуть твой проект и добавить в него новые фичи. ООП и MVC - общепринятый подход. Везде ты будешь видеть такой код (все популярные фреймворки используют ООП), и если сам пишешь в таком стиле, твой код будет тоже понятен. А если ты начнешь изобретать что-то свое, то многие люди просто не захотят разбираться в твоем велосипеде. Зачем тратить на это время?

Про фреймворки. Из используют по тем же причинам: 1) чтобы в приложении был стандартный понятный каркас 2) чтобы экономить время на написании того, что можно взять гтовое. Из Slim в принципе мы используем в первую очередь роутер, это штука которая умеет из URL вроде /file/123 извлечь id файла и выбрать действие, котлрое надо выполнить. Конечно, можно вместо Slim написать свой роутер, на if и регулярках, но зачем? Время уйдет, а какая от этого выгода?

Ты говоришь, что не видишь преимуществ ООП. Хорошо, а ты пробовал решать задачи из последней главы (задача про корпорацию и кошки-мышки)? По моему в них преимущества ООП-подхода довольно-таки хорошо видны: если пытаться решать их без ООП, получается та еще лапша из функций и массивов. Ты их решал? Если ты так уверен что ООП не нужен и без него все проще, почему бы тебе не попробовать решить эти задачи без ООП и посмотреть самому?

Теперь про файлообменник. Можно ли сделать клон ргхоста без ООП? Да, можно. Но вопрос, а зачем? Из твоего вопроса видно, ты считаешь ООП и фреймворки чем-то сложным, и думаешь зачем для простой задачи использовать сложные вещи. Это понятно, что для начинающего они могут показаться сложными, но только потому что ты в них плохо разбираешься. У меня например, наоборот, ощущение что без ООП выйдет менее понятный, более запутанный код.

Ну и наконец, задача про ргхост имеет целью не «сделать побыстрее клон файлообменника и заработать денег», а «изучить основы разработки веб-приложений, ООП и MVC».

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

> По учебнику я учился какой-то процедурной ерунде,
Это потому, что кто-то так толком и не дописал все, что собирался. Но одна глава про ООП там все-таки есть. в самом конце.

В обещм, если у тебя есть еще какие-то сомнения, то пиши. Но мне кажется, что ты пропустил задачи из главы про ООП и потому толком в нем не разобрался.
Аноним 2019/05/05 21:44:43  №1394687 333
Вообще как происходит разработка приложения в норме? Понятно, что не вручную всё пишется.
Я сейчас бросаю композер в папку, там зависимости прописываю и ставлю, потом собираю это долго и нудно во что-то работающее.
Ответы: >>1394730
Аноним 2019/05/06 01:50:59  №1394707 334
>>1394637
Я другой анон.
Сам учу PHP по урокам Виктора Зинченко. Он лучший из всего на YouTube. У парня талант обучать других людей.
Аноним 2019/05/06 01:52:14  №1394708 335
>>1394637

Я другой анон.

Сам учу PHP по урокам Виктора Зинченко.

Он лучший из всего на YouTube. У парня талант обучать других людей.
Аноним 2019/05/06 02:33:03  №1394709 336
>>1394637
А в чём разница между фрейморками ? Я в этом теме вообще ничего не понимаю. Может посоветуешь ?
8-170 Аноним 2019/05/06 05:50:44  №1394730 337
8-170

>>1394687

Что значит "не вручную"? Код пока пишут вручную.

>>1394607

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

- https://martinfowler.com/eaaCatalog/serviceLayer.html
- http://design-pattern.ru/patterns/service-layer.html

Ну например, если у тебя есть приложение-файлообменник, ты можешь сделать сервис загрузки файлов и в нем метод "добавить файл". Это позволяет тебе добавить файл не только вручную через сайт, но и программно, из кода. Это может пригодиться, если ты например будешь делать API, при тестировании, да и просто делает код аккуратнее.

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

Код в контроллере нельзя повторно использовать, в отличие от сервиса. Ну и в MVC роль контроллера в интерпретации команд пользователя.

> Утилиты это классы со статик методами, служащими аналогом обычных функций?

Да. Паттерн Utility Class.

> Стоит ли делать отдельный класс роутера для списка студентов?

Можно сделать. Стоит или не стоит - думай сам.
Аноним 2019/05/06 05:52:34  №1394732 338
>>1394643

> А что тогда должен ловить try/catch?

Ты урок про исключения прочел? Смысл исключений как раз в том, чтобы не писать кучу if или кучу try/catch.

> Вот посмотри мой код, пожалуйста. Где тут ошибки

- пользователю не показывается красивая страница ошибки
- информация об ошибке не попадает в лог ошибок
- для показа страницы ошибки try/catch пишут один раз в начале программы, а не вокруг каждого вызова функции

В твоем случае надо либо использовать set_exception_handler, либо оборачивать все в огромный try/catch.

> Если да, то какую ошибку функция query() может выбрасывать? Тоже PDOException?

А в мануале ответа нету? Тут например: https://www.php.net/manual/ru/pdo.error-handling.php

Ошибки естественно могут быть: ошибка в SQL-запросе, ошибка связи с БД.

> Мне нужно оборачивать запрос $dbh->query($query); в try/catch?

Не нужно.

Что использовать: PDO или mysqli - не принципиально, они оба поддерживают исключения.

>>1394604

Померяй или погугли тесты.

Ответы: >>1394743
Аноним 2019/05/06 05:54:58  №1394733 339
>>1394590

> Есть класс WebReader

Это называется обычно HttpClient. И есть уже готовые клиенты, например, Guzzle.

Тебе надо переделать архитектуру и выбрасывать исключение наверх, а в классе-наследнике ловить его и обрабатывать как нужно, либо сделать в базовом классе опцию для включения этого кода, и выставлять ее в true в наследнике, либо вынести решение вопроса "что делать при ошибке" в отдельный метод, и тогда наследник может его переопределить.

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

> Это будет нормально - передать ему исключение, на основе которого он либо изменит свойства класса (модифицирует запрос)

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

>>1394581

Он не может обработать ошибку соединения с БД. У него нет резервной БД или чего-то такого. Потому ему не нужен отдельный обработчик для именно этой ошибки, а нужен один общий обработчик для любых ошибок и для показа страницы ошибки.

>>1394582

Несколько try/catch пишется, если ты знаешь, как обработать конкретную ошибку. Иначе пишется один общий обработчик ошибок на все случаи жизни.

>>1388385

В нем ничего не заменено, просто QUERY_STRING - это то, что идет ПОСЛЕ знака вопроса в URL (потому знака вопроса в ней нету) и она вообще может отсутствовать. Открой мануал и проверь: https://www.php.net/manual/ru/reserved.variables.server.php

Также, можешь прочитать урок про структуру URL на всякий случай: https://github.com/codedokode/pasta/blob/master/network/urls.md - там написано, что такое query string

>>1387384

Урок по MVC https://github.com/codedokode/pasta/blob/master/arch/mvc.md
Ответы: >>1394909
Аноним 2019/05/06 05:56:56  №1394734 340
>>1387455

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

Для Постгреса, кстати, есть русский перевод мануала.

>>1386695

Ты передаешь неправильные параметры наверно, либо не тот ид телефонии, либо не то число часов. Или передаешь его строкой может быть.

>>1382988

php-fpm это менеджер процессов PHP, к которому nginx обращается по протоколу FastCGI. Он запускается как отдельная от nginx программа. Apache тоже поддерживает FastCGI и может с ним взаимодействовать.

Обычно схема такая: запросы идут на нгинкс, статические файлы он отдает сам, динамические запросы к страницам сайта передает в php-fpm, который выполняет php-скрипт.

mod_php - это интерпретатор PHP, оформленный в виде модуля к Апачу. Он загружается внутрь Апача и естественно, без Апача работать не может.

>>1382148

Это можно сделать, но тут сложность в том, что он не будет искать ошибки в захваченной фразе. Ну, например, если мы хотим захватить ближайшее слово справа и слева, то можем написать:

\S+\s*...\s*\S+

Но тогда в захваченном слове не будут искаться ошибки, так как preg_match_all() не проходится повторно по уже найденной подстроке.

Другой вариант - использовать опцию PREG_MATCH_OFFSET_CAPTURE, которая сохраняет для каждого найденного вхождения позицию в байтах от начала строки. Эту позицию преобразовываем в символы и берем например текст, по 20 символов в обе стороны от места ошибки.

Ну и покажи код, чтобы было можно что-то еще добавить.
Аноним 2019/05/06 05:58:39  №1394735 341
>>1382113

Для разбиения на строки хватило бы explode().

Переменные можно назвать лучше: afterSplit -> lines, stringAfter -> line, text1 -> characters

> $i<34

Это лучше бы вычислять, например, как макс. из длины строк, одной строкой, используя array_map() и max().

> $text1[$k][$i] != "\0"

В реальном тексте там нет символа с нулевым кодом и твоя проверка не имеет смысла.

Ты тут обращаешься к несуществующим элементам массива и это вызвает ошибки. Тебе стоило бы сделать проверку, что $k меньше чем число символов в текущей строке. У тебя есть проверка, но она некорректная (она сравнивает не с числом символов в текущей строке, а с числом в последней).

То есть тебе стоит сделать так:

если (k меньше чем число символов в данной строке) то вывести пробел.

>>1381775

Комментарии лучше писать над строкой, а не справа, а то слишком длинные строки выходят.

ё не входит в диапазон а-я и её надо писать отдельно.

> for ($i=(count($matches)-1); $i>=0; $i--) {

Не стоит заниматься такими микрооптимизациями, они ухудшают читабельность. Также, для обхода массива стоит использовать foreach().

> like in 20 line

Не стоит ссылаться на номера строк, так как они меняются при доработке кода.

Для замены букв по массиву замен есть функция strtr().

Ты считаешь все латинские буквы неправильными, но могут быть и латинские слова с русскими буквами - лучше проверять по первой букве или как-то еще.

Про преобразования типов: https://www.php.net/manual/ru/language.types.type-juggling.php

>>1381740

Отдельный сервер нужен для больших объемов отправки.

>>1380807

Добавь еще экранирование выводимых данных.
Ответы: >>1395036
Аноним 2019/05/06 06:01:02  №1394736 342
>>1380549

> 1. Будет ли хорошим решением получать объект студента статическим методом из класса-помощника?

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

> 2. Хорошим ли решением будет хранить введенные студентом данные на стороне сервера, чтобы в случае вывода ошибки при валидации вставлять их в html-атрибут value?

Как это делать, описано в моем уроке про формы и в комментариях к задаче: https://github.com/codedokode/pasta/blob/master/forms.md

> 3. Можно ли вызывать встроенные в php функции из логики шаблонов? Да и обычные функции, ведь они могут содержать в себе сложную логику.

Можно для оформления вывода, чтобы например, как-то отформатировать число, итд.

> 4. Я забрёл слишком далеко и начал тестировать с phpunit валидатор студента, а у меня в нём большинство методов защищенные. Пришлось использовать Reflectionclass для получения доступа к ним, это нормальная практика?

Это неправильно. Ты не должен при тестировании "знать", как устроен тестируемый класс. Ты тестируешь только публичные методы, те же, что использует программа. Ты используешь класс так же, как программа, не имея каких-то тайных дверей внутрь него. При таком подходе мы можем менять содержимое класса, не трогая тесты. А также, тесты получаются ближе к тому, что делает программа.

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

> И про валидатор, в нём самые часто используемые конструкции по типу измерения длины строки/проверки на пустоту, я обобщил в отдельные методы. Как вам такое решение?

Нормально.

> Для каждой способности этого метода писать отдельный тест-метод?

Обычно тестируют выполнение "требований". Что должен делать метод? В простейшем случае: 1) пропускать правильные значения 2) не пропускать неправильные. Значит, пишем 2 теста. Это еще назвыают "позитивный" и "негативный" сценарий.

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

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

>>1380793

В шаблон удобнее передать объект студента.
Аноним 2019/05/06 06:02:15  №1394737 343
>>1380690

> Так ведь там весь массив гет из реквеста, а не просто место для сохранения.

А это неправильно и говорит о том, что ты не понимаешь разделение ответственности. Задача генератора ссылок - генерировать ссылки, а откуда пришли данные, из GET или из базы данных, или еще откуда-то - он знать не должен. Потому в нем не должно быть упоминания массива GET. Ты не разделяешь зоны ответственности в коде.

> Вообще, задумка была такой, что замыкание передаётся в шаблон под каким-то именем, где просто вызывается как на пикрелейтед. Меняются только запрошенные параметры, остальные не остаются как были. Ну и пустой писанины чтоб поменьше.

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

> Зачем? Количество записей ведь не изменилось.

Я вроде писал, так везде делают. Когда ты жмешь сортировку, ты хочешь увидеть САМЫЕ большие или маленькие значения, а для этого надо перейти на первую страницу. Иначе ты оказываешься где-то в середине.
Аноним 2019/05/06 06:46:42  №1394743 344
image.png (119, 1250x796)
796x1250
>>1394732
>чтобы не писать кучу if или кучу try/catch.
В смысле? На той же яве и в C++ try/catch нужно было на каждый чих ОТДЕЛЬНО устанавливать, а в PHP он как то по другому действует? Тип как try/catch может выглядеть ОДИН на всю программу?

>В твоем случае надо либо использовать set_exception_handler, либо оборачивать все в огромный try/catch
Я чет не понимаю. try/catch должен оборачивать что? ??

>А в мануале ответа нету? Тут например
Там написано, для того чтобы получить ошибку нужно вызвать какую то функцию. И я не увидел какую именно ошибку выбрасывает запрос. Мне же нужно знать, какую именно ошибку выбрасывает запрос, чтобы поймать ее.

Ответы: >>1394746 >>1394747
Аноним 2019/05/06 07:01:29  №1394746 345
>>1394743
Короче, вот если так сделать, то что будет. Это кстати разработка БД, мне не нужно выдавать ошибку


<?php
set_exception_handler(function (Throwable $exception) {
//Код из мануала ОПа
error_log($e->__toString());

header("HTTP/1.0 503 Temporary unavailable");
header("Content-type: text/plain; charset=utf-8");

});
require_once __DIR__ . '/login.php';

$dbh = new PDO('mysql:host=localhost;dbname=', $un, $pw);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //И куда теперь эту штуку девать?
$query = "CREATE TABLE student (
id SMALLINT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
surname VARCHAR(50) NOT NULL,
gender ENUM('male', 'female') NOT NULL,
groupNumber VARCHAR(5) NOT NULL,
email VARCHAR(30) NOT NULL UNIQUE,
totalPoints SMALLINT UNSIGNED NOT NULL,
yearOfBirth YEAR NOT NULL,
localOrNonresident ENUM('local', 'nonresident') NOT NULL,
PRIMARY KEY (id)
)";

$dbh->query($query);
$dbh
Ответы: >>1394749
Аноним 2019/05/06 07:01:39  №1394747 346
>>1394743

Пусть у тебя все запросы идут через index.php. Тогда можно написать в нем:

require_once '....error_handler.php';
initErrorHandler();

try {
require_once 'bootstrap.php';
$fc = new FrontContrller();
$fc->handleRequest();
} catch (Throwable $e) {
handleException($e);
}

Альтернатива:

require_once '....error_handler.php';
initErrorHandler();
set_exception_handler('handleException');
$fc = new FrontContrller();
$fc->handleRequest();

Соответственно, во всех остальных местах кода try/catch не нужен, так как исключение будет поймано в index.php. Объясни теперь, откуда у тебя идея, что его надо писать много раз?

В мануале специально дан такой пример, чтобы с помощью расположения try/catch показать, в каком месте выбрасывается исключение. Это не значит, что ты его должен копировать строка в строку. Более того, там объясняется, как отключить выброс исключений и использовать ERRMODE_WARNING, потому и try/catch так поставлен, чтобы исключение не вылетело наружу из кода. А у тебя цели "отключать" исключения нету. То есть ты нашел в мануале пример, который вообще отношения к твоей ситуации не имеет.

В яве и Си++ то же самое, не требуется везде ставить try/catch.

Видимо, я плохо в уроке про исключения это объясняю. Но тебе определенно надо изучить исключения получше.
Ответы: >>1394765
Аноним 2019/05/06 07:04:56  №1394749 347
>>1394746

Если это скрипт, который запускается вручную из консоли (командной строки), то вообще писать try/catch не нужно, так как PHP в этой ситуации при исключении выведет информацию о нем и завершит скрипт. И соответственно, header в консоли не имеет никакого смысла.

Если это не скрипт в консоли, а для веба, то надо делать, как я описал выше, либо set_exception_handler, либо все завернуть в единственный try/catch.
Ответы: >>1394772
Аноним 2019/05/06 08:09:22  №1394765 348
>>1394747
Еще больше запутался.
require_once '....error_handler.php';
Что это за многоточие и что это подключаем тут?

initErrorHandler();
И эта функция что делает?? Не гуглится

Скажи я правильно понял или нет, пожалуйста.
Берем главный файл index.php. В него входят две первые строчки, которые я не понял и дальше включаем try. В try идет подключение файла bootstrap. А bootstrap это толи модель, толи просто инициализатор в MVC. Там хранятся файлы:
1) Класс, который описывает сущность студент
2) Класс, который работает с базой данных(паттерн TableDataGateway)
3) Класс, который проверяет правильность ввода данных.
Так вот в тех классах исключения писать не надо? Мне не нужно в классе, который реализует паттерн TableDataGateway использовать отлов ошибок/исключение/try/catch?
Подключение к БД в каком месте идет? В TableDataGateway или в index?
Просто если в index, то что мне делать в конструкторе public function __construct(PDO $pdo) { ... } класса TableDataGateway? Взять данные из базы данных в массив?
И где мне тогда подключаться к базе данных? В try/catch до bootstrap?

$fc = new FrontContrller();
$fc->handleRequest();
Это я тоже не понял. Это шаблоны?

И почему в альтернативе не описана функция set_exception_handler('handleException')? Ты подразумевал, что она где то описана?
Ответы: >>1394771
Аноним 2019/05/06 08:26:49  №1394771 349
>>1394765
>А bootstrap это толи модель, толи просто инициализатор в MVC.
Это прелоадер называется. Там инициализируются зависимости, окружение и тд.
Аноним 2019/05/06 08:32:56  №1394772 350
>>1394749
Кстати я подразумевал, что этот скриgn будет использован один раз. То есть он нужен был для GITHub, чтобы можно было включить один раз и все. Он создал бы базу данных и больше не понадобился.
Ответы: >>1394785
Аноним 2019/05/06 09:05:23  №1394785 351
>>1394772

Лучше использовать для этого SQL-дамп. Просто создаем файл с расширением .sql и в него пишем нужные SQL-команды, с точкой с запятой в конце каждой. Дампы можно генерировать программами вроде mysqldump или phpmyadmin, но можно и писать руками (заодно поучишься SQL).

Загружается дамп через программу-клиент БД или через командную строку.

- http://www.mysql.ru/docs/man/mysqldump.html
- пример первого попавшегося, найденного в гугле, дампа: https://github.com/cymitty/Student-list/blob/master/studentlist.sql

Полезно писать дамп руками, чтобы освоить SQL и работу с дампами из командной строки.

Если же тебе надо что-то посложнее загрузки дампа, то надо сделать скрипт для командной строки. При этом делать страницу ошибки не требуется, и писать try/catch тоже, так как по умолчанию PHP выведет подробности ошибки сам.

Почитать про командную строку простыми словами: https://github.com/codedokode/pasta/blob/master/soft/cli.md
Аноним 2019/05/06 13:10:52  №1394818 352
123.JPG (112, 1044x805)
805x1044
222.JPG (35, 824x569)
569x824
Циферки у меня выводятся, но не умножаются. Тыкните носом, уже и так и сяк пробовал. Да, тупой, не бейте
Ответы: >>1394839
Аноним 2019/05/06 15:56:39  №1394839 353
>>1394818
Все действия убирай из ковычек. Ковычки = текст. Сделай конкатенацию. типо - echo "$x $x = " . $x $x
Ответы: >>1394840 >>1395041
Аноним 2019/05/06 15:57:46  №1394840 354
>>1394839
знака умножения нет :(
Ответы: >>1395041
Аноним 2019/05/06 17:52:11  №1394877 355
>>1394637
>Зинченко
никогда ничего не учи по-русски
Аноним 2019/05/06 19:18:00  №1394909 356
>>1394733
> вынести решение вопроса "что делать при ошибке" в отдельный метод
Вот это мне нравится. Вытащу тогда содержимое catch во вспомогательный метод типа tryToRepairTheRequest().
В родителе будет
protected function tryToRepairTheRequest(\ErrorException $e) {
// можем что-то сделать? если нет, throw $e;
}
В наследниках буду делать
private function tryToRepairTheRequest(\ErrorException $e) {
try { parent::tryToRepairTheRequest($e); }
catch (\ErrorException $e) { // специальный код для наследника, а если не вышло то опять же throw $e; }
}

>У тебя объект представляет один запрос и для нового запроса создается новый объект?
Нет. Запросы могут идти через один объект, а вот ответы - уже новые объекты.
$reader = new WebReader($defaultStreamContext, $maxQtyAttempts); // контекст стрима, который будет использован, если в get() никакой не указан, и кол-во попыток перезапросить при сбоях
$response = $reader->get('https://google.com'[, $streamContext]); // $response - объект класса WebResponse, содержащий ответ
$response2 = $reader->get('https://yandex.ru');

> что, если ты в процессе обработки одного запроса попытаешься через этот класс сделать другой?
Не понял. У меня нет никакой асинхронности и тредов. Вызвал get() - получи WebResponse или эксепшен.
>Свойства второго запроса затрут первый?
Ну, каждый запрос плодит по совершенно независимому WebResponse. WebReader при этом может оставаться один. Все, что он знает - какие хттп-заголовки и параметры стрима выставлять. $url нигде не запоминается и живет только внутри get(), который под капотом вызывает return $this->doRequest($url, $streamContext, $this->qtyAttempts), если ему нравятся переданные параметры. А doRequest() возвращает new WebResponse($http_response_header, $content), куда кладет всё полученное, если запрос удался.
Ответы: >>1398391 >>1402423 >>1402834
Аноним 2019/05/06 22:41:54  №1394979 357
Ответы: >>1395444
Аноним 2019/05/07 06:32:56  №1395036 358
>>1394735
>Отдельный сервер нужен для больших объемов отправки
Большой объём -- это сколько? Есть какое-то правило или просто "не работает в лоб -- поднимай сервер"?
Если я раз в два месяца отправляю пачку около 150 писем, нужен сервер?
Ответы: >>1395044
Аноним 2019/05/07 06:48:03  №1395041 359
Снимок.JPG (12, 259x120)
120x259
>>1394839
>>1394840
Зачем там точка?
Принцип я понял, но теперь не хочет принимать равно.
Ответы: >>1395048
Аноним 2019/05/07 06:51:41  №1395044 360
>>1395036

По идее, если ты правильно настроил sendmail на своем сервере (а также, возможно, всякие антиспам меры вроде SPF итд, которые описываются в статьях по теме), то все должно работать. Антиспам нужен для массовых рассылок.

Отдельный сервер, как я понимаю, тоже нужен для массовых рассылок, чтобы ты не запускал бы у себя на сервере экземпляр sendmail на каждую отправку письма, а например слал бы их по SMTP на отдельный сервер и с него рассылал. Возможно, это позволяет ускорить передачу писем на рассылку. Соответственно, "массовые" здесь начинается с десятков-сотен тысяч писем и нужно, когда стандартная конфигурация не работает или работает недостаточно быстро.

Или, возможно, ты увлекся микросервисами и хочешь усложнить себе жизнь на ровном месте. Тогда тоже можно сделать отдельный сервер.

Соответственно, у меня ощущение, что ты либо неправильно понял статью, либо в ней ошибки.

Ответы: >>1395430
Аноним 2019/05/07 07:10:27  №1395048 361
>>1395041

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

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

Если твой текст программы не соответствует грамматике, то выдается синтаксическая ошибка (ошибка разбора) и программа не выполняется. Ну например, число должно состоять только из цифр. Если ты попытаешься написать в коде число вида 123xyz, то произойдет ошибка разбора.

Кроме синтаксических бывают и другие ошибки, но другие ошибки возможны только при выполнении программы и при отсутствии синтаксических.

Для начала, пролистай мануал по echo: https://php.net/manual/ru/function.echo.php

Посмотри на синтаксис echo из мануала (скобки я убрал):

echo string $arg1 [, string $... ] ;

Эта строка описывает, что в грамматике разрешено использовать после ключевого слова echo.

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

Теперь посмотри на свой код:

echo "....." = $x * $x\n;

ты пытаешься передать в echo сложную составную конструкцию как один аргумент. Давай её разберем:

"какая-то строка" = какое-то матем. выражение \n ;

Оператор = сохраняет в переменную слева от него значение, записанное справа от него, например:

$a = 2 + 2;

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

Вторая ошибка - это использование \n. Ты его используешь вне строки, и вне строки это просто набор символов, не имеющий смысла и вызывающий ошибку разбора. Символы \n имеют специальный смысл (вставка в строку символа перевода строки) внутри двойных кавычек, но снаружи них это просто ошибка синтаксиса. Про это написано тут: https://www.php.net/manual/ru/language.types.string.php

Далее, прочитай про точку: https://www.php.net/manual/ru/language.operators.string.php - это оператор, работающий со строками. Справа и слева от него указывается строка или выражение, дающее строку, или что-то, что можно преобразовать в строку, и он склеивает строки справа и слева и возвращает результат. То есть точка - это как плюс из математики, только для строк.

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

Про поводу того, что надо сделать, есть такие варианты:

- сделать переменную, поместить в нее результат умножения, а эту переменную подставить внутрь выводимой строки
- сделать переменную, поместить в нее результат умножения, и склеить строку с переменной с помощью точки
- склеить выводимую строку с результатом умножения без использования промежуточной переменной

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


Ответы: >>1395076
Аноним 2019/05/07 08:16:11  №1395076 362
>>1395048
Пока вопрос один. В обучалке этого обьёма информации нет. Её надо в мануалах искать самому и дальше?
Ответы: >>1395080
Аноним 2019/05/07 08:21:30  №1395080 363
>>1395076

Согласен, в учебнике есть что дорабатывать. Пока что можно параллельно с учебником искать в мануале описанные там функции и читать дополнительно. Учебник помогает тем, что тебе не надо читать весь мануал, он показывает, на что именно обратить внимание и дает пример использования функций.
Ответы: >>1395208
Аноним 2019/05/07 11:14:45  №1395208 364
>>1395080
В учебнике ОПа хотелось бы больше примеров. Всё таки иногда понятнее посмотреть с небольшими пояснениями, чем прочитать смутные отсылки и попытки "объяснить на пальцах". Абстракции и шаблоны одними словами лучше даже не объяснять.
К тому же новичкам необходимо первое время больше читать, чем писать, как я думаю.

Понятно, что ОП даёт названия и отсылки, и можно посмотреть в гугле. Но гугл на то и гугл, что там до сих пор встречается код на том же mysql), или просто школьники с хабра - он на ранжирует качество написанного.
Аноним 2019/05/07 18:47:16  №1395418 365
объясните мне хрень про стрелочку и this
Ответы: >>1395431 >>1395433
Аноним 2019/05/07 19:26:36  №1395430 366
>>1395044
Статью не читал, просто в своё время делали с корешем прогу на питоне для рассылки оценок и прочей инфы, чтобы сократить ёблю единственной девочке из учебного офиса нашего института, которая всем этим занималась. Тогда мы поднимали smtp-сервер, потому что вроде как других способов не нашли, а сейчас мне просто интересно, как это можно было бы сделать на пхп
Ответы: >>1395435
Аноним 2019/05/07 19:31:43  №1395431 367
>>1395418
Прочитай еще пару раз гайд от ОПа, там вроде предельно ясно обьяснено что это и зачем нужно
Аноним 2019/05/07 19:34:10  №1395433 368
Ответы: >>1395551
Аноним 2019/05/07 19:36:23  №1395435 369
>>1395430
>в своё время делали с корешем прогу на питоне для рассылки оценок и прочей инфы, чтобы сократить ёблю единственной девочке из учебного офиса нашего института, которая всем этим занималась
м-м-максимум куколдизм
Ответы: >>1395778
Аноним 2019/05/07 20:07:25  №1395444 370
>>1394979
Анон, через 'е' пишется. Ты из js-треда к нам?
Ответы: >>1395446
Аноним 2019/05/07 20:18:13  №1395446 371
>>1395444
Если что, это я к анону, который зарегался, а не к создателю студентов.
Ответы: >>1395451
Аноним 2019/05/07 20:28:52  №1395451 372
>>1395446
Ща я тож зарегаюсь.
Ответы: >>1395461
Аноним 2019/05/07 21:04:56  №1395461 373
>>1395451
Пацаны, не вынуждайте меня искать вас по ip из логов.
Ответы: >>1395463 >>1395478
Аноним 2019/05/07 21:13:01  №1395463 374
>>1395461
Хуй соси
Губой тряси
Аноним 2019/05/07 22:08:24  №1395478 375
>>1395461
Ты удолил запись что ли? У меня пусто в профиле, да и в таблице тож.
Ответы: >>1395495
Аноним 2019/05/07 22:15:45  №1395479 376
Не тратте время на изучение пыхи, это умирающая технология. Ничего нового на ней не пишут. Вакансий все меньше и смотреть на вас будут как на говно даже фронтендеры.
Ответы: >>1395480
Аноним 2019/05/07 22:19:40  №1395480 377
Ответы: >>1395481
Аноним 2019/05/07 22:24:42  №1395481 378
>>1395480
Java/C#/Python/Node.js - все что угодно из этого, только не пыху
Ответы: >>1395482 >>1395507
Аноним 2019/05/07 22:28:22  №1395482 379
>>1395481
А что, по ноде вакансий больше?
Ответы: >>1395484
Аноним 2019/05/07 22:31:06  №1395484 380
>>1395482
в развитых странах он уже обогнал пыху по вакансиям. а все тренды рано или поздно проявляются в снг
Ответы: >>1395485 >>1395498
Аноним 2019/05/07 22:33:09  №1395485 381
>>1395484
Пруф есть, или бабка нашептала?
Ответы: >>1395487
Аноним 2019/05/07 22:37:44  №1395487 382
image.png (17, 611x200)
200x611
image.png (17, 563x187)
187x563
Ответы: >>1395488
Аноним 2019/05/07 22:44:01  №1395488 383
>>1395487
А в штатах чё? Нах ты один Израиль принёс, мы что, евреи?
Ответы: >>1395489
Аноним 2019/05/07 22:45:09  №1395489 384
>>1395488
хз, что в штатах. я там не живу, но подозреваю, что пыха там еще менее популярна, чем в израиле
Ответы: >>1395496
Аноним 2019/05/07 22:45:22  №1395490 385
>>1380485 (OP)
Сап, пхп тред.
Дело такое, есть вероятность перекатиться на вакансию на бек php/java, а проблема в том, что не шарю за php почти никак. Делал круд в шарагу, но я думаю этого не хватит. На джаве писал на спринговом стеке, даже на котле писал чутка. Так вот, есть ли у вас какая нить годная книга чтобы без ЕХО "ХЕЛО ВРОЛД", а сразу четенько и по делу.
Олсо, может кто так же перекатывался с джавы, отпишитесь как и что.
Ответы: >>1395492
Аноним 2019/05/07 22:47:33  №1395492 386
>>1395490
главное это пройти собеседование, а там легко перекатишся с джавы.
вот у меня всегда проблема решить задание на месте, потому-что мне надо думать в спокойной обстановке
Ответы: >>1395505
Аноним 2019/05/07 22:57:11  №1395495 387
>>1395478
Да, лучше бы код мой засрали на гите, а не базу.
Ответы: >>1395497
Аноним 2019/05/07 22:58:01  №1395496 388
>>1395489
А мы в Израиле не живем - нафига ты его принёс я понять не могу. Подозрения свои при себе оставь - ЖС сейчас на хайпе, вот и результат. Потом попустит.

С другой стороны нубы, вроде тебя, не понимают, что если ты учил программирование, а не язык, то освоение другого языка - не проблема. ЯП всего лишь инструмент.
Ответы: >>1395498
Аноним 2019/05/07 22:59:49  №1395497 389
>>1395495
А что так? Ну написали тебе там ерунды, так ононы же всегда ерунду пишут.
Ответы: >>1395502
Аноним 2019/05/07 23:04:57  №1395498 390
>>1395496
>ты учил программирование, а не язык
то ты обосрешся на собеседовании, когда не сможешь пояснить за конкретные технологии

>нафига ты его принёс я понять не могу
>>1395484

>ЖС сейчас на хайпе
сейчас это с 2011 года?
Ответы: >>1395499
Аноним 2019/05/07 23:07:03  №1395499 391
>>1395498
Ты пруфов толком так и не принёс, толстяк.
Ответы: >>1395501
Аноним 2019/05/07 23:10:27  №1395501 392
>>1395499
если ты фрилансер или живешь в снг и собираешся там дальше жить, то пыха норм - еще лет 15 протянет
Я лишь хотел дать рекомендацию тем, кто планирует свалить в развитые страны
Ответы: >>1395503
Аноним 2019/05/07 23:12:07  №1395502 393
>>1395497
Испанский стыд был, как будто ребенок отсталый двачер писал. А так похер вообще, что в моем круде напишете.
Аноним 2019/05/07 23:14:09  №1395503 394
>>1395501
>еще лет 15 протянет
Слишком смелое заявление для того, кто пруфов не принёс.
Ответы: >>1395504
Аноним 2019/05/07 23:16:21  №1395504 395
>>1395503
я принес тебе пруф рынка труда в стране которая точно входит в 10-ку по передовым технологиям в мире

сразу отвечу, что мне похуй пруф для тебя это или нет, путь каждый сам решит
Ответы: >>1395508
Аноним 2019/05/07 23:17:46  №1395505 396
>>1395492
ну мне фактически не нужно прям с головой в пыху залезть, мне нужно просто понять что почем, просто я работал на жабке и когда сел за пыху первый(единственный, лол) раз меня прям нормально так колдоёбило, вообще блять как другой мир
Ответы: >>1395506 >>1395511
Аноним 2019/05/07 23:19:30  №1395506 397
>>1395505
я делал файлообменник из ОП-поста на Джаве и было труднее, чем на пхп
Аноним 2019/05/07 23:20:04  №1395507 398
>>1395481
>>смотреть на вас будут как на говно даже фронтендеры
>советует учить ноду
ну ты же понимаешь кем становится человек который учит ноду
Ответы: >>1395510
Аноним 2019/05/07 23:20:55  №1395508 399
>>1395504
Ты вполне мог избирательно пруф принести. Я тебе не верю.
Речь шла о развитых странах, а не только Израиле.

С другой стороны мне просто насрать на твоё мнение. Будем уж честны.
Ответы: >>1395509
Аноним 2019/05/07 23:22:10  №1395509 400
>>1395508
тогда чего ты мне отвечаешь, шизик?
Ответы: >>1395512
Аноним 2019/05/07 23:22:45  №1395510 401
>>1395507
успешным девелопером на острие веба?
Ответы: >>1395514
Аноним 2019/05/07 23:23:15  №1395511 402
>>1395505
Я сейчас вот жабку изучаю после пыха. Поначалу тож колдоёбило бурно.
Аноним 2019/05/07 23:24:13  №1395512 403
>>1395509
Так у нас тут еженедельно ебанашка с откровениями залетает. Просто посмотрел что у тебя в башке насрано.
Ответы: >>1395513
Аноним 2019/05/07 23:24:55  №1395513 404
>>1395512
жаль ни одного аргумента за изучение пыхи не привел
Ответы: >>1395515
Аноним 2019/05/07 23:27:23  №1395514 405
>>1395510
а еще фронтэндером
Аноним 2019/05/07 23:30:17  №1395515 406
Ответы: >>1395516
Аноним 2019/05/07 23:35:07  №1395516 407
image.png (48, 524x556)
556x524
>>1395515
Короче вот ситуация по США. Пока еще нода не обогнала пыху, но это случится очень скоро.
Ответы: >>1395517 >>1395548
Аноним 2019/05/07 23:36:21  №1395517 408
>>1395516
Ну вот как перегонит, так и приходи.
Ответы: >>1395519
Аноним 2019/05/07 23:36:33  №1395518 409
Если про backend, то у меня в Минске по ноде, руби совсем мало вакансий, питона норм, но, везде почти надо с опытом, знакомый вкатывался в питон и сейчас после десятков собесов нихуя, по c# и java по-моему надо знать намного больше, чем по пыхе и найти работу без опыта сложно. Так что пыха неплохой вариант, потом можно и куда ещё, не сидеть же на ней всю жизнь.
Ответы: >>1395521
Аноним 2019/05/07 23:37:51  №1395519 410
>>1395517
но учить нужно уже сейчас
Ответы: >>1395520
Аноним 2019/05/07 23:40:23  №1395520 411
>>1395519
Что учить? Многие пхп-кодеры это фуллстаки. Подтянуть нодку - дело недели-месяца.
Ответы: >>1395523
Аноним 2019/05/07 23:40:33  №1395521 412
>>1395518
клепая сайтики ты не выучишь ООП, многопоточность и базы данных на нормальном уровне
Ответы: >>1395522 >>1395529
Аноним 2019/05/07 23:42:38  №1395522 413
>>1395521
А что на пыхе этого нет?
Аноним 2019/05/07 23:43:28  №1395523 414
>>1395520
короче я надеялся на конструктив, а тут "всяк кулик своё болото хвалит".
Ответы: >>1395524
Аноним 2019/05/07 23:46:59  №1395524 415
>>1395523
Хорошо, что ты хочешь услышать? Мы раскаиваемся, бросаем пхп и идём учить то, что скажет нам залетевший еженедельный васян без каких-то конкретных знаний?
Прости нас о великий мимохуй. Мы не ведали что творили!
Аноним 2019/05/08 00:09:16  №1395529 416
>>1395521
смотря какие сайтики
Аноним 2019/05/08 05:09:24  №1395548 417
>>1395516
нода это еще хуже,чем пых
Ответы: >>1395552
Аноним 2019/05/08 05:39:07  №1395551 418
>>1395433
че ты порвался так?
Ответы: >>1395612
Аноним 2019/05/08 05:39:57  №1395552 419
>>1395548
ок если не использовать коллбеки
async/await и просто конфетка
Аноним 2019/05/08 06:55:20  №1395576 420
Кто-нибудь работал с Joomla? Выполняю заказ на создание андроид приложения под сайт и делаю щас авторизацию. Хочу сделать хеширование введеного пароля, его сравнение с паролем из бд и по результатам авторизация или нет. Как Joomla хеширует пароли? Как я понял через bcrypt, но на сайте соль в бд не сохраняется
Ответы: >>1395583
Аноним 2019/05/08 07:26:02  №1395583 421
>>1395576
Те сделать скрипт на php который хешировпл и проверял пароль. Сам сайт написан на Joomla
Ответы: >>1395613
Аноним 2019/05/08 08:54:50  №1395612 422
>>1395551
Смысл на всякое говно время тратить, если оно не в состоянии найти инфу по базовым вещами? Сам не хочет - идёт нахуй.
Аноним 2019/05/08 08:59:29  №1395613 423
>>1395583
Ну так сделай. Делов на пару строк.
Ответы: >>1395615
Аноним 2019/05/08 09:01:14  №1395615 424
>>1395613
Как мне кэшировать пароль если я не знаю соль? Или это не так работает?
Ответы: >>1395629
Аноним 2019/05/08 09:48:48  №1395629 425
>>1395615
Как сама джумла это делает? Доки смотрел? ИТТ всё больше по Ларавелям и Симфоням сидят.
Ответы: >>1395630
Аноним 2019/05/08 10:11:30  №1395630 426
>>1395629
Она делает это через bcrypt. Щас кстати попробовал сделать проверку через стандартную функцию password_verify и оно выдает, что совпадает, хотя вчера вроде бы выдавала что нет. Как вообще bcrypt работает? Как, генерируя каждый раз новый хеш, оно может проверять на совпадение? Не разбираюсь в криптографии
Ответы: >>1395634 >>1395646
Аноним 2019/05/08 10:15:35  №1395634 427
>>1395630
>генерируя каждый раз новый хеш
Хэш не должен быть каждый раз новым с одними и теми же входящими данными. Как ты его тогда сравнивать будешь?

>bcrypt
Может она там сама солит его?
Аноним 2019/05/08 10:34:47  №1395643 428
Котаны, подскажите - есть экшен у контроллера, он обрабатывает два вида запросов - обычный и асинхронный.
public function testAction(){
if($this->isAjax()){ //если отправленный запрос AJAX
$postData = file_get_contents('php://input');
$res = json_decode($postData, true);
$this->loadView('_test', $res);
die;
}else{
$vars = [
'posts' => ['Test' => 'TestValue'],
];
}
$this->setVars($vars);

}
Ответы: >>1395645 >>1395658
Аноним 2019/05/08 10:35:51  №1395645 429
>>1395643
Черт, случайно отправил недописанный пост. Фейспалм.jpg
Аноним 2019/05/08 10:36:23  №1395646 430
>>1395630

Часто в выдаваемом "хеше" закодированы:

- сам хеш
- соль
- алгоритм получения хеша

Например, стандартная функция password_hash возвращает такой составной хеш, а password_verify разбирает его на части и проверяет по ним пароль.
Аноним 2019/05/08 10:47:13  №1395650 431
в пхп фреймворках есть аналоги батареек джанги?
Аноним 2019/05/08 10:57:40  №1395658 432
Аноним 2019/05/08 11:00:20  №1395661 433
Котаны, подскажите - есть экшен у контроллера, он обрабатывает два вида запросов - обычный и асинхронный.

public function testAction(){

if($this->isAjax()){ //если отправленный запрос AJAX то должен отрисовать ту же самую стандартную страницу, но с данными из AJAX запроса
$postData = file_get_contents('php://input');
$res = json_decode($postData, true); //данные из AJAX запроса
$this->loadView($res); //метод который должен перерисовать шаблон но уже с новыми данными но не перерисовывает
die;

}else{ //если не AJAX // то отрисовываем стандартную страницу
$res = "другие данные";
}
$this->loadView($res); //отриcовка шаблона по умолчанию

}

Короче суть проблемы вот в чем - отрисовываю шаблон, далее по нажатию на кнопку выполняется асинхронный запрос, и по моему плану сервер должен перерисовать шаблон но уже с данными из AJAX. Для этого я вызываю метод $this->loadView($res) который содержит require на тот же самый шаблон. Но нихрена не перерисовывается. Если в средствах разработчика в браузере посмотреть - то видно что ответом на запрос приходит шаблон с данными AJAX.

Понятно что можно с помощью JS вставить асинхронные данные - тут все работает отлично.
Аноним 2019/05/08 11:02:35  №1395662 434
>>1395661
А по заголовкам там чё?
Ответы: >>1395672
Аноним 2019/05/08 11:07:23  №1395666 435
Анонычи, может кто сталкивался и подскажет, как в amoCRM по средствам api в php достать массив с id сделок?
Вроде сделал подключение, всё заебись, а id сделок достать не могу =(
Аноним 2019/05/08 11:10:11  №1395667 436
>>1395661

Функцию isAjax() ты протестировал, что она корректно работает?
Ответы: >>1395672
Аноним 2019/05/08 11:22:00  №1395672 437
>>1395662
аякс запрос идет с двумя заголовками:
{ 'Content-Type': 'application/json' , 'X-Requested-With':'XMLHttpRequest' }

>>1395667
>Функцию isAjax() ты протестировал, что она корректно работает?

Да все работает. И сам аякс запрос работает корректно.
По факту нужно отрисовать один и тот же шаблон, но второй раз с новыми данными.
Аноним 2019/05/08 11:42:13  №1395679 438
полчаса и вуаля
Ответы: >>1395684
Аноним 2019/05/08 11:59:34  №1395684 439
image.png (459, 700x700)
700x700
>>1395679
>поисковая строка принскрин экрана
Ответы: >>1395721
Аноним 2019/05/08 13:05:46  №1395721 440
Аноним 2019/05/08 13:13:54  №1395725 441
image.png (10, 334x99)
99x334
image.png (4, 263x44)
44x263
Господа, помогите в нелепой ситуации. Php никогда не изучал , захотел всего лишь изменить 1 css файл . 1ый пикрелейтед уже файл на хостинге (измененный). 2ой пикрелейтед, что приходит в браузер из этого файла. Сервер ребутал. Что еще нужно сделать, чтобы он подсосал изменения css?
Ответы: >>1395760 >>1395761
Аноним 2019/05/08 14:33:47  №1395760 442
>>1395725
Смотри в коде страницы откуда именно сосутся css. Возможно ты изменил только исходник, а стили тянутся из компилированого файла и нужно его обновить. Ну и кеш сбрось.
Аноним 2019/05/08 14:34:50  №1395761 443
>>1395725
У тебя страница просто в закэшилась. Контрол+R нажми в ней.
Аноним 2019/05/08 14:48:42  №1395772 444
>>1395661
Страницу рисует браузер. Экшен у контроллера просто выдает данные которые нужно отрисовать. Когда ты дергаешь контроллер аяксом, соотвествующий акшон честно отдает все данные. Но браузеру на них похуй - лично к нему никто не обращался нарисовать что-то новое. Тут только с помощью JS вставлять асинхронные данные.
Ответы: >>1398828
Аноним 2019/05/08 14:50:53  №1395774 445
>>1395661
какой уебищный синтаксис
Аноним 2019/05/08 14:59:23  №1395778 446
>>1395435
Да, нам действительно нечем было заняться. До сих пор с болью вспоминаю, как мы пытались всё собрать в ехе-шник.
Аноним 2019/05/08 17:00:58  №1395825 447
iFrrf6wk.png (191, 512x512)
512x512
Написал решение к классической задаче с собесов про
> Есть продукты A, B, C, D, E, F, G, H, I, J, K, L, M. Каждый продукт стоит определенную сумму.
> Есть набор правил расчета итоговой суммы:
> 1. Если одновременно выбраны А и B, то их суммарная стоимость уменьшается на 10% (для каждой пары А и B)
> 2. Если одновременно выбраны D и E, то их суммарная стоимость уменьшается на 6% (для каждой пары D и E)
> ...
Хочу, чтобы меня похуесосили. Если вам несложно, конечно ^_^
bit-ly/2Wyh0iX
Ответы: >>1395843 >>1396270 >>1396278
Аноним 2019/05/08 17:13:59  №1395840 448
Аноним 2019/05/08 17:17:36  №1395843 449
>>1395825
>>1395840
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Аноним 2019/05/08 17:51:00  №1395866 450
>>1395840
какой же ты несмешной, пиздец просто
Аноним 2019/05/09 07:50:28  №1396270 451
>>1395825
> комментарии на кириллице
Надеюсь, ты уже уволен.
Ответы: >>1396386
Аноним 2019/05/09 08:25:35  №1396278 452
>>1395825
Ты не понял задачу. Это не правила фильтра с исключением сработавших элементов из множества, на что намекает "странный" порядок правил. К множеству поочередно применяется каждое правило, затем из сработавших правил для каждого товара выбирается то правило, что даст наибольшую скидку на сумму стоимости корзины в целом.

Аноним 2019/05/09 11:48:52  №1396386 453
>>1396270
Ты у Абу код посмотри.
Аноним 2019/05/09 14:46:42  №1396476 454
что такое сессии?
Ответы: >>1396505
Аноним 2019/05/09 15:26:45  №1396505 455
>>1396476
Это типа школьного экзамена
Аноним 2019/05/09 17:57:38  №1396553 456
Не могу понять, как в самом свежем Slim'е куки установить.

Пробовал и внутри метода установить и снаружи, конструкция
$app->setCookie('user', uniqid('id'), '365 days');
возвращает исключение BadMethodCallException с текстом Method setCookie is not a valid method. Гуглил и ничего не нашел по теме.
На гитхабе вроде был вопрос о том, как установить куки в их фреймворке, на что создатели посоветовали юзать сторонние библиотеки для этого. Вопрос датируется 15 годом. Но сейчас в доке появилась инфа о том, что куки можно установить, но у меня не получается. Я делаю точно так же, как и в доке.

Кто-нибудь сталкивался с этим?
Ответы: >>1396562
Аноним 2019/05/09 18:16:35  №1396562 457
>>1396553
Видимо, такого метода просто нет. Придется написать в службу поддержки, посмотрим, что скажут.
Ответы: >>1396578
Аноним 2019/05/09 19:10:24  №1396578 458
>>1396562
Да, он был удален из Slim 3. Теперь нужно использовать родной setcookie(), либо юзать сторонние PSR-7 либы.
Ответы: >>1396726
Аноним 2019/05/09 20:24:36  №1396603 459
>>1380485 (OP)
Аноны, вопрос по спискам студентов.
Где ведется подключение к базе данных?
В начале нужно подключить базу данных, а потом вызвать конструктор класса, которая реализует Table Data Gateway, и передать в конструктор переменную или подключение ведется в конструкторе класса, который реализует Table Data Gateway?
Ответы: >>1396642
Аноним 2019/05/09 22:27:13  №1396642 460
>>1396603
Почитай у опа про DI. Ты заранее регистрируешь в контейнере, как подключение создаётся и как создаётся tablegateway. Потом можно этот контейнер передавать куда угодно и, например, из контроллера создавать твой tablegateway. А вообще подключение должно передаваться готовое уже, tablegateway этим заниматься не должен.
Аноним 2019/05/10 01:14:49  №1396678 461
Анонычи, как хорошо усвоить ооп к собеседованию? На практикес гуглом всё понимаю, а вот боюсь в теории проебаться, я пока только начинаю, так что не думаю что будут прямо топить. Подкиньте гайдов каких-нибудь что-ли или толковой инфы, чтобы легко воспринималось и по базовом ооп
Ответы: >>1396728
Аноним 2019/05/10 07:17:47  №1396726 462
>>1396578
Так-то логично сделали. Нинужно это Слиму.
Аноним 2019/05/10 07:22:26  №1396728 463
>>1396678
Задачи ОПа делай, которые на ООП,
Аноним 2019/05/10 07:59:01  №1396745 464
>>1395840
Я так и не понял, нормально я выполнил эту задачу или нет. Вопрос такой: Я попытался сделать сущность пользователя и разделить обязанность обращения к таблице и сделал, как я понимаю, TableDataGateway, получилось ли? И то, что я все файлы с видом создал в формате ".php", а не ".html" приемлемо?
Аноним 2019/05/10 14:40:28  №1397075 465
бляяяя,заработало методом тыка,я рот имел всех авторов уроков
Ответы: >>1397206 >>1397210
Аноним 2019/05/10 14:58:06  №1397095 466
Тем кто только вкатывается советую не ебланить с чтением литературы, просмотром дополнительных гайдосов и прочим обучением. Лучше учитесь сразу писать правильно на ооп с неймспейсами и прочей шалупонью. Уже 3 года работаю, а до сих пор не знаю как написать нормально с 0 апи на ООП. Так что ПРОСТО ПИШИ КОД И ВСЕ СО ВРЕМЕНЕМ ПРИДЕТ САМО - это не то что вам нужно, поверьте.
Аноним 2019/05/10 15:02:24  №1397100 467
>>1397095
поясни вкатывальщику
что это
Ответы: >>1397105 >>1397106
Аноним 2019/05/10 15:05:53  №1397105 468
>>1397100
вот это Route::get('/user', 'UserController@index');
я понял что это связано с контроллерами,но не понял как работает
Ответы: >>1397108
Аноним 2019/05/10 15:05:58  №1397106 469
>>1397100
-Пацаны читайте литературу и смотрете больше обучающих видосов
-поясни вкатывальщику что это
-Знаешь, иди ка нахуй, дебил ебаный...
Ответы: >>1397108
Аноним 2019/05/10 15:07:33  №1397108 470
>>1397106
я не успел прост дописать вот это >>1397105
а ты сразу нахуй
Аноним 2019/05/10 15:11:59  №1397112 471
>>1397095
Двачую.

разработчик со времён PHP 4, никак не могу переучиться на ООП
Ответы: >>1397117 >>1397118 >>1397478
Аноним 2019/05/10 15:14:30  №1397117 472
>>1397112
Это у тебя сколько стажа получается? Где работаешь и сколько зарабатываешь?
Ответы: >>1397123
Аноним 2019/05/10 15:15:59  №1397118 473
>>1397112
>>ПРИДЕТ САМО
>>3 года
>>никак не могу научиться
>>двочую
Ответы: >>1397121
Аноним 2019/05/10 15:19:01  №1397121 474
>>1397118
не уловил смысл твоего поста
Ответы: >>1397123
Аноним 2019/05/10 15:19:59  №1397123 475
>>1397117
Стажа лет 10, чисто как хобби.
С ходу взяли миддлом, но я поработал два месяца и ушел - тупо перегорел. Программирование это не так романтично, как кажется, когда ты за камплюктером 5/2 по 7 часов.
З/п была 70к.

>>1397121
Он жопочтец.
Ответы: >>1397125 >>1397129
Аноним 2019/05/10 15:26:53  №1397125 476
>>1397123
Ты если адмен или прочий автоматизатор то тебе можно в принципе, ведь голова не резиновая что бы в неё знания из смежных областей складывать. А то что не роматнтично - так это наверное прост не повезло. Я на разные работы уже повкатывался и везде нагрузка разная, где-то за 30к приходилось впахивать по 10 часов в день (досвиданья через 2 месяца, ага), а где-то по 7 часов ненапряжно сиди да пиши без нервов и неадекватных дедлайнов за 70к, прост наверное нужно тебе еще попробоваться куда-то.
Ответы: >>1397132
Аноним 2019/05/10 15:31:34  №1397129 477
>>1397123
Ты три года читаешь теорию и ни строки не написал? Или три года пишешь. Почему не пришло само? У тебя взаимоисключающие параграфы.
Ответы: >>1397132
Аноним 2019/05/10 15:35:09  №1397132 478
>>1397125
> то тебе можно в принципе
Да нихрена. Любой проект свыше ста строк, написанный без ООП, приносит страдания каждому, кто будет его дописывать и переписывать.
Я вот на свои пет-проджекты без слез смотреть не могу.
На той работе тоже было куча легаси-кода и хреновая его документация. И еще тикеты типа "сделай такую-то фишечку", в ходе которого ты ломаешь еще три фишечки, потому что взаимосвязь всякой хрени внутри хранится в основном в голове у тимлидера и аксакалов.

>>1397129
Если ты прочтешь внимательнее, то увидишь, что он опровергает написанное болдом, а не подводит итог жирненьким.
Ответы: >>1397163
Аноним 2019/05/10 16:03:36  №1397153 479
>>1397095
> Лучше учитесь сразу писать правильно на ооп с неймспейсами и прочей шалупонью
это так не работает. программисты всегда идут по кратчайшему пути. И никто не будет учиться писать "правильно", без мотивации. Могу посоветовать новичкам почитать "Чистый Код" от Мартина, там есть и советы и мотивационка
Ответы: >>1397159
Аноним 2019/05/10 16:30:21  №1397159 480
>>1397153
Чистый код Мартина годно.
мимо-джавист
Ответы: >>1397163
Аноним 2019/05/10 16:41:49  №1397163 481
>>1397132
Работаю в легаси проекте который начинался еще как раз на старте пхп5, в "ядре" системы такой код прикольный который как бы формально и оор, но по факту просто тематически скомпанованные функции по группкам и у большинства объектов можно только вызывать методы и все, а сам объект никуда не засунуть ни присунуть. Управляет всем этим файлы по 2к строк где изи может быть цикл с телом в 1к и сиди ковыряй. В целом большим плюсьм на проекте является то, что все как раз понимают что в нем никто нихуя не понимает, и никто не ебет мозги на тему "чего так долго", а наоборот по возможности все стараются помочь если не можешь разобраться.

>>1397159
Что жавист читает в пхп-тредисе?
Ответы: >>1397273
Аноним 2019/05/10 18:19:05  №1397206 482
>>1397075
laracast попробуй, чтобы не иметь всех авторов
Ответы: >>1397208
Аноним 2019/05/10 18:21:36  №1397208 483
>>1397206
плохо воспринимаю на слух и неудобно пользоваться субтитрами
уверен скажешь страдай сука
ща
Ответы: >>1397209 >>1397212
Аноним 2019/05/10 18:22:43  №1397209 484
>>1397208
щас осилил базу по контролерам и видам,встал на миддл веар
Аноним 2019/05/10 18:24:33  №1397210 485
>>1397075
На скрине в шторме снизу нашел ошибку отсутствия PagesController. Вот ты пытаешься получить к нему доступ,а ты его создал? php artisan make:controller PagesController
Ответы: >>1397211 >>1397214
Аноним 2019/05/10 18:26:38  №1397211 486
>>1397210
это старый скрин,щас доперло
Аноним 2019/05/10 18:27:06  №1397212 487
>>1397208
Пока ты не будешь даже пытаться осилить, ты никогда не начнешь воспринимать. Скажи спасибо, что у тебя есть нормальная мотивация учить ангельский, без задрачивания специальной скучной хуйни, как это делают разные неайтишники и гуманитарии.

мимо
Ответы: >>1397213
Аноним 2019/05/10 18:28:43  №1397213 488
>>1397212
я только хоть как то воспринимаю печатный текст,англ учу уже 3 месяца
Аноним 2019/05/10 18:31:52  №1397214 489
>>1397210
так в этом варианте можно и без контроллера страницу вывести
Аноним 2019/05/10 19:44:39  №1397246 490
>>1397095
ООП это где проектирование. Писать легче и интереснее, если правильно классы сделал.
А вообще тема довольно простая - сложно переучиться, в смысле надо следить за тем как пишешь. Я сегодня вот увидел, что у меня парсер на статиках одних, весь вечер переписывал на ООП. Вроде вышло.
Аноним 2019/05/10 20:08:11  №1397254 491
Я тут сериализовал массив в файл - он сохранялся в текстовом формате.
Потом я из этого массива объект сделал - он сериализовался в двоичный файл. Пробовал через __sleep возвращать поля, но там вообще чушь какая-то получается.
Что я делаю не так? Как сериализовать объект в текстовом виде? Это возможно?
Ответы: >>1397516 >>1397801 >>1398325
Аноним 2019/05/10 20:15:13  №1397259 492
Помогите решить задачу по SQL нубу.
Аноним 2019/05/10 20:44:16  №1397273 493
>>1397163
Выше писал, что есть вероятность вкатиться на вакансию бек php/java с java бека, но нет знаний php, просил книгу подсказать
Прост захаживаю мало ли кто нить еще отпишет или что интересного найду
Аноним 2019/05/11 04:30:06  №1397373 494
Аноны, в чем сейчас принято вести разработку? Docker, wsl, просто lemp или lamp на убунте родной, либо на виртуалке, либо на купленном vps, vargant, wamp? Чем вы пользуетесь? Если оп жив, то что ты посоветуешь?
Ответы: >>1397401 >>1397402 >>1397406
Аноним 2019/05/11 05:29:16  №1397380 495
>>1380485 (OP)
>Кто-то хочет открыть стартап
на пхп???
Аноним 2019/05/11 07:36:48  №1397401 496
>>1397373
Разработку или деплоймент?
Ответы: >>1397404
Аноним 2019/05/11 07:38:02  №1397402 497
>>1397373
Разработку или деплоймент?
Аноним 2019/05/11 07:55:15  №1397404 498
Аноним 2019/05/11 07:59:30  №1397406 499
>>1397373
Разработка win10 + ospanel
Аноним 2019/05/11 09:44:21  №1397478 500
>>1397112
вон из моей профессии
Аноним 2019/05/11 10:27:12  №1397516 501
>>1397254
> Потом я из этого массива объект сделал - он сериализовался в двоичный файл
шта?
Ответы: >>1397612
Аноним 2019/05/11 11:19:19  №1397571 502
>>1397559
причём этот фрилансер не знает как правильно сравнивать хеш. Мартышка, короче
Ответы: >>1397574
Аноним 2019/05/11 11:24:17  №1397574 503
>>1397571
Что здесь не так? md5 дважды, чтобы хэш не нашелся по радужным таблицам. Сам md5 всегда возвращает string, поэтому нестрогое сравнение тут не влияет на результат.
Ответы: >>1397576 >>1397579 >>1397611
Аноним 2019/05/11 11:25:26  №1397576 504
>>1397574
Он походу про password_verify.
Аноним 2019/05/11 11:30:29  №1397579 505
>>1397574

Радужные таблицы как раз и позволяют восстановить многократно обработанный хеш.
Ответы: >>1397582
Аноним 2019/05/11 11:35:15  №1397582 506
>>1397579
Как? В такой таблице должно быть 16^32 строк.
Ecce PHP Аноним 2019/05/11 12:31:31  №1397611 507
goblin-смеётся-2.webm (635, 1280x720)
720x1280
Снимок.PNG (17, 922x495)
495x922
Ответы: >>1397626
Аноним 2019/05/11 12:35:46  №1397612 508
image.png (250, 1050x624)
624x1050
>>1397516
Чего не понятного? Берёшь класс, там объявляешь приватное хранилище, в хранилище - этот массив на самом деле этот класс тоже хранится в массиве. На выходе у тебя не сериализованный многомерный массив, а пикрелейтед. Но если сериализовать массивом, то там читабельный формат.
В принципе всё нормально работает. Но я чёта не понимаю - как так.
Ответы: >>1397614
Ecce PHP Аноним 2019/05/11 12:38:09  №1397614 509
>>1397612
лол, чем ты сериализацию проводишь?
Ответы: >>1397625
Аноним 2019/05/11 12:46:54  №1397623 510
как группировать роуты в ларавеле?
Ответы: >>1397639 >>1397640
Аноним 2019/05/11 12:49:01  №1397624 511
>>1397559
>фрилансер решил себе бекдор сделать
Защита от кидка заказчика, не?
Аноним 2019/05/11 12:51:11  №1397625 512
Ответы: >>1397636
Аноним 2019/05/11 12:51:52  №1397626 513
>>1397611
А вместо боевых видео ты этот конкретный пример сломать можешь?
Коллизии в md5 есть, но ты мне найди пароль от конкретного примера.
А в примере по ссылке строки кастуются в числа из-за 0e, но только хэш из примера начинается с 36, и поэтому не скастуется в число никогда, даже если с другой стороны будет хэш, начинающийся с 0e.
Ответы: >>1397634
Аноним 2019/05/11 13:03:19  №1397634 514
>>1397626
> строки кастуются в числа из-за 0e
> поэтому не скастуется в число никогда, даже если с другой стороны будет хэш, начинающийся с 0e
Да, и всё это знает обезьяна со скриншота из >>1397559 , и именно поэтому пишет нестрогое сравнение, а не потому что она обезьяна и до сих пор не выработала рефлекс писать строгое сравнение во время компарации хешей
Аноним 2019/05/11 13:03:42  №1397636 515
>>1397625
Для начала попробуй json_encode. На мою щёку у тебя денег не хватит
Ответы: >>1397643
Аноним 2019/05/11 13:06:53  №1397639 516
Ответы: >>1397645
Аноним 2019/05/11 13:08:03  №1397640 517
>>1397623
ок тогда объясните эту конструкцию
>Route::group([], function () {
Route::get('hello', function () {
return 'Hello';
});
Route::get('world', function () {
return 'World';
});
});
и эту
>Route::group(['prefix']=>'home', function()
{
Route::get('/', 'HomeController@showIndex');
Route::get('/about', 'HomeController@About');
Route::get('/contact',
'HomeController@showContact');
});
вменяемого объяснения нет
Ответы: >>1397829 >>1398073
Аноним 2019/05/11 13:09:30  №1397643 518
>>1397636
Для начала научись не раздавать советы, которых у тебя не спрашивали, хамло неймфажное.
Ответы: >>1397644
Аноним 2019/05/11 13:10:39  №1397644 519
>>1397643
Ты вообще ретард? Где во фразе "лол, чем ты сериализацию проводишь?" советы? Блядь, пиздуй вон, дворы подменять
Ответы: >>1397653
Аноним 2019/05/11 13:11:06  №1397645 520
>>1397639
в одном сука месте видел
Route::resource('home', 'HomeController')
это типа хоум корень страницы и общий контроллер.
те все страницы после хоум и имеющие общий такой контроллер выполняются,так?
Ответы: >>1397647 >>1398325
Аноним 2019/05/11 13:12:38  №1397647 521
>>1397645
Можешь проверить что будет работать через php artisan route:list
Ответы: >>1397650
someApprentice 2019/05/11 13:13:34  №1397648 522
image.png (249, 1920x1080)
1080x1920
image.png (276, 1920x1080)
1080x1920
image.png (356, 1920x1080)
1080x1920
image.png (290, 1920x1080)
1080x1920
>>1394573
>По поводу импортов: я не очень понимаю, зачем ты в model/message.py импортируешь наследников. Обычно импортируют только то, что нужно в данном файле. И обычно наследник импортирует предка, а не наоборот. Потому я думаю, эти импорты надо просто убрать:
>
># models/message.py
>import text_message
>import voice_message
>
>Зачем они добавлены? Странно, что у тебя предок зависит от своих наследников (что они ему нужны).
Я понял свою ошибку. Я когда пытался получить все сообщения я использовал команду вида session.query(Message).join(Message_Reference).filter(Message_Reference.user == self.user).all() и получал только сущности родительского класса Message, и я подумал что родителю необходимо знать о детях чтобы получить их всех.
Я теперь понял, что импорты должны выполнятся там где выполняется этот запрос - это работает.

>Также, ты похоже выбрал Concrete Table Inheritance, возможно, что запросы к ней потребуют лишних UNION, судя по мануалу: https://docs.sqlalchemy.org/en/13/orm/inheritance.html#concrete-table-inheritance
К сожалению, мне не удалось найти какой паттерн наследования использует psql. Я косвенно предположил, что это именно он.pic-1

Использование UNION приводит к нагрузке?

Вообще, ORM не очень дружат с наследованием, как я могу посудить. Отношения между сущностями тяжело совершить с помощью встроенных инструментов и приходится делать метод для совершения запроса в ручную.pic-2 При получении сущностей выдается массив из сначала сущностей родителя, затем сущности ребёнка.pic-3 Я не знаю должно ли быть такое поведение. Хочется самому отсортировать только сущности детей и возвращать этот массив.


>> Следует сделать скрипт, который будет принимать все credentials, выполнять всю установку, а на выход выдавать все хэши и токены. Возможно генерировать сразу .env файл.
>
>Я думаю, достаточно только сгенерировать токены. В .env может быть еще куча других параметров. Но можно, конечно, выдавать заготовку .env файла.
>
>> Как обычно делаются такие файлы? Через Докер (не разу с ним не знакомился)?
>
>В dev среде можно использовать docker-compose для оркестрации докеров с отдельными приложениями. Докер, как правило, используется чтобы упаковать в образ программу с нужными ей библиотеками, например, определенную версию Питона или Ноды, чтобы ее не надо было устанавливать в систему руками. Код твоего приложения в докер-образ не кладется, а подмонтируется в него как внешний раздел. docker-compose заниамется тем, что просто запускает несколько докеров (например: микросервис авторизации и основное приложение). На Винде и Маке Докер запускает код в виртуальной машине с линуксом, а файлы прокидываются через сетевую файловую систему со всеми вытекающими.
>
>Ты можешь найти готовый пример приложения на PHP + nginx + mysql в докере и разберешься, я думаю.
Я ошибся когда писал, что у разных ролей wamp'а разные uri. Сейчас я сделал авторизацию действий засчет ролей и даже для сервера не нужно применять динамическую авторизацию.pic-4

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


>> Лучше сделать это на системном языке и чтобы он был кроссплатформенный. Можете что-нибудь посоветовать пожалуйста?
>
>Обычно используют Питон, bash для таких скриптов. Если у тебя код на Питоне, логично в нем сделать CLI скрипт для генерации токенов.
>Если у тебя код на Питоне
Страница выдаётся из Ноды, API я собираюсь переписать на PHP, а код wamp'а на Питоне.


>>1394587
>Такие запросы с джойнами будут плохо работать на больших нагрузках. Они же почти не оптимизируются индексами никак и требуют перебор строк. Возможно, тут придется сделать денормализацию, например, добавить в Dialog либо в Participant дополнительные поля. Чтобы, например, запрос бы имел вид
>
>SELECT FROM Participant WHERE user = ? AND partner = ? AND private =1
>
>Это ложится на индексы. Но, конечно, денормализацию стоит делать во вторую очередь.
Я думаю, что партнер должен добавляться скорее в ссылку на конференцию, потому что получатель это отдельная сущность, которая не отвечает за то с кем она должна вести диалог. А если партнёров будет много (публичная конференция)? Конечно тут можно прийти к созданию отдельной таблицы Partners... не будет ли и здесь плохо работать запрос с джоинами на больших нагрузках?

Далее, даже учитывая что мы создадим поле partner в Conference_Reference, это создаст запрос для получения вида:

// неизвестно какой пользователь сначала "создал" конференцию,
// а какой оказался получателем (партнёром)
SELECT FROM Conference_Reference WHERE (user = sender.id OR user = receiver.id) AND (partner = receiver.id OR partner = sender.id)

Такой запрос может вернуть две записи и сама его форма не элегантна.

Я предлагаю вернуться к идеи выше с массивами >>1387125

SELECT FROM Conference WHERE private = true AND (sender.id = ANY(participants) AND receiver.id = ANY(participants));

Как писалось выше такой запрос использует индексы (https://stackoverflow.com/questions/4058731/can-postgresql-index-array-columns).

У вас есть опыт с работой с индексами. Как вам кажется, индексирование массивов приведёт к желаемому повышению производительности?



>> Можно я оптимизацию БД оставлю на последнее?
>
>Можно. Но я просто хотел подчеркнуть, что мессенджеры это высоконагруженные штуки и там приходится об этом думать. И о шардинге, если ты хочешь, чтобы проект расширялся. Потому мы сначала проектируем нормализованную схему, а потом смотрим на типичные запросы и оптимизируем схему для них.
>
>Более того, часто под мессенджеры даже пишутся специализированные хранилища.
Я это прекрасно понимаю..

>Насчет reply - а недостаточно тут просто сделать поле в сообщении "replyToUuid" со ссылкой на исходное сообщение? Без вложений.
Судя по API телеграма там используется как раз такой подход ( https://core.telegram.org/bots/api#message ), но мне никогда не было понятно почему только можно ответить на одно сообщение, мне иногда хочется ответить на несколько сразу, да и выглядит это как прикрепление к сообщению.

>Так, схема выглядит хорошо. Позже стоит продумать операции, которые будут выполняться (их явно будет больше, например, может понадобиться постраничное получение участников огромного чата). И как их оптимизировать.
Опять же с массивами это тоже делается очень просто

SELECT participants[offset:limit] FROM Conference WHERE id = conference.id;


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


Также, я озаботился вопросом как работает с ключами protonmail, и оказалось, что он хранит их на сервере зашифрованные паролем пользователя, как я изначально и собирался это и делать. Я считал, что ключи должны храниться только у пользователя, но подход с генерацией ключей для каждого клиента пользователя создаёт только больше проблем - если пользователь часто меняет клиент (чистит кэш браузера/удаляет приложения/использует несколько устройств), это может превратиться в кошмарный список ключей и при зашифровки сообщения для них всех будет требовать всё больше и больше ресурсов.
Вынуждать пользователя самому заниматься менеджментом своих ключей было бы отталкивающе и тяжело доступно для понимания.

https://protonmail.com/support/knowledge-base/how-is-the-private-key-stored/

Я собираюсь повторить эту практику.

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


>> Я думаю, что пока подходы к авторизации методов WAMP не изучены, следует писать сырой код на if'ах, а подход с роутингом взять на заметку и держать в уме. А как думаете вы?
>
>Я, увы, так хорошо авторизацию в WAMP не знаю и сейчас не могу подсказать.
Рано или поздно мы разберёмся какая архитектура будет лучше.

P.S.
Я понимаю, что ваши советы по архитектуры базы данных содержат опыт, и я парой прихожу к тому что ваш совет, в конечном итоге, оказывается проще, но я всё равно нахожу либо ошибку в своих действиях в применении новых технологий, либо решение появляйщейся проблеме. Я чувствую, что я на правильном пути применяя новые технологии и идеи. В конечном итоге, это кристаллизуется в опыт и можно будет сравнить плюсы или минусы того или иного подхода.



Ответы: >>1397655 >>1398326
Аноним 2019/05/11 13:15:18  №1397650 523
>>1397647
а объяснить просто принцип не судьба?
да,я тупой
Ответы: >>1397652
Аноним 2019/05/11 13:16:07  №1397652 524
>>1397650
лол, думаешь я умный :) просто что сам знаю, тебе написа
Аноним 2019/05/11 13:16:19  №1397653 525
>>1397644
Я не спрашивал как мне сохранять объекты, даун. Вопрос был о странном поведении встроенной функции.

Дворы подметать - твоя работа, судя по постам.
Ответы: >>1397657
Аноним 2019/05/11 13:16:23  №1397655 526
>>1397648
Илюша,ты когда трезвый,такой добрый! кек
Аноним 2019/05/11 13:17:14  №1397657 527
>>1397653
> Я не спрашивал как мне сохранять объекты
А я тебе и не отвечал

> даун
На этом сайте подпись ставят в самом низу сообщения. Ну это так, на будущее
Аноним 2019/05/11 16:18:37  №1397801 528
А вот на серваке с убунтой через консольный PHP сериализует нормально - в текстовый вид. Только что проверил.
Хз что с ней не так.

>>1397254-кун
Ответы: >>1398372
Аноним 2019/05/11 16:34:51  №1397816 529
14687502236520.jpg (41, 900x900)
900x900
как мне сука горит от того что приходится собирать инфу по частям среди тонны воды и кучи статей,где писали как бы для начинающих,а по факту нихуя не объяснив как это работает и как все это связано между собой,а в треде хуй кто поможет
Ответы: >>1397822
Аноним 2019/05/11 16:47:07  №1397822 530
Ответы: >>1397829
Аноним 2019/05/11 16:54:55  №1397829 531
>>1397822
допустим это
>>1397640
и таких примеров дохера.
или это
Ответы: >>1397830 >>1397834
Аноним 2019/05/11 16:55:22  №1397830 532
Ответы: >>1397831
Аноним 2019/05/11 16:55:39  №1397831 533
Аноним 2019/05/11 16:58:27  №1397834 534
>>1397829
А что тебе именно не понятно? Там вполне нормальный код.
Маршруту даётся замыкание, которое либо возвращает какое-то значение, либо отрабатывает контроллер.
Ответы: >>1397837
Аноним 2019/05/11 17:00:50  №1397837 535
>>1397834
для тебя нормальный,а я понял что это группировка роутеров.но я не догоняю что значат массивы с ключами и значениями
Ответы: >>1397839 >>1397844
Аноним 2019/05/11 17:02:29  №1397839 536
Ответы: >>1397846
Аноним 2019/05/11 17:04:08  №1397844 537