М.Двач / Программирование

Этого треда уже нет.
Это копия, сохраненная 22 января 2019 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

Клуб изучающих PHP #106 /php/ 3 дек, 17:34 1305368 В конец треда | Веб

33 Кб, 500x500157 Кб, 1024x683188 Кб, 853x48059 Кб, 400x539

Брр, холодно-то как. Но даже это нас не остановит. Тут мы, несмотря ни на что, изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки, печем печенье и даже делаем простые сайты! Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.

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

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

Предыдущий тред был тут: >>1281608 (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? — Да, однозначно. Посмотри любую вакансию.

Ответы057540621207359077420833108456086901034910637109761177016130245182563426004280892931829870

2 3 дек, 17:38 2 1305372

56 Кб, 500x644435 Кб, 600x900

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

Если тебе лень выравнивать код руками, закачай его на 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

Ответы0544105442

3 3 дек, 17:47 3 1305375

Если вы в предыдущем треде >>1281608 (OP) написали вопрос или запостили решение, но вас не проверили - напомните о себе в этом треде.

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

493 Кб, 514x480
4 3 дек, 17:47 4 1305376

>2019
>php

5 3 дек, 19:21 5 1305413

Привет анон, сегодня вкатился в изучении php, код не компилируется, не могу понять в чем ошибка, ведь первая часть АБСОЛЮТНО такая же https://ideone.com/5R215K

Ответы054160541806046

6 3 дек, 19:25 6 1305416

>>1305413
>https://ideone.com/5R215K
Скобки круглые должны быть, ты чего?

Ответы05421

7 3 дек, 19:26 7 1305418

>>1305413
https://secure.php.net/manual/ru/language.types.array.php
Это прочитать не судьба?

Ответы05421

8 3 дек, 19:28 8 1305421

>>1305416
>>1305418
Посоны, использую версию 5.5, в них же квадратные должны быть?

9 3 дек, 20:16 9 1305441

>>1305372
Как меня бесит когда пидарасы всякие { ставят в одну линию с условием. Только в css так делаю

Ответы05464

10 3 дек, 20:17 10 1305442

>>1305372
>4 пробелами
Про табы у вас в селе не слышали еще, да?

Ответы06046

11 3 дек, 21:01 11 1305464

>>1305441
Чмо про PSR не слыхало?

Ответы05665

12 4 дек, 00:45 12 1305546

Чем обычно занимаются джуны пхп на своей первой работе? Какие вообще советы можете дать по поиску работы на позицию джуна? Думаю после зимы могу уже начать искать себе работу. До этого никогда не работал

Ответы05547

13 4 дек, 00:48 13 1305547

>>1305546
Актуальный вопрос. Поддвачну.

14 4 дек, 02:04 14 1305562

Первый мой перекат в этом треде, посоны.

У кого какой?

15 4 дек, 04:49 15 1305584

>>1304932
>926-981
>
>Аноны, а интересно, как бы вы перевели "statement", например, отсюда:
>
>> As in C or Perl, PHP requires instructions to be terminated with a semicolon at the end of each statement.
>
>Я обычно и statement, и instruction перевожу как "команда".
>
>Ну и заодно, как бы вы перевели "clause" из SQL, например, "ORDER clause", "WHERE clause"?
Я бы перевёл как "выражение".

Со словом "clause" встречаюсь впервые, но знания с википедии дают простой ответ.

Во-первых: https://en.wikipedia.org/wiki/Clause
>In language, a clause is the smallest grammatical unit that can express a complete proposition.

Во-вторых: https://en.wikipedia.org/wiki/Clause_(logic)
>In logic, a clause is an expression formed from a finite collection of literals...

И наконец: https://en.wikipedia.org/wiki/Clause_(disambiguation)
>Clause, a constituent component of statements and queries in SQL

Так что, это слово можно перевести так же - "выражение". То есть, все эти слова близкие по смыслу но разные по семантике, иными словами, синонимы.

Или можно так и переводить - "клауза" (https://ru.wikipedia.org/wiki/Клауза).

Ответы06046

16 4 дек, 05:32 16 1305587

За сколько перекатов среднестатистический вкатывальщик зарабатывает первые деньги?

Ответы05649

17 4 дек, 07:51 17 1305599

Оп, это анон, который про игру пошаговую спрашивал. Можешь привести пару примеров проектов по бэку на php, которые можно на собеседовании показать? Кроме магазинов и соцсетей ничего в голову не идёт.

Ответы0604606323

18 4 дек, 09:20 18 1305609

152 Кб, 677x90069 Кб, 847x376

Чем дальше иду по мануалу ОПа, тем больше понимаю, какой же мерзкий это язык! Смешной момент на 2-й картинке где регулярка задается кастрированной версией, заместо полноценной с указанием флагов, и чтобы, например, игнорировать регистр заместо простого флага придумали ОТДЕЛЬНУЮ функцию. Ну что это за peezdos ?

Ответы0561605655057910604715258

226 Кб, 1264x741
19 4 дек, 09:58 19 1305614

>Функции и новый айпад
>
>Если у тебя есть соблазн сделать все, тупо скопипастив код 3 раза — знай, это решение не пройдет. Так-то.

А у меня прошло. Так-то! Ну или ОП ворвется и скажет, что strawbery не начисляет процент на свои 7777, тогда этот случай придется считать немного иначе.

Ответы06047

20 4 дек, 10:02 20 1305616

>>1305609
Отклеилась ссылка http://sandbox.onlinephpfunctions.com/code/47e625f6e0189cfbaa1c1b18ab03d868701ae86e

21 4 дек, 12:47 21 1305649

>>1305587
У всех разная скорость обучения. Да и не перекаты учат, а решённые задачи.

22 4 дек, 12:52 22 1305655

>>1305609
Есть там флаги. Для второй пикчи: i - ignore case, u - utf8.

Ответы05712

23 4 дек, 13:05 23 1305665

>>1305464
Каво нахуй?

14 Кб, 320x233
24 4 дек, 14:38 24 1305712

>>1305655
Действительно есть, но отдельным параметром для функции.

Ответы05810

25 4 дек, 14:39 25 1305713

Вот вроде люди которые советуют использовать фреймворки, вы блять сами то их использовали. я только на установку ебучего laravel потратил 4 часа, каждый шаг сопровождался жопной болью. В плане "установи composer/настрой его правильно, настрой переменные,настрой ебучий файл хостс", но и это еще не всё. Работа с этим фреймворком это просто какой-то пиздец.
Переведу стандартную ситуацию в более реальную плоскость - для решения задачки уровня 2+2 второкласнику предлагают сначала выучить диффуры.
Четыреждеблядская ярость уже отошла. Я просто шлю фпизду этот фреймворк. Вот серьезно.

Ответы0571406048

26 4 дек, 14:41 26 1305714

>>1305713
Стандартная ситуация для любого бэк-энд фреймворка.

Ответы05716

27 4 дек, 14:42 27 1305716

>>1305714
Ок, что делать, если эти ебучие фреймворки нужны везде кроме Битриксоидов?

Ответы05719

28 4 дек, 14:45 28 1305719

>>1305716
Страдать, что ж еще. Вообще, бэк-энд(нормальный) это не какая-то хуйня. Безопасность, вот это всё - учитывается. Отсюда с наскоку осилить установку/настройку не просто.

29 4 дек, 16:11 29 1305754

>>1305368 (OP)
Подскажите, почему в $_SERVER нет элемента 'HTTP_REFERER'?

Ответы0575906048

30 4 дек, 16:16 30 1305759

>>1305754
Потому, что страница, с которой был переход, в ссылке имеет rel="noreferrer" ? https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types

Ответы05765

31 4 дек, 16:22 31 1305765

>>1305759
Это я валет. Элемент появляется, если перешел по ссылке, а я руками урл писал. Но всё равно спасибо, добрый человек!

32 4 дек, 16:53 32 1305772

А кто-нить шарит в PDO? Почему при
>$row = $pdo-> query('select * from users') -> fetch();

И потом при выводе через

><td>Name</td>
<tr><? echo $row['name'];?></tr>
<td>Login</td>
<tr><? echo $row['login'];?></tr>
<td>Password</td>
<tr><? echo $row['pwd'];?></tr>
<td>email</td>
<tr><? echo $row['email'];?></tr>

Я вижу только 1 запись в базу?
Где я еблан?

Ответы05775

33 4 дек, 17:00 33 1305775

>>1305772
PDOStatement::fetch — Fetches the next row from a result set
PDOStatement::fetchAll — Returns an array containing all of the result set rows

Ответы05776

34 4 дек, 17:02 34 1305776

>>1305775
>atement::fetch — Fetches the next row from a result set
>PDOStatement::fetchAll — Ret

fetchAll - не выводит в итоге вообще нихуя

Ответы06048

35 4 дек, 17:17 35 1305779

Почему при pecl install grpc убунта ебёт мозги по поводу отсутствия zlib? При том, что apt install zlib1g говорит, что все ок и уже установлено. У кого-нибудь получалось без ебли установить грпц?

Ответы06049

36 4 дек, 17:46 36 1305791

>>1305609
дваждую, ещё и с юникодом не дружит

Ответы05811

37 4 дек, 18:49 37 1305810

>>1305712
>для функции
Нет, не для функции, нуб.
Ты чем учебник ОПа читал? Там есть всё.

Ответы0604706087

38 4 дек, 18:50 38 1305811

>>1305791
И базу данных не прикрутишь никак без костылей.

39 4 дек, 19:36 39 1305838

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

Ответы0584005927

40 4 дек, 19:38 40 1305840

>>1305838
дополню вопрос: пытался вкатить в js, по книге нихуя не понял(начинать вкатывание с объектов это охуеть конечно), с видеокурса очень даже зашло.

Ответы06049

41 4 дек, 21:21 41 1305927

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

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

42 4 дек, 21:23 42 1305930

Лучшиекурсы по PHP для новичков на русском

https://www.youtube.com/playlist?list=PLSdH7dYnlGYgrWg5wsEG4v03MiJ1WSOTx

https://www.youtube.com/playlist?list=PLSdH7dYnlGYgQ6ElbHRpG2zRXbkgkO3zQ

https://www.youtube.com/playlist?list=PLSdH7dYnlGYht0eGi9-14X87hrSl9plCc

https://www.youtube.com/playlist?list=PLSdH7dYnlGYh4uk8fMvnjuKl5PI7Xoxnj

43 4 дек, 23:35 43 1306021

https://www.youtube.com/watch?v=w5vTmURvvko
Сделал всё как в видео, но почему-то когда вызываю метод printItem, в самом конце, срабаывает только код который выдаёт текс "Новость :" а оставшаяся часть $this->title нигде не срабатывает. Проверял все переменные, всё работает корректно, то есть если я хочу вывести инфу вроде author_name или conten из $row то всё отображается, а если в методе $this->author_name то уже нет.

44 5 дек, 01:14 44 1306046

>>1305413

Запятую пропустил, смотри внимательнее.

>>1305442

В PSR указаны пробелы. Табы отображаются по-разному и этим плохи.

>>1305584

Выражение (expression) это обычно что-то, что можно вычислить и оно вернет результат. Вроде 2 + 2.

>>1305599

Сайт новостей вроде meduza.io, клон Hacker news, сайт для проведения почтовых рассылок, сайт для поиска опен сурс проектов, которым можно помочь (поиск по навыкам, плюс рейтинг по количеству незакрытых багов), сайт, который показывает код с Гитхаба, но добавляет функционал для навигации по нему как в IDE, видеохостинг pipe, сайт для поиска/сдачи жилья, сайт для поиска временных работников, фриланс-биржа.

Радио, которое играет песни с помощью Ютуба.

И, кстати, сайт для проверки знаний, наш TestHub: https://gist.github.com/codedokode/8733007 .

Ответы060500612106130

45 5 дек, 01:14 45 1306047

>>1305609

А почему это должен быть флаг? В чем принципиальная разница? Почему ты думаешь, что использование флага это "полноценно"? Также, в PHP обычно используют регулярные выражения диалекта PCRE, а не расширенные выражения POSIX, которые используешь ты.

Ну и если ты хотел покритиковать язык, то для тебя уже сделали готовую методичку: https://habr.com/post/315152/

Решено верно.

Мне больше не нравится наличие глобальных настроек для mb_ereg...: http://php.net/manual/ru/function.mb-regex-set-options.php

Из-за них один и тот же код может работать по-разному.

>>1305614

У тебя как раз сделано нормально: код вынесен в функцию вместо копирования его. Но не все хорошо.

Не пиши по 2 команды в одной строчке, это ухудшает читабельность. В if принято использовать фигурные скобки по PSR. Кстати, у тебя if можно заменить на min/max.

Не очень понятно, зачем писать ++ перед $months. Это в принципе правильно, но смотрится непривычно.

Вместо array() можно писать [].

Одинаковые вещи лучше называть одинаково: 'price' => $total_price

А так, решено верно.

>>1305810

Давайте спокойнее. И в учебнике ОПа про mb_ereg, по моему, ничего нету.

45 5 дек, 01:14 45 1306047

>>1305609

А почему это должен быть флаг? В чем принципиальная разница? Почему ты думаешь, что использование флага это "полноценно"? Также, в PHP обычно используют регулярные выражения диалекта PCRE, а не расширенные выражения POSIX, которые используешь ты.

Ну и если ты хотел покритиковать язык, то для тебя уже сделали готовую методичку: https://habr.com/post/315152/

Решено верно.

Мне больше не нравится наличие глобальных настроек для mb_ereg...: http://php.net/manual/ru/function.mb-regex-set-options.php

Из-за них один и тот же код может работать по-разному.

>>1305614

У тебя как раз сделано нормально: код вынесен в функцию вместо копирования его. Но не все хорошо.

Не пиши по 2 команды в одной строчке, это ухудшает читабельность. В if принято использовать фигурные скобки по PSR. Кстати, у тебя if можно заменить на min/max.

Не очень понятно, зачем писать ++ перед $months. Это в принципе правильно, но смотрится непривычно.

Вместо array() можно писать [].

Одинаковые вещи лучше называть одинаково: 'price' => $total_price

А так, решено верно.

>>1305810

Давайте спокойнее. И в учебнике ОПа про mb_ereg, по моему, ничего нету.

Показать весь текст

46 5 дек, 01:14 46 1306048

>>1305713

Это может говорить о том, что у тебя недостаточно навыков по работе в командной строке и недостаточное знание Windows/Linux. А у нас, кстати, есть простой гайд по основам командной строки: https://github.com/codedokode/pasta/blob/master/soft/cli.md

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

Для решения совсем простой задачки ты, конечно, можешь просто написать скрипт на 100 строчек. Зачем усложнять? Фреймворк для более сложных задач, для сайтов с таблицами, формами, админками итд. Учись выбирать правильный инструмент.

Почитал документацию по Laravel ( https://laravel.com/docs/5.7/installation ), мне конечно не нравится идея устанавливать утилиту laravel глобально, ведь у тебя может быть несколько проектов с разными версиями laravel. Я бы установил ее не глобально, а только для проекта. А так, вроде с виду ничего сложного.

>>1305754

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

>>1305776

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

47 5 дек, 01:15 47 1306049

>>1305779

А почему zlib1g? Также, я подозреваю, что для pecl может понадобиться не пакет с динамической библиотекой, а с заголовками и статической библиотекой.

Вот смотри, содержимое пакета zlib1g: https://packages.ubuntu.com/cosmic/amd64/zlib1g/filelist

Видно, что там есть только динамическая библиотека libz.so - это файл, в котором содержатся скомпилированные функции zlib. Программа может подключить эту библиотеку и вызывать ее функции. Чем-то похоже на библиотеки PHP. Но! Си - это не PHP. В Си, прежде чем запустить программу, ее надо скомпилировать из исходников в машинный код. А чтобы скомпилировать программу, которая будет вызывать функции библиотеки zlib, компилятору нужно дать их описание (в zlib.so его нету). Для этого нужны специальные заголовочные файлы, обычно они имеют расширение .h. В исходниках программы стоит ссылка на них и компилятор по описанию сможет сгенерировать код для вызова этих функций.

А вот содержимое zlib1g-dev: https://packages.ubuntu.com/cosmic/amd64/zlib1g-dev/filelist

Здесь мы видим заголовочные файлы вроде zlib.h, которые содержат описания (заголовки) функций библиотеки zlib на языке Си. Тебе наверняка любопытно, что это за файл, он выглядит примерно так: https://github.com/madler/zlib/blob/master/zlib.h

Там есть определения констант (#define), типов данных (typedef, struct), а также описания функций и комментарии. Содержимого функций там нету, только заголовки.

Также, в пакете ты можешь увидеть статическую библиотеку libz.a. Она содержит скомпилированный код функций, тот же самый, что в libz.so, но в другом формате. Статическая библиотека позволяет встроить (слинковать) код функций zlib прямо в скомпилированную программу. А динамическая библиотека zlib.so - она предназначена для подключения только в момент запуска программы.

Ну и еще в пакете есть документация и примеры использования.

Команда pecl компилирует расширения PHP их исходников. Если расширению нужна библиотека - то для компиляции такого расширения нужны именно заголовки из пакета zlib1g-dev. А для работы скомпилированного расширения - нужна zlib.so из zlib1g.

>>1305840

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

47 5 дек, 01:15 47 1306049

>>1305779

А почему zlib1g? Также, я подозреваю, что для pecl может понадобиться не пакет с динамической библиотекой, а с заголовками и статической библиотекой.

Вот смотри, содержимое пакета zlib1g: https://packages.ubuntu.com/cosmic/amd64/zlib1g/filelist

Видно, что там есть только динамическая библиотека libz.so - это файл, в котором содержатся скомпилированные функции zlib. Программа может подключить эту библиотеку и вызывать ее функции. Чем-то похоже на библиотеки PHP. Но! Си - это не PHP. В Си, прежде чем запустить программу, ее надо скомпилировать из исходников в машинный код. А чтобы скомпилировать программу, которая будет вызывать функции библиотеки zlib, компилятору нужно дать их описание (в zlib.so его нету). Для этого нужны специальные заголовочные файлы, обычно они имеют расширение .h. В исходниках программы стоит ссылка на них и компилятор по описанию сможет сгенерировать код для вызова этих функций.

А вот содержимое zlib1g-dev: https://packages.ubuntu.com/cosmic/amd64/zlib1g-dev/filelist

Здесь мы видим заголовочные файлы вроде zlib.h, которые содержат описания (заголовки) функций библиотеки zlib на языке Си. Тебе наверняка любопытно, что это за файл, он выглядит примерно так: https://github.com/madler/zlib/blob/master/zlib.h

Там есть определения констант (#define), типов данных (typedef, struct), а также описания функций и комментарии. Содержимого функций там нету, только заголовки.

Также, в пакете ты можешь увидеть статическую библиотеку libz.a. Она содержит скомпилированный код функций, тот же самый, что в libz.so, но в другом формате. Статическая библиотека позволяет встроить (слинковать) код функций zlib прямо в скомпилированную программу. А динамическая библиотека zlib.so - она предназначена для подключения только в момент запуска программы.

Ну и еще в пакете есть документация и примеры использования.

Команда pecl компилирует расширения PHP их исходников. Если расширению нужна библиотека - то для компиляции такого расширения нужны именно заголовки из пакета zlib1g-dev. А для работы скомпилированного расширения - нужна zlib.so из zlib1g.

>>1305840

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

Показать весь текст
Ответы07373

48 5 дек, 01:18 48 1306050

>>1306046
>Выражение (expression) это обычно что-то, что можно вычислить и оно вернет результат. Вроде 2 + 2.
Но любая функция в программировании это же математическое вычисление, не так ли?

Ответы06066

49 5 дек, 02:45 49 1306066

>>1306050

statement это например if. Он не является выражением.

Ответы0606706070

50 5 дек, 02:53 50 1306067

>>1306066
if тоже можно представить как математическое выражение (вычисление).

51 5 дек, 02:59 51 1306070

>>1306066
Тогда, "statement" можно перевести как "утверждение". Если касаться перевода.

52 5 дек, 06:26 52 1306087

>>1305810
>нуб
Потише, бывалый.

>Ты чем учебник ОПа читал? Там есть всё.
Учебник не канон, а всего лишь гид.
Документация - канон, я читал её.

53 5 дек, 08:08 53 1306121

>>1306046
Сайт аренды жилья давно уже думал сделать. Когда искал квартиру, неделю впустую звонил и ездил ко всяким долбаебам, у которых условия меняются на ходу, фотки не как в реальности, агенты повсюду.
Что, если создать систему подтверждения владельца квартиры, проверку качества и правдоподобности фотографий. Системы бронирования для просмотра, чтобы хозяин квартиры мог просто в нужное время прийти для осмотра жилья,без тупых созвонов. Если на месте оказался не хозяин с сайта, то жмёшь жалобу и аккаунт в бан улетает, если условия или цена с сайта не совпадает с реальностью-тоже самое. Если клиент не пришёл смотреть хату в нужное время - его уже наказывают. Можно прикрутить к аккаунтам отзывы,о хозяинах и жильцах.
Единственная проблема с этим всем, как понять, когда жалуются на человека это правда или просто ебанутый клиент. Не всех же в бан кидать после 1 жалобы, клиент вообще мог прийти, а хозяин все равно пожаловался, что того не было. Для разбора всех этих конфликтов, наверное, персонал нужен сайту.

Ответы1276321361

54 5 дек, 08:31 54 1306130

>>1306046
>Сайт новостей вроде meduza.io, клон Hacker news, сайт для проведения почтовых рассылок, сайт для поиска опен сурс проектов, которым можно помочь (поиск по навыкам, плюс рейтинг по количеству незакрытых багов), сайт, который показывает код с Гитхаба, но добавляет функционал для навигации по нему как в IDE, видеохостинг pipe, сайт для поиска/сдачи жилья, сайт для поиска временных работников, фриланс-биржа.
>
>Радио, которое играет песни с помощью Ютуба.
>
>И, кстати, сайт для проверки знаний, наш TestHub: https://gist.github.com/codedokode/8733007 .
Какие замечательные идеи для стартапов! Любой анон может реализовать любую из этих идей и получать пассивный доход.

55 5 дек, 11:17 55 1306212

>>1305368 (OP)
Сап, аноны.В php я полный ноль, потому нужна ваша помощь. Как сделать CRUD для комментариев?

someApprentice 56 5 дек, 11:55 56 1306284

Я закончил разбираться с Node.js, React'ом и с тем, как работает Universal Application.

https://github.com/someApprentice/Reactive-Express/

Как вы знаете, изначально, я хотел написать шифровальное приложение которое сможет работать без поддержки JS и на старых браузерах. Но в процессе разбора этих инструментов, ко мне пришло понимание, что в этом нет смысла, потому что приватные ключи должны оставаться приватно у пользователя в локальном хранилище IndexedDB кажется лучшим местом, и поэтому все процессы шифровки/дешифровки тоже привязаны к клиенту.

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

Что касается использования уже существующих протоколов шифрования, то TOX привлекателен. Мне нужно поразмыслить стоит ли его брать.

У меня есть только один небольшой вопрос по коду:

https://github.com/someApprentice/Reactive-Express/blob/master/src/app.js

React Router так же обрабатывает роуты на серверной части помимо самого express'а. Поэтому для express'а нет никакого смысла ставить обработчик на каждый роут. Как можно заметить роут для '/' и для '/somewhere' имеет абсолютно идентичный код. Так может для рендеринга просто поставить обработчик с регулярным выражением для всех роутов '/.*', а сверху перезаписать отдельные для POST (если такие потребуются) и для API?

Ответы0673729861

57 5 дек, 12:59 57 1306323

>>1305599
https://github.com/karan/Projects
Не благодари

Ответы06331

58 5 дек, 13:23 58 1306331

>>1306323
И не буду, ничего интересного не нашёл.

Ответы06341

59 5 дек, 14:15 59 1306341

>>1306331
Ну правильно, хули ожидать от человека без собственной фантазии.

Ответы06343

60 5 дек, 14:17 60 1306343

>>1306341
Ну так зачем кидать идеи человека без собственной фантазии?

954 Кб, 611x377
61 5 дек, 14:18 61 1306344

/web совсем помер. Спрошу сдесь.

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

Ответы06382

62 5 дек, 15:05 62 1306382

>>1306344

А какой язык программирования и какую платформу ты используешь для написания приложения?

Если HTML/JS то для прокрутки есть методы DOM:

https://developer.mozilla.org/ru/docs/Web/API/Element/scrollTop
https://developer.mozilla.org/ru/docs/Web/API/Window/scroll

Подсветку строки можно делать по-разному. Можно каждую строку программы сделать отдельным элементом DOM и добавлять ей CSS класс. Можно изловчиться и сделать один элемент DOM в виде прямоугольника с подсветкой и один блок текста и перемещать его к нужной строке.

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

Ответы06399

63 5 дек, 15:50 63 1306399

>>1306382
> А какой язык программирования и какую платформу ты используешь для написания приложения?
Голый JavaScript и HTML. Браузер хром.

Дизассемблированный код пихается в блок div у которого overflow-y: scroll
Каждая строчка это div в котором ещё 5 дивов. Адрес, мнемоника и аргументы
> scrollTop
Это я нашёл. Но как вычислять чему этот scrollTop равен к примеру для 4 строчке.

> Подсветку строки
Это буду делать изменяя background-color дива

> Имей в виду, что если у тебя большой текст
Адресное пространство от 0 до 0хfff
т.е. максимальное число строк 4095
Но по факту будет меньше, поскольку часть памяти идёт на видеобуфер, часть под переменные.

Главная функция эмулятора дёргается каждые 16мс. Если с таким интервалом менть css свойства браузер нормально будет отрабатывать?

Ответы29862

64 5 дек, 17:29 64 1306445

Вечер в хату, увожаемые ананасы.

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

Искал для своих целей клон реддита, из нескольких вариантов остановился на одном (ларавел), но есть нюанс: комментарии рисуются на стороне клиента через js, а не самим фреймворком.

Хочу переделать, чтобы комментарии доставались сервером и на нем рендерились в html. Не могли бы вы оценить трудоемкость этой задачи?

Ссылка на этот кусок js кода https://github.com/Michael-J-Scofield/plebbit/blob/master/resources/views/threads/thread.blade.php#L245

Ответы0647606774

65 5 дек, 18:02 65 1306476

>>1306445

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

Ответы06548

66 5 дек, 20:17 66 1306548

>>1306476
цель - запустить как можно быстрее, а не научиться юзать ларавел.

67 5 дек, 22:04 67 1306638

Тут есть мастера по joomla? Нужна хелпа!

someApprentice 68 6 дек, 03:26 68 1306737

>>1306284
>
>React Router так же обрабатывает роуты на серверной части помимо самого express'а. Поэтому для express'а нет никакого смысла ставить обработчик на каждый роут. Как можно заметить роут для '/' и для '/somewhere' имеет абсолютно идентичный код. Так может для рендеринга просто поставить обработчик с регулярным выражением для всех роутов '/.', а сверху перезаписать отдельные для POST (если такие потребуются) и для API?
Уточнение: Можно ли поставить обработчик всех роутов с помощью регулярного выражения '/.', не смотря на то что такой обработчик считается неприемлемым?

https://github.com/someApprentice/Reactive-Express/blob/master/src/app.js#L22-L30
https://github.com/someApprentice/Reactive-Express/blob/master/src/app.js#L38-L46

69 6 дек, 05:10 69 1306751

может кто-нибудь объяснить нофане, почему
>echo "$sas + \$ucc" + "30%8";
выводит "35"?

Ответы06756

70 6 дек, 06:11 70 1306756

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

Ответы06766

71 6 дек, 06:51 71 1306766

>>1306756
понял, спасибо большое!

72 6 дек, 07:27 72 1306774

>>1306445
Я делал комменты через рекурсию.
Нагуглил функцию и под себя переделал.
Вроде как понимаю, что написано, а вроде нет.

73 6 дек, 10:53 73 1306842

Аноны, нид сам хэлп.
Имеется некое подобие подачи заявки. Необходимо отправлять в бд дату подачи заявки.
Проблема в следующем:
Сама инфа отправляется в бд с помощью sprintf через %s\%d(плейсхолдеры вроде?)
Как отправить дату через эти плейсхолдеры? Гугол уже прочитал чёт там по поводу даты ничего нет. Мануал официальный тоже прочитал есть только про строки( str_to_date мэйби юзануть?)и про числа(напомню в бд столбец сделан с datetime)
Собственно вопрос как подготовить строку для отправки, для datetime

Ответы06847

74 6 дек, 11:33 74 1306847

>>1306842
Отбой тревоги пасаны. Я еблан и писал в отображении заявки а не в подаче.

Короче если кому-то будет необходимо то datetime отправляется в бд через sprintf с помощью строчного коофициента( '%s')

Ответы06896

75 6 дек, 13:34 75 1306896

>>1306847
А что, обязательно дату в базу отправлять из приложения? Там должна быть встроенная функция автозаполнения датой, при создании новой записи. На MySQL есть, я пользовался.

76 6 дек, 17:44 76 1307039

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

Допустим я забрал весь html через file_get_content, дальше с помощью http://php.net/manual/ru/domdocument.loadhtml.php
я спарсил их кривой html, и получил все урлы на страничке. Из них уже выбрал те что ведут на сами csv и названия файлов.

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

Меня немного смущает размер файлов и то с какой скоростью сервер отдает их.

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

Какое можно надежное решение придумать в подобной ситуации?

Ответы0727807286

77 6 дек, 18:17 77 1307056

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

Ответы07102

78 6 дек, 19:49 78 1307102

>>1307056
>можно авторизоваться
>нет валидации, куков

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

API API ебаный API 79 6 дек, 21:03 79 1307134

Аноны, третий день пытаюсь запилить API на yii2 базовый шаблон.
Мануалы курил, но нихрена не понял)
Проект уже весь запилен, осталось запилить папку API для react приложения.
Есть может у кого в закромах посмотреть где, как организованно API со всеми настройками..
Никак не пойму как настроить маршруты внутри http/lockalhost/projectName/API/index.php !!
Тут могу отдавать что угодно, а вот дальше как подключать контроллеры, экшены самомго API, не понимаю...

Ответы29863

80 6 дек, 23:27 80 1307205

Аноны, есть ли смысл брать Котерова "пхп7 в подлиннике"? Или лучше что то другое по 7ой пыхе?

Ответы07255

81 7 дек, 01:26 81 1307255

>>1307205
>Котерова
не стоит

82 7 дек, 02:50 82 1307278

>>1307039
>Какое можно надежное решение придумать в подобной ситуации?
Отключи уйму времени и качай по очереди.

83 7 дек, 03:45 83 1307286

>>1307039

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

84 7 дек, 09:26 84 1307359

>>1305368 (OP)
Если я пишу сразу на удаленный сервак, то никак не получится накрутить xdebug?

Ответы07434

85 7 дек, 09:44 85 1307373

>>1306049
Благодарю за развернутое объяснение, всё получилось. Задача у меня изначально была подружить пхп-клиент с го-сервером по грпц, докеризировать всё это дело и довести до продашкн-реди ума.
Если будет кому интересно, могу залить на гит то, что в итоге получится.

62 Кб, 595x447
86 7 дек, 09:55 86 1307386

2 дня задачу из учебника делол, оказалось всё очень просто https://ideone.com/h3Zk89

Ответы29863

87 7 дек, 11:20 87 1307434

>>1307359
Через ssh тунель я делал так.

Ответы07641

88 7 дек, 18:17 88 1307641

>>1307434
А можно как то дебажить код на удаленном сервере без танцев с бубном?

Ответы07718

4 Кб, 333x78
89 7 дек, 19:16 89 1307666

Привет двач, делаю задачку про студентов и возникла такая проблема, не знаю как сделать чтобы столбец ID в бд заполнялся сам, в базе стоит параметр AI. Сейчас он ищет последний элемент через foreach, что очень хуево. Что подскажете?

Ответы0766807720

90 7 дек, 19:24 90 1307668

>>1307666
без кавычек пиши $id

Ответы07673

91 7 дек, 19:28 91 1307673

>>1307668
А остальные переменные тоже без кавычек писать лучше?

Ответы0767407692

92 7 дек, 19:32 92 1307674

>>1307673
Понял, не нужно

93 7 дек, 19:57 93 1307692

>>1307673
Когда что то не работает или чето не понимаешь каким образом работает, то распечатывай переменную, которая вызывает вопросы.
Ты можешь распечатать твой скл запрос:
$sql ='INSERT INTO hooy WHERE id = zhopa ......';
echo $sql;
И ты увидишь что конкретно сжирает сервер

94 7 дек, 20:53 94 1307718

>>1307641
Если у тебя публичный статически ip можеш попробовать в настройках php на сервере:
xdebug.remote_enable=1
xdebug.remote_host=твой айпи
xdebug.remote_port=твой открытый порт
В настройках иде слушаешь этот порт.
SSH тунель едва-ли подходит под танцы с бубном - прокидываешь порт и айпи ставишь локальный.
Зато сразу защищено и не требует статики.

95 7 дек, 20:57 95 1307720

>>1307666
Чтобы автоинкремент заработал тебе не нужно вообще указывать id в INSERT, пропускай этот столбец.

Ответы07722

96 7 дек, 21:05 96 1307722

>>1307720
Спасибо! Похоже я раньше, что-то не так сделал и это не работало

97 7 дек, 21:14 97 1307732

Объясните как правильно развернуть дев-окружение php + php-fpm + nginx + mysql в докере. Чем отличается MariaDB от MySQL? Дело в том, что для Alpine есть только Мария.

Ответы29863

98 7 дек, 21:40 98 1307742

>>1305368 (OP)
Почему YII и Symfony, а не Laravel?

Ответы07776

99 7 дек, 23:14 99 1307776

>>1307742
Нравится ларавел - бери его

Ответы07787

100 7 дек, 23:37 100 1307787

>>1307776
Считается, что в Symfony много джавовой наркомании. Но это не точно. Поэтому спросил почему именно они.

Ответы07791

101 7 дек, 23:40 101 1307791

>>1307787
Симфони - более тырпрайзный вариант, эдакий спринг для мира пхп.
Ларавел больше про хуяк-хуяк-в-продакшен.
Юи не трогай - устаревший кусок говна.мимо 1.5 года сидел на юи2 в галерке

102 8 дек, 01:26 102 1307826

PHP - кусок говна. Совсем не мотивирует меня работать на нем.

Ответы0783007939

103 8 дек, 01:32 103 1307828

бамп

104 8 дек, 01:40 104 1307830

>>1307826
Зачем пишешь сюда тогда?
Чего стек не сменишь?

166 Кб, 640x294
105 8 дек, 13:30 105 1307939

>>1307826
Ну-ну.

106 8 дек, 14:27 106 1307965

'SELECT * FROM student LIMIT $limit OFFSET $offset'
Такие же запросы можно использовать? Просто в задаче про студентов написано, что нельзя переменные вставлять прямо в запрос. Но здесь нет никаких данных введенных пользователем, для них же защита не нужна?

Ответы0805908109

107 8 дек, 16:06 107 1308014

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

Ответы0801916200

5 Кб, 154x266
108 8 дек, 16:06 108 1308016

Не прикрепилось

Ответы08019

109 8 дек, 16:07 109 1308018

Отбой, я понял

110 8 дек, 16:08 110 1308019

>>1308014
>>1308016
http://php.net/manual/en/control-structures.foreach.php

Ответы08066

111 8 дек, 16:58 111 1308059

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

Ответы08062

112 8 дек, 17:05 112 1308062

>>1308059
public function getStudentsByLimit($limit, $offset){
$db = $this->dbase;
$stmt = $db->prepare("SELECT * FROM student LIMIT $limit OFFSET $offset");
$stmt->execute();
$result = $stmt->fetchAll();
return $result;
}

Ответы081130817808207

223 Кб, 500x500
113 8 дек, 17:12 113 1308066

>>1308019
Велосипеды конструировать изволите?
http://php.net/manual/ru/function.array-sum.php

Ответы08071

114 8 дек, 17:25 114 1308071

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

Ответы0808108084

115 8 дек, 17:35 115 1308081

>>1308071
Знакомо. Наверное, все через это проходили.
Рекомендую всегда, вообще всегда, смотреть документацию при работе с каким-то типом данных.
Вот работаешь ты с массивами - открой вкладку со списком функций на сайте и просмотри их все.
Это же самообман всё - думаешь, что долго открывать, искать эти функции, как дурак, тогда как ИРЛ всё обычно наоборот - функции имеют понятное название, а пилить велосипед с тем же foreach выйдет гораздо дольше, чем просто взять и использовать нужную из документации.

116 8 дек, 17:40 116 1308084

>>1308071
в вебе уже всё изобретено, гуглишь как сделать хуйня нейм и получаешь уже готовый код

117 8 дек, 18:10 117 1308109

>>1307965

А откуда ты в функции знаешь, откуда пришли данные? На них это не написано. Плюс, offset явно создается на основе данных пользователя.

Ну вот ты напишешь функцию:

function getStudent($limit, $offset)
{
....
'SELECT * FROM student LIMIT $limit OFFSET $offset'
...
}

Как проверить, что она безопасна? Где гарантия, что в нее всегда передают только числа? Это ты думаешь, что в нее передают только числа, но завтра кто-нибудь напишет

getStudents($_GET['limit'], ...)

И у нас инъекция.

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

Кстати, в случае чисел для защиты достаточно применить intval() или поставить тайп-хинт int, но через плейсхолдеры все же будет надежнее. Их убрать труднее, чем заменить int на string, не заметив что это для обеспечения безопасности.

Ответы0816908176

118 8 дек, 18:18 118 1308113

>>1308062
Не оч реализация, как по мне.
Обычно так пишу - https://ideone.com/TPhsrf
я там скобки посеял где-то пока писал

Если у кого есть ещё идеи - делитесь.

119 8 дек, 19:17 119 1308169

>>1308109
Пользователь не может передать туда ничего, у меня там идет не через гет, а просто типа site.com/page/2. Там все рассчитывается для создания пагинации. В оффсет и лимит не может попасть ничего кроме числа по идее. Я понимаю что этого не видно и тут не экстрасенсы сидят. Может я вопрос не так задал: можно ли вставлять переменные прямо в sql запрос, если я уверен, что туда не попадет какая-нибудь левая хуйня? Не будут ли на меня смотреть как на дауна из-за этого?

Ответы08178

120 8 дек, 19:22 120 1308176

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

121 8 дек, 19:22 121 1308178

>>1308169

Ты то ли невнимательно прочел пост, то ли что-то не так понял.

Функция, работающая с SQL, должна работать безопасно, что бы в нее не передавали. И защита должна быть сделана в самой функции. Чтобы смотря только на эту функцию, было видно что она безопасна.

Функция >>1308062 этим требованиям не соответствует.

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

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

Ответы08183

122 8 дек, 19:26 122 1308183

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

Ответы08189

123 8 дек, 19:34 123 1308189

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

124 8 дек, 20:04 124 1308207

>>1308062
>$db = $this->dbase;
Какая-то бессмысленная строка. Зачем она нужна?
Почему заместо этого всего:
>$db = $this->dbase;
>$stmt = $db->prepare()
просто не использовать:
$this->dbase->prepare()

125 8 дек, 21:43 125 1308244

Сапсан, как вывести погоду через API в динамическую обложку для вк

126 9 дек, 01:27 126 1308331

>>1305368 (OP)

https://ideone.com/YZhoeC

ООП-Будильник 2.0 с учетом замечаний из предыдущего треда, надеюсь ничего не упустил. Спасибо за подробные замечания, всё очень доступно и понятно!

https://ideone.com/Kj2GBG
Версия с тестами, выглядит не так стильно но работает. Ну эмм, я пошел делать вектор.

Ответы115101322814975

127 9 дек, 10:21 127 1308417

Это снова я!
Сумма прописью ULTIMATE FINALLY (надеюсь) EDITION - https://repl.it/@MaksimSienchien/GrowingStarkProducts

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

https://repl.it/@MaksimSienchien/LimitedTrimAfkgaming-1

Ответы31368

128 9 дек, 11:08 128 1308429

ОП, глянь "Гостиницу" мою, если будет время:
http://sandbox.onlinephpfunctions.com/code/bf265b1dcfaab38559a459812aa03f0c5583fc7b

Также есть вопрос по оформлению кода, в PSR-1, PSR-2 ответа не нашел, PHPStorm на автомате не форматирует это. Как правильно разбивать построчно различные конструкции. Вот примеры у меня в коде - 55-60 строки (сокращенный if), 188-192 строки (длинное условие в if-е), 268-274 строки (массив).

Ответы08859

129 9 дек, 12:27 129 1308456

>>1305368 (OP)
Может ли не работать перенаправление header("Location: /") из за того, что есть деприкейтед ошибка, на которую я пока забил хуй?

Ответы0845708459

130 9 дек, 12:28 130 1308457

>>1308456
Cannot modify header information - headers already sent by...

131 9 дек, 12:34 131 1308459

>>1308456
Разобрался. Если кому интересно, да, может. Выводимые серваком ошибки не дают изменять заголовки

132 9 дек, 18:26 132 1308663

Если кому-то интересно - статья с вопросами и задачками с собеседования в Яндексе: https://medium.com/@olgakozlova/вопросы-из-яндекса-895261c94e16

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

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

133 9 дек, 18:32 133 1308667

Из предыдущего треда:

>>1299665

> https://repl.it/@underbottom/ATM - банкомат.

> $count100 = 0;
> $count200 = 0;
> $count500 = 0;
Если ты начинаешь создавать переменные с цифрами на конце, скорее всего тебе нужен массив. Не $count100, а $count[100]. У тебя, чтобы добавить новый номинал, надо переделывать весь код.

В общем, там сейчас один и тот же код скопирован 6 раз, надо использовать массив и цикл вместо копипасты.

В Википедии написано, что жадный алгоритм работает только для "канонических" систем монет или купюр: https://ru.wikipedia.org/wiki/Жадный_алгоритм#Размен_монет

> https://repl.it/@underbottom/smart-ATM -головоломка.

Да, тут идея относительно верная - перебирать все сочетания количеств купюр. Но проблема в том, что время выполнения программы быстро растет. Допустим, у тебя по 10 штук каждой купюры = это 10^6 = 1 млн. итераций (терпимо). Но если купюр будет по 100 штук, то это уже 100^6 = 10^12 = триллион итераций. Слишком долго будет работать.

Потому надо внедрять оптимизации перебора, вроде таких:

- если мы хотим выдать 6600, то не имеет смысл проверять варианты, где 2 и более купюры по 5000. Имеет смысл проверять варианты только 0x5000 и 1x5000
- если мы хотим выдать 500500, то сначала стоит попробовать вариант 100 x 5000, так как он ближе всего к цели, и только потом 99x5000, 98 x 5000 и тд.
- если мы хотим выдать 500500, и у нас сумма купюр номиналом < 5000 равна 6000, то не имеет смысла проверять варианты вроде 96 x 5000, 95 x 5000 итд., так как при их использовании нам не хватит мелких купюр.

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

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

Ну и у тебя скопировано 6 циклов, было бы выгоднее заменить их на рекурсивный вызов функции с одним циклом. Почитай про рекурсию и попробуй заменить циклы на нее. А то если мы хотим сделать 4 или 7 номиналов, надо код переделывать. Хватит копипастить.

Похожая задача о сдаче: https://habr.com/post/109384/

Почитать про задачи о размене: https://neerc.ifmo.ru/wiki/index.php?title=Задача_о_рюкзаке#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B0_.D0.BE_.D1.80.D0.B0.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5

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

133 9 дек, 18:32 133 1308667

Из предыдущего треда:

>>1299665

> https://repl.it/@underbottom/ATM - банкомат.

> $count100 = 0;
> $count200 = 0;
> $count500 = 0;
Если ты начинаешь создавать переменные с цифрами на конце, скорее всего тебе нужен массив. Не $count100, а $count[100]. У тебя, чтобы добавить новый номинал, надо переделывать весь код.

В общем, там сейчас один и тот же код скопирован 6 раз, надо использовать массив и цикл вместо копипасты.

В Википедии написано, что жадный алгоритм работает только для "канонических" систем монет или купюр: https://ru.wikipedia.org/wiki/Жадный_алгоритм#Размен_монет

> https://repl.it/@underbottom/smart-ATM -головоломка.

Да, тут идея относительно верная - перебирать все сочетания количеств купюр. Но проблема в том, что время выполнения программы быстро растет. Допустим, у тебя по 10 штук каждой купюры = это 10^6 = 1 млн. итераций (терпимо). Но если купюр будет по 100 штук, то это уже 100^6 = 10^12 = триллион итераций. Слишком долго будет работать.

Потому надо внедрять оптимизации перебора, вроде таких:

- если мы хотим выдать 6600, то не имеет смысл проверять варианты, где 2 и более купюры по 5000. Имеет смысл проверять варианты только 0x5000 и 1x5000
- если мы хотим выдать 500500, то сначала стоит попробовать вариант 100 x 5000, так как он ближе всего к цели, и только потом 99x5000, 98 x 5000 и тд.
- если мы хотим выдать 500500, и у нас сумма купюр номиналом < 5000 равна 6000, то не имеет смысла проверять варианты вроде 96 x 5000, 95 x 5000 итд., так как при их использовании нам не хватит мелких купюр.

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

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

Ну и у тебя скопировано 6 циклов, было бы выгоднее заменить их на рекурсивный вызов функции с одним циклом. Почитай про рекурсию и попробуй заменить циклы на нее. А то если мы хотим сделать 4 или 7 номиналов, надо код переделывать. Хватит копипастить.

Похожая задача о сдаче: https://habr.com/post/109384/

Почитать про задачи о размене: https://neerc.ifmo.ru/wiki/index.php?title=Задача_о_рюкзаке#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B0_.D0.BE_.D1.80.D0.B0.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5

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

Показать весь текст

134 9 дек, 19:39 134 1308685

Делаю телеграм-бота.
С локального сервера или через браузер все работает, но при отправлении текста из сервера "Aukštųjų" превращается в "Auk", а с urlencode в "Auk&#353;t&#371;j&#371;". Что делать? Использую Heroku, если это важно.

Ответы10142

135 9 дек, 19:56 135 1308690

>>1305368 (OP)
ОП, что там с решением задачки TestHub? Есть какие-то варианты? Не совсем понимаю как сделать БД для вопросов с несколькими вариантами ответа.

Ответы08790

136 9 дек, 23:53 136 1308790

>>1308690

Мы же вроде обсуждали это где-то выше. Можно использовать такую схему:

- вопросы - questions
- варианты ответов - options - связаны с вопросами как M-1
- сеанс теста - session
- ответ на вопрос - answer, связан с session и questions
- выбранные варианты ответов - selected_options, связаны с answer и options

137 10 дек, 03:43 137 1308850

Ответы на посты предыдущего треда с 305 до конца

>>1299989

> Почему не открывается страница в браузере из PHPStorm.

Тебе надо проверить настройки PHPStorm, вот этот раздел

https://www.jetbrains.com/help/phpstorm/settings-tools-web-browsers.html
https://www.jetbrains.com/help/phpstorm/configuring-local-interpreter.html

>>1299566

> Почему дампы выводятся дважды, причем показывают они разную информацию?

Потому, что код выполняется 2 раза.

>>1299564

> https://ideone.com/AbXtmY правильно ли я решил задачу со школьником взявший кредит на айпад?

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

>>1299056

> Вкатился к вам после 3х месяцев Си (мой первый язык). Пока идёт просто, хочу сразу узнать какая самая сложная тема в пхп для новичков

Ссылки и ООП наверно.

137 10 дек, 03:43 137 1308850

Ответы на посты предыдущего треда с 305 до конца

>>1299989

> Почему не открывается страница в браузере из PHPStorm.

Тебе надо проверить настройки PHPStorm, вот этот раздел

https://www.jetbrains.com/help/phpstorm/settings-tools-web-browsers.html
https://www.jetbrains.com/help/phpstorm/configuring-local-interpreter.html

>>1299566

> Почему дампы выводятся дважды, причем показывают они разную информацию?

Потому, что код выполняется 2 раза.

>>1299564

> https://ideone.com/AbXtmY правильно ли я решил задачу со школьником взявший кредит на айпад?

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

>>1299056

> Вкатился к вам после 3х месяцев Си (мой первый язык). Пока идёт просто, хочу сразу узнать какая самая сложная тема в пхп для новичков

Ссылки и ООП наверно.

Показать весь текст

138 10 дек, 03:44 138 1308851

>>1298694

> Если по мануалу опа я не смог в MVC - я сильно тупой?

Мануал может быть написан не идеально, лучше задать вопрос в треде.

>>1298653

> https://repl.it/@underbottom/words-out-of-digits - Числа прописью.

> function makeThree($number) {
> $number/=1000;
Тут стоит сделать округление, а то % рассчитан на работу с целыми числами.

> function makeWordOfKeys ($number,$currencyName) {
Эта функция выглядит усложненно. Вот я писал другому анону про то, какие должны быть функции, прочитай пост: https://phpclub.tech/pr/res/1281608.html#1304593

> Видимо ты не понял идею разбиения кода на функции. Суть в том, что длинный кусок кода, который делает несколько вещей, сложно понять. Его сложно править, в нем много переменных, и можно нечаянно что-то сломать. Ну и физически прочитать 1000 или 10 000 строк кода быстро невозможно. Поэтому код разбивают на отдельные действия и выносят эти действия в функции. Так, что мы можем вместо огромной портянки кода читать только небольшую функцию, которая нас интересует.

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

> Вот пример более адекватной функции:

> /＊＊
> ＊ Принимает на вход целое число от 0 до 999 и возвращает его
> ＊　текстовое представление.
> ＊
> ＊　Например, для числа 312 вернет "триста двенадцать".
> ＊/
> function spellNumber(int $number): string
>
> Согласись, что даже если ты не прочитал код функции, ты из описания уже понимаешь, что она делает, и как ее можно использовать. Например, так:
>
> echo spellNumber(123) . "\n";
>
> Комментарий　/＊＊　... ＊/ - это комментарий в формате phpdoc ( https://ru.wikipedia.org/wiki/PHPDoc ). Слово int и string - это тайп-хинты, советую их изучить:
>
> - http://php.net/manual/ru/functions.arguments.php#functions.arguments.type-declaration
> - http://php.net/manual/ru/functions.returning-values.php
>
> То есть ты должен в идеале каждую функцию так описать. Если ты не можешь понятно описать назначение функции и формат ее аргументов, то скорее всего, ты что-то неудачно спроектировал.

Функция makeWordOfKeys несамостоятельна и неуниверсальна. Она принимает на вход массив из 3 чисел и массив из 9 слов (это кстати не описано в комментариях и надо самому догадываться). И она явно привязана к другой функции, которая содержит этот массив из 9 слов. Лучше было бы сделать функцию, которая получает на вход число, формы слов и выбирает одну из форм. Тогда она будет достаточно отделена от остального кода. А так, у тебя это просто продолжение другой функции.

Вдобавок, в ней еще куча копипасты.

Та же проблема с makeWordOfThree. Непонятно, почему она должна получать именно массив из 3 чисел, а не одно число, например. И написание цифр лучше не передавать в нее, а поместить либо в нее, либо в отдельную функцию. В аргументы мы передаем значения, которые влияют на работу функции. Но этот массив с написанием чисел всегда одинаков и его передавать не надо.

138 10 дек, 03:44 138 1308851

>>1298694

> Если по мануалу опа я не смог в MVC - я сильно тупой?

Мануал может быть написан не идеально, лучше задать вопрос в треде.

>>1298653

> https://repl.it/@underbottom/words-out-of-digits - Числа прописью.

> function makeThree($number) {
> $number/=1000;
Тут стоит сделать округление, а то % рассчитан на работу с целыми числами.

> function makeWordOfKeys ($number,$currencyName) {
Эта функция выглядит усложненно. Вот я писал другому анону про то, какие должны быть функции, прочитай пост: https://phpclub.tech/pr/res/1281608.html#1304593

> Видимо ты не понял идею разбиения кода на функции. Суть в том, что длинный кусок кода, который делает несколько вещей, сложно понять. Его сложно править, в нем много переменных, и можно нечаянно что-то сломать. Ну и физически прочитать 1000 или 10 000 строк кода быстро невозможно. Поэтому код разбивают на отдельные действия и выносят эти действия в функции. Так, что мы можем вместо огромной портянки кода читать только небольшую функцию, которая нас интересует.

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

> Вот пример более адекватной функции:

> /＊＊
> ＊ Принимает на вход целое число от 0 до 999 и возвращает его
> ＊　текстовое представление.
> ＊
> ＊　Например, для числа 312 вернет "триста двенадцать".
> ＊/
> function spellNumber(int $number): string
>
> Согласись, что даже если ты не прочитал код функции, ты из описания уже понимаешь, что она делает, и как ее можно использовать. Например, так:
>
> echo spellNumber(123) . "\n";
>
> Комментарий　/＊＊　... ＊/ - это комментарий в формате phpdoc ( https://ru.wikipedia.org/wiki/PHPDoc ). Слово int и string - это тайп-хинты, советую их изучить:
>
> - http://php.net/manual/ru/functions.arguments.php#functions.arguments.type-declaration
> - http://php.net/manual/ru/functions.returning-values.php
>
> То есть ты должен в идеале каждую функцию так описать. Если ты не можешь понятно описать назначение функции и формат ее аргументов, то скорее всего, ты что-то неудачно спроектировал.

Функция makeWordOfKeys несамостоятельна и неуниверсальна. Она принимает на вход массив из 3 чисел и массив из 9 слов (это кстати не описано в комментариях и надо самому догадываться). И она явно привязана к другой функции, которая содержит этот массив из 9 слов. Лучше было бы сделать функцию, которая получает на вход число, формы слов и выбирает одну из форм. Тогда она будет достаточно отделена от остального кода. А так, у тебя это просто продолжение другой функции.

Вдобавок, в ней еще куча копипасты.

Та же проблема с makeWordOfThree. Непонятно, почему она должна получать именно массив из 3 чисел, а не одно число, например. И написание цифр лучше не передавать в нее, а поместить либо в нее, либо в отдельную функцию. В аргументы мы передаем значения, которые влияют на работу функции. Но этот массив с написанием чисел всегда одинаков и его передавать не надо.

Показать весь текст

139 10 дек, 03:45 139 1308852

>>1298054

> Квантификаторы - условия задаваемые выражению внутри скобок.
нет, квантификаторы - это символы, которые задают число повторов идущего перед ними символа или выражения. Например: ?, +, ＊, {...}

> 2) Фигурные скобки. Внутри них задаётся число повторений от n до m.
Верно.

> 3) Круглые скобки - объединяют набор символов и квантификаторов в один элемент(тупая формулировка наверное).
Верно.

> задачка. Число находим вот так [\d]+. Найти число с запятой [\d]+(\,\s).
> >[\d]+(\,\s)＊

Нет, неверно. У тебя написано:

искать число, за ним выражение ( запятая, пробел ), которое повторяется любой число раз.

То есть твое выражение это:

число (запятая пробел)＊

Но нам надо искать число, за которым может идти сколько угодно других чисел через запятую:

число (пробелы запятая пробелы число)＊

Попробуй записать это на языке регулярок.

>>1298000

> https://repl.it/@underbottom/povtorenie1 - (исправление пробелов и заглавные буквы)

Здесь можно было обойтись одним preg_replace:

> $regexp = "/(\S+)(\s)([,.!?:;]+)(\s)/ui";
> $text = preg_replace($regexp,"$1$3",$text);
> $regexp = "/([,.?!:;]+)([a-zа-яё0-9]+)/ui";
> $text = preg_replace($regexp,"$1 $2",$text);

В первом выражении [,.!?:;]+ квантификатор плюс "жадный" ( http://php.net/manual/ru/regexp.reference.repetition.php ) и захватит максимально возможное число символов в тексте. То есть, если там будет многоточие, то эта конструкция захватит все точки в нем. И потому можно одним preg_replace и убрать лишние пробелы, и добавить один пробел после знака.

> function makeLetterUp ($match) {
Эта функция сделана не очень логично, что она принимает массив, а не строку с буквой. Для использования с preg_replace_callback выгоднее было бы использовать анонимную функцию:

$upcaseLetter = function ($match) { ... };
...preg_replace_callback(..., $upcaseLetter);

Или вообще, убрав переменную:

...preg_replace_callback(..., function ($match) {
...
});

Почитать: http://php.net/manual/ru/functions.anonymous.php

Также, у тебя отдельно меняется регистр первой буквы в тексте, а отдельно - первых букв в предложениях. Можно было бы объединить это в одно действие.

А так, решено верно.

> https://repl.it/@underbottom/repeat4 - поправил недочёты.

> [^\\s]
Можно просто \\S

> $changedText=str_replace("здел","сдел",$changedText);
Слово "раздел" будет заменено на "расдел".

> [^,а-я0-9a-z]
ё не входит в диапазон а-я и его надо указывать отдельно.

> (а|но\s)

Здесь \s относится только к "но", но не к "а". Также, здесь проще использовать \b, чтобы указать, что там должна быть граница слова.

В общем, пока тут есть проблемы.

> https://repl.it/@underbottom/repeat3 - Исправил. Я перемудрил.

Ок, верно.

> https://repl.it/@underbottom/value-credit - долго думал, как реализовать вычисления наименьшей цены. Оказалось min сравнивая массивы берёт только валью нулевой строки.(пытался ставить миллион дней результат не поменялся).

Если 3 банка, то можно просто поставить 2 if. Также, можно сделать цикл по массиву, сравнивая каждый элемент с ранее найденным мин. значением. Также, можно отсортировать массив и взять первый элемент.

> $result [0] = 0;
> $result [1] = $i;

Это не очень понятный код, так как непонятно, что хранится в элементах массива. Что значит $result[0]? Лучше использовать переменные, а в конце функции написать:

return [$price, $bankName, ..];

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

Я, кстати, не знал про такое использование min() и не встречал такое нигде. Но почему бы и нет.

Решено верно, но код мог бы быть понятнее.

> https://repl.it/@underbottom/ExcitingUnimportantExperiments - переделал регулярку, уверен, что нужно не так. Но вроде работает.

Ошибка 404 при попытке открыть ссылку.

> https://repl.it/@underbottom/repeat1 - переделал регулярку и способ решения.

> $phone = preg_replace ("/\+7/","8",$phone);
тут стоило добавить привязку к началу строки, а то +7 может быть и в середине. В остальном верно.

> https://repl.it/@underbottom/exam-after-chapter - опять перемудрил. Исправил.

Твоя программа считает одиночную латинскую букву вроде x или z ошибкой: https://repl.it/repls/ForsakenUnitedFreesoftware

Также, она должна бы находить русские буквы в латинских словах.

> https://repl.it/@underbottom/yodashuffler

> $word = [];
> $phrases = [];
Эти глобальные переменные никак не используются.

> function makeYodaStyleText($text) {
> $phrases = [];
> $i = 0;
Это можно было не писать.

> ([.|!|?|;])
В квадратных скобках верт. черта не является спецсимволом и не имеет специального значения. Надо писать либо [.!?;] либо \.|!|\?|; . И круглые скобки не нужны тут. Что они делают тут?

> foreach ($word as $idinahooi) {
$words as $word. Как читать твою программу?

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

В общем, сильно переусложнено.

139 10 дек, 03:45 139 1308852

>>1298054

> Квантификаторы - условия задаваемые выражению внутри скобок.
нет, квантификаторы - это символы, которые задают число повторов идущего перед ними символа или выражения. Например: ?, +, ＊, {...}

> 2) Фигурные скобки. Внутри них задаётся число повторений от n до m.
Верно.

> 3) Круглые скобки - объединяют набор символов и квантификаторов в один элемент(тупая формулировка наверное).
Верно.

> задачка. Число находим вот так [\d]+. Найти число с запятой [\d]+(\,\s).
> >[\d]+(\,\s)＊

Нет, неверно. У тебя написано:

искать число, за ним выражение ( запятая, пробел ), которое повторяется любой число раз.

То есть твое выражение это:

число (запятая пробел)＊

Но нам надо искать число, за которым может идти сколько угодно других чисел через запятую:

число (пробелы запятая пробелы число)＊

Попробуй записать это на языке регулярок.

>>1298000

> https://repl.it/@underbottom/povtorenie1 - (исправление пробелов и заглавные буквы)

Здесь можно было обойтись одним preg_replace:

> $regexp = "/(\S+)(\s)([,.!?:;]+)(\s)/ui";
> $text = preg_replace($regexp,"$1$3",$text);
> $regexp = "/([,.?!:;]+)([a-zа-яё0-9]+)/ui";
> $text = preg_replace($regexp,"$1 $2",$text);

В первом выражении [,.!?:;]+ квантификатор плюс "жадный" ( http://php.net/manual/ru/regexp.reference.repetition.php ) и захватит максимально возможное число символов в тексте. То есть, если там будет многоточие, то эта конструкция захватит все точки в нем. И потому можно одним preg_replace и убрать лишние пробелы, и добавить один пробел после знака.

> function makeLetterUp ($match) {
Эта функция сделана не очень логично, что она принимает массив, а не строку с буквой. Для использования с preg_replace_callback выгоднее было бы использовать анонимную функцию:

$upcaseLetter = function ($match) { ... };
...preg_replace_callback(..., $upcaseLetter);

Или вообще, убрав переменную:

...preg_replace_callback(..., function ($match) {
...
});

Почитать: http://php.net/manual/ru/functions.anonymous.php

Также, у тебя отдельно меняется регистр первой буквы в тексте, а отдельно - первых букв в предложениях. Можно было бы объединить это в одно действие.

А так, решено верно.

> https://repl.it/@underbottom/repeat4 - поправил недочёты.

> [^\\s]
Можно просто \\S

> $changedText=str_replace("здел","сдел",$changedText);
Слово "раздел" будет заменено на "расдел".

> [^,а-я0-9a-z]
ё не входит в диапазон а-я и его надо указывать отдельно.

> (а|но\s)

Здесь \s относится только к "но", но не к "а". Также, здесь проще использовать \b, чтобы указать, что там должна быть граница слова.

В общем, пока тут есть проблемы.

> https://repl.it/@underbottom/repeat3 - Исправил. Я перемудрил.

Ок, верно.

> https://repl.it/@underbottom/value-credit - долго думал, как реализовать вычисления наименьшей цены. Оказалось min сравнивая массивы берёт только валью нулевой строки.(пытался ставить миллион дней результат не поменялся).

Если 3 банка, то можно просто поставить 2 if. Также, можно сделать цикл по массиву, сравнивая каждый элемент с ранее найденным мин. значением. Также, можно отсортировать массив и взять первый элемент.

> $result [0] = 0;
> $result [1] = $i;

Это не очень понятный код, так как непонятно, что хранится в элементах массива. Что значит $result[0]? Лучше использовать переменные, а в конце функции написать:

return [$price, $bankName, ..];

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

Я, кстати, не знал про такое использование min() и не встречал такое нигде. Но почему бы и нет.

Решено верно, но код мог бы быть понятнее.

> https://repl.it/@underbottom/ExcitingUnimportantExperiments - переделал регулярку, уверен, что нужно не так. Но вроде работает.

Ошибка 404 при попытке открыть ссылку.

> https://repl.it/@underbottom/repeat1 - переделал регулярку и способ решения.

> $phone = preg_replace ("/\+7/","8",$phone);
тут стоило добавить привязку к началу строки, а то +7 может быть и в середине. В остальном верно.

> https://repl.it/@underbottom/exam-after-chapter - опять перемудрил. Исправил.

Твоя программа считает одиночную латинскую букву вроде x или z ошибкой: https://repl.it/repls/ForsakenUnitedFreesoftware

Также, она должна бы находить русские буквы в латинских словах.

> https://repl.it/@underbottom/yodashuffler

> $word = [];
> $phrases = [];
Эти глобальные переменные никак не используются.

> function makeYodaStyleText($text) {
> $phrases = [];
> $i = 0;
Это можно было не писать.

> ([.|!|?|;])
В квадратных скобках верт. черта не является спецсимволом и не имеет специального значения. Надо писать либо [.!?;] либо \.|!|\?|; . И круглые скобки не нужны тут. Что они делают тут?

> foreach ($word as $idinahooi) {
$words as $word. Как читать твою программу?

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

В общем, сильно переусложнено.

Показать весь текст
Ответы08853

140 10 дек, 03:47 140 1308853

Эти задачи:

https://repl.it/@underbottom/povtorenie1
https://repl.it/@underbottom/repeat4
https://repl.it/@underbottom/repeat3
https://repl.it/@underbottom/value-credit
https://repl.it/@underbottom/ExcitingUnimportantExperiments
https://repl.it/@underbottom/repeat1
https://repl.it/@underbottom/exam-after-chapter
https://repl.it/@underbottom/yodashuffler

Проверены тут: >>1308852

141 10 дек, 03:47 141 1308854

>>1297954

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

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

- сетевое программирование и сокеты Беркли
- веб-сокеты и что-то вроде WAMP
- ReactPHP для асинхронной работы с сокетами

Если у тебя однопользовательская игра, проще обойтись без сервера. Если многопользовательская - придется делать сервер. Вот тут я писал, как это делают в настоящих играх: https://phpclub.tech/pr/res/1281608.html#1304936

Ты можешь делать на PHP, но если хочешь максимум производительности и десятки тысяч пользователей, то придется задействовать Си/Го/Раст/D/Java - что-то из этого набора. Но если ты не игровая студия, то можно и на PHP сделать.

142 10 дек, 03:48 142 1308856

>>1297952

> Анончики, требуется помощь с задачей ОПа.
> Что я накрутил - ([\s\-()]\+7|8)([\s\-()][0-9]){10}$. Не ищет номер с пробелом между + и 7. Очевидным решение будет написать \s* между ними и тогда всё заработает, но сомневаюсь, что это правильное решение

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

>>1297532

>>Потому ArrayObject надо оборачивать:
> То бишь, самому реализовать все нужные интерфейсы?
Да. Ты создаешь свой класс, не унаследованный от ArrayObject, и не обязан сохранять совместимость с ним.

>>1293491

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

Если ты хочешь критику, ты можешь в этот тред выкладывать, может кто-то прокомментирует, или поискать, может есть какие-то форумы, где можно обсудить код. На SO есть https://codereview.stackexchange.com/ , но он на английском - может есть русская версия?

143 10 дек, 03:48 143 1308857

>>1292844

> что делает эта функция? mysqli_fetch_array()
В офиц. мануале написано. Что именно там непонятно?

> И почему в конце mysqli стоит буква i?
Потому что было расширение mysql. Потом сделали улучшенное расширение под названием mysqli (MySQL Improved) и все функции из него имеют этот префикс, чтобы их не перепутали с функциями расширения mysql.

>>1292670

> Единственное что - создаётся ощущение, что я делаю что-то не так. Пока не буду выкидывать код(т.к. он не дописан), но распишу что он из себя представляет. Надеюсь что Добрый Анон скажет где я проебался.

Извини, без примеров кода это трудно.

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

Можно.

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

Зато ты можешь создать объект класса-наследника и на нем вызвать этот метод.

144 10 дек, 03:48 144 1308858

>>1292672

> И да, я столкнулся со вполне очевидной проблемой - не могу найти общую сумму т.к. все свойства объектов я сам же и защитил.

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

>>1292613

> Задача про калькулятор
> https://ideone.com/kW3eWB

eval() лучше избегать по нескольким причинам. Например, что если у тебя нет достаточной фильтрации и пользователь сможет в математическое выражение засунуть вредоносный код, который eval выполнит? Тут он не требуется. Проще сделать функцию вычисления результата с if/elseif внутри.

Вот если ты не боишься очень сложного кода, посмотри, как разработчики PHPExcel реализовали вычисление выражений: https://github.com/PHPOffice/PhpSpreadsheet/blob/develop/src/PhpSpreadsheet/Calculation/Calculation.php

Функции strpos, strlen надо избегать, так как они не поддерживают utf-8: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

Команда

$op;

выглядит странно.

Переменную $flag нужно назвать более осмысленно, чтобы было понятно, что в ней.

145 10 дек, 03:49 145 1308859

>>1291781

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

>>1308429

> public function addRooms(array $roomsForAdding)
Это неудобная функция, так как непонятно, какого формата массив в нее передается. Логичнее было принимать сразу массив объектов-комнат. Это гораздо гибче, так как в таком случае можно как угодно настроить эти комнаты, и даже передать вместо комнаты ее наследника (правда, не очень представляю, зачем). А у тебя - нельзя.

Или хотя бы сделать функцию addRoom() с человекопонятными параметрами.

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

> echo "Добро пожаловать в гостиницу '$name'";
Это для отладки? в реальном коде такого быть не должно. Представь, ты хочешь на сайте вывести информацию о комнатах, создаешь объект, а он пользователю на страницу выводит надпись "добро пожаловать", причем в самом верху страницы, еще до шапки, и в неправильной кодировке (так как метатег, задающий кодировку, еще не передан).

Гостиница не должна сама ничего выводить. Она только принимает и возвращает значения.

> public function checkGuests(array $guestsList, string $entryDate, string $departureDate)
> string $entryDate
Почему не DateTimeInterface? У нас уже есть объект для представления времени. Это избавляет нас от необходимости проверять правильность строки, например.

> public function checkGuests(array $guestsList, string $entryDate, string $departureDate)
Стоит добавить проверку, что вторая дата больше первой. Это позволит быстро обнаружить ошибку программиста. А так - ошибка останется не замеченной, просто не получится заселить гостей, как будто номеров нету. Это собьет всех с толку и затруднит обнаружение причины проблемы.

> // сортировка пузырьком по (цене/кол-во гостей) по возрастанию
usort тут не подходит? Надо как минимум это выносить в отдельную функцию, это же тяжело читать, там такие многоэтажные выражения.

> $guestsForRegestration = array_slice($guestsList, 0, $roomForRegestration->getCapacity());
> $guestsList = array_slice($guestsList, $roomForRegestration->getCapacity());

Есть array_splice для этого.

В общем, checkGuests слишком большая для понимания, надо ее уменьшить. И кстати, у тебя есть 2 пути - регистрация всех в одном номере и регистрация в нескольких номерах - но ведь первое это частный случай второго и можно использовать для них один и тот же код.

> public function printFreeRooms
Гостиница ничего не выводит. Она должна просто вернуть данные. Выводом занимается внешний код. Разделение ответственности.

> public function printGuestHistory(string $name)
Стоило бы Гостя тоже сделать объектом, можно даже без полей. Ну и интуиция подсказывает, что Гостиница захочет знать, кто вместе с кем приезжает, потому может понадобиться даже ГруппаГостей. Но делать ее пока не надо, раз это не просят.

> if (in_array($name, $regestration->getGuests())) {
Лучше бы сравнивать не имена, а сами объекты. Объект обладает идентичностью, он уникален, и подходит для сравнения.

> for ($fromTheDate; $fromTheDate <= $toTheDate; $fromTheDate->add(new DateInterval('P1D'))) {
> $dailyIncome = 0;
> foreach($this->regestrations as $regestration) {
А нельзя ли тут как-то оптимизироваться за счет, например, сортировки броней по дате? Или, например, первым проходом отсеять брони, попавшие в интервал, а вторым - пройтись по ним и посчитать массив сумм по дням. А то у тебя тут сложность O(days x regestrationsCount) получается.

> if (($entryDate >= $regestration->getEntryDate() && $departureDate <= $regestration->getDepartureDate()) ||

А можно еще сделать if ($regestration->includes($entyrDate)) или даже $regestration->intersects($entry, $departure). Это повысит читабельность. А то ты относишься к объектам как к массивам, которые ничего не умеют кроме хранения данных и ничего сами сделать не способны.

Также, здесь можно было ради читабельности сократить $regestration до $r.

> array_splice($freeRooms, $key, 1);
Плохая новость: у array_splice и у array_search сложность O(N), а у array_key_exists/unset() всего лишь O(1), то есть гораздо быстрее. Массивы заточены на поиск по ключу, а не значению. Можно бы оптимизировать, заменив splice на unset. Еще один вариант - использовать SplObjectStorage, который умеет хранить коллекцию объектов как ключи массива и искать или удалять их за O(1).

Если у нас 100 номеров и 10 000 броней, то получается порядка 100 x 10 000 шагов, а с оптимизацией - в 100 раз меньше.

Это конечно задача на ООП, но почему бы заодно не поучиться оптимизации?

> public function __construct(Room $room, DateTimeImmutable $entryDate, DateTimeImmutable $departureDate, array $guestsList) {

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

И еще, для проверки можно бы использовать юнит-тесты. Вот я тут подробно про них писал: https://phpclub.tech/pr/res/1281608.html#1303707

И вот что у анона получилось: https://ideone.com/Kj2GBG

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

> Как правильно разбивать построчно различные конструкции. Вот примеры у меня в коде - 55-60 строки (сокращенный if), 188-192 строки (длинное условие в if-е), 268-274 строки (массив).

А точно ли PSR не говорит?

> 5. Управляющие конструкции
> Перед закрывающими круглыми скобками НЕ ДОЛЖНО быть пробелов.
> Между закрывающей круглой скобкой и открывающей фигурной скобкой ДОЛЖЕН быть один пробел.

Тут кое-что написано. У тебя явно не выполняется требование про отсутствие пробелов перед круглой скобкой.

А вообще, если что-то не определено в PSR, и есть несколько вариантов, то лучше определить это в документации к проекту или в внутрикорпоративном стандарте. Можно также посмотреть, как это сделано в Симфони и сделать так же: https://github.com/symfony/symfony

Также, можно почитать https://github.com/php-fig/fig-standards и поднять вопрос в их mailing list. Например, предложить свой вариант стандарта. Вот здесь ты можешь почитать, как неспешно идет обсуждение новых стандартов: https://groups.google.com/forum/#!forum/php-fig

145 10 дек, 03:49 145 1308859

>>1291781

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

>>1308429

> public function addRooms(array $roomsForAdding)
Это неудобная функция, так как непонятно, какого формата массив в нее передается. Логичнее было принимать сразу массив объектов-комнат. Это гораздо гибче, так как в таком случае можно как угодно настроить эти комнаты, и даже передать вместо комнаты ее наследника (правда, не очень представляю, зачем). А у тебя - нельзя.

Или хотя бы сделать функцию addRoom() с человекопонятными параметрами.

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

> echo "Добро пожаловать в гостиницу '$name'";
Это для отладки? в реальном коде такого быть не должно. Представь, ты хочешь на сайте вывести информацию о комнатах, создаешь объект, а он пользователю на страницу выводит надпись "добро пожаловать", причем в самом верху страницы, еще до шапки, и в неправильной кодировке (так как метатег, задающий кодировку, еще не передан).

Гостиница не должна сама ничего выводить. Она только принимает и возвращает значения.

> public function checkGuests(array $guestsList, string $entryDate, string $departureDate)
> string $entryDate
Почему не DateTimeInterface? У нас уже есть объект для представления времени. Это избавляет нас от необходимости проверять правильность строки, например.

> public function checkGuests(array $guestsList, string $entryDate, string $departureDate)
Стоит добавить проверку, что вторая дата больше первой. Это позволит быстро обнаружить ошибку программиста. А так - ошибка останется не замеченной, просто не получится заселить гостей, как будто номеров нету. Это собьет всех с толку и затруднит обнаружение причины проблемы.

> // сортировка пузырьком по (цене/кол-во гостей) по возрастанию
usort тут не подходит? Надо как минимум это выносить в отдельную функцию, это же тяжело читать, там такие многоэтажные выражения.

> $guestsForRegestration = array_slice($guestsList, 0, $roomForRegestration->getCapacity());
> $guestsList = array_slice($guestsList, $roomForRegestration->getCapacity());

Есть array_splice для этого.

В общем, checkGuests слишком большая для понимания, надо ее уменьшить. И кстати, у тебя есть 2 пути - регистрация всех в одном номере и регистрация в нескольких номерах - но ведь первое это частный случай второго и можно использовать для них один и тот же код.

> public function printFreeRooms
Гостиница ничего не выводит. Она должна просто вернуть данные. Выводом занимается внешний код. Разделение ответственности.

> public function printGuestHistory(string $name)
Стоило бы Гостя тоже сделать объектом, можно даже без полей. Ну и интуиция подсказывает, что Гостиница захочет знать, кто вместе с кем приезжает, потому может понадобиться даже ГруппаГостей. Но делать ее пока не надо, раз это не просят.

> if (in_array($name, $regestration->getGuests())) {
Лучше бы сравнивать не имена, а сами объекты. Объект обладает идентичностью, он уникален, и подходит для сравнения.

> for ($fromTheDate; $fromTheDate <= $toTheDate; $fromTheDate->add(new DateInterval('P1D'))) {
> $dailyIncome = 0;
> foreach($this->regestrations as $regestration) {
А нельзя ли тут как-то оптимизироваться за счет, например, сортировки броней по дате? Или, например, первым проходом отсеять брони, попавшие в интервал, а вторым - пройтись по ним и посчитать массив сумм по дням. А то у тебя тут сложность O(days x regestrationsCount) получается.

> if (($entryDate >= $regestration->getEntryDate() && $departureDate <= $regestration->getDepartureDate()) ||

А можно еще сделать if ($regestration->includes($entyrDate)) или даже $regestration->intersects($entry, $departure). Это повысит читабельность. А то ты относишься к объектам как к массивам, которые ничего не умеют кроме хранения данных и ничего сами сделать не способны.

Также, здесь можно было ради читабельности сократить $regestration до $r.

> array_splice($freeRooms, $key, 1);
Плохая новость: у array_splice и у array_search сложность O(N), а у array_key_exists/unset() всего лишь O(1), то есть гораздо быстрее. Массивы заточены на поиск по ключу, а не значению. Можно бы оптимизировать, заменив splice на unset. Еще один вариант - использовать SplObjectStorage, который умеет хранить коллекцию объектов как ключи массива и искать или удалять их за O(1).

Если у нас 100 номеров и 10 000 броней, то получается порядка 100 x 10 000 шагов, а с оптимизацией - в 100 раз меньше.

Это конечно задача на ООП, но почему бы заодно не поучиться оптимизации?

> public function __construct(Room $room, DateTimeImmutable $entryDate, DateTimeImmutable $departureDate, array $guestsList) {

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

И еще, для проверки можно бы использовать юнит-тесты. Вот я тут подробно про них писал: https://phpclub.tech/pr/res/1281608.html#1303707

И вот что у анона получилось: https://ideone.com/Kj2GBG

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

> Как правильно разбивать построчно различные конструкции. Вот примеры у меня в коде - 55-60 строки (сокращенный if), 188-192 строки (длинное условие в if-е), 268-274 строки (массив).

А точно ли PSR не говорит?

> 5. Управляющие конструкции
> Перед закрывающими круглыми скобками НЕ ДОЛЖНО быть пробелов.
> Между закрывающей круглой скобкой и открывающей фигурной скобкой ДОЛЖЕН быть один пробел.

Тут кое-что написано. У тебя явно не выполняется требование про отсутствие пробелов перед круглой скобкой.

А вообще, если что-то не определено в PSR, и есть несколько вариантов, то лучше определить это в документации к проекту или в внутрикорпоративном стандарте. Можно также посмотреть, как это сделано в Симфони и сделать так же: https://github.com/symfony/symfony

Также, можно почитать https://github.com/php-fig/fig-standards и поднять вопрос в их mailing list. Например, предложить свой вариант стандарта. Вот здесь ты можешь почитать, как неспешно идет обсуждение новых стандартов: https://groups.google.com/forum/#!forum/php-fig

Показать весь текст

146 10 дек, 03:49 146 1308860

ОП, а ты богатый?

147 10 дек, 04:31 147 1308865

Я помню неделю-другую назад тут был разговор про ковариантность и контрвариантность и приведен пример, не работавший в PHP:

class Child extends Parent {};
interface X
{
public function get(): Parent;
}

interface Y extends X
{
public function get(): Child;
}

Готовится изменение, которое это разрешит: https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters

148 10 дек, 04:49 148 1308868

Также, в дополнение к PSR-1 и PSR-2 готовится еще один стайл гайд - PSR-12 (в чем вы можете убедиться, зайдя на https://www.php-fig.org/psr/ ): https://github.com/php-fig/fig-standards/blob/master/proposed/extended-coding-style-guide.md

Кто там хотел больше правил? Налетайте.

Стандарт еще не принят и можно вносить пожелания и отмечать недостатки вот тут: https://groups.google.com/forum/#!forum/php-fig (читайте правила прежде чем постить).

Ответы09694

149 10 дек, 11:04 149 1308946

Посаны, можно ли с помощью call_user_func_array вызвать не статический метод?

Ответы09144

150 10 дек, 11:48 150 1308962

Посмотрел требования в куче вакансий, чет охуел, при том что я не первый месяц php дрочу. Что нужно знать, чтобы вкатиться: html, css, php (ООП, MVC), опыт больше года, sql, laravel или yii2 (остальные фреймворки гораздо реже), js, linux, git, еще куча всякой хуеты. Часто в требованиях дополнительно встречается jquery, еще какие нибудь джс фреймворки, битрикс, всякие цмс вроде джумлы или вордпресса. Иногда требуется вышка. Реже техническая вышка. Еще реже профильная. Понятно, что выучить sql на уровне 'select * from %huina%' можно очень быстро, но если по всей этой хуете требуют глубокие знания, то это учить заебешься. Есть конечно и вакансии аля PHP, sql, js, html, css даже без фреймворков и прочего, но их гораздо меньше.

151 10 дек, 15:09 151 1309030

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

Вот пока то, что накалякал за сегодня по примерам: https://ideone.com/pG9yPF
Использовал вот этот подход https://phpdelusions.net/pdo_examples/insert#multiple как пример.

Тестовую дату из двух значений она отработала, а вот на 300 массивов по 16 значений уже не переваривает (белый экран без ошибок на локалке с включеным error_reporting(-1); )

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

Ответы0913409692

152 10 дек, 18:15 152 1309134

>>1309030
Губу закатай - с хайлоадом надо ебстись порядочно и простой функцией тут не отделаешься.

Ответы09297

153 10 дек, 18:32 153 1309144

>>1308946
Д - документация.

Ответы09679

154 10 дек, 23:26 154 1309297

>>1309134
Это не особо хайлолад. Просто есть csv файлы которые нужно парсить раз в месяц. В самом большом файле 1.1милиона строк пока.

Ответы09887

155 10 дек, 23:28 155 1309299

Подкиньте материалов по хуйло аду.

156 11 дек, 15:11 156 1309639

Authorizer.authenticate(() => {this.setState({redirectToReferrer: true})}) читаемый формат записи?

Или лучше поставить пробельчики Authorizer.authenticate(() => { this.setState({ redirectToReferrer: true }) })?

Или ещё лучше переносить всё на новую строку?

Authorizer.authenticate(() => {
this.setState(
{
redirectToReferrer: true
}
)
});

Ответы10254

157 11 дек, 16:32 157 1309679

>>1309144
Я нуфаг и ничего не понимаю че там написано

Ответы09690

158 11 дек, 16:50 158 1309690

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

Ответы09696

159 11 дек, 16:58 159 1309692

>>1309030
>10 000 записей.
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/batch-processing.html

160 11 дек, 17:01 160 1309694

>>1308868
Бесполезная хуйня

161 11 дек, 17:03 161 1309696

>>1309690
Бро ты прав как никто. Просто меня пугает документация т.к. раньше я вобще не понимал ни слова там и поэтому мне легче спросить.
Я посидел сейчас 5 блять минут в гугле и всё понял лол

162 11 дек, 17:04 162 1309699

Но так или иначе, официальную документацию мне всё равно сложно воспринимать. Я могу использовать ее как дополнение к объяснению от какого то живого человека.
Как с этим бороться?

Ответы09708

163 11 дек, 17:17 163 1309708

>>1309699
>Как с этим бороться?
Учить PHP. Именно понимание документации показывает твой уровень владения.
Я тоже раньше боялся, а вчера себя поймал на том, что одним глазом смотрю стрим, а вторым - читаю php.net впрок.
Теперь пугаюсь гитхабов и прочих толстых библиотек.

Привыкай короче.

164 11 дек, 18:33 164 1309754

Прост желаю выговориться, но если советом поможете будет не плохо
Значит школьник, 17лвл. В течении 2-х месяцев нужно начать, как минимум самому себя содержать а желательно чуть больше и шоб жить было где. Так вот, прочел значит я летом 4-е издание Робин Никсона "Создаем Динамические сайты...", и еще посоздавал всякого чисто для себя, совсем не мног. Чуть чуть почитал статей да мануала. Естественно немног из того, что рекомендует ОП.
Вроде не глупый, да и в теме нравиться разбиратся. Я очень хорошо обучаюс и готов впахивать. Но тут у меня возникают проблеммы с вектором развития: я просто не понимаю, что за чем будет эффективнее, и в какой момент я стану востребованным юниором. Хочу выйти хотя бы уверенно на фриланс, но пока точно не справлюсс.
Умею еще видосики нарезать, но не более.
Как лучше мне сейчас поступить?
P.S.
Понятно, что сидеть просто так я и сейчас не буду. Просто хотелось бы узнать твою точку зрения анон.
P.P.S.
Наверн часто подобное влетает в тред?

Ответы0976510676

165 11 дек, 18:39 165 1309758

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

Ответы0976109814

166 11 дек, 18:53 166 1309761

>>1309758
>Зачем вобще нужен механизм наследования абстрактных классов
Чтобы C++ дебилам было дегче стать Java дебилам.

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

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

167 11 дек, 19:02 167 1309765

>>1309754
> 2-х месяцев
Идешь на ВСЕ фриланс биржи, ищешь заказы на WordPress, берешь и делаешь сидишь по 8 и хуяришь, получаешь свои гроши.

Ответы09785

168 11 дек, 19:31 168 1309785

>>1309765
Могу попробовать, но с WP не особо дружу, да и не очень он мне нравиться. Как вариант, спасибо

169 11 дек, 20:30 169 1309814

>>1309758

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

> Зачем вобще нужен механизм наследования абстрактных классов

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

> если можно тупо создать класс со статическим методом и вызывать его где только можно?

А зачем создавать статический метод, если можно сделать просто функцию? И твой вопрос становится равносилен вопросу "А зачем использовать ООП". Ради упрощения сложного кода, разделения кода на независимые части, ради использования инкапсуляции.

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

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

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

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

class Element
{
abstract public function getPinCount();
}

Класс резистора определит его как

class Resistor extends Element
{
public function getPinCount()
{
return 2;
}
}

А у транзистора их будет, например, 3. У микросхемы - вообще разное число в зависимости от типа корпуса:

class IC extends Element
{
public function getPinCount()
{
if ($this->packageType == self::DIP_16) {
return 16;
} else ...
...

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

Может, тебе какую-нибудь задачу на абс. классы решить?

Допустим: сделай классы для представления математического выражения в виде дерева объектов. Выражение состоит из таких элементов:

- целое или дробное число: 2, 3.5
- константы: Пи, e (для Пи есть юникодный символ)
- переменная: x, y, hello_world
- сумма, разность: x + 2 + y
- произведение: 3x, 2＊2
- деление: 1/6, (x + 1)/y
- возведение в степень: 2^5
- функции: sin, cos, tan

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

$exp = new Sum(new Number(3), new Variable('x'));

Затем нужно сделать вывод выражения. Выражение выше должно быть выведено как:

3 + x

Затем нужно сделать функцию упрощения выражения. А именно, применить следующие правила:

- в сумме/разности можно сложить все числа в одно: 2 + x + 3 - 1 -> 4 + x
- в произведении можно умножить числа: 2 ＊ 3x -> 6x
- в делении можно делить числа без потери точности: 4/6 -> 2/3, 5x / 5 -> 1x, но нельзя заменить 4/6 на 0.666 так как это не точно. Можно заменить 1.5 / 0.5 -> 3. Нельзя делить на ноль: 2/0 не упрощается.
- в возведении в степень можно заменять числа без потери точности: x ^ (2 ^ 3) -> x^8
- синусы и косинусы для круглых значений можно заменять: sin(pi / 6) -> 1/2.Для некруглых приблизительные вычисления делать нельзя
- можно суммировать одинаковые переменные: 2x + 3x -> 5x
- при умножении на 0 выражение ликвидируется, если в нем нет ошибок: 2x -2x + 3 -> 0x + 3 -> 3. Но нельзя убрать умножение тут: 0 ＊　(2 / 0)
- 0/2 -> 0. 0/x можно заменить на 0 только если x != 0
- умножение/деление на 1 убирается: 1x -> x, y / 1 -> 1
- возведение в 0 степень дает 1, в первую степень - остается то же число: x ^ 1 = x
- можно дополнить список своими правилами

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

{n1} {v1} + {n2}{v2} -> {n1 + n2}{v1}

А программа уже применяет эти шаблоны к выражению. Но это ой как сложно. Зато кратко и понятно.

Уверен, тут ты статическими методами не обойдешься

169 11 дек, 20:30 169 1309814

>>1309758

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

> Зачем вобще нужен механизм наследования абстрактных классов

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

> если можно тупо создать класс со статическим методом и вызывать его где только можно?

А зачем создавать статический метод, если можно сделать просто функцию? И твой вопрос становится равносилен вопросу "А зачем использовать ООП". Ради упрощения сложного кода, разделения кода на независимые части, ради использования инкапсуляции.

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

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

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

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

class Element
{
abstract public function getPinCount();
}

Класс резистора определит его как

class Resistor extends Element
{
public function getPinCount()
{
return 2;
}
}

А у транзистора их будет, например, 3. У микросхемы - вообще разное число в зависимости от типа корпуса:

class IC extends Element
{
public function getPinCount()
{
if ($this->packageType == self::DIP_16) {
return 16;
} else ...
...

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

Может, тебе какую-нибудь задачу на абс. классы решить?

Допустим: сделай классы для представления математического выражения в виде дерева объектов. Выражение состоит из таких элементов:

- целое или дробное число: 2, 3.5
- константы: Пи, e (для Пи есть юникодный символ)
- переменная: x, y, hello_world
- сумма, разность: x + 2 + y
- произведение: 3x, 2＊2
- деление: 1/6, (x + 1)/y
- возведение в степень: 2^5
- функции: sin, cos, tan

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

$exp = new Sum(new Number(3), new Variable('x'));

Затем нужно сделать вывод выражения. Выражение выше должно быть выведено как:

3 + x

Затем нужно сделать функцию упрощения выражения. А именно, применить следующие правила:

- в сумме/разности можно сложить все числа в одно: 2 + x + 3 - 1 -> 4 + x
- в произведении можно умножить числа: 2 ＊ 3x -> 6x
- в делении можно делить числа без потери точности: 4/6 -> 2/3, 5x / 5 -> 1x, но нельзя заменить 4/6 на 0.666 так как это не точно. Можно заменить 1.5 / 0.5 -> 3. Нельзя делить на ноль: 2/0 не упрощается.
- в возведении в степень можно заменять числа без потери точности: x ^ (2 ^ 3) -> x^8
- синусы и косинусы для круглых значений можно заменять: sin(pi / 6) -> 1/2.Для некруглых приблизительные вычисления делать нельзя
- можно суммировать одинаковые переменные: 2x + 3x -> 5x
- при умножении на 0 выражение ликвидируется, если в нем нет ошибок: 2x -2x + 3 -> 0x + 3 -> 3. Но нельзя убрать умножение тут: 0 ＊　(2 / 0)
- 0/2 -> 0. 0/x можно заменить на 0 только если x != 0
- умножение/деление на 1 убирается: 1x -> x, y / 1 -> 1
- возведение в 0 степень дает 1, в первую степень - остается то же число: x ^ 1 = x
- можно дополнить список своими правилами

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

{n1} {v1} + {n2}{v2} -> {n1 + n2}{v1}

А программа уже применяет эти шаблоны к выражению. Но это ой как сложно. Зато кратко и понятно.

Уверен, тут ты статическими методами не обойдешься

Показать весь текст

170 11 дек, 22:28 170 1309887

>>1309297
>Просто есть csv файлы которые нужно парсить раз в месяц. В самом большом файле 1.1милиона строк пока.
Очевидный import numpy as np, pandas as pd очевиден

171 12 дек, 05:02 171 1309980

Чет щас начал вкатываться в PHP после C и у меня ощущение что это тот же C только с ебанутым синтаксисом и поломанный к хуям. Пардон май фрэнч.

Ответы0998110117

172 12 дек, 05:17 172 1309981

>>1309980
так и есть

173 12 дек, 06:32 173 1309989

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

Ответы10071

174 12 дек, 12:29 174 1310071

>>1309989
Привыкай это не только в пыхе, это везде.

175 12 дек, 13:35 175 1310117

>>1309980
Держи в курсе

Ответы10137

176 12 дек, 14:53 176 1310137

>>1310117
Держу в курсе, соси классы свои долбоеб.

Ответы10177

177 12 дек, 15:00 177 1310142

>>1308685
Блядь, запарился уже. Всё перепробовал. Если просто выводишь получаемые данные в браузер и копируешь их, вставляешь в код и отправляешь через heroku же, то все работает. Вручную и через локальный сервер и без этого работает. А когда данные просто получаются извне и отправляются, то обрезаются до первого необычного символа. Все эти utf8_decode, utf8_encode, htmlentities - ничего не помогает, максимум - символы заменяются на &#353;. Как я ненавижу все эти кодировки.

178 12 дек, 15:38 178 1310150

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

17 Кб, 510x111
179 12 дек, 15:53 179 1310153

Помогач.
есть строка на входе. Ищу регляркой там дату в определенном формате. нужно к дате добавить например ЗАЛУПА.

исходная - предлагаю 10.04.2014 пообедать.

Сделать:

предлагаю 10.04.2014 Залупа пообедать.

Ответы10156

180 12 дек, 16:05 180 1310156

>>1310153
угараешь?

Ответы10161

181 12 дек, 16:13 181 1310161

>>1310156
нет. Строку поиска регулярки составил вот в конструкторе. А что дальше делать хз.

Ответы10162

182 12 дек, 16:16 182 1310162

>>1310161

http://php.net/manual/ru/function.preg-replace.php

Ответы10169

183 12 дек, 16:42 183 1310169

>>1310162
ну оно заменит полностью найденое совпадение, а мне надо добавить прост слово к совпадению.

Ответы10170

184 12 дек, 16:53 184 1310170

>>1310169
напиши регулярку, которая будет искать слово пообедать рядом с датой и замени его на залупа пообедать

Ответы1017110191

185 12 дек, 16:54 185 1310171

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

186 12 дек, 17:18 186 1310176

ЛАдно, пытался просто объяснить, чекните мое говно, почему оно не работает?
https://ideone.com/34FAk8

Ответы10199

187 12 дек, 17:24 187 1310177

>>1310137
Сосу свои классы и радуюсь жизни.

Ответы10179

188 12 дек, 17:26 188 1310179

>>1310177
А теперь глотни ка двойной массив который нахуй не нужен.

Ответы10181

52 Кб, 960x540
189 12 дек, 17:28 189 1310181

>>1310179
>двойной массив

190 12 дек, 18:06 190 1310191

>>1310170
Думал это легко сделать, но не тут то было, хыыы, придется массивы городить

Ответы10199

191 12 дек, 18:24 191 1310199

>>1310176
>>1310191

вот сделал 2 массива. Что заменить и на что. Через str_replace чет не выходит

192 12 дек, 19:49 192 1310254

>>1309639
Специально придумали prettier, чтобы каждый разработчик не делал как ему вздумается: https://github.com/prettier/prettier

Я запускаю его так: prettier --print-width=110 --tab-width 4 --single-quote --trailing-comma=es5 --write"

Алсо почему у тебя авторайзер занимается аутентификацией? Почитай про разницу между авторизацией и аутентификацией: https://stackoverflow.com/a/6367931

Ответы10590

193 12 дек, 22:00 193 1310305

JS задачки душные какие-то. Сижу третий час вдупляю в 4-ое

51 Кб, 600x729
194 12 дек, 23:42 194 1310349

>>1305368 (OP)
Как то тут уютно у вас, господа. Пожалуй пополню ваши ряды. Всем добра.

Ответы10397

195 13 дек, 00:08 195 1310371

Че, поцоны, говорят пыха-то мертвый язык.

Ответы1042310446

196 13 дек, 01:03 196 1310397

>>1310349
Добро пожаловать!

197 13 дек, 05:08 197 1310423

>>1310371
На нём говорили древние?

10 Кб, 949x79
198 13 дек, 07:10 198 1310433

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

https://simtech.ru/wp-content/themes/simtechrutheme/book/Brett McLaughlin.PHP and MySQL.- 2013.pdf

первый жи код

<?php
echo "Приветствую вас здесь. Слышал, вы учитесь на PHP-программиста!\n";
echo "Почему бы вам не набрать свое имя для меня:\n";
$name = trim(fgets(STDIN));
echo "\nСпасибо, " . $name . ", очень рад с вами познакомиться.\n\n";
?>

нормально не работает!Ни на сервере(у меня сайт есть), ни в онлайн интерпритаторе. Может кто-нибудь объяснить почему. Буду благодарен.

Ответы10437

21 Кб, 652x142
199 13 дек, 07:38 199 1310437

>>1310433
Потому, что пример нужно выполнить в консоли, через php-cli.

Ответы10445

200 13 дек, 07:53 200 1310445

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

Ответы1044710449

201 13 дек, 07:54 201 1310446

>>1310371
https://habr.com/post/179399/

202 13 дек, 07:55 202 1310447

>>1310445
> даже первый код не запускается
фейспалп.жпг

Ты сначал с консолью разберись

Ответы10450

203 13 дек, 08:10 203 1310449

>>1310445
И пытаться не стоит на данном этапе. Лучше разберись с установкой php, у ОПа есть уроки:
Установка и настройка PHP - https://github.com/codedokode/pasta/blob/master/soft/php-install.md
Как начать пользоваться командной строкой - https://github.com/codedokode/pasta/blob/master/soft/cli.md

Ответы10451

204 13 дек, 08:11 204 1310450

>>1310447

ну да, я не профессионал,не понимаю. Но интересный вопрос зачем это выполнять через консоль?Разве php не дл серверов делалось?

Ответы1046210464

205 13 дек, 08:14 205 1310451

>>1310449
Извини, я кое-что недопонл . Зачем мне его устанавливать на комп? У мне есть сайт на серваке, который поддерживает php. Я уже создал там ряд работающих php скриптов, как то , например : скачивани файлов по паролю , форма обратной свзи, автоматическая отправка email. Все они работают.А этот нет? Почему нельзя примеры из этой книге запускать на сервере своего сайта? Их же наверное можно там как-то применить , иначе какой в них смысл? Уж не думал что имея сайт , придется что-то на комп устанавливать

Буду благодарен ответам.

Ответы10459

206 13 дек, 08:44 206 1310459

>>1310451
У PHP есть разные режимы (интерфейсы) работы.
PHP-CGI - интерфейс для работы с веб-сервером (через этот интерфейс работает твой сайт).
PHP-CLI - интерфейс для работы из командной строки.

Почему не работает?

Давай посмотрим на fgets(STDIN):

fgets - функция, которая читает строку из файла.

STDIN - это стандартная константа php, её значение - php://stdin.

php://stdin - это поток (файл), в который попадает всё, что ты ввёл с клавиатуры в терминале (командной строке).

В итоге получается, что скрипт пытается прочитать строку из потока, который попросту "не существует", т.к. PHP работает в режиме CGI, а не CLI.

Не знаю как проще обьяснить.

Ответы1046310474

207 13 дек, 08:49 207 1310462

>>1310450
Ну так а как ты с сервером общаешься?

208 13 дек, 08:49 208 1310463

>>1310459

Да , спасибо, щас понял почему не работает.

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

Да ради обучения можно сказать нужное ПО и все это запустить и тп. Но в конечном то итоге все равно все на сервере применять придется. И вот как этого добится? Может есть пособия где сразу на сервере показано?

Ответы1046810470

209 13 дек, 08:52 209 1310464

>>1310450
PHP - язык общего назначения.

Ответы10474

210 13 дек, 08:57 210 1310468

>>1310463
Начни с гайда в ОП-посте.

211 13 дек, 08:59 211 1310470

>>1310463
>Получается, код что написан в книге не будет работать на сервере?
Будет, просто у тебя знаний не хватает.

>И вот как этого добится?
Перестать задавать тупые вопросы и читать гайд ОП.

>Может есть пособия где сразу на сервере показано?
Иди нахуй

Ответы1047110491

212 13 дек, 09:00 212 1310471

>>1310470
UPD: ,иди читать

213 13 дек, 09:00 213 1310474

>>1310464
но мне интересно применение на сервере

>>1310459
просто , щас вот какой момент. В сети есть не мало материалов, про PHP и MySQL , но очень мало где бы было показано как это связано. Допустим даже такой банальный пример как, есть у нас база данных , мы к ней подключились. Пытаюсь использовать функию SHOW TABLES [FROM db_name]; , но выдет ошибки . Вот такая простая вещь. И хоть бы пример хоть одного работающего php кода найти связанный с базой.

<?php

$address = "----"; //Адрес базы данных
$user = "--------"; //Имя пользователя базы данных
$password = "------"; //Пароль пользователя
$name_db = "--------"; //Имя базы данных

//Подключаемся к базе данных
$conn = mysqli_connect($address, $user, $password, $name_db);
if (!$conn) {
die("Conneion failed: " . mysqli_connect_error());
}

echo "Connected successfully";

$result = mysql_query( "SHOW DATABASES");

?>

Почему это может не работать? Connected successfully выводит. То есть все подключились. А тут такая вроде элементарна функия и предупреждения рисует. Наверное я что-то делаю не так, но вот где написано что имено?

Ответы10491

214 13 дек, 09:19 214 1310491

>>1310474

>>1310470 Сей анон все тебе уже сказал.

Толку от того, что ты накопипастишь кода, не зная как он работает, не будет.

Ответы10502

215 13 дек, 09:45 215 1310502

>>1310491
просто видешь анон, я ведь вроде понимаю как код работает, по крайней мере котрый кописащу. Я ж не только кописастил, я нашел в сети самоучитель на сайте https://myrusakov.ru , шел по нему. Там вроде более менее понятно. Плюс сразу решил учится на практике, то есть на своем сайте.Если возникали, какие-то задачи,решал их по материалам самоучителя или гуглил, потом под свои нужды правил нагугленый код и тп. Я думал это правельный подход для обучения.

А потом решил сделать систему регистраии-авторизаии, и вот чот не получается. Точнее "регистрировать", то есть вносить в БД из формы на сайте вполне удолось(накопипастил-подправил), но с авторизаией проблемка вышла. Стал гуглить книги, что б понять связь php-mysql, нагуглил то с чем пришел, а она оказывается не для серваков.

Так вот анон, что мне щас посоветуешь, весь гайд с нуля читать? Я ведь вроде понимал что писали в том онлайн самоучителе. Устанавливать ПО на комп , что бы работать по гайду? Оно стоит того?Больше даст чем онлайн самучители? ТАк то ель знания преобрести у меня.

216 13 дек, 12:45 216 1310590

>>1310254
А есть где-нибудь написанная спецификая с договоренностями как писать? Я лучше сам буду писать правильно.

>Я запускаю его так: prettier --print-width=110 --tab-width 4 --single-quote --trailing-comma=es5 --write"
Должен быть отступ в 2 пробела.

https://en.wikipedia.org/wiki/Authentication#Authorization
>The process of authorization is distinct from that of authentication. Whereas authentication is the process of verifying that "you are who you say you are", authorization is the process of verifying that "you are permitted to do what you are trying to do". This does not mean authorization presupposes authentication; an anonymous agent could be authorized to a limited action set.

And also

>For example, a client showing proper identification credentials to a bank teller is asking to be authenticated that he really is the one whose identification he is showing. A client whose authentication request is approved becomes authorized to access the accounts of that account holder, but no others.

So that means that by any mean, authorization is not restricted to make authentication.

217 13 дек, 15:13 217 1310637

>>1305368 (OP)
Друзья, хочу удалить строку из базы. Пишу запрос в пхп файле: "DELETE FROM db WHERE id_cat = 1". Результата ноль, ошибок тоже нет.

Удаляю эту самую строку из пхп май админ рукой, тупа кликнув удалить и пхп май админ выдает такой запрос
DELETE FROM `db` WHERE `db`.`id_cat` = 5

Вопрос: зачем после WHERE писать db.id_cat? Для чего нужно еще раз указывать название базы?

218 13 дек, 15:28 218 1310642

Оп и не только он, посоветуете книги какие по алгоритмам, или где ещё можно поучить их?

Ответы10643

219 13 дек, 15:42 219 1310643

>>1310642
Порешать онлайн:
Timus Online
codewars
Померятся хуями:
TopCoder
Посмотреть:
Stanford Online Algorithms: Design and Analysis
Robert Sedgewick курс с coursera. Если там закрыли бесплатный доступ, то есть на трекерах.
Почитать современную классику:
CLRS
Thomas H. Cormen
Charles E. Leiserson
Ronald L. Rivest
Clifford Stein
Introduction to Algorithms

Ответы10650

220 13 дек, 16:14 220 1310650

>>1310643
Спасибо.

782 Кб, 958x570
221 13 дек, 16:52 221 1310672

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

Ответы11081

222 13 дек, 17:11 222 1310676

>>1309754
Надеюсь успел ответить, и мой ответ дойдет до тебя.

Если ты хочешь стать как можно быстрей востребованным юниором, то, возможно, с твоим объемом знаний стоит выбрать какой-нибудь фреймворк для PHP и сделать что-нибудь на нём для портфолио. Symfony великолепен.

Выполни на нём задачу про студентов из шапки и/или файлхостинг и этих заний тебе должно хватит чтобы устроится на PHP джуниора.

Может быть как раз за пару месяцев получиться это сделать.

Однако.

Сейчас в вебе преобладает JS. Значит профитней всего будет учить его. Раз ты прочел ту книгу значит должен знать хотя бы его основы.

Отшлифуй знания прочитав mdn https://developer.mozilla.org/bm/docs/Web/JavaScript и/или туториал на https://javascript.info/

Затем ознакомься с нодой https://nodejs.org/en/docs/guides/ https://nodejs.org/en/docs/guides/getting-started-guide/

Затем выбири один или несколько фреймворков: React, Vue, Angular... (перечисленно по мере востребованнсоти), и попутно изучи webpack

Всё что я перечислил это достаточный объем зананий чтобы свободно писать приложения на JS.

Ну и английский естественно must have.

И если ты так хочешь во фриланс, то может быть тебе лучше будет найти просто удалённую работу?

Ответы1068111022

223 13 дек, 17:33 223 1310681

>>1310676
иди толсти в другом месте, бротишь

Ответы10682

224 13 дек, 17:34 224 1310682

>>1310681
что толстого в посте этом, брат?

Ответы10911

225 14 дек, 07:44 225 1310908

Уважаемые костылитаны. Так композер с грушей и прочие технологий нужно прям от зубов знать? Пиздеть не буду административку Шлинукса знаю, клитор могу развить, ебашил скрипты. Мне уже этот язык нравится, конечно кроме этих ебаных долларов, тот же С4 только немного уродливый, зависимости эти ебучие, все как в С4 только уебищно. Но радует что можно ебать байты. Ахуеть сколько куков.

226 14 дек, 07:47 226 1310911

>>1310682
Я не он, но ты хуйню советуешь, настоящие масты идут в девопс, фуллстак. Ты сидишь в Пыхотреде и советуешь JS, ну не ебанутый? Без обид.

Ответы10924

227 14 дек, 09:12 227 1310924

>>1310911
>фуллстак
Это которые CMS обслуживают? Они кроме говнокода ничего родить не могут - знают всё, но самые азы.

Ответы10934

228 14 дек, 09:43 228 1310934

>>1310924
Я про тех что могут написать свой фрейм.

Ответы10948

229 14 дек, 10:10 229 1310945

Есть два куска

$DealId="{=Document:ID}";
$res=CCrmDeal::LoadProductRows($DealId);
for($i=0;$i<=count($res);$i++){
if($res[$i]['PRODUCT_ID']==648){
$this->SetVariable('Variable1', 2);
}
}

и

$DealId="{=Document:ID}";
$res=CCrmDeal::LoadProductRows($DealId);
for($i=0;$i<=count($res);$i++){
if($res[$i]['PRODUCT_ID']==647){
$this->SetVariable('Variable1', 1);
}
}

как мне их в один слить? не вот эту проверку

for($i=0;$i<=count($res);$i++){
if($res[$i]['PRODUCT_ID']==648){
$this->SetVariable('Variable1', 2);
if($res[$i]['PRODUCT_ID']==647){
$this->SetVariable('Variable1', 1);

сделать одним куском?

229 14 дек, 10:10 229 1310945

Есть два куска

$DealId="{=Document:ID}";
$res=CCrmDeal::LoadProductRows($DealId);
for($i=0;$i<=count($res);$i++){
if($res[$i]['PRODUCT_ID']==648){
$this->SetVariable('Variable1', 2);
}
}

и

$DealId="{=Document:ID}";
$res=CCrmDeal::LoadProductRows($DealId);
for($i=0;$i<=count($res);$i++){
if($res[$i]['PRODUCT_ID']==647){
$this->SetVariable('Variable1', 1);
}
}

как мне их в один слить? не вот эту проверку

for($i=0;$i<=count($res);$i++){
if($res[$i]['PRODUCT_ID']==648){
$this->SetVariable('Variable1', 2);
if($res[$i]['PRODUCT_ID']==647){
$this->SetVariable('Variable1', 1);

сделать одним куском?

Показать весь текст
Ответы1095810984

230 14 дек, 10:10 230 1310946

не вот эту проверку

231 14 дек, 10:12 231 1310948

>>1310934
Не видел таких.

232 14 дек, 10:39 232 1310958

>>1310945
Должно выйти через array_map.

171 Кб, 1359x662
233 14 дек, 11:29 233 1310976

>>1305368 (OP)
Аноны, я почти доделал движок по видеоурокам.
Но блять где то в коде я сделал дамп сессии и теперь не могу его найти ааааааа
Вот что делать?

Ответы109781097911044

234 14 дек, 11:37 234 1310978

>>1310976

из консоли:

grep -rni "var_dump" *

Если у тебя пхпшторм то нажми Ctrl+Shift+F

Ответы10983

235 14 дек, 11:37 235 1310979

>>1310976
>RAINBOWTHEME
>RUNINTOTHERAINBOWTRACKRUNALONGWITHCAPTAINJACKD-RA-RO-DA-RI-RA-RO

Ответы10983

236 14 дек, 11:49 236 1310983

>>1310978
>из консоли:
У меня хостинг

>Если у тебя пхпшторм то нажми Ctrl+Shift+F
Нетууу!! Бляяя, вот я алеша. Но реально нету. Разве что я запихнул сессию в какую то переменную, но ведь она печатается тоже var_dump или print_r
Это пиздец какой то

>>1310979
Да, я не скрываюсь

237 14 дек, 11:51 237 1310984

>>1310945
Я бы сделал так:

$foo = function ($fn) {
return function ($item, $key) use ($fn) {
switch ($item['PRODUCT_ID']) {
case 647: return $fn(1);
case 648: return $fn(2);
}
}
}

$bar = function ($v) use ($this) {
$this->SetVariable('Variable1', $v);
}

$DealId="{=Document:ID}";
$res=CCrmDeal::LoadProductRows($DealId);
array_walk($foo($bar), $res)

238 14 дек, 13:22 238 1311022

>>1310676
Хорошо, как раз думал об изучении фреймворка какого нить. Да и 2 вариант понравился.
Спасибо.

Ответы11037

239 14 дек, 13:34 239 1311029

Только вкатился. Зачем отбивать 4 пробела если существует tab?

Ответы11048

3,1 Мб, 1252x1252
240 14 дек, 13:47 240 1311037

>>1311022
>Да и 2 вариант понравился.
Двачую, бротиш. Пацаны в жс треде подтвердили, учишь ЕКСПРЕСС + ВУЕ + МОНГО и со старда 300к минимум будешь получать на удалёнке. Говорят, будешь делать СПА с БОГАТЫМ АПИ и АСИНХРОННЫМ БЭКЕНДОМ и горя не знать. Работаешь, говорят, 3 часа в день максимум. Остальное время играешь в эксклюзивы и ссышь пукарям в /v на головы 4к скриншотами. В общем, все советуют подумать о будущем сразу вкатываться в НОД ЖС.

Ответы1105611419

241 14 дек, 13:58 241 1311044

>>1310976
Аноны, у меня в коде вобще нет print_r и var_dump. Я в шоке, как такое может быть? Хелп!

242 14 дек, 14:05 242 1311048

>>1311029
Фича на в том какие педали ты там давишь. Все вменяемые редакторы имеют опцию ставить 4 пробела по нажатию Tab. Нужно для того, что бы код выглядел более менее одинаково, независимо от размера табуляции.

243 14 дек, 14:21 243 1311056

>>1311037
Выучил alert и confirm, можно уже джс джуном идти устраиваться? Или еще надо html выучить?

244 14 дек, 15:58 244 1311081

>>1310672

Ну у тебя из бд прилетает массив же прямо в html шаблоне берешь и хуяришь такую конструкцию:

<? foreach ($arrayOfSomeShit as $shit) : ?>
<div>
<img src="<? echo $shit['img_url']; ?>" />
<span><? echo $shit['title']; ?></span>
</div>
<? endforeach; ?>

Жирным выделил то что является собственно php-кодом внутри твоего html кода. Надеюсь макаба не испортит разметку

13 Кб, 624x198
245 14 дек, 16:38 245 1311098

Ну и чего ты добился, ОП-хуй?

Ответы11327

153 Кб, 1000x1094
246 14 дек, 17:25 246 1311131

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

Критика приветствуется
https://github.com/02Cetch/xenos

Если кому интересно, то очень помог вот этот курс:
https://www.youtube.com/watch?v=B1Q44OKh5YA&list=PLSdH7dYnlGYht0eGi9-14X87hrSl9plCc

Ответы1115311172

247 14 дек, 17:29 247 1311135

Как написать программу с генерацией стихотворения? Перечитал начало урока (град информации без примеров, 95% не понятно как работает. Все предыдущие уроки были прекрасные) миллион раз, даже на предыдущий зашел. До этого задачи щелкал как орешки

Ответы19272

38 Кб, 783x636
248 14 дек, 17:42 248 1311141

https://ideone.com/EzRrHO

Все что смог из себя высрать (И то случайно получилось)

Ответы19272

249 14 дек, 18:04 249 1311153

>>1311131
Ты типа фулстак какой то? у тебя в гитхабе и чето на реакте и yii2

Ответы11155

250 14 дек, 18:09 250 1311155

>>1311153
Да, так, баловался. На реакте делал проект, чуть не ёбнулся без Redux. Запутался в архитектуре и сделал кучу костылей. А так реакт, как view часть в SPA - это вещь

Ответы11167

251 14 дек, 18:29 251 1311167

>>1311155
Бля молодец.

252 14 дек, 18:40 252 1311172

>>1311131
О, я тоже через пару дней начинаю. Сейчас закончил пхп старт. Дашь какое нибудь напутствие?

Ответы11175

253 14 дек, 18:45 253 1311175

>>1311172
Конспекты, ОБЯЗАТЕЛЬНО. Не большие, но по важным темам нужно делать. + читать хотя бы чуть-чуть литературы, которую он к урокам прикрепляет. Выполнять домашку, которую он даёт(не обязательно самостоятельно, можно опять же взять решение на сайте, но, при этом, разобрать всё, что он написал.)

В практике к курсу посоветую не бояться, сесть и запилить комментарии к постам(дальше поймёшь о чём я).

Ну и лично моё правило - уставший и заёбаный? Отдохни и хотя бы 3-5 минут осиль от видео, так хотя бы будешь двигаться потихоньку к своей цели.

Удачи

Ответы11184

254 14 дек, 19:11 254 1311184

>>1311175
Спасибо.
А вобще можно начинать к пхп ап, если из реальных проектов у меня только пхп старт?

Ответы11193

255 14 дек, 19:37 255 1311193

>>1311184
вполне, но могут быть проблемы

Ответы11245

256 14 дек, 19:46 256 1311196

как в preg_replace изменить регистр символа следующего после точки?

Ответы19272

257 14 дек, 20:35 257 1311213

Где искать норм фрилансеров пхп на снг биржах?

Ответы11232

258 14 дек, 21:29 258 1311232

>>1311213
На апворке не пробовал посмотреть?

Ответы11568

259 14 дек, 22:55 259 1311245

>>1311193
Спасибо, мужик

260 15 дек, 05:12 260 1311327

>>1311098
да, кстати встречал в задачках учебника глупые моменты

261 15 дек, 11:28 261 1311419

>>1311037
>и АСИНХРОННЫМ БЭКЕНДОМ
Ну-к, на этом моменте поподробней. Возможно ли делать с помощью Vue + React асинхронный server side rendering?

Ответы11431

262 15 дек, 12:10 262 1311431

>>1311419
Я ебу? Мне посоны в жс треде сказали... Иди у них спрашивай.

263 15 дек, 12:43 263 1311448

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

Ответы1146511467

264 15 дек, 13:24 264 1311465

>>1311448
Ты можешь воспользоваться другой песочницей. Например https://3v4l.org/

265 15 дек, 13:28 265 1311467

>>1311448
подними апач

Ответы11473

136 Кб, 600x928
266 15 дек, 13:34 266 1311473

>>1311467
Не надо нас поднимать!

267 15 дек, 15:28 267 1311510

>>1308331
бамп

268 15 дек, 17:44 268 1311566

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

Ответы11567

269 15 дек, 17:45 269 1311567

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

Ответы11571

270 15 дек, 17:48 270 1311568

>>1311232
Я хз, на апворке за далары всё.

271 15 дек, 18:01 271 1311571

>>1311567
Я не знаю, анон. Я сам сделал студентов и файлообменник, плюс еще один говнопроект. Получается говнокод, но с каждым разом получше. Сейчас еще один круд сделаю и начну ларавель задротить. Ну и жс начну учить. Надеюсь к лету вкачусь.

Ответы1158911593

272 15 дек, 18:42 272 1311589

>>1311571
Ебать к лету...
А сколько времени в день ты тратишь на это?

Ответы11595

273 15 дек, 18:47 273 1311593

>>1311571
И какой у тебя план развития?

Ответы11601

274 15 дек, 18:47 274 1311595

>>1311589
Если пишу код, то могу целый день сидеть. Не знаю часов 8. А если я смотрю какие-нибудь видосы или читаю туториалы всякие, то гораздо меньше. Сразу лень становится и все такое. Короче 1-3 часа в день, если смотрю что-то и до 7-8 часов если пишу код.

Ответы11674

275 15 дек, 18:59 275 1311601

>>1311593
Сидеть учить PHP, Laravel, Js, в базах данных разобраться получше, чем просто делать самые простые запросы. Ну и английский. В алгоритмах разобраться хоть на каком-то начальном уровне, чтобы на собеседовании не обосраться. В конце марта - середине апреля уже начну искать работу, ну и просто по собеседованиям ходить (если меня на них пустят ваще, лол). А то типа я могу так и три года сидеть изучать всякую хуйню на васянском уровне, а потом даже джуном не возьмут.

276 15 дек, 20:58 276 1311658

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

Следующей задачей после регулярки идет задача "Чилса прописью". От нее я просто охуел. Я не знаю как ее решать. В моей голове вообще нету никаких идей и знаний от прочитанных уроков. Искать информацию в уроках ОПа невозможно. Что мне делать, искренне хочу научиться PHP

Ответы116701167119272

277 15 дек, 21:28 277 1311670

>>1311658
А что у тебя конкретно не получилось. Пришли свои наработки, пиши вопросы

278 15 дек, 21:32 278 1311671

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

279 15 дек, 21:37 279 1311674

>>1311595
Так же сижу - то практика день-два, то теории три. Поначалу так вообще сидел: 7 статей прочитай - одно говно напиши. Уже четвертый месяц так торчу.

Ответы11800

280 16 дек, 01:08 280 1311770

>>1305368 (OP)
https://ideone.com/WnhXAL
почему второй elseif не срабатывает?

Ответы1179919272

281 16 дек, 05:42 281 1311799

>>1311770
что за задача?

Ответы12085

282 16 дек, 05:43 282 1311800

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

--мимокрок

8 Кб, 177x38
283 16 дек, 07:45 283 1311814

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

Ответы1181611824

284 16 дек, 08:36 284 1311816

>>1311814
Мож какой то компонент права не может получить?

Ответы11818

285 16 дек, 08:38 285 1311818

>>1311816
Как это чекнуть? Алсо через командную строку всё myqsl исправно добавляет базы, проблема именно в phpmyadmin

286 16 дек, 09:11 286 1311824

>>1311814

Напиши какого пользователя (пароль не надо) ты указываешь в phpmyadmin.

Затем в командной строке зайди в mysql под пользователем или под админом и выведи, какие права даны пользователю:

SHOW GRANTS FOR 'username'@'localhost';

или

SHOW GRANTS FOR CURRENT_USER;

Обрати внимание что в mysql права привязаны к IP адресу. То есть ты можешь дать одни права пользователю x, заходящему с localhost, и другие - пользователю x, зашедшему с 10.0.0.1

Ответы11827

287 16 дек, 09:14 287 1311827

>>1311824
Решил проблему, установил более старую версию пхпамйадмина и всё само заработало. Видимо в последней версии разрабы что то напортачили

Ответы11854

288 16 дек, 10:37 288 1311854

>>1311827
Мне кажется зря, мог бы просто через права все решить. Присвоить как тебе кот показал.

64 Кб, 540x786
289 16 дек, 12:13 289 1311956

Не смог понять как решать Лиличку. Нашел у кого-то решение, но так и не понял что делает этот алгоритм

$letterNumber = 0;
for($i = 0; $i < $maxLength; $i++){
foreach ($lines as $key => $value) {
if (mb_substr($value, $letterNumber, 1) != ""){
echo "|", mb_substr($value, $letterNumber, 1);
} else {
echo "| ";
}
}
echo "|\n";
$letterNumber++;
}

Ответы1234919272

290 16 дек, 14:52 290 1312085

>>1311799
число прописью, я там проверяю десятки и добавляю их в массив, но условие почему то не выполняется

291 16 дек, 22:42 291 1312349

>>1311956
Эта задача сверху вниз слова пишет?
Там $key->$value лишний, можно на $line заменить
Вывод будет такой:
Д | К
ы | о
м | м

292 16 дек, 23:01 292 1312364

116 Кб, 1116x58512 Кб, 517x17312 Кб, 301x190

Не получается выровнять block по центру с минимальным отступом в 10px.
Помогите, аноны.

Ответы1236512403

34 Кб, 1894x803
293 16 дек, 23:03 293 1312365

>>1312364
Такая бадья соответственно

294 16 дек, 23:34 294 1312379

сделал часть от задачи про число прописью
https://repl.it/@askarpro24/VivaciousFaithfulScandisk-1
не могу понять как использовать массив из 1й функции чтобы через foreach подставить из массива с (400,20,1) сделать (четыреста,двадцать,один), просто обратиться к массиву из другой функции я так понял нельзя.

Ответы1240019271

295 17 дек, 00:34 295 1312400

>>1312379
//В основном теле программы:
$result = numberToText(421);
$text = smallNumberToText($result,0);
echo $text;

//в smallNumberToText:
$translatedNumber = "";
foreach ($result as $num){
$translatedNumber = $translatedNumber . ' ' . $spelling[$num];
}
return $translatedNumber;

Ответы12425

296 17 дек, 00:42 296 1312403

>>1312364

Ну так у тебя нет правил, которые бы задавали центрирование. Элемент с блочным позиционированием можно отцентрировать с помощью трюка с margin = auto:

- http://softwaremaniacs.org/blog/2005/08/27/css-layout-flow/
- и немного тут https://github.com/codedokode/pasta/blob/master/html/positioning.md

Ответы1240512406

297 17 дек, 00:46 297 1312405

>>1312403
Пробежался по статейкам. Так там используется display, в задании сказано, что без него нужно делать. Или я просто тупой

Ответы12408

298 17 дек, 00:49 298 1312406

>>1312403
Бля, работает. Спасибо большое

299 17 дек, 00:59 299 1312408

>>1312405

У блочных элементов вроде div по умолчанию стоит display: block, и явно это прописывать не требуется. Думаю, имелось в виду это.

300 17 дек, 01:25 300 1312410

Подскажите по коду. Я Получил ответ от API Vk, там есть параметр:

viewer_type=4&api_result=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Cresponse%20list%3D%22true%22%3E%0A%20%3Cuser%3E%0A%20%20%3Cuid%3E5159802sex%3E%0A%20%3C%2F

Я пытаюсь декодировать api_result и вытащить из него sex=2. Перечитал весь Stack overflow, ничего не работает. Как вытащить переменную sex из параметра api_result?

Ответы1241212498

301 17 дек, 01:41 301 1312412

>>1312410
Настоящие индейцы уже не декодируют полученные строки?
Прогони через
http://php.net/manual/ru/function.urldecode.php

Ответы12414

302 17 дек, 01:55 302 1312414

>>1312412
>http://php.net/manual/ru/function.urldecode.php
Я прогонял, няша. Он выдает мне списком все данные оттуда имя фамилия пол. А как вытащить конкретную переменную?

Ответы124161241712419

303 17 дек, 01:59 303 1312416

>>1312414

Ты умеешь работать с XML и массивами в PHP? Если нет, то иди читай теорию, так как невооруженным глазом видно, что строка в XML.

Ответы1241912421

304 17 дек, 02:00 304 1312417

>>1312414

В PHP есть расширения DOM и SimpleXML для разбора XML данных.

Ответы12421

305 17 дек, 02:04 305 1312419

>>1312414
>как вытащить конкретную переменную?
В документации должны быть описаны типы данных со всеми ключами.
Просто прогоняешь черед декодеру url, потом декодеру json, и в результате просто указываешь ключ.
Почитай ещё доки по декодеру json - там есть подводный камушек.

>>1312416
>XML
Там json, как я видел.

Ответы12421

306 17 дек, 02:15 306 1312421

>>1312416
>>1312417
>>1312419

Спасибо, буду читать мануалы по json decode

307 17 дек, 02:49 307 1312425

>>1312400
>$result = numberToText(421);
>$text = smallNumberToText($result,0);
>echo $text;
спасибо, теперь разобрался как вызывать функции чтобы они массив возвращали

308 17 дек, 12:08 308 1312498

>>1312410

заработало вот так:

<?php
$string = $_GET['api_result'];
$xml = simplexml_load_string($string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
echo $array['user']['sex'];
?>

Всем спасибо за совет, целую вас в аунсы каждого.

Ответы12600

309 17 дек, 13:00 309 1312516

Что начать читать чтобы создавать простенькие сайты? Знаю основы php и html. Пока смотрю 8 часовой курс про регулярки - нужно куда-то двигаться.

Ответы125191254112603

310 17 дек, 13:11 310 1312519

>>1312516
>8 часовой курс про регулярки
ебать

Ответы1252812610

311 17 дек, 13:42 311 1312528

>>1312519
Не, ну а чо. Уроков ОПа для решения его задач не хватает

Ответы19270

312 17 дек, 14:18 312 1312541

>>1312516
Сеньор Регулярка Девелопер?

313 17 дек, 15:57 313 1312600

>>1312498
>json_encode
>json_decode
Ты сперва закодировал, потом раскодировал.

$response = $_GET['api_result'];
>рас
$json= urldecode($response);
>дфа
$result= json_decode($json,TRUE);

И готово.
echo $result['user']['sex'];

29 Кб, 798x514
314 17 дек, 16:00 314 1312603

>>1312516
>8 часовой курс про регулярки
Есть ссылка на курс? Может я чего упустил, когда за полчаса их освоил? Вдруг ими Абу можно унижать?

Ответы12657

315 17 дек, 16:11 315 1312610

>>1312519

Что плохого, что человек хочет нормально разобраться в предмете, а не проскочить и потом задавать вопросы, как извлечь текст из строки?

Ответы12630

316 17 дек, 16:49 316 1312630

>>1312610
Хочешь нормально разобраться - напарси говна через регулярки, а курсы хоть 24 часа смотри - без практики толку 0.

Ответы15300

317 17 дек, 16:57 317 1312634

посоны, как вы синтаксис запоминаете? всё время приходится держать перед собой пример или гуглить документацию

Ответы1265412660

318 17 дек, 17:22 318 1312654

>>1312634
Никак. Пиши каждый день немного кода. Само запомнится до уровня автомата.

319 17 дек, 17:25 319 1312657

>>1312603
Вот курс https://www.youtube.com/playlist?list=PLT0-cCYWU-_SIlYYwScRLLKpTRQlTqp1r
Ну скажите мне чего почитать чтобы делать что-нибудь типо этого http://php.net/manual/ru/tutorial.forms.php

Ответы12674

320 17 дек, 17:29 320 1312660

>>1312634
Так и запоминаем. В голове только часто используемые функции и основные операторы синтаксиса. За специфическими фичами приходится лазать в доки.

Ответы12661

321 17 дек, 17:30 321 1312661

>>1312660
Главное запомнить, что эти фичи вообще есть, чтобы не изобретать велосипед.

Ответы12911

322 17 дек, 17:35 322 1312667

Как начать перебор foreach с начала, если какое-то условие не выполняется? Каким-нибудь goto?

Ответы126911269612729

323 17 дек, 17:45 323 1312674

>>1312657
На хтмлакадеми фастом проходишь основы хтмл, там формы будут, потом у опа читаешь про http(get,post), как поставить wamp. Можешь ещё это все в видосах php start глянуть, тут советовали пару раз.

Ответы12701

324 17 дек, 17:57 324 1312691

>>1312667
Что то я не нашел вменяемого способа. Или упаковывают foreach в функцию и рекурсивно вызывают ее или упаковывают в цикл while.

25 Кб, 740x201
325 17 дек, 18:05 325 1312696

>>1312667
Короче, сам замутил чота такое. Делает 10 попыток и завершает цикл. Как раз сегодня про goto узнал.
$num = 0;
repeat:
foreach($list as $id) {
действия
if ($id == null) {
if ($num < 10) {
$num++;
goto repeat;
} else {$num = 0; break;}
}
}

Ответы12697127061304113042

326 17 дек, 18:06 326 1312697

>>1312696
Забыл, что отступы убираются. А о том, что они превращаются в \t, я вообще не знал. Прастити.

327 17 дек, 18:13 327 1312701

>>1312674
> опа читаешь про http(get,post), как поставить wamp.
Не понял. Это где?

Ответы1273719270

328 17 дек, 18:38 328 1312706

>>1312696
goto это пиздец...

329 17 дек, 19:19 329 1312729

>>1312667
1. Можно вынести foreach в функцию и просто выходить из неё когда надо, сбрасывая его.
2. Посмотри на пхп.нет про итераторы-генераторы.

goto не используй вообще никогда - нинужно и говнокод.

Ответы12992

330 17 дек, 19:33 330 1312737

>>1312701
В шапке все ссылки есть, ищи.

331 17 дек, 20:24 331 1312763

>>1306121
Пытаешься изобрести bnb?

332 17 дек, 21:23 332 1312807

КТО ЮЗАЕТ HOMESTEAD ДЛЯ LARAVEL? ОТЗОВИТЕСЬ

Произошёл пиздец, старый конфиг наебнулся, сделал новый. Далее:

>vagrant up

А мне консоль в ответ
>Microsoft Windows [Version 6.1.7601]

C:\Users\55555>cd /d T:\m2\www\laravel-dev\homestead

T:\m2\www\laravel-dev\homestead>vagrant up
Bringing machine 'homestead-7' up with 'virtualbox' provider...
==> homestead-7: Box 'laravel/homestead' could not be found. Attempting to find
and install...
homestead-7: Box Provider: virtualbox
homestead-7: Box Version: >= 6.3.0
==> homestead-7: Loading metadata for box 'laravel/homestead'
homestead-7: URL: https://vagrantcloud.com/laravel/homestead
==> homestead-7: Adding box 'laravel/homestead' (v6.4.0) for provider: virtualbo
x
homestead-7: Downloading: https://vagrantcloud.com/laravel/boxes/homestead/v
ersions/6.4.0/providers/virtualbox.box
==> homestead-7: Box download is resuming from prior download progress
homestead-7: Progress: 0% (Rate: 31580/s, Estimated time remaining: 19:30:02
homestead-7: Progress: 0% (Rate: 38358/s, Estimated time remaining: 17:40:50
homestead-7: Progress: 0% (Rate: 49230/s, Estimated time remaining: 16:16:52
homestead-7: Progress: 0% (Rate: 40903/s, Estimated time remaining: 16:35:30
homestead-7: Progress: 0% (Rate: 34871/s, Estimated time remaining: 17:01:47
homestead-7: Progress: 0% (Rate: 21877/s, Estimated time remaining: 18:20:30
homestead-7: Progress: 0% (Rate: 16459/s, Estimated time remaining: 18:56:37
homestead-7: Progress: 0% (Rate: 20666/s, Estimated time remaining: 19:28:40
homestead-7: Progress: 0% (Rate: 17938/s, Estimated time remaining: 20:52:37
homestead-7: Progress: 0% (Rate: 17998/s, Estimated time remaining: 21:06:38
homestead-7: Progress: 0% (Rate: 30227/s, Estimated time remaining: 20:13:23
homestead-7: Progress: 0% (Rate: 37105/s, Estimated time remaining: 19:57:13
homestead-7: Progress: 0% (Rate: 38358/s, Estimated time remaining: 20:03:33
homestead-7: Progress: 0% (Rate: 31266/s, Estimated time remaining: 20:07:17
homestead-7: Progress: 0% (Rate: 34983/s, Estimated time remaining: 19:35:12
homestead-7: Progress: 0% (Rate: 40784/s, Estimated time remaining: 19:14:06
homestead-7: Progress: 0% (Rate: 45479/s, Estimated time remaining: 19:05:20
homestead-7: Progress: 0% (Rate: 45256/s, Estimated time remaining: 18:32:13
)

332 17 дек, 21:23 332 1312807

КТО ЮЗАЕТ HOMESTEAD ДЛЯ LARAVEL? ОТЗОВИТЕСЬ

Произошёл пиздец, старый конфиг наебнулся, сделал новый. Далее:

>vagrant up

А мне консоль в ответ
>Microsoft Windows [Version 6.1.7601]

C:\Users\55555>cd /d T:\m2\www\laravel-dev\homestead

T:\m2\www\laravel-dev\homestead>vagrant up
Bringing machine 'homestead-7' up with 'virtualbox' provider...
==> homestead-7: Box 'laravel/homestead' could not be found. Attempting to find
and install...
homestead-7: Box Provider: virtualbox
homestead-7: Box Version: >= 6.3.0
==> homestead-7: Loading metadata for box 'laravel/homestead'
homestead-7: URL: https://vagrantcloud.com/laravel/homestead
==> homestead-7: Adding box 'laravel/homestead' (v6.4.0) for provider: virtualbo
x
homestead-7: Downloading: https://vagrantcloud.com/laravel/boxes/homestead/v
ersions/6.4.0/providers/virtualbox.box
==> homestead-7: Box download is resuming from prior download progress
homestead-7: Progress: 0% (Rate: 31580/s, Estimated time remaining: 19:30:02
homestead-7: Progress: 0% (Rate: 38358/s, Estimated time remaining: 17:40:50
homestead-7: Progress: 0% (Rate: 49230/s, Estimated time remaining: 16:16:52
homestead-7: Progress: 0% (Rate: 40903/s, Estimated time remaining: 16:35:30
homestead-7: Progress: 0% (Rate: 34871/s, Estimated time remaining: 17:01:47
homestead-7: Progress: 0% (Rate: 21877/s, Estimated time remaining: 18:20:30
homestead-7: Progress: 0% (Rate: 16459/s, Estimated time remaining: 18:56:37
homestead-7: Progress: 0% (Rate: 20666/s, Estimated time remaining: 19:28:40
homestead-7: Progress: 0% (Rate: 17938/s, Estimated time remaining: 20:52:37
homestead-7: Progress: 0% (Rate: 17998/s, Estimated time remaining: 21:06:38
homestead-7: Progress: 0% (Rate: 30227/s, Estimated time remaining: 20:13:23
homestead-7: Progress: 0% (Rate: 37105/s, Estimated time remaining: 19:57:13
homestead-7: Progress: 0% (Rate: 38358/s, Estimated time remaining: 20:03:33
homestead-7: Progress: 0% (Rate: 31266/s, Estimated time remaining: 20:07:17
homestead-7: Progress: 0% (Rate: 34983/s, Estimated time remaining: 19:35:12
homestead-7: Progress: 0% (Rate: 40784/s, Estimated time remaining: 19:14:06
homestead-7: Progress: 0% (Rate: 45479/s, Estimated time remaining: 19:05:20
homestead-7: Progress: 0% (Rate: 45256/s, Estimated time remaining: 18:32:13
)

Показать весь текст
Ответы19270

333 18 дек, 06:06 333 1312911

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

Ответы12952

334 18 дек, 09:30 334 1312952

>>1312911
Постоянно такая хуйня.

335 18 дек, 12:23 335 1312992

>>1312729
1. Не понял.
2. Еще сильнее не понял.
И я не понимаю, почему говнокод? Запись короткая, читается легко, работает хорошо.

Ответы1301913026

336 18 дек, 13:25 336 1313019

>>1312992
>И я не понимаю, почему говнокод? Запись короткая, читается легко, работает хорошо.
Потому что говнокод. Запись короткая, читается легко и все прочее - это пока у тебя скрипт на 10 строк. Если бы все скрипты были в 10 строчек, то ваще не нужно ни ооп, ни всякая другая хуйня, все сразу понятно. А так ты высрешь в процедурном стиле скрипт на 500 строк с бесконечными циклами, разветлениями и прочей залупой. А сверху еще приправишь это goto. И твой код нельзя будет без ящика водки прочитать.

Ответы13031

337 18 дек, 13:43 337 1313026

>>1312992
>1. Не понял.
>2. Еще сильнее не понял.
Учи ОПовские уроки - рано тебе ещё программировать.

338 18 дек, 13:54 338 1313031

>>1313019
>И твой код нельзя будет без ящика водки прочитать.
Это заблуждение. Если писать говно, то и с ООП и без ООП говно будет. А если писать нормально, то и в процедурном, и в ООП, и даже с гоуту хороший код будет.

Ответы13042

339 18 дек, 14:18 339 1313041

>>1312696

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

То есть мы видим

if () {
...
}

x();

И понимаем, что независимо от того, выполнится if или нет, управление дойдет до вызова x() (если только там нет return или throw). А с goto логика выполнения может быть сколь угодно запутанной.

Также, у тебя не соблюдаются отступы.

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

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

340 18 дек, 14:18 340 1313042

>>1312696
>Делает 10 попыток и завершает цикл
>Как раз сегодня про goto узнал
А про for ты ещё не узнал? Нахуевертил чёрт пойми чего. Выглядит так, будто ты меня в жопу этим кодом послал.
Лучше бы просто описал чего конкретно хочешь.

>>1313031
>Если писать говно, то и с ООП и без ООП говно будет
Если человек дорос до использования ООП, то уже понимает зачем это и почему.
>даже с гоуту хороший код будет
НЕ-БУ-ДЕТ. Это низкоуровневая хуета из ассемблера.
Используют её 2 типа людей: 1 - дикие нубасы-говнокодеры, и 2 - годные спецы на диких и очень специфичных задачах, когда обычным методом выйдет хуже и сложнее.

Ответы13047

341 18 дек, 14:37 341 1313047

>>1313042
>Если человек дорос до использования ООП, то уже понимает зачем это и почему.
Нихуя. Мало кто правильно использует ООП. В основном вырвиглазная неподдерживаемая хуита.

>НЕ-БУ-ДЕТ. Это низкоуровневая хуета из ассемблера.
Если используется так, что понятно что происходит, то почему бы и нет?

Ответы1305013090

342 18 дек, 14:45 342 1313050

>>1313047
>Мало кто правильно использует ООП.
Чего ты несёшь? Давай показывай тогда как правильно - код свой приведи, или кукаретик.

>Если используется так, что понятно что происходит, то почему бы и нет?
В твоём правильном ООП, ты хочешь сказать?

Ответы13056

343 18 дек, 15:02 343 1313056

>>1313050
>Чего ты несёшь? Давай показывай тогда как правильно
Правильно это как-то так: https://github.com/yegor256/takes

>В твоём правильном ООП, ты хочешь сказать?
Да в любом, где есть хоть немного императивного кода.

Ответы130591306113066

344 18 дек, 15:08 344 1313059

>>1313056
>Правильно это как-то так: https://github.com/yegor256/takes
Там обычный ООП, пионер.

>Да в любом, где есть хоть немного императивного кода.
В приведённой тобой ссылке покажи.

Ответы1306613068

345 18 дек, 15:09 345 1313061

>>1313056
Алсо, это не твой код, судя по всему.

Нехорошо чужое воровать, пионер.

Ответы13068

346 18 дек, 15:16 346 1313066

>>1313056
>yegor256
>>1313059
>ам обычный ООП, пионер.
кек
Асло как правильно использовать гото написано у МакКоннела в Совершенном коде, нехуй тут тупые дискуссии устраивать.
кро

Ответы13070

347 18 дек, 15:18 347 1313068

>>1313059
>Там обычный ООП
Ты даже не посмотрел что там внутри. "Обычный" ООП - это императивная хуйня. Взять какой-нибудь PHP фреймворк, CMS, мудл. Вот там типичный "обычный" ООП.

>В приведённой тобой ссылке покажи.
Там нет императивщины, там pure OOP.

>>1313061
Не мой. Но я почти так же пишу.

Ответы13071

348 18 дек, 15:20 348 1313070

>>1313066
>кек
В чём его необычность. Давай рассказывай, а не кукарекай.

349 18 дек, 15:21 349 1313071

>>1313068
>Но я почти так же пишу
Лул. А ещё ты лидер митол-группы.

Ответы13082

350 18 дек, 15:46 350 1313082

>>1313071
Ясно-понятно. У нас тут диванный кукаретик.

Ответы13089

351 18 дек, 15:55 351 1313089

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

352 18 дек, 15:57 352 1313090

>>1313047

> низкоуровневая хуета из ассемблера.

Читал про разработку первых электронных таблиц VisiCalc (1978) - интересно, что там, хоть и писали на ассемблере, использовали макросы для имитации if/else: http://rmf.vc/implementingvisicalc

> The assembler had macros so that instead of directly coding to the machines conditional instructions I could use an "aif/aelse/aendif" set in order to assure that the structure of the code was maintained.

А тут можно увидеть кусочек кода с do/until: http://www.bricklin.com/history/saiearly.htm

> Если используется так, что понятно что происходит, то почему бы и нет?

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

Приведи пример, где goto имеет преимущество перед структурным программированием.

Ответы1309713098

353 18 дек, 15:58 353 1313092

Помогите пожалуйста настроить ngnix. Ставлю сервер на виртуалке, всё установил, всё сделал по гайду, сделал сайт test-lemp.local. Захожу на него и вижу белый экран, хотя должен заработать index.php. Почему не работает? Хелп!

Ответы1309913102

354 18 дек, 16:03 354 1313097

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

355 18 дек, 16:04 355 1313098

>>1313090
>Приведи пример, где goto имеет преимущество перед структурным программированием.
Да хотя бы организовать быстрый выход из нескольких вложенных циклов. Есть, конечно, языки с чем-нибудь типа break n;
Но в питоне, например, нет такой конструкции, и гото тоже нет, лол, и приходится извращаться.

Ответы13103

356 18 дек, 16:07 356 1313099

>>1313092
>хотя должен заработать index.php
Он у тебя не пустой надеюсь? Вывод ошибок включен?
Просто надо исключить сам пхп.

Сам недавно трахался, то только с апачем - есть убунта серв, ну типичный такой lamp, только пых там не заводится - модуль не подключается. А не подключается потому, что его нету в списке модулей, хотя ставил. Возможно это из-за того, что я php на консолько ставил изначально. Думаю снести всё это дело и поставить по гайду.

Ответы13107

357 18 дек, 16:10 357 1313102

>>1313092
А php-fpm то хоть поставил и запустил?

Ответы13107

358 18 дек, 16:10 358 1313103

>>1313098
>организовать быстрый выход из нескольких вложенных циклов
>goto
В аду заставляют работать с твоим кодом.
Красиво, наверное, выглядит этот бросок через десятки строк и конструкций, вникуда.

Ответы13104

359 18 дек, 16:11 359 1313104

>>1313103
Никогда не пишу больше десяти строк в одной процедурке. А уж в циклах и подавно.

Ответы13149

360 18 дек, 16:15 360 1313107

>>1313102
>>1313099
Всё поцаны, я проебался с одной строкой в конфиге. 10 раз пересмотрел, написал в тред, а потом нашел ошибку. И у меня так вобще всегда.
Щас буду ебаться с установкой xdebug

361 18 дек, 17:22 361 1313149

>>1313104
>не пишу больше десяти строк в одной процедурке. А уж в циклах и подавно.
>быстрый выход из нескольких вложенных циклов
Кто-то запизделся.

Ответы13161

362 18 дек, 17:47 362 1313161

>>1313149
Не, ну если брать во внимание строчки с одной операторной скобкой по PSR-2, то, таки, да, я напиздел, лол.

Ответы13163

363 18 дек, 17:51 363 1313163

>>1313161
>строчки с одной операторной скобкой по PSR-2
>из нескольких вложенных циклов

Ответы13176

364 18 дек, 18:14 364 1313176

>>1313163
Для имбецилов: по одной скобке на каждую строчку.

Ответы13180

365 18 дек, 18:17 365 1313180

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

Ответы13197

366 18 дек, 18:47 366 1313197

>>1313180
А ты, типа, не используешь операторные скобки при написании циклов?

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

367 18 дек, 19:21 367 1313213

опа

368 18 дек, 19:22 368 1313215

Ситуация такая, сначала было максимально интересно делать что-либо, но как только перешел на фреймворк, стало максимально лень, что со мной не так?

Ответы13247

369 18 дек, 20:01 369 1313228

>>1308331
Бамп

Ответы14975

370 18 дек, 20:41 370 1313247

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

Ответы132621340114974

3,8 Мб, 1600x1284
371 18 дек, 21:09 371 1313262

>>1313247
>а бессмысленное говно писать, ненужное никому, смысла нету
В айти будущее большое ждет тебя.

Ответы13314

372 18 дек, 22:45 372 1313314

>>1313262
Идёт четвёртый месяц изучения веб - мозги кипят, особенно вечером.

Ответы13406

160 Кб, 640x638
373 19 дек, 02:56 373 1313379

То чувство когда набросал лапши в редактор, на перспективу, а она с первого раза всё правильно отработала.

Ответы13422

374 19 дек, 05:33 374 1313401

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

Ответы14974

375 19 дек, 06:26 375 1313406

>>1313314
так возьми отпуск. сходит в баньку с посонами. водовки наверни, блядей помацай
на ёбаной пыхе свет клином не сошелся

Ответы13761

376 19 дек, 08:51 376 1313422

>>1313379
Бля ахаха сделал мой день анон

377 19 дек, 09:25 377 1313426

Аноны кто-нибудь вкатился в этом году? Сколько искали работу? Что знали на момент вката? Были ли у вас какие-нибудь проекты нормальные? А то чет я уже заебался сидеть. Вдруг остальные уже вкатились со знаниями на моем уровне или не очень сильно выше, а я сижу сычую.

Ответы14974

378 19 дек, 10:19 378 1313439

Аноны спрашивали, где нужны трейты? Их ведь не было в оригинальном ООП.

Вот, что мне в голову приходит:

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

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

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

Какие есть минусы?

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

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

trait LastEditLogger requires SomeBaseClass, SomeInterface, SomeOtherTrait.

Также, у трейтов нет конструкторов и нельзя сделать инициализацию.

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

function x(SomeTrait $y)

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

378 19 дек, 10:19 378 1313439

Аноны спрашивали, где нужны трейты? Их ведь не было в оригинальном ООП.

Вот, что мне в голову приходит:

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

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

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

Какие есть минусы?

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

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

trait LastEditLogger requires SomeBaseClass, SomeInterface, SomeOtherTrait.

Также, у трейтов нет конструкторов и нельзя сделать инициализацию.

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

function x(SomeTrait $y)

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

Показать весь текст
Ответы134441345113508

379 19 дек, 10:22 379 1313440

НАчинал с пхп потом перешел на нормальный язык Джава.
теперь мне опять нужно писать на слонике.
Я теперь не могу нормально относится к этому синтаксису. Что делать?

380 19 дек, 10:40 380 1313444

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

Ответы14974

381 19 дек, 10:54 381 1313451

>>1313439
Inteface + trait>>1313439
>- трейт для контроллера с какой-то небольшой полезной функцией. Ну например, функцией отдачи файла с выставлением нужных заголовков (FileSenderTrait). Или функцией выдачи какой-то ошибки.
Тупое говно тупого говна.
Лучше это решать через композицию.
Сервисы, DTO.

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

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

>>1313439
>Также, надо, чтобы трейт можно было указать в качестве тайп-хинта:
Трейты можно в тайпхинте использовать.

>>1313439
>И видите другие применения трейтов?
Interface + trait.

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

Пример использования:
https://github.com/igorw/evenement/tree/master/src/Evenement

381 19 дек, 10:54 381 1313451

>>1313439
Inteface + trait>>1313439
>- трейт для контроллера с какой-то небольшой полезной функцией. Ну например, функцией отдачи файла с выставлением нужных заголовков (FileSenderTrait). Или функцией выдачи какой-то ошибки.
Тупое говно тупого говна.
Лучше это решать через композицию.
Сервисы, DTO.

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

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

>>1313439
>Также, надо, чтобы трейт можно было указать в качестве тайп-хинта:
Трейты можно в тайпхинте использовать.

>>1313439
>И видите другие применения трейтов?
Interface + trait.

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

Пример использования:
https://github.com/igorw/evenement/tree/master/src/Evenement

Показать весь текст
Ответы14973

382 19 дек, 13:19 382 1313508

>>1313439
Нахуй оно нужно? Чтобы забить пробел между интерфейсами и наследованием: нет как множественного наследования, так и дефолтной имплементации у интерфейсов. Трейт - это код, который копипастится в твой класс с.

Вот тебе некоторый абстрактный пример:
https://ideone.com/jZYlWs

Ответы14973

383 19 дек, 14:23 383 1313537

Анон, подскажи: IE не хочет открывать страницу в UTF8, упорно открывает в кириллице (windows), автовыбор отключен, в гугле ничего путного не нашел.

Ответы1431214972

384 19 дек, 15:10 384 1313562

Аноны, что за хня со мной, 4тый месяц подряд учу программирование, каждый день увеличивал часы проведенные за компом, но последние две недели появляется странное чувство уже через час после того как
сел за комп , головокружение, затупы, как будто сильно нервничаю. Раньше сидел играл в ту же дотку по 5-8 часов к ряду и все было збс, а сейчас ни по прогать ни поиграть нормально не могу. Всего лишь 23лвл, может у кого похожее было, как фиксить?

Ответы13576135931367913838

385 19 дек, 15:23 385 1313576

>>1313562
Возможно, микроинсульт схватил, сходи к врачу.

386 19 дек, 16:07 386 1313593

>>1313562
Ыыы а у меня спондилез шеи в 20.

387 19 дек, 18:56 387 1313679

>>1313562
шея\голова болит иногда? трещит шея если поворачивать?

Ответы13819

388 19 дек, 21:06 388 1313761

>>1313406
В пизду блядство и алкоголизм - я у мамы погроммист.

389 19 дек, 22:29 389 1313819

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

Ответы138211382713830

31 Кб, 500x461
390 19 дек, 22:31 390 1313821

>>1313819
>шея хрустит при резких поворотах либо когда наклоняю голову назад.

3 Кб, 264x191
391 19 дек, 22:42 391 1313827

>>1313819
Некогда обьяснять, мышцы твоей шеи в хлам после сидений(плюс ты наверняка напрягаешься и пережимаешь все что угодно), ложишься на ровное, вытягиваешься, на спине поднимаешь голову(как маленький ребенок если ты видел, когда он учится шею держать) 5-6 подходов по 5-10 секунд держания на весу
Чем выше держишь, тем легче, со временем можно будет совсем немного поднимать и это будет обеспечивать хорошую нагрузку
На животе руки по швам смотришь вниз(не вперед) - то же самое делаешь, аля маня учится ползать в кроватке в годик
Через недельку должно быть полегче, ключевые слова "нестабильность шейного отдела позвоночника"
Делаю постоянно перед сном, если совсем пиздец можно погреть в ванной
цэпэ! тоже делает упражнениее второе

Ответы13838

392 19 дек, 22:47 392 1313830

>>1313819
Шейный остеохондроз, бро.

Ответы13838

393 19 дек, 23:03 393 1313838

>>1313827
>>1313830
Спасибо за советы, но думаю это одна из проблем. Такая вещь как тут >>1313562 еще происходит если выпить кофе/какао. У врача был, поставил ВСД, но в интернетах пишут что этот диагноз все совковые врачи ставят, а на платных еще не заработал.

Еще на счёт шеи, может какую гель/мазь посоветуйте?

Ответы138401384913855

394 19 дек, 23:05 394 1313840

>>1313838
Извиняюсь сразу за оффтопы, просто это решает судьбу, не представляю как я буду работать по 8 часов в офисе если дома не могу и 2-3 часов нормально поучиться.
Сами темпы обучения идут быстро, планирую уже через 6-8 месяцев искать работку

395 19 дек, 23:25 395 1313849

>>1313838
У меня была подобная проблема. Занялся легким спортом и она ушла. Сейчас забросил и периодически проблема возникает.

396 19 дек, 23:33 396 1313855

>>1313838
Мази все хуйня, укрепляй мышцы регулярными несложными упражнениями, чай можно не пить, всд хуйня, начинай думать о здоровье, вон космонавты тоже по кайфу чилят в невесомости, но потом если не будут там заниматься по пизде сразу всё пойдет как спустятся, те же перегрузки отсутствием нагрузки
всд + па стаж 5+ лет

397 20 дек, 06:07 397 1313930

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

Ответы13931

398 20 дек, 06:11 398 1313931

>>1313930
Шапка опа.

399 20 дек, 10:42 399 1313959

CentOS7, Apache2.4, PHP7.2
Посоны, есть такое желание: получать переменные окружения для всех сайтов на хостинге (сайтов много - больше 50) из одного источника, не копируя в каждый виртуальный хост apache.
Но веб-сервер ограничен в правах и не может получать переменные окружения из /etc/profile.d например.
Как быть? Как делают гуру?

Ответы1409814973

400 20 дек, 14:40 400 1314047

Вопрос, нахуя нужен JS для php прогера?

Ответы140481404914512

401 20 дек, 14:42 401 1314048

>>1314047
нигде не нужен чисто пых прогер, обычно нужно знать пых, хтмл, жс и прочую малафью

Ответы14078

402 20 дек, 14:42 402 1314049

>>1314047
Грань между бекендом и фронтом щас размывается. Можно хуярить всё на одном языке (js). Ты со своим "онли пхп" уже динозавр.

Ответы14078

17 Кб, 1783x144
403 20 дек, 15:07 403 1314063

да как этот ебучий список нормально сделать?

Ответы14104

41 Кб, 1454x744
404 20 дек, 15:17 404 1314065

вот такая дрянь

Ответы14104

405 20 дек, 15:44 405 1314078

>>1314048
>>1314049
То есть если я просто хочу клепать сайтики на bitrix, wordpress за дошикм, надо столько всякой ебалы знать? Мне js с его ебанутыми промисами, коллбэками как-то не зашел

Ответы1409914104

406 20 дек, 16:20 406 1314098

>>1313959
Используй виртуализацию. Погугли например про docker-контейнер.

Ответы14973

407 20 дек, 16:21 407 1314099

>>1314078
Да дохуя знать надо. Может если только ты выпускник вуза какого-нибудь в Москве, можешь изи вкатиться на джуна. Там вроде вакансии есть с требованиями аля знать синтаксис php. А так ебашить придется и учить много хуеты. Я сам начал джс учить потихоньку так лень пиздец.

408 20 дек, 16:35 408 1314104

>>1314063
>>1314065
Покажи код!

>>1314078
>То есть если я просто хочу клепать сайтики на bitrix, wordpress за дошикм, надо столько всякой ебалы знать?
Зависит от требований работодателя. Мы не можем знать что ему потребуется. Наблюдай за рынком, смотри что требуется.

Моё личное мнение, JS для проектов на таких помойных фреймворках обладает таким же низким уровнем вхождения. А промисы и коллбэки, это не конкретная специфика JS и есть в любом языке. Понимание этого зависит от твоего общего уровня программирования. Коротко говоря, моя мысль заключается в том, что ты можешь изучить и JS, и это так же легко как html/css для твоего выбранного уровня.

Ответы1410614117

23 Кб, 418x413
409 20 дек, 16:38 409 1314106

>>1314104

Ответы14107

410 20 дек, 16:40 410 1314107

>>1314106
А что в массивах находится показать? Пожалуйста, старайся выдать максимальное количество информации о своей проблемы за один пост, дабы не разводить флуд.

Ответы14108

411 20 дек, 16:43 411 1314108

>>1314107
https://ideone.com/4lxBGW

Ответы14133

412 20 дек, 17:19 412 1314117

>>1314104
>Моё личное мнение, JS для проектов на таких помойных фреймворках обладает таким же низким уровнем вхождения.
Там весь Джай Асс - прикрутить Джай Куэри и поназначать селекторы для эффектов. Где там программирование вообще? Мартышки отлично справляются тыкая наугад.
Уровень ПХП там точно такой же.

мимоковырятель вордпресса палочкой

Ответы14128

413 20 дек, 17:43 413 1314128

>>1314117
А какие вообще задачи по вордпрессу ты делаешь? Плагины новые создаешь или че?

Ответы14141

414 20 дек, 17:53 414 1314133

>>1314108
>while($row = mysqli_fetch_array($result)) {
> $array[] = $row[0];
> $array1[] = $row[1];
>}

Во-первых, ты можешь воспользоваться выражением ключ -> значение в массиве, то есть ключом элемента массива будет название имени столбца полученного из БД (базы данных), а значением будет его значение.

[
'name' => 'Boris'
'password' => '12345'
]

Для этого тебе нужно воспользоваться оператором foreach

https://secure.php.net/manual/ru/control-structures.foreach.php

Подумай сам как это сделать.

Подсказка:

foreach($row as $key => $value) {
...
}

>$array = array();
Можно писать проще $array = [];

Переменные лучше называть тем что они обозначают, т.е. $array лучше переименовать в $users.

Затем, ты складываешь в $array все значения имён, а в $array1 все значение паролей, потом выводишь на новую строку <tr> данные имен <td> из $array и закрываешь эту строку </td>, и снова создаешь новую строку и выводишь в неё данные паролей из $array1. Кстати, при выводе $array1 ты в цикле обходишь $array >for($i=0;$i< count($array);$i++){ print_r($array1[$i])... Тебе нужно в каждой строке выводить данные И имён, И паролей.

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

Например это:
https://true-coder.ru/php/razdelenie-koda-i-shablona-mvc-chast-1.html
https://true-coder.ru/php/razdelenie-koda-i-shablona-mvc-chast-2.html

mysqli уже давно устаревшая технология, и все пользуются PDO.

https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
https://secure.php.net/manual/ru/book.pdo.php

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

Можешь свободно задавать любые вопросы если они появились.

414 20 дек, 17:53 414 1314133

>>1314108
>while($row = mysqli_fetch_array($result)) {
> $array[] = $row[0];
> $array1[] = $row[1];
>}

Во-первых, ты можешь воспользоваться выражением ключ -> значение в массиве, то есть ключом элемента массива будет название имени столбца полученного из БД (базы данных), а значением будет его значение.

[
'name' => 'Boris'
'password' => '12345'
]

Для этого тебе нужно воспользоваться оператором foreach

https://secure.php.net/manual/ru/control-structures.foreach.php

Подумай сам как это сделать.

Подсказка:

foreach($row as $key => $value) {
...
}

>$array = array();
Можно писать проще $array = [];

Переменные лучше называть тем что они обозначают, т.е. $array лучше переименовать в $users.

Затем, ты складываешь в $array все значения имён, а в $array1 все значение паролей, потом выводишь на новую строку <tr> данные имен <td> из $array и закрываешь эту строку </td>, и снова создаешь новую строку и выводишь в неё данные паролей из $array1. Кстати, при выводе $array1 ты в цикле обходишь $array >for($i=0;$i< count($array);$i++){ print_r($array1[$i])... Тебе нужно в каждой строке выводить данные И имён, И паролей.

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

Например это:
https://true-coder.ru/php/razdelenie-koda-i-shablona-mvc-chast-1.html
https://true-coder.ru/php/razdelenie-koda-i-shablona-mvc-chast-2.html

mysqli уже давно устаревшая технология, и все пользуются PDO.

https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
https://secure.php.net/manual/ru/book.pdo.php

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

Можешь свободно задавать любые вопросы если они появились.

Показать весь текст
Ответы1413514368

415 20 дек, 17:57 415 1314135

>>1314133
>и закрываешь эту строку </tr>*
Опечатался.

416 20 дек, 18:13 416 1314141

>>1314128
Или че.

417 20 дек, 23:20 417 1314312

>>1313537
Решилось комментированием строки
#AddDefaultCharset windows-1251
в конфиге денвера

418 21 дек, 04:45 418 1314364

Как передать свойство с одного класса в метод другого класса? Только статик?

Ответы1442614444

23 Кб, 827x376
419 21 дек, 06:56 419 1314368

>>1314133
Слава аллаху отзывчивому анону, не знал что так можно делать, только сейчас узнал о функции array_combine

Ответы14972

84 Кб, 776x856
420 21 дек, 11:18 420 1314425

Почему мне 2 выдает заместо 1 ? Мультибайто-проблемы? Но я же указал флаг /u , че ей не нравится?
http://sandbox.onlinephpfunctions.com/code/34c2e0e95accd4a9551b591f8b10745da88877bd

Ответы14972

421 21 дек, 11:29 421 1314426

>>1314364
Статические сущности - корень зла.

Ответы1445414623

422 21 дек, 11:58 422 1314444

>>1314364

Через аргументы:

$otherClass->method($this->property);

423 21 дек, 12:49 423 1314454

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

Типичная аксиома Эскобара короче.

Ответы1451414972

424 21 дек, 14:34 424 1314512

>>1314047
Потому что JAMstack

425 21 дек, 14:35 425 1314514

>>1314454
>Просто группировка переменных и обрабатывающего их функционала в один пакет.
Инкапсуляция, конечно, всегда хорошо. Но статические сущности в ООП не нужны.

Ответы14584

426 21 дек, 16:30 426 1314584

>>1314514
Речь не об ООП, а о хелперах, намертво прикрученных к приложению.

427 21 дек, 17:31 427 1314623

>>1314426
А что лучше? Дублировать одинаковый код?

Ответы14674

428 21 дек, 18:37 428 1314674

>>1314623
Пересмотреть архитектуру приложения.

429 21 дек, 22:22 429 1314762

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

Ответы14788

430 21 дек, 23:26 430 1314788

>>1314762
В днищеконторах только если.
Видишь такую - укатывайся подальше.

laravel начинающий бог в треде 431 21 дек, 23:51 431 1314797

спрашивайие

Ответы14805

432 22 дек, 00:08 432 1314804

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

Ответы14807

433 22 дек, 00:10 433 1314805

>>1314797
Есть два стула: один - с толстыми контроллерами, другой - на статиках сделанный. Что себе оставишь, что на собес отправишь?

Ответы14808

434 22 дек, 00:17 434 1314807

>>1314804
Как положено заходить в опен спейс? Если тебе под ноги кружку печенек кинут, что надо делать?

Как определить тимлида, где его рабочее место должно быть?

Ответы14809

435 22 дек, 00:20 435 1314808

>>1314805
Буду ебашить лапшу кода покамест монстр не разрастется до размеров галактики, а потом сьебну на другую работу мидлом. И так до сеньора с 300к в день.

Ответы14810

436 22 дек, 00:22 436 1314809

>>1314807
>Как положено заходить в опен спейс?
на гироскутере

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

>Как определить тимлида, где его рабочее место должно быть?
ближайшее к смузимашине

Ответы14813

437 22 дек, 00:23 437 1314810

>>1314808
А не боишься, что тебе неперезвонят с такими закидонами? Пойдёшь веслать в козлиную галеру.

Ответы14818

438 22 дек, 00:26 438 1314813

>>1314809
>смузимашина свежайшего смузи испить
С этим - к гламурным питорастам. У ПХПшников за это не погладят - у нас народ суровый и прожжёный.

Ответы14818

439 22 дек, 00:34 439 1314818

>>1314813
> у нас народ суровый и прожжёный.
одним словом уёбки-ноулайферы

>>1314810
>не перезвонят
мне похуй, хуже веб-макаки профессии нет

Ответы148191485514895

440 22 дек, 00:38 440 1314819

>>1314818
Ты не вкатишься.

Ответы14820

441 22 дек, 00:51 441 1314820

>>1314819
б-г миловал

Ответы14821

442 22 дек, 00:56 442 1314821

>>1314820
Это вообще шениально - называть людей неизвестной тебе профессии уёбками и макаками.

>б-г миловал
Веб от тебя.

Ответы14822

443 22 дек, 00:58 443 1314822

>>1314821
>Это вообще гениально
А ты подумой почему среди айтишнегов нет гениев? Тотоже!

444 22 дек, 06:51 444 1314855

>>1314818
Этот лев.

722 Кб, 1000x800
445 22 дек, 11:52 445 1314886

Анон, а как сделать фон и поверх него блок с тем же фоном только без «зетмнения», как на пике?

Ответы1489415179

446 22 дек, 12:13 446 1314894

>>1314886

Самый простой способ - просто сделать 2 картинки, одна чистая, другая затемненная. Затемненная имеет низкий контраст и может быть сильно сжата тем же JPEG. Если ты можешь гарантировать, что ее серединка всегда будет закрыта попапом, то можешь сделать серединку просто серой, что уменьшит вес. В попапе сделать закругление и фоном поставить цветную картинку. Чтобы картинки совпадали по расположению, можно:

- задать для них привязку к центру элемента. Это позволит сделать цветную картинку маленькой
- использовать привязку фона через http://htmlbook.ru/css/background-attachment и привязать их к углу экрана

Дальше - можно попробовать взять одну картинку, но заморочиться с фильтрами: https://developer.mozilla.org/ru/docs/Web/CSS/filter (интересно, что впервые фильтры появились в древних Internet Explorer, я помню, они были в IE6, вышедшем в 2003).

Надо понимать, что некоторые фильтры вроде blur не бесплатны. Например, у меня на телефоне применение фильтра blur к странице приводит к тому, что скроллинг идет со скоростью 2-3 fps (это очень дерганно).

Также, надо по caniuse проверить, насколько хорошо они поддерживаются: https://caniuse.com/#feat=css-filters

Заметь, что поддерживаются они так себе: в FF 2014 года надо включать флаг для их поддержки.

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

Ответы15142

447 22 дек, 12:25 447 1314895

>>1314818
>уёбки-ноулайферы
Вот какое тебе дело до чужой личной жизни? Ты ебаный вуерист извращенец?

Ответы14949

448 22 дек, 14:47 448 1314949

>>1314895
На самом деле у него всё ещё хуже:
1 - он жирный-пассажирный, который за каким-то хреном залез в пхп-тред и троллит тут. Уж точно не от избытка общения такое делают.
2 - он не жирный, а просто идиот, который залез в пхп-тред из-за нехватки дураков в /б.

449 22 дек, 15:59 449 1314972

369-448

>>1314454

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

>>1314425

Флаг u говорит о том, что шаблон для поиска и строка в кодировке utf-8. Увы, он не влияет на тот факт, что PREG_MATCH_OFFSET возвращает смещение в байтах, а не символах. Русские буквы занимают 2 байта.

Если тебе принципиально надо перевести байты в символы, то это можно сделать через mb_strlen(substr(....)), используя тот факт, что функции без mb_ работают со смещением в байтах. Вырезать кусок строки, указав смещение в байтах, и найти его длину в символах.

>>1314368

Это все хорошо, но не храни пароли в открытом виде, а храни соленый хеш от них: https://github.com/codedokode/pasta/blob/master/security/password-hashing.md

>>1313537

Надо указать кодировку заголовком Content-Type или тегом meta charset. Не стоит использовать устаревшие однобайтовые кодировки вроде 1251, в них, например, нет эмодзи и многих других символов.

Ответы1517515866

450 22 дек, 15:59 450 1314973

>>1313959

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

>>1314098

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

>>1313508

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

>>1313451

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

> DTO

Не очень понятно, при чем тут это.

> Ток надо проверить сможет ли доктрина прочитать анотации в трейте.

Может.

> Трейты можно в тайпхинте использовать.

Ты проверял эту информацию? У меня не работает: https://3v4l.org/0KcVF

> Пример использования:
> https://github.com/igorw/evenement/tree/master/src/Evenement

Мне, кстати, не нравится, эта система, так как там нет проверки на правильность написания события:

$x->on('dataaaReceived', ...)

А если бы были методы вроде

$x->onDataReceived(...)

То была бы и защита от опечаток, и видно, какие события доступны. Еще один вариант - через публичные свойства или методы, как в .NET:

$x->dataReceivedEvent->addListener(function ($e) {
...
});

Этот подход также защищает от опечаток и позволяет увидеть доступные события. А подход Evenement, скопированный с Node.JS, мне не очень нравится. Но это мое мнение.

450 22 дек, 15:59 450 1314973

>>1313959

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

>>1314098

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

>>1313508

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

>>1313451

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

> DTO

Не очень понятно, при чем тут это.

> Ток надо проверить сможет ли доктрина прочитать анотации в трейте.

Может.

> Трейты можно в тайпхинте использовать.

Ты проверял эту информацию? У меня не работает: https://3v4l.org/0KcVF

> Пример использования:
> https://github.com/igorw/evenement/tree/master/src/Evenement

Мне, кстати, не нравится, эта система, так как там нет проверки на правильность написания события:

$x->on('dataaaReceived', ...)

А если бы были методы вроде

$x->onDataReceived(...)

То была бы и защита от опечаток, и видно, какие события доступны. Еще один вариант - через публичные свойства или методы, как в .NET:

$x->dataReceivedEvent->addListener(function ($e) {
...
});

Этот подход также защищает от опечаток и позволяет увидеть доступные события. А подход Evenement, скопированный с Node.JS, мне не очень нравится. Но это мое мнение.

Показать весь текст
Ответы15868

451 22 дек, 16:00 451 1314974

>>1313444

Да, можно.

>>1313426

Поищи сам в архиве: https://phpclub.tech/search/?q=устроился

>>1313401

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

>>1313247

А что для тебя было бы интересно?

452 22 дек, 16:01 452 1314975

>>1313228
>>1308331

Комментариев, мягко, говоря маловато. Непросто будет другому разработчику понять, как использовать код. Хотя бы комментарий перед классом стоило добавить (а в идеале перед всеми неочевидными публичными методами).

> $this->time = $hour.':'.$minute;
А не выгоднее ли хранить время как часы и минуты отдельно, чтобы не мучаться с преобразованиями?

> $hour = 0..$hour;
А зачем тут 2 точки? Это получается 0. (0 без дробной части) . $hour.

> $minute > 60
А 60 минут - это допустимо?

> $datesAndTimes[] = $currentTime->modify($ordinal.' '.$spelling[$dayOfWeek].' '.$this->time);
Интересное решение.

> public function setAlarm(int $id, Alarm $alarm): void
> public function getAlarm(int $id): ?Alarm
А зачем этот id? Для тестов? Мне кажется, проще вообще без него. Или ты не уверен, что когда ты меняешь свойства тревоги, они поменяются внутри AlarmClock ? А это уже к тебе вопрос: поменяются или нет?

> if ($object == $alarm) {

Изучи, в чем отличие == и === для объектов в PHP мануале: http://php.net/manual/ru/language.oop5.object-comparison.php

> public function findNearestAlarm(DateTimeImmutable $currentTime): Alarm
Возможно, было бы лучше использовать DateTimeInterface, чтобы можно было передавать и DateTime, хотя тогда придется беспокоиться, что ты не поменяешь его содержимое.

> $alarms[] = [$alarmTime, $alarm];
> sort($alarms);

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

> sort($datesAndTimes);
> return $datesAndTimes[0];

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

> sort($alarms);
> return $alarms[0][1];
То же самое.

> private function isTriggeredAlarm(Alarm $alarm, DateTimeImmutable $currentTime): bool
Мне кажется, тут было бы быстрее сравнить время, день недели и признак активности. Хотя использованный подход тоже годится.

> $currentTime = new DateTimeImmutable('13:00');
Здесь в тесте появляется зависимость от текущего дня. Лучше бы жестко прописать дату, чтобы убрать случайности.

> assert(get_class($alarmTime) == DateTimeImmutable::class);
Лучше было бы писать $alarmTime instanceof DateTimeImmutable - ведь мы не обязаны вернуть строго этот класс, а допустимо вернуть его наследника в соотв. с принципом Лисков (LSP).

> assert($alarmClock->getAlarm(0) === null);
Вот тут вместо поиска по id (а откда ты знаешь, какой у тревоги id? Это нигде не документировано) было бы лучше сделать метод вроде getAllAlarms() или hasAlarm() и проверять через них. А с твоим подходом - появляется необходимость в id, и тест становится хрупким, зависящим от деталей реализации класса: если завтра мы начнем нумеровать тревоги с 1, то тест сломается. А это затраты времени и денег на переписывание.

> assert($nearestAlarm === $alarm || $nearestAlarm === $alarm2);

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

> $alarm2->setType(Alarm::TYPE_NON_REPEATING);
> $alarmClock->setAlarm(0, $alarm2);
Вообще, вызывать setAlarm не требуется. Ты объект заменяешь тем же самым объектом.

В общем, сделано хорошо.

Ну и на будущее, сейчас ты писал тесты руками, но вообще есть готовые фреймворки для написания тестов, где много готовых полезных методов, где есть вывод отчетов о выполнении тестов. Самый известный - это PhpUnit, это PHP-версия семейства фреймворков xUnit, которые есть почти для любого языка (версия для Явы, например, называется JUnit). Это семейство началось с фреймворка для Smalltalk SUnit, описанного Кентом Беком в статье 1989 года ( http://swing.fit.cvut.cz/projects/stx/doc/online/english/tools/misc/testfram.htm - там есть полный код фреймворка). Почти 30 лет прошло!

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

452 22 дек, 16:01 452 1314975

>>1313228
>>1308331

Комментариев, мягко, говоря маловато. Непросто будет другому разработчику понять, как использовать код. Хотя бы комментарий перед классом стоило добавить (а в идеале перед всеми неочевидными публичными методами).

> $this->time = $hour.':'.$minute;
А не выгоднее ли хранить время как часы и минуты отдельно, чтобы не мучаться с преобразованиями?

> $hour = 0..$hour;
А зачем тут 2 точки? Это получается 0. (0 без дробной части) . $hour.

> $minute > 60
А 60 минут - это допустимо?

> $datesAndTimes[] = $currentTime->modify($ordinal.' '.$spelling[$dayOfWeek].' '.$this->time);
Интересное решение.

> public function setAlarm(int $id, Alarm $alarm): void
> public function getAlarm(int $id): ?Alarm
А зачем этот id? Для тестов? Мне кажется, проще вообще без него. Или ты не уверен, что когда ты меняешь свойства тревоги, они поменяются внутри AlarmClock ? А это уже к тебе вопрос: поменяются или нет?

> if ($object == $alarm) {

Изучи, в чем отличие == и === для объектов в PHP мануале: http://php.net/manual/ru/language.oop5.object-comparison.php

> public function findNearestAlarm(DateTimeImmutable $currentTime): Alarm
Возможно, было бы лучше использовать DateTimeInterface, чтобы можно было передавать и DateTime, хотя тогда придется беспокоиться, что ты не поменяешь его содержимое.

> $alarms[] = [$alarmTime, $alarm];
> sort($alarms);

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

> sort($datesAndTimes);
> return $datesAndTimes[0];

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

> sort($alarms);
> return $alarms[0][1];
То же самое.

> private function isTriggeredAlarm(Alarm $alarm, DateTimeImmutable $currentTime): bool
Мне кажется, тут было бы быстрее сравнить время, день недели и признак активности. Хотя использованный подход тоже годится.

> $currentTime = new DateTimeImmutable('13:00');
Здесь в тесте появляется зависимость от текущего дня. Лучше бы жестко прописать дату, чтобы убрать случайности.

> assert(get_class($alarmTime) == DateTimeImmutable::class);
Лучше было бы писать $alarmTime instanceof DateTimeImmutable - ведь мы не обязаны вернуть строго этот класс, а допустимо вернуть его наследника в соотв. с принципом Лисков (LSP).

> assert($alarmClock->getAlarm(0) === null);
Вот тут вместо поиска по id (а откда ты знаешь, какой у тревоги id? Это нигде не документировано) было бы лучше сделать метод вроде getAllAlarms() или hasAlarm() и проверять через них. А с твоим подходом - появляется необходимость в id, и тест становится хрупким, зависящим от деталей реализации класса: если завтра мы начнем нумеровать тревоги с 1, то тест сломается. А это затраты времени и денег на переписывание.

> assert($nearestAlarm === $alarm || $nearestAlarm === $alarm2);

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

> $alarm2->setType(Alarm::TYPE_NON_REPEATING);
> $alarmClock->setAlarm(0, $alarm2);
Вообще, вызывать setAlarm не требуется. Ты объект заменяешь тем же самым объектом.

В общем, сделано хорошо.

Ну и на будущее, сейчас ты писал тесты руками, но вообще есть готовые фреймворки для написания тестов, где много готовых полезных методов, где есть вывод отчетов о выполнении тестов. Самый известный - это PhpUnit, это PHP-версия семейства фреймворков xUnit, которые есть почти для любого языка (версия для Явы, например, называется JUnit). Это семейство началось с фреймворка для Smalltalk SUnit, описанного Кентом Беком в статье 1989 года ( http://swing.fit.cvut.cz/projects/stx/doc/online/english/tools/misc/testfram.htm - там есть полный код фреймворка). Почти 30 лет прошло!

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

Показать весь текст
Ответы1521516084

453 22 дек, 19:21 453 1315134

Насколько сложно сейчас(конец 2018 года) найти работу php junior во Львове?

454 22 дек, 19:46 454 1315142

>>1314894
Спасибо тебе огромное и побольше здоровья.

455 22 дек, 20:59 455 1315175

>>1314972
>Есть еще мнение, что для дебага лучше использовать дебаггер, или сделать логгирование или натыкать var_dump.
У меня ПХП как консольное приложение крутился - вывод прямо на экран в реалтайме.
>var_dump
Если у тебя скрипт 10 строк, то да, а если под 300? Задолбаешься потом это вар_дамп выковыривать из кода.

Ответы15176

456 22 дек, 21:01 456 1315176

>>1315175
>а если под 300?
На каждый модуль, размазанные по файловой системе, в смысле

457 22 дек, 21:06 457 1315179

>>1314886
А еще можно открыть source и посмотреть как там это сделано.

Ответы15230

458 22 дек, 21:47 458 1315215

>>1314975
> Возможно, было бы лучше использовать DateTimeInterface, чтобы можно было передавать и DateTime

Я не тот, кому адресован ответ, просто для справки отвечу - DateTimeInterface лучше не использовать. Это бесполезный интерфейс, так как если функция работает с аргументами типа \DateTime, на которых вызываются методы modify или setTime, то при передаче в функцию аргументов типа \DateTimeImmutable функция вернёт другие результаты, верно и обратное.
Например во Flow даже есть специальные конструкции, позволяющие пометить аргументы, для которых запрещено мутирование: https://flow.org/en/docs/types/interfaces/#toc-interface-property-variance-read-only-and-write-only

Ещё есть RFC от разработчика доктрины, предлагающее выпилить DateTimeInterface: https://wiki.php.net/rfc/drop-datetimeinterface
Похоже, что этот интерфейс вводился для поддержки перезрузки операторов вроде >, < для объектов дат.

Иммутабельные объекты-значения вроде денег и времени исключают огромное количество трудноуловимых багов. Кстати, в мире JS есть библиотека moment, в которой даты не иммутабельны и разработчики писали пост с извинениями за то, что сразу не сделали нормально. Сейчас уже слишком поздно что-то менять из-за обратной совместимости, поэтому приходится постоянно клонировать даты.

Ответы15228

459 22 дек, 22:06 459 1315228

>>1315215

Вообще, да, справедливое замечание. Не стоит тогда менять DTImmutable на DTInterface.

Я ловил себя на мысли, что эти классы не очень совместимы, но как-то глубоко не думал.

Действительно, интерфейс определяет не только названия методов, но и определенные требования к ним. И неправильно, когда одна реализация modify создает новую сущность, а другая - модифицирует существующую. Трудно написать интерфейс, который корректно работает с обоими типами.

Ответы15231

460 22 дек, 22:06 460 1315230

>>1315179
Это изображение, лол.

461 22 дек, 22:07 461 1315231

>>1315228

* трудно написать код, который корректно работает с обоими типами

462 22 дек, 22:47 462 1315258

>>1305609
екземпл

463 23 дек, 01:15 463 1315297

Отпишитесь, кто работает на пыхе в ДС. Сколько получаете?

Ответы15865

464 23 дек, 01:24 464 1315300

>>1312630
Вспомнил свою спам-молодость.
И только попробуйте мне пиздануть, что нельзя парсить HTML регулярками — я напишу регулярку в 10 раз быстрее, чем вы будете подключать свою нескучную либу от васяна (которая ещё и поперхнется при первом нарушении формата) и этого будет достаточно для 98% задач.

465 23 дек, 11:24 465 1315365

как же блевотно на чистом пхп писать сайт

Ответы15369

466 23 дек, 11:30 466 1315369

>>1315365
Держи нас в курсе.

Фреймворк 467 23 дек, 15:50 467 1315498

Зимой будет долгий отпуск. Планирую ознакомиться с парой фреймворков. Сам работаю с ларой.

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

И еще вопрос. Какой фреймворк считается самым тру? Симфони вроде как?

Ответы1559819270

468 23 дек, 18:24 468 1315598

>>1315498
>
Необходим дохуя простой фреймворк.
Slim/Silex.

> Какой фреймворк считается самым тру?
Zend > Symfony> Yii > ...

Ответы15653

469 23 дек, 20:09 469 1315653

>>1315598
Чем плох Laravel?

Ответы15667

470 23 дек, 20:19 470 1315667

>>1315653
Ничем.

Ответы15670

471 23 дек, 20:22 471 1315670

>>1315667
медленный,самый главный тормоз

472 23 дек, 21:57 472 1315713

Аноны! Дайте советов мудрых по теоретическому вопросу.
Есть некий сайт с видео на пример возьмём паблик вкакахе. Нужно написать скрипт, который будет выкачивать видео оттуда и заливать на фтп. Пхп с этим справится? Если что, каждое видео открывается в новом окне. Скачивание вручную происходит путём ПКМ->Сохранить видео как...

Ответы15715

473 23 дек, 22:00 473 1315715

>>1315713
Да, вполне справится.

474 24 дек, 03:29 474 1315784

Можно ли в пхп работать с тредами и нужно ли это вообще?

Ответы19270

475 24 дек, 11:15 475 1315838

Не могу заставить Slim работать ни на локалхосте, ни на хостинге. Выдает Page Not Found.
Вот код index.php:
<?php
require 'vendor/autoload.php';
$app = new \Slim\App();
$app->run();

Ответы15851

476 24 дек, 12:10 476 1315851

>>1315838

htaccess настроил как в документации?

Ответы1585715955

477 24 дек, 12:31 477 1315857

>>1315851
Нет. Настроил по видео https://www.youtube.com/watch?v=TcFUNG7M3VE&t=554s хостинг выдает ошибку

478 24 дек, 13:04 478 1315865

>>1315297
100к

479 24 дек, 13:11 479 1315866

>>1314972
>PREG_MATCH_OFFSET возвращает смещение в байтах
Спасибо за развернутый ответ!

480 24 дек, 13:20 480 1315868

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

Понятно, дальше не читал.

Ответы15931

481 24 дек, 16:01 481 1315931

>>1315868
Да, придётся подтянуть матчасть чтобы понять что написано.

482 24 дек, 17:00 482 1315955

>>1315851
Все я разобрался

483 24 дек, 21:22 483 1316084

>>1314975
Спасибо за замечания!

>Комментариев, мягко, говоря маловато
Понял, сделаю

>А зачем этот id?
Переделаю

>Интересное решение.
> $currentTime->modify($ordinal.' '.$spelling[$dayOfWeek].' '.$this->time);

Что-то не так? Есть вариант с $time-add(DateInterval::createFromDateString('параметры')); , но он выглядит слишком массивно и по-моему имеет какой-то подвох.

>Здесь есть проблема: если ни один день недели не выбран, то массив будет пуст и произойдет ошибка

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

У меня возник вопрос насчет функции setAlarm. Как она в нынешнем виде (замена объекта на объект) может пригодиться в реальном проекте? Ведь можно завести метод getAlarms():array и настраивать нужный нам объект выбрав его из массива. Это нарушит принцип solid?

Ответы19269

34 Кб, 369x604
484 24 дек, 23:04 484 1316130

>>1305368 (OP)
У меня возникли вопросы по вектору!

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

Но я подсмотрел в phpclub.tech, что вы рекомендовали для построения фирмы использовать паттерн Builder.

Я вижу два варианта решения, первый - это создать класс CompanyBuilder в котором будут методы создатьДепартаменты, создатьРаботников, получитьКомпанию.

Пример https://ideone.com/3FEnva

Второй вариант, это - создать класс DepartmentBuilder с методами создатьРаботников, получитьДепартамент.

Пример https://ideone.com/PkdeAs

Вдохновлялся этим образцом https://github.com/domnikl/DesignPatternsPHP/blob/master/Creational/Builder/TruckBuilder.php

Ещё была идея сделать фабрику со статическим классом, которая будет отдавать нам массив с работниками.

Пример https://ideone.com/Fwij7Q

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

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

Надеюсь принципы ООП не запрещают иметь внутри объекта Employee объект профессии, который может быть у каждого работника уникальным или наоборот у всех сотрудников одной профессии в компании он будет одинаковым.

Буду благодарен за подсказки. Возможно я ещё не дорос до уровня на котором стоит пытаться вникать в паттерны?

34 Кб, 369x604
484 24 дек, 23:04 484 1316130

>>1305368 (OP)
У меня возникли вопросы по вектору!

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

Но я подсмотрел в phpclub.tech, что вы рекомендовали для построения фирмы использовать паттерн Builder.

Я вижу два варианта решения, первый - это создать класс CompanyBuilder в котором будут методы создатьДепартаменты, создатьРаботников, получитьКомпанию.

Пример https://ideone.com/3FEnva

Второй вариант, это - создать класс DepartmentBuilder с методами создатьРаботников, получитьДепартамент.

Пример https://ideone.com/PkdeAs

Вдохновлялся этим образцом https://github.com/domnikl/DesignPatternsPHP/blob/master/Creational/Builder/TruckBuilder.php

Ещё была идея сделать фабрику со статическим классом, которая будет отдавать нам массив с работниками.

Пример https://ideone.com/Fwij7Q

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

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

Надеюсь принципы ООП не запрещают иметь внутри объекта Employee объект профессии, который может быть у каждого работника уникальным или наоборот у всех сотрудников одной профессии в компании он будет одинаковым.

Буду благодарен за подсказки. Возможно я ещё не дорос до уровня на котором стоит пытаться вникать в паттерны?

Показать весь текст
Ответы1874319267

485 25 дек, 00:37 485 1316154

Анонушки, есть такой массив $key, в котором такие данные

(
[0] => $10 000 business start up

[1] => $10 000 investment opportunities

[2] => $10 000 to invest

[3] => $1000 investment ideas

)

В этом простом скрипте, который юзает этот массив: ключ - это номер страницы, а значение - это ключевое слово страницы как бы. Надеюсь понятно.

Таким образом, мы дергаем domain.ru/?page=1

А там выводится "$10 000 business start up"

Как мне вывести их наоборот, да так, чтобы этот массив начался с единицы, т.к. странцы в url начинаются с единицы, да еще в виде карты сайта? Но не xml в в виде списка <a href="domain.ru/?page=1">$10 000 business start up</a>... и так далее.

Короче пройтись по всему массиву, сделать по сути смещение на единицу и вывести с таким синтаксисом?

Ответы16164

486 25 дек, 01:07 486 1316164

>>1316154
Даже не так лучше, анончики, простите: нужно просто вывести карту сайта в виде всех страничек (то есть просто вы ключи из массива без значений):

<?xml version="1.0" encoding="UTF-8"?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

<url>

<loc>http://www.domain.com/?page=0</loc>

<lastmod>2005-01-01</lastmod>

<changefreq>monthly</changefreq>

<priority>0.8</priority>

</url>

<url>

<loc>http://www.domain.com/?page=0</loc>

<lastmod>2005-01-01</lastmod>

<changefreq>monthly</changefreq>

<priority>0.8</priority>

</url>

</urlset>

486 25 дек, 01:07 486 1316164

>>1316154
Даже не так лучше, анончики, простите: нужно просто вывести карту сайта в виде всех страничек (то есть просто вы ключи из массива без значений):

<?xml version="1.0" encoding="UTF-8"?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

<url>

<loc>http://www.domain.com/?page=0</loc>

<lastmod>2005-01-01</lastmod>

<changefreq>monthly</changefreq>

<priority>0.8</priority>

</url>

<url>

<loc>http://www.domain.com/?page=0</loc>

<lastmod>2005-01-01</lastmod>

<changefreq>monthly</changefreq>

<priority>0.8</priority>

</url>

</urlset>

Показать весь текст
Ответы1617019269

487 25 дек, 01:21 487 1316170

>>1316164
Тут по хорошему нужно бы разнести на несколько файлов и реализовать хотя бы примитивный темплейт, но если "хуяк хуяк и в продакшн" то как то так:
<?php
$keys =[
0 => '$10 000 business start up',
1 => '$10 000 investment opportunities',
2 => '$10 000 to invest',
3 => '$1000 investment ideas'
];
$myShittyCode = '';
foreach ($keys as $key => $value) {
$myShittyCode .= '<a href="domain.ru/?page=' . ($key + 1) .'">' . $value . '</a>';
}

echo $myShittyCode;

/ или использовать цикл for()
или получать имя ключа функцией key() . тут нужно будет читнуть мануал по массивам
*/

Ответы16175

81 Кб, 604x604
488 25 дек, 01:53 488 1316175

>>1316170
Спасибо большое! Сделал твой вариант в виде html и сделал xml по этому коду: gist.github.com/artlung/210438

Все получилось.

489 25 дек, 06:04 489 1316200

>>1308014
array_reduce();

490 25 дек, 08:21 490 1316210

Нужно ли пхпшнику задротить JS?

Ответы1624316273

491 25 дек, 10:17 491 1316243

>>1316210
Необязательно, но желательно. Зависит от того, чем ты хочешь заниматься.

492 25 дек, 11:53 492 1316273

>>1316210
Если и лезть в эту тему, то с головой, не стоит относится к этому ЯП с пренебрежением или с отвращением. Подойдите к этому как к навыку работы с еще одним инструментом, который заслуживает отдельного внимания и детального изучения. К тому же, изучение JS приведет к встряске устоявшихся ментальных конструкций, полученных при изучении PHP.

493 25 дек, 13:57 493 1316313

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

$items= array(
0 => array(
"img" => "site/hooy.img",
"name" => "Штаны Гоша рубчинский",
"prcie" => "10000"),
1 => array(
"img" => "site/hooy2.img",
"name" => "Ватник",
"prcie" => "50"),
)
)
);
И так далее

Составил такую регулярку просто чтобы для начала вытянуть все блоки с товарами, а дальше че нибудь придумаю:
$pattern = '~<div class="item"(.*)</div>~';
preg_match_all($pattern, $content, $matches);

Возвращаются пустые массивы. Я не понимаю. Что я делаю не так?
Я знаю, что этот вопрос решили уже 100 раз. Я делаю это исключительно в целях обучения.

Ответы1632519269

494 25 дек, 14:35 494 1316325

>>1316313
Мудак ты ёбаный, ну есть же json, нахуй тебе парсить хтмл?

Ответы1633316337

495 25 дек, 14:57 495 1316333

>>1316325
То есть мне надо кодировать всю страницу в json, найти там нужные мне блоки, записать их, а потом раскодировать?

Ответы16336

496 25 дек, 15:08 496 1316336

>>1316333
Кодера найми просто и он всё сделает за день. Сам ты неделю возиться будешь, мозг сломаешь, и не факт, что результат будет.

А так ты ересь несёшь.

Ответы16340

497 25 дек, 15:11 497 1316337

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

498 25 дек, 15:17 498 1316340

>>1316336
Бро ты чего какой злой? Я учу пхп, хочу понять как мне запарсить блоки, вот и спрашиваю.

Ответы16344

499 25 дек, 15:23 499 1316343

Найс, посоветуйте книг

500 25 дек, 15:28 500 1316344

>>1316340
Почему я злой? Нормально общались вроде.
Если сайт твой - парсить его выдачу смысла не имеет и создаёт лишнюю нагрузку.
Проще запрос к БД составить и получить свой массив куда надо. Ну или API с json прикрутить, но тут долго пыхтеть будешь.

Ответы16346

501 25 дек, 15:35 501 1316346

>>1316344
Мне не принципиально с какого сайта парсить, хоть с яндекс ньюс. Просто у меня есть свой сайт, который я написал сам, мне проще парсить с него.
Цель - научиться и понять как вытаскивать блоки с одинаковым классом и записывать информацию из них в массив на чистом пхп.
На данный момент я запутался.

Ответы17103

502 25 дек, 19:56 502 1316478

Спаси и сохрани

479 Кб, webm,
1920x1080, 0:11
someApprentice 503 27 дек, 06:33 503 1317102

Как вам код? Мне очень нравится.

Ответы171071714319269

504 27 дек, 06:39 504 1317103

>>1316346
Получаешь страницу, парсишь регулярками по ситуации. Или какой-нибудь либой, которая уже умеет прекрасно работать с дом. Вероятно соснешь на динамичном контенте, придется выкручиваться.

505 27 дек, 07:16 505 1317107

>>1317102
жмот

633 Кб, mp4,
1920x1080, 0:30
someApprentice 506 27 дек, 09:47 506 1317143

>>1317102

507 27 дек, 18:39 507 1317353

Аноны, подскажите, можно-ли сгенерировать новую папку на PHP, если можно, то как?

Ответы17356

508 27 дек, 18:48 508 1317356

>>1317353
mkdir

Ответы17362

509 27 дек, 18:58 509 1317362

>>1317356
Спасибо.

510 29 дек, 13:32 510 1318313

Поцаны, я установил Intervention и начал разбираться. Сделал простейшую функцию ресайз и вот результат:
Fatal error: Uncaught Error: Call to undefined function Intervention\Image\mb_convert_case() in /var/www/images/vendor/intervention/image/src/Intervention/Image/AbstractDriver.php:105

Как я понял, у меня нет функции mb_convert_case(). Не понимать. Функции для пхп можно как то доустанавливать?

Ответы18327

511 29 дек, 13:51 511 1318327

>>1318313
Разобрался. Надо было установить mbstring
Почему так происходит? Почему надо что то доустанавливать в пхп лол?

Ответы19269

VirtualBox + MySQL 512 29 дек, 14:18 512 1318338

Хз где спросить. Спрошу у вас.

Есть необходимость иметь отдельный виртуальны сервер под MySQL (в моем случае MariaDB).
Настроил все на VirtualBox. Проблема в том, что соединение с хоста происходит очень долго. Кто-то может пояснить почему и можно ли это исправить?

На виртуалке использую ubuntu server 18.04 и виртуальный адаптер хоста со статическим ip. Виртуальный адаптер хоста нужен для того, чтобы с базой можно было соедениться как с хоста, так и с других виртуальных образов.

Я тупой, поэтому если кто знает в чем проблема поясните на пальцах плез

Ответы18356

513 29 дек, 14:56 513 1318356

>>1318338
Вопрос решился очень просто

Ответы18575

514 29 дек, 17:28 514 1318400

Двощь, помоги мне.
$x = 2;
echo "$x $x = ($x$x)\n";
Мне нужно, чтобы выводило 2 2 = 4, а не 2 2 = (2*2)

Ответы184011840418420

515 29 дек, 17:30 515 1318401

>>1318400
Блядская разметка.
Мне нужно, чтобы выводило 2 умножить 2 = 4, а не 2 умножить 2 = (2*2)

516 29 дек, 17:38 516 1318404

>>1318400

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

Ответы1840518420

517 29 дек, 17:40 517 1318405

>>1318404
>В строку нельзя вставлять выражения.
Очень жаль. Спасибо.

76 Кб, 730x738
518 29 дек, 17:48 518 1318406

В два треда закинул, сюда тоже закину
Ну что, погроммисты, можете сдать грейд на мидла?

Ответы185021864718654

1 Кб, 211x48
519 29 дек, 18:39 519 1318420

>>1318404
Въебал бы тебе с ноги

>>1318400

Ответы1843618503

520 29 дек, 19:23 520 1318436

>>1318420
Въебал бы тебе за щеку за тупые выебоны на детской теме. Кодер из тебя дерьмо, если ты экономишь переменные в ущерб читабельности.

Ответы18503

521 29 дек, 23:43 521 1318502

>>1318406

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

522 29 дек, 23:48 522 1318503

>>1318420
>>1318436

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

Ответы18518

523 30 дек, 00:26 523 1318518

>>1318503
>Давайте вести себя культурнее.
Да я, вроде, старался в стиле поста ответить. Но ты прав, пожалуй.

524 30 дек, 06:54 524 1318575

>>1318356
Расскажи как

Ответы18678

525 30 дек, 11:33 525 1318633

В пыхе можно замутить нормальные дженерики каким-нибудь расширением?
Есть rfc, но это лишь бумажка для подтирания жопы, которой уже подтерлись.
Нужен какой-то реальный рабочий код или мод языка

Ответы18783

526 30 дек, 12:19 526 1318647

71 Кб, 751x77299 Кб, 742x846

>>1318406
На Сениора и Июня

Ответы1865419214

527 30 дек, 12:31 527 1318654

>>1318406
>>1318647
Какая-то хуита. Вообще ничего нет про виртуализацию/контейнеризацию и системы деплоя.
Нихуя нет про сети кроме "http протокол".
При этом вопросы по БД на более высоком уровне, чем требуется при разработке 95% говносайтов.
При этом еще и чисто под SQL заточены, судя по всему.
Я уж молчу про отсутствие требований знаний структур данных и алгоритмов.

528 30 дек, 12:33 528 1318656

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

Ответы1870518707

529 30 дек, 13:22 529 1318678

>>1318575
В настройках всего этого сетевого говна (в убунте 18.04 это netplan). У меня было написано:
nameservers:
addresses: [8.8.8.8, 8.8.4.4]

Что создавало какую-то залупа с DNSами всякими (хуйово в этом шарю). На практике, эта хуйня при запуске оси, записывала в этот файл: /etc/resolv.conf строку: nameserver: 127.0.0.53

Насколько я понял из гугла. При соединении мускуль тратит какоето время на поиск чегото там связанного с днс, хз в общем, но везде советуют в конфиг мускуля добавить такой параметр:
skip-name-resolve

Что мне не помогло, но я оставил. А помогло банальное удаление строк:
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
из настроек netplan

и удаление
nameserver: 127.0.0.53
из:
/etc/resolv.conf

16 Кб, 979x169
530 30 дек, 13:47 530 1318682

Насколько я конченый?

Ответы19268

531 30 дек, 15:06 531 1318705

>>1318656
>область видимости члена класса
Какого ещё члена? Ты класс объявляешь или объект этого класса? И причём тут наследование?
Ничего не понятно из твоего поста.

Ответы18708

532 30 дек, 15:13 532 1318707

>>1318656

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

А вообще, почему бы тебе не сделать эксперимент? Сделай 3 базовых класса с 3 разными видимостями полей, для каждого по 2 наследника, где видимость меняется, чтобы были все комбинации. И тогда обсудим, почему так выходит.

Ответы18708

533 30 дек, 15:15 533 1318708

>>1318707
>>1318705
Уже сделал.
1. В пыхе нельзя менять область видимости членов класса.
2. Можно объявить в дочернем классе член с таким же именем и увеличить ему область видимости, но это будет не тот же самый член, что в базовом классе, а новый член, прост с таким же именем. Значение не копируется.
При этом если уменьшить область видимости члена с идентичным именем, то выкинет фатал еррор.

Ответы1871419268

534 30 дек, 15:27 534 1318714

>>1318708

private члены класса видны только в нем. Если ты хочешь расширить область видимости, надо брать в базовый класс protected, а в наследнике делать public.

3 Кб, 455x78
535 30 дек, 16:07 535 1318727

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

Ответы18734

536 30 дек, 16:47 536 1318734

>>1318727

Это случайно не связано с багом, который описан тут:

- https://phpclub.tech/pr/res/1305368.html#1308865
- https://phpclub.tech/pr/res/1281608.html#1297483

То есть когда ты в наследнике сужаешь возвращаемый тайп-хинт? Расширять его нельзя из-за приципа Лисков, а сужать можно, но PHP не позволяет.

Ответы18750

537 30 дек, 17:30 537 1318743

>>1316130
Up!
Снимаю все вопросы, кроме.

>Надеюсь принципы ООП не запрещают иметь внутри объекта Employee объект профессии, который может быть у каждого работника уникальным или наоборот у всех сотрудников одной профессии в компании он будет одинаковым.

Объект профессии не имеет смысла в системе без объекта сотрудника, получается его нужно создавать внутри конструктора сотрудника? Композиция, так кажется это называется.

Ответы19267

538 30 дек, 17:56 538 1318750

>>1318734
Да, сужаю. В 7.2 подвезли какой-то костыль для этих дел, но это бред
https://wiki.php.net/rfc/object-typehint

Ответы19268

539 30 дек, 20:13 539 1318783

>>1318633
Дженериков нет и не будет. Даже если будут, всё перечёркивает динамическая натура PHP, так как проверки типов происходят в рантайме, то есть эффект "скомпилировалось - значит работает" недостижим в PHP. Есть статические анализаторы, поддерживающие дженерики, например psalm, phpstan, phan: https://github.com/phan/phan/wiki/Generic-Types

Сейчас всё больше open source проектов внедряют статический анализ, например Doctrine ORM, но в локальной разработке это очень неудобно - на данный момент статические анализаторы плохо поддерживаются в IDE, у каждого статического анализатора свой синтаксис дженериков + для сторонних библиотек нет тайпингов и никто их не делает. Для того же TypeScript есть репозиторий DefinitelyTyped. Тем не менее, вот человек использует статический анализ в PHP: https://www.youtube.com/watch?v=sf39f2q15cU

Совет - бери другой язык. Сам последние полгода 90% времени пишу на тайпскрипте, остальные 10% мучаюсь с PHP. Тем, кто писал только на динамических языках, нас не понять.

Ответы18793

540 30 дек, 20:32 540 1318793

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

Ответы1882118879

541 30 дек, 20:51 541 1318812

Чому PSR такое говно?

Code MUST follow a “coding style guide” PSR [PSR-1].

Code MUST use 4 spaces for indenting, not tabs.

There MUST NOT be a hard limit on line length; the soft limit MUST be 120 characters; lines SHOULD be 80 characters or less.

There MUST be one blank line after the namespace declaration, and there MUST be one blank line after the block of use declarations.

Opening braces for classes MUST go on the next line, and closing braces MUST go on the next line after the body.

Opening braces for methods MUST go on the next line, and closing braces MUST go on the next line after the body.

Visibility MUST be declared on all properties and methods; abstract and final MUST be declared before the visibility; static MUST be declared after the visibility.

Control structure keywords MUST have one space after them; method and function calls MUST NOT.

Opening braces for control structures MUST go on the same line, and closing braces MUST go on the next line after the body.

Opening parentheses for control structures MUST NOT have a space after them, and closing parentheses for control structures MUST NOT have a space before.

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

Ответы1881319267

542 30 дек, 20:53 542 1318813

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

Ответы18821

543 30 дек, 21:11 543 1318821

>>1318793
> вообще ни вижу какие весомые преимущества могут быть в динамической типизации
Это удобно тогда, когда вся программа может уместиться в голове: https://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two

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

> Ну это же костыль, причем лютейший, чет уровня "тайпхинтов в комментах".
Зависит от реализации, например Flow для JS это статический анализатор, но по мощи и удобству использования он обходит многие статически типизированные языки вроде джавы благодаря выводу типов. Только вот за анализаторами для JS стоят крупные компании - Facebook и Microsoft, анализаторы для PHP пишут энтузиасты в свободное время.

>>1318813
Поставь php-cs-fixer, сделай его precommit-хуком и не парься.

544 30 дек, 22:41 544 1318879

>>1318793

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

Сайт ОПа например представляет собой HTML-страницы с небольшой обвязкой на PHP (для вывода меню, подвала, ссылок итд), слепленной за один вечер.

Ответы19332

545 30 дек, 23:25 545 1318899

Двощь, дай совета!
Мне каждый шаг цикла нужно записывать процент от суммы кредита, чтобы в конце посчитать потраченную сумму общую. Как мне это сделать?
https://ideone.com/l2f86A

Ответы1919919266

546 31 дек, 00:25 546 1318938

И ещё вопрос.
Почему переменная $number увеличивается всего на 1?
https://ideone.com/3f1uxG

Ответы1894018941

547 31 дек, 00:29 547 1318940

>>1318938
>https://ideone.com/3f1uxG
Потому что рост анона больше только по сравнению с Семеном, а остальных меньше.

Ответы18942

548 31 дек, 00:30 548 1318941

>>1318938
Тут уже я просто затупил. Элементарно не так значения переменных сравнивал.

Ответы18942

549 31 дек, 00:31 549 1318942

>>1318940
>>1318941
Да, я уже увидел, спасибо.

Вот это ещё интересует
https://ideone.com/l2f86A

Ответы19266

550 31 дек, 15:36 550 1319120

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

Ответы19165

551 31 дек, 16:53 551 1319165

>>1319120
пили кулстори, мотивируй

Ответы19167

552 31 дек, 16:54 552 1319167

>>1319165
+

553 31 дек, 18:18 553 1319199

>>1318899
Бамп вопросу

554 31 дек, 19:11 554 1319214

>>1318647
Все изи, как-то даже не густо, но вот по бд накрутили лишнего помоему, обычно эти тонкости мало кто знает до реального опыта проблем. + nosql обязательно, хотя бы парочку популярных на общем уровне.

555 31 дек, 19:55 555 1319223

С наступающим, программисты! ОПу огромное, человеческое спасибо помощь и терпение к тупости ньюфагов.

88 Кб, 500x500
556 31 дек, 23:07 556 1319266

448 - 555, 247 - 369

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

>>1318942

> $count;
Это немного странный способ создать переменную, и он не работает: https://ideone.com/WabCGW

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

Ты должен создать переменную перед тем, как пытаться ее использовать в выражении. Это делается с помощью оператора равно:

$count = 0;

А так, у тебя происходит ошибка, о чем тебе говорит PHP:

> PHP Notice: Undefined variable: count in /home/2Eccp2/prog.php on line 11

Параметры кредита (процент, выплата) лучше сделать переменными ради читаемости и удобства изменения. $percent гораздо понятнее чем просто "3". А если к ним еще комментарии добавить....

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

>>1318899

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

Лучше по-другому:

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

88 Кб, 500x500
556 31 дек, 23:07 556 1319266

448 - 555, 247 - 369

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

>>1318942

> $count;
Это немного странный способ создать переменную, и он не работает: https://ideone.com/WabCGW

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

Ты должен создать переменную перед тем, как пытаться ее использовать в выражении. Это делается с помощью оператора равно:

$count = 0;

А так, у тебя происходит ошибка, о чем тебе говорит PHP:

> PHP Notice: Undefined variable: count in /home/2Eccp2/prog.php on line 11

Параметры кредита (процент, выплата) лучше сделать переменными ради читаемости и удобства изменения. $percent гораздо понятнее чем просто "3". А если к ним еще комментарии добавить....

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

>>1318899

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

Лучше по-другому:

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

Показать весь текст

557 31 дек, 23:08 557 1319267

>>1318812

Стандарт не обязан соответствовать твоим вкусам.

>>1316130
>>1318743

> Нужно каким-то образом наполнить компанию департаментами и сотрудниками

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

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

> Но я подсмотрел в phpclub.tech, что вы рекомендовали для построения фирмы использовать паттерн Builder.

Удивительно, но я такого не помню. Но, не исключаю, что советовал.

> первый - это создать класс CompanyBuilder в котором будут методы создатьДепартаменты, создатьРаботников, получитьКомпанию.

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

> Второй вариант, это - создать класс DepartmentBuilder с методами создатьРаботников, получитьДепартамент.

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

> Ещё была идея сделать фабрику со статическим классом, которая будет отдавать нам массив с работниками.

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

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

> Также я написал абстрактный класс Profession для возможности смены профессии сотруднику из которого наследуются инженер, менеджер, аналитик и маркетолог.

Хорошо.

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

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

> Надеюсь принципы ООП не запрещают иметь внутри объекта Employee объект профессии, который может быть у каждого работника уникальным или наоборот у всех сотрудников одной профессии в компании он будет одинаковым.

Логичнее один объект. У нас же у многих работников одна и та же профессия. Значит, логично и объект сделать один. Если у каждого будет своя копия профессии, то мы:

- получим сложности при создании (нам надо создавать кучу объектов-профессий с одинаковыми свойствами и ничего не перепутать)
- при сравнении (сравнение $e1->getProfession() === $e2->getProfesion() не сработает и непонятно, как сравнивать профессии - придется добавлять какой-то идентификатор или название и следить за их уникальностью)
- при обновлении данных. Представим, что у профессии есть свойство "надбавка к пенсии", и нам надо ее поменять. Нам надо будет найти каждый объект профессии в программе и обновить у него это свойство.В большом, сложном коде, где создается и хранится много объектов в разных местах, это сделать нереально.

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

> Возможно я ещё не дорос до уровня на котором стоит пытаться вникать в паттерны?

Ну почему, с билдером же ты разобрался. В реальности, например, билдер используется в Symfony Forms для построения форм (вроде формы регистрации).

> Объект профессии не имеет смысла в системе без объекта сотрудника, получается его нужно создавать внутри конструктора сотрудника? Композиция, так кажется это называется.

Не так. Вроде (я не уверен) композиция применяется когда объект является составной частью другого. Ну например, мотор и машина. Или факультет и университет. Профессия не является частью работника.

557 31 дек, 23:08 557 1319267

>>1318812

Стандарт не обязан соответствовать твоим вкусам.

>>1316130
>>1318743

> Нужно каким-то образом наполнить компанию департаментами и сотрудниками

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

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

> Но я подсмотрел в phpclub.tech, что вы рекомендовали для построения фирмы использовать паттерн Builder.

Удивительно, но я такого не помню. Но, не исключаю, что советовал.

> первый - это создать класс CompanyBuilder в котором будут методы создатьДепартаменты, создатьРаботников, получитьКомпанию.

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

> Второй вариант, это - создать класс DepartmentBuilder с методами создатьРаботников, получитьДепартамент.

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

> Ещё была идея сделать фабрику со статическим классом, которая будет отдавать нам массив с работниками.

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

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

> Также я написал абстрактный класс Profession для возможности смены профессии сотруднику из которого наследуются инженер, менеджер, аналитик и маркетолог.

Хорошо.

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

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

> Надеюсь принципы ООП не запрещают иметь внутри объекта Employee объект профессии, который может быть у каждого работника уникальным или наоборот у всех сотрудников одной профессии в компании он будет одинаковым.

Логичнее один объект. У нас же у многих работников одна и та же профессия. Значит, логично и объект сделать один. Если у каждого будет своя копия профессии, то мы:

- получим сложности при создании (нам надо создавать кучу объектов-профессий с одинаковыми свойствами и ничего не перепутать)
- при сравнении (сравнение $e1->getProfession() === $e2->getProfesion() не сработает и непонятно, как сравнивать профессии - придется добавлять какой-то идентификатор или название и следить за их уникальностью)
- при обновлении данных. Представим, что у профессии есть свойство "надбавка к пенсии", и нам надо ее поменять. Нам надо будет найти каждый объект профессии в программе и обновить у него это свойство.В большом, сложном коде, где создается и хранится много объектов в разных местах, это сделать нереально.

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

> Возможно я ещё не дорос до уровня на котором стоит пытаться вникать в паттерны?

Ну почему, с билдером же ты разобрался. В реальности, например, билдер используется в Symfony Forms для построения форм (вроде формы регистрации).

> Объект профессии не имеет смысла в системе без объекта сотрудника, получается его нужно создавать внутри конструктора сотрудника? Композиция, так кажется это называется.

Не так. Вроде (я не уверен) композиция применяется когда объект является составной частью другого. Ну например, мотор и машина. Или факультет и университет. Профессия не является частью работника.

Показать весь текст

558 31 дек, 23:08 558 1319268

>>1318750

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

>>1318708

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

Если это случай когда:

class Parent
{
protected $x = 5;
}

class Child extends Parent
{
public $x;
}

То ты переопределяешь значение по умолчанию на null и потому оно не "наследуется".

>>1318682

Читать ужасно. Элементы массива надо разбить переносами по одному на строке. Чтобы не копипастить $this->ts(), сохрани это в переменную и обращайся к ней.

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

Не используй подчеркивание перед переменной.

Не ставь пробел перед ().

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

Пока, код плоховат.

558 31 дек, 23:08 558 1319268

>>1318750

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

>>1318708

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

Если это случай когда:

class Parent
{
protected $x = 5;
}

class Child extends Parent
{
public $x;
}

То ты переопределяешь значение по умолчанию на null и потому оно не "наследуется".

>>1318682

Читать ужасно. Элементы массива надо разбить переносами по одному на строке. Чтобы не копипастить $this->ts(), сохрани это в переменную и обращайся к ней.

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

Не используй подчеркивание перед переменной.

Не ставь пробел перед ().

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

Пока, код плоховат.

Показать весь текст

559 31 дек, 23:08 559 1319269

>>1318327

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

В PHP огромное число, тысячи функций. Без разделения на расширения будет тяжело ориентироваться.

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

>>1317102

У меня буквы почему-то маленькие. Трудно читать в таком виде.

>>1316313

> Составил такую регулярку
Возможно, проблема в том что точка соответствует любому символу кроме перевода строки. Почитай официальный мануал по рег. выражениям http://php.net/manual/ru/pcre.pattern.php если не знал.

>>1316164

Сайтмап удобно генерировать методами DOM так как это обеспечивает его корректность и экранирует все нужные символы. Гугли DOMDocument. Не надо тут делать велосипеды и писать уродливые циклы с конкатенацией строк.

>>1316084

Я написал "интересное решение" без иронии, потому исправлять там ничего не надо.

>>Здесь есть проблема: если ни один день недели не выбран, то массив будет пуст и произойдет ошибка
> Но это невозможно, массив с днями недели не может быть пустым.

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

> У меня возник вопрос насчет функции setAlarm. Как она в нынешнем виде (замена объекта на объект) может пригодиться в реальном проекте? Ведь можно завести метод getAlarms():array и настраивать нужный нам объект выбрав его из массива. Это нарушит принцип solid?

Она никак не может пригодиться и довольно бессмысленна, и ты скорее всего ее написал, так как не выучил, как копируются указатели на объекты. Если ты пишешь:

$a = new Alarm();
$b = $a;
$a->setEnabled(true);

То тут $a и $b указывают на один объект и писать $b->setEnabled() или дополнительное $b = $a не требуется. А ты зачем-то это пишешь.

В реальном проекте у тревог, скорее всего, придется сделать какие-то id (ради сохранения в БД например) и ты скорее всего будешь их искать по id и придется добавить findAlarmById(). Но, конечно, зависит от ситуации, можно и без идентификаторов.

559 31 дек, 23:08 559 1319269

>>1318327

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

В PHP огромное число, тысячи функций. Без разделения на расширения будет тяжело ориентироваться.

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

>>1317102

У меня буквы почему-то маленькие. Трудно читать в таком виде.

>>1316313

> Составил такую регулярку
Возможно, проблема в том что точка соответствует любому символу кроме перевода строки. Почитай официальный мануал по рег. выражениям http://php.net/manual/ru/pcre.pattern.php если не знал.

>>1316164

Сайтмап удобно генерировать методами DOM так как это обеспечивает его корректность и экранирует все нужные символы. Гугли DOMDocument. Не надо тут делать велосипеды и писать уродливые циклы с конкатенацией строк.

>>1316084

Я написал "интересное решение" без иронии, потому исправлять там ничего не надо.

>>Здесь есть проблема: если ни один день недели не выбран, то массив будет пуст и произойдет ошибка
> Но это невозможно, массив с днями недели не может быть пустым.

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

> У меня возник вопрос насчет функции setAlarm. Как она в нынешнем виде (замена объекта на объект) может пригодиться в реальном проекте? Ведь можно завести метод getAlarms():array и настраивать нужный нам объект выбрав его из массива. Это нарушит принцип solid?

Она никак не может пригодиться и довольно бессмысленна, и ты скорее всего ее написал, так как не выучил, как копируются указатели на объекты. Если ты пишешь:

$a = new Alarm();
$b = $a;
$a->setEnabled(true);

То тут $a и $b указывают на один объект и писать $b->setEnabled() или дополнительное $b = $a не требуется. А ты зачем-то это пишешь.

В реальном проекте у тревог, скорее всего, придется сделать какие-то id (ради сохранения в БД например) и ты скорее всего будешь их искать по id и придется добавить findAlarmById(). Но, конечно, зависит от ситуации, можно и без идентификаторов.

Показать весь текст

560 31 дек, 23:09 560 1319270

>>1315784

Ну, гугление выдает например http://php.net/manual/ru/book.pthreads.php

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

>>1315498

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

>>1312807

Судя по всему, у тебя там проблемы с соединением с сервером и файлы не качаются. Либо проблемы на удаленном сервере, либо с интернетом.

Я бы для начала просто скопировал URL https://vagrantcloud.com/laravel/boxes/homestead/v
ersions/6.4.0/providers/virtualbox.box в браузер и попробовал скачать файл через него для проверки. Если не качается - сделал бы traceroute и посмотрел, доходят ли пакеты до сервера.

>>1312701

Наверно тут: https://github.com/codedokode/pasta/

>>1312528

Да, урок про регулярки требует улучшения.

561 31 дек, 23:10 561 1319271

>>1312379

Форматируй код. Добавляй отступы. Если редактор не позволяет это делать, возьми редактор кода получше. А то читать невозможно.

> global $gender;
Не используй глобальные переменные, это затрудняет чтение кода, ведь теперь мы должны изучить весь код, чтобы понять, как эта переменная используется. А хотелось бы ограничиться изучением одной функции.

> $flor = floor($amount1/100)*100; //хра
Лучше $hundreds (сотни)

Разбиение на функции сделано не очень удачно. Каждая функция должна быть изолированной. Чтобы ее можно было использовать отдельно. То есть у нее есть понятное название, описание, что она делает, что ей передать и что она вернет. У тебя же описания нету, одна функция разбивает число на массив чисел непонятного вида, другая заменяет в этом массиве числа на слова. И одну не имеет смысла использовать без другой. То есть по сути это не 2 отдельных независимых функции, а 2 половинки одной функции и нет смысла их делать отдельными.

Ты можешь переделать код. Вместо этого:

$result = numberToText(125);
$text = smallNumberToText($result,0);

Вызывать smallNumberToText из numberToText так, чтобы она в итоге за один вызов возвращала бы сразу строку с текстом:

$text = numberToText(125);

То есть это:

elseif ($flor>0){ //записываем сотни
$result[]=$flor;

Мы заменяем на:

elseif ($flor>0){ //записываем сотни
$result[]=smallNumberToText($flor);

И вот мы получаем 2 независимых функции:

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

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

561 31 дек, 23:10 561 1319271

>>1312379

Форматируй код. Добавляй отступы. Если редактор не позволяет это делать, возьми редактор кода получше. А то читать невозможно.

> global $gender;
Не используй глобальные переменные, это затрудняет чтение кода, ведь теперь мы должны изучить весь код, чтобы понять, как эта переменная используется. А хотелось бы ограничиться изучением одной функции.

> $flor = floor($amount1/100)*100; //хра
Лучше $hundreds (сотни)

Разбиение на функции сделано не очень удачно. Каждая функция должна быть изолированной. Чтобы ее можно было использовать отдельно. То есть у нее есть понятное название, описание, что она делает, что ей передать и что она вернет. У тебя же описания нету, одна функция разбивает число на массив чисел непонятного вида, другая заменяет в этом массиве числа на слова. И одну не имеет смысла использовать без другой. То есть по сути это не 2 отдельных независимых функции, а 2 половинки одной функции и нет смысла их делать отдельными.

Ты можешь переделать код. Вместо этого:

$result = numberToText(125);
$text = smallNumberToText($result,0);

Вызывать smallNumberToText из numberToText так, чтобы она в итоге за один вызов возвращала бы сразу строку с текстом:

$text = numberToText(125);

То есть это:

elseif ($flor>0){ //записываем сотни
$result[]=$flor;

Мы заменяем на:

elseif ($flor>0){ //записываем сотни
$result[]=smallNumberToText($flor);

И вот мы получаем 2 независимых функции:

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

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

Показать весь текст

562 31 дек, 23:10 562 1319272

>>1311956

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

Это надо сделать самому.

>>1311770

> elseif (($remainder>10) & ($remainder<20)){
Ты использовал вместо логического И && оператор "побитовое И" &, который делает кое-что другое: https://ru.wikipedia.org/wiki/Битовые_операции

Также, в блоке if-elseif... срабатывает только одна ветка и остальные не проверяются.

>>1311658

да, урок по регуляркам требует обновления.

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

Спасибо за информацию о непонятных моментах в учебнике.

>>1311196

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

>>1311141

С виду нормально. Выражение сложноватое получилось, и можно было вынести получение слова отдельно:

$part1 = $word1[array_rand(...)];

>>1311135

Как в следующем посте можно. Или через цикл по такому массиву:

$choices = [
['Чудесных', ....],
[варианты второго слова],
[варианты третьего],
...
];

562 31 дек, 23:10 562 1319272

>>1311956

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

Это надо сделать самому.

>>1311770

> elseif (($remainder>10) & ($remainder<20)){
Ты использовал вместо логического И && оператор "побитовое И" &, который делает кое-что другое: https://ru.wikipedia.org/wiki/Битовые_операции

Также, в блоке if-elseif... срабатывает только одна ветка и остальные не проверяются.

>>1311658

да, урок по регуляркам требует обновления.

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

Спасибо за информацию о непонятных моментах в учебнике.

>>1311196

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

>>1311141

С виду нормально. Выражение сложноватое получилось, и можно было вынести получение слова отдельно:

$part1 = $word1[array_rand(...)];

>>1311135

Как в следующем посте можно. Или через цикл по такому массиву:

$choices = [
['Чудесных', ....],
[варианты второго слова],
[варианты третьего],
...
];

Показать весь текст

563 31 дек, 23:11 563 1319273

Все, остальное посмотрим с вами в следующем году.

564 1 янв, 02:49 564 1319318

С Новым Годом, гайс.

Всем удачного вката и пусть никто не уйдёт обиженным.

565 1 янв, 10:31 565 1319332

>>1318879
>в некоторых случаях это просто быстрее и проще
>Сайт ОПа например представляет собой HTML-страницы с небольшой обвязкой на PHP (для вывода меню, подвала, ссылок итд), слепленной за один вечер.
Ну я и говорю, в этом есть смысл, только если ты домохозяйка с говносайтом из 1.5 страниц.
В любом нормальном приложении статически типизируемый язык будет БЫСТРЕЕ И ПРОЩЕ

566 1 янв, 16:08 566 1319376

https://github.com/asdasdasdasddasasdasdas/StudentList
Чекните мой список студентов

Ответы1950020317

567 1 янв, 19:28 567 1319432

Ребята посоветуйте видеокурсов годных. Каналов на ютубе

568 1 янв, 22:15 568 1319481

Есть массив времен. Формат - часы:минуты.
Надо сделать функцию, которая его сортирует.

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

Ответы1949919600

569 1 янв, 22:25 569 1319485

Двощь, помоги с таким вопросом.
Добавил проверку к array_rand() на предмет одинаковых элементов массива. Почему каждый раз пишется предупреждение? По сути же должно писать только тогда, когда выпадает 2 одинаковых элемента массива.
Или как сделать так, чтобы никогда одинаковые элементы не выпадали?
https://ideone.com/mUEyfD

Ответы1955331368

570 1 янв, 23:32 570 1319499

>>1319481
preg_grep, пихаешь регулярочку и твой массив и получаешь именно те элементы которые соответствуют формату. Ну или прям в функции где будешь сортировать регулируй и сортируй.
'[012]\d:[0-5]\d'

Ответы1956319600

571 1 янв, 23:38 571 1319500

>>1319376
Что у тебя там с гейтвеем Студента? Вроде запрос описал , а дёргаешь чистый PDO в половине методов.

мимокрок

572 2 янв, 10:34 572 1319553

>>1319485
Бамп

573 2 янв, 11:14 573 1319563

>>1319499
А в нормальном языке это делается List<DateTime> и проверяется на уровне тайпхинтов

Ответы19564

66 Кб, 602x653
574 2 янв, 11:25 574 1319564

>>1319563
Работаем с тем, что есть.

575 2 янв, 13:02 575 1319591

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

Ответы19600

576 2 янв, 13:34 576 1319600

>>1319481
> Формат - часы:минуты.
Что ты подразумеваешь под часами и минутами? Под твой формат подходит как период времени, например "30:20" - 30 часов 20 минут, время в пути или временная отметка, например "23:00" - 11 часов вечера.
Если тебе нужно второе, то можешь обернуть время в объект \DateTime, тогда можно применить usort и проставить тайп-хинты:

$dates = [new \DateTime('+1 year'), new \DateTime('+1 day'), new \DateTime('-1 day')];

usort($dates, function (\DateTime $left, \DateTime $right) {
return $left <=> $right;
});

Код: https://ideone.com/5mm9Hc
В PHP есть ещё \DateInterval и \DatePeriod из полезного.

Вообще хорошая практика для таких ситуаций использовать объекты значения: https://codete.com/blog/value-objects/

>>1319499
> '[012]\d:[0-5]\d'
Можно выбрать 29 часов? Если проблему можно решить без регулярки, её лучше решить без регулярки.

>>1319591

> Заебался уже на каждый пук свое исключение делать.

Ну и это бессмысленно, у ОПа есть урок по исключениям: https://github.com/codedokode/pasta/blob/master/php/exceptions.md

> Иногда надо просто просигнализировать, допустим, если аргумент хуевый и все.

http://php.net/manual/en/class.invalidargumentexception.php#102218

Свои исключения есть смысл делать только тогда, когда тебе их нужно ловить.

576 2 янв, 13:34 576 1319600

>>1319481
> Формат - часы:минуты.
Что ты подразумеваешь под часами и минутами? Под твой формат подходит как период времени, например "30:20" - 30 часов 20 минут, время в пути или временная отметка, например "23:00" - 11 часов вечера.
Если тебе нужно второе, то можешь обернуть время в объект \DateTime, тогда можно применить usort и проставить тайп-хинты:

$dates = [new \DateTime('+1 year'), new \DateTime('+1 day'), new \DateTime('-1 day')];

usort($dates, function (\DateTime $left, \DateTime $right) {
return $left <=> $right;
});

Код: https://ideone.com/5mm9Hc
В PHP есть ещё \DateInterval и \DatePeriod из полезного.

Вообще хорошая практика для таких ситуаций использовать объекты значения: https://codete.com/blog/value-objects/

>>1319499
> '[012]\d:[0-5]\d'
Можно выбрать 29 часов? Если проблему можно решить без регулярки, её лучше решить без регулярки.

>>1319591

> Заебался уже на каждый пук свое исключение делать.

Ну и это бессмысленно, у ОПа есть урок по исключениям: https://github.com/codedokode/pasta/blob/master/php/exceptions.md

> Иногда надо просто просигнализировать, допустим, если аргумент хуевый и все.

http://php.net/manual/en/class.invalidargumentexception.php#102218

Свои исключения есть смысл делать только тогда, когда тебе их нужно ловить.

Показать весь текст
Ответы19610

577 2 янв, 13:56 577 1319610

>>1319600
>usort($dates, function (\DateTime $left, \DateTime $right)
Лол, так и сделал. Только я малец прихуел с оператора <=>.
Не знал о его существовании, существенно укорачивает код, збс.

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

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

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

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

Вот если тебе надо вернуть там какой-нибудь объект файла, допустим.
А файла-то нихуя и нет.
Что ты будешь делать - возвращать какое-то говно в виде "пустого" объекта, нула и прочую срань?

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

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

577 2 янв, 13:56 577 1319610

>>1319600
>usort($dates, function (\DateTime $left, \DateTime $right)
Лол, так и сделал. Только я малец прихуел с оператора <=>.
Не знал о его существовании, существенно укорачивает код, збс.

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

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

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

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

Вот если тебе надо вернуть там какой-нибудь объект файла, допустим.
А файла-то нихуя и нет.
Что ты будешь делать - возвращать какое-то говно в виде "пустого" объекта, нула и прочую срань?

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

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

Показать весь текст
Ответы1961319642

578 2 янв, 13:59 578 1319613

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

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

579 2 янв, 14:26 579 1319626

кого еще корежит от этого языка?

Ответы1963521960

580 2 янв, 14:39 580 1319635

>>1319626
Всех. Чем больше его знаю, тем больше бесит.

581 2 янв, 14:50 581 1319642

>>1319610

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

Зачем, \DateTime ведь выбросит исключение, если не сможет создать дату из строки.

> это все ДОЛГО
Ну ты же из джавы и должен уметь пользоваться IDE и кодогенерацией, PHPStorm умеет по пропертям генерить геттеры/сеттеры. Лично меня большое количество классов не напрягает.

> И с исключениями вопрос бы решился.
Я же скинул ссылку, в PHP целая куча классов для исключений - InvalidArgumentException, LogicException, DomainException, RuntimeException. Вот полный список: https://habr.com/post/329140/

> Ты или возвращаешь полноценный результат или высираешь исключение и все, нехуй пытаться решить проблему, которую невозможно решить на данном уровне.
Согласен, но тут в 95% случаев хватит встроенных исключений в PHP.
Ещё я пользуюсь плагином Php Inspections Extended, он как раз будет ругаться, если не будешь обрабатывать if'ами nullable типы: https://github.com/kalessil/phpinspectionsea

Вообще, я ещё раз посоветую просто взять другой язык. (Я вот вообще во фронтенд укатился)

Ответы1964819650

582 2 янв, 14:54 582 1319648

>>1319642
> посоветую просто взять другой язык
какой?

583 2 янв, 14:55 583 1319650

>>1319642
>\DateTime ведь выбросит исключение, если не сможет создать дату из строки
Да, но DateTime жрет далеко не только hh:mm.

>в 95% случаев хватит встроенных исключений в PHP
Это да.
Кстати, PhpStorm, ВНЕЗАПНО, почему-то не сует в throws в phpdoc для встроенных исключений. А для сторонних сует.

584 2 янв, 15:30 584 1319663

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

Ответы1966519682

585 2 янв, 15:35 585 1319665

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

Ответы19667

586 2 янв, 15:36 586 1319667

>>1319665
что скажешь за сам фреймворк?

Ответы19669

587 2 янв, 15:46 587 1319669

>>1319667
Лично мне больше нравится Symfony. Но игнорировать лару в текущей ситуации невозможно. Это как фронтенд. По идее знать php пограмисту не обязательно, но тогда сильно сокращаются опции на рынке труда.

Ответы19679

588 2 янв, 15:56 588 1319679

>>1319669
почему сиmфони?

589 2 янв, 16:20 589 1319682

>>1319663
Это не от пыха зависит.
Дело в дисциплине, почитай про это.
"Будь лучшей версией себя", "правило в 10 раз больше".

Ответы1968519729

590 2 янв, 16:39 590 1319685

>>1319682
еще как от пыха

Ответы19695

591 2 янв, 17:20 591 1319695

>>1319685
Не оправдывай свою слабохарактерность уебанством пыха

Ответы19704

592 2 янв, 17:44 592 1319704

>>1319695
это не оправдывает его херовость

Ответы19716

593 2 янв, 18:18 593 1319716

>>1319704
Не нравится - катись в другой. Жаловаться на свою немощь в пхп-треде это удел маминого неосилятора.
Держи в курсе.

594 2 янв, 18:40 594 1319722

Двощь, всё таки не понимаю, как запилить проверку на повторы.
https://ideone.com/CWYEdX

Ответы19756

595 2 янв, 18:47 595 1319724

3 года пишу на PHP, сегодня первый раз устанавливаю PHPUnit, поздравьте меня

596 2 янв, 19:17 596 1319729

>>1319682
Что же ты забросил свой бложек, няша?

Ответы20145

597 2 янв, 19:42 597 1319747

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

598 2 янв, 19:56 598 1319756

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

Что у тебя с повторами? Телепаты уехали за бугор, от жизни такой.

Ответы19857

599 2 янв, 21:48 599 1319857

>>1319756
Бля, не ту ссыль дал. Уже завтра скину.
А это я просто код с хелпы тестировал. Там такой давали в примере, так что вопрос не ко мне.

Алсо, перекатывать тред кто-то будет?

Ответы20294

1,4 Мб, 193x135
600 3 янв, 10:39 600 1320145

>>1319729

Ответы20383

601 3 янв, 11:56 601 1320176

Зачем проходить в 2к19 году учебник ОПа, если есть гениальнейший code-basics? Он еще и опенсорсный

Ответы2021820387

602 3 янв, 13:21 602 1320218

>>1320176
Тебя никто не заставляет, можешь читать любые говносайты, какие захочешь, разрешаю

603 3 янв, 14:35 603 1320240

Какой же пиздос в пхп с отсутствием дженериков и коллекций.
Надо отсортировать массив объектов.
Как это делается в нормальном языке.
В объекте переопределяется компаратор и все.
А в пхп тонна анальных извращений.

Ответы20326

604 3 янв, 15:52 604 1320283

Может у кого есть рабочий скрипт (PHP!) для скачивания картинок из треда? Как вы обходите https? Кашу кашную получаю, хз, или так и должно быть.

Ответы20323

605 3 янв, 16:15 605 1320294

>>1319857

Погоди перекатывать, еще до конца праздников можно тут сидеть.

606 3 янв, 17:12 606 1320317

>>1319376
bump

607 3 янв, 17:21 607 1320323

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

608 3 янв, 17:24 608 1320326

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

Ответы2033420354

609 3 янв, 17:31 609 1320334

>>1320326
Вся суть в том, что в крестах или яве операции выполняют САМИ коллекции.
А в пхп надо писать левые велосипеды, чтобы отсортировать массив объектов.

Короче процедурщина ебаная получается.

Ответы20346

610 3 янв, 17:40 610 1320346

>>1320334
https://github.com/italolelis/collections
https://github.com/akanehara/ginq

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

Ответы20348

611 3 янв, 17:46 611 1320348

>>1320346
Сраный говнокод. Вся суть коллекций в том, что это коллекции не рандомного дерьма, а объектов одного типа.
Принес какие-то нескучные обертки над массивами и выебывается тут.

Ответы2035520361

612 3 янв, 17:53 612 1320354

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

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

Ответы20361

613 3 янв, 17:54 613 1320355

>>1320348
Точно жиробас.

614 3 янв, 18:06 614 1320361

>>1320348
>что это коллекции не рандомного дерьма, а объектов одного типа.
List<object> тебе за щеку, ни к чему строгому коллекции не обязывают.
>Принес какие-то нескучные обертки над массивами
То есть ты настолько донный, что не представляешь как сделать собственную коллекцию на коленке со строгой типизацией? Просто прекрасно, что ты хейтишь пхп - одним говнокодером у нас будем меньше.
Добавлю, что не все коллекции это дженерики, и кину в лицо тебе пожалуй коллекцию из шарпа - ArrayList - которая даже по названию очевидно нескучная обертка над массивом (хотя хуй знает в действительности ли это так, лень ради тебя это чекать).
Специально для "без массивов" ебни коллекцию на ссылках. Реализовать таким образом можно что угодно, были бы руки из того места.
>>1320354
Настроение поганое, захотелось проораться.

Ответы20382

615 3 янв, 18:44 615 1320373

Анончики, а теперь нетбинс только с апачем работает, что ли? Как отдельное приложение не накатить?

616 3 янв, 19:04 616 1320382

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

Ответы20393

617 3 янв, 19:09 617 1320383

>>1320145
Возвращайся давай!

38 Кб, 613x488
618 3 янв, 19:09 618 1320384

Двощик, иду дальше по курсу ОПа и мне нужна твоя помощь.
Задание на пике.
https://ideone.com/M66Z31
1. Почему кол-во месяцев $month не прибавляется? Я же, вроде, в цикле прибавляю.
2. Как сделать проверку на отрицательное число остатка по выплате?
То есть, школьник в 12 месяц останется должен банку какую-то сумму, но цикл закончится, так как стоит условие $price>0. Как мне ему остаток-то выплатить?

Ответы203852039421244

619 3 янв, 19:11 619 1320385

>>1320384
И сразу же 1-ый вопрос снимается. Пока писал - проверил, а там, оказывается, хуйня написана.

620 3 янв, 19:11 620 1320387

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

621 3 янв, 19:34 621 1320393

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

622 3 янв, 19:37 622 1320394

>>1320384
Там проще всё реализуется. Переписывай нормально.

Ответы20401

623 3 янв, 19:50 623 1320399

Как удалить несколько элементов из массива во время итерации по нему с конца в начало, если для ключей не гарантируется то, что они будут непременно с 0 и до N.

То есть, массив вида [3=>15, 42=22, 1005=>13]
Копировать содержимое во временные массивы нельзя

Ответы20407

624 3 янв, 19:51 624 1320401

>>1320394
Как проще то? Хоть скажи, где изменить надо.

Ответы20407

625 3 янв, 20:03 625 1320407

>>1320399
>Как удалить несколько элементов из массива во время итерации по нему
unset($varname)

>>1320401
>if($forOpen!=0)
Убирай проверку $forOpen на 0. Зачем она там нужна? Достаточно просто сложить её с кредитом вначале. Если 0, то и будет + 0. А ещё лучше укажи этот $forOpen на 0 по умолчанию при объявлении ф-ции.

>for($price = 40000 + $forOpen;$price>0;$price = ($price + $inMonth +$comm)-5000)
Тут вообще бред.
У тебя цикл со счётчиком, а ты его как условный юзаешь по сути. Тут лучше танцевать от месяцев, а не от прайса. Просто за каждый месяц пересчитывай кредит.
Ну и циклы объявлять научись - там не надо лишнего писать.

Ответы20416

626 3 янв, 20:23 626 1320416

>>1320407
Так а как я буду от месяцев плясать, если неизвестно как раз количество месяцев, требуемое для погашения кредита?
>Убирай проверку $forOpen на 0. Зачем она там нужна?
Тут согласен. Не подумал об этом.
>А ещё лучше укажи этот $forOpen на 0 по умолчанию при объявлении ф-ции.
Типо вот так сделать$forOpen = 0?
Зачем?
>У тебя цикл со счётчиком, а ты его как условный юзаешь по сути.
И вот тут по подробнее, пожалуйста.

Ответы20423

627 3 янв, 20:45 627 1320423

>>1320416
>Так а как я буду от месяцев плясать, если неизвестно как раз количество месяцев, требуемое для погашения кредита?
$month++
И пересчитывай кредит. В теле цикла, а не в объявлении.

>Типо вот так сделать$forOpen = 0?
>Зачем?
Затем, что в 2х случаях из 3х она не указывается. Будет логично сделать её необязательной.

>вот тут по подробнее
For () - цикл со счётчиком. У тебя нет счётчика. Вернее есть $month=$month+1, но криво реализованный и к циклу отношения не имеет. Отсюда и цикл поехавший.

Ответы20451

628 3 янв, 21:49 628 1320440

78 Кб, 1304x76834 Кб, 1306x768

Уважаемые аноны занимаюсь по книжке. Установил XMAPP. Но эта сука не запускается в браузере через localhost или через 127.01.01
Закидывал в каталог апачи. Бесполезно. Есть более менее разбирающиеся аноны. Хочу проконсультироваться. Отпишите пожалуйста.

Ответы205982065121243

629 3 янв, 22:28 629 1320451

>>1320423
Я тут цикл починил.
https://ideone.com/aJTU6W
Всё ещё второй вопрос остался открытым
>Как сделать проверку на отрицательное число остатка по выплате?
То есть, школьник в 12 месяц останется должен банку какую-то сумму, но цикл закончится, так как стоит условие $price>0. Как мне ему остаток-то выплатить?

Ответы20465

630 3 янв, 22:55 630 1320458

Анонче буду тралировать вас занудством, начиная с нубовских задач
https://ideone.com/EeoltU вот тут в условиях задачи про игру в кубики было сказано только про дубли, но одинаковая сумма может выпасть и при разных числах, правильно ли решена задача?

Ответы31369

631 3 янв, 23:04 631 1320461

Получилась задача-стихотворение без всяких пробегов по массивам https://ideone.com/niDPTN
Просто через эхо вывод стиха, норм?

Ответы2046631369

632 3 янв, 23:23 632 1320465

>>1320451
>Как сделать проверку на отрицательное число остатка по выплате?
>но цикл закончится, так как стоит условие $price>0
Как вариант - поставить условие $price>$pay, где $pay это ежемесячный платёж. А сразу после цикла вывести остатки.
Тогда в минус не должно уходить.

633 3 янв, 23:28 633 1320466

>>1320461
>без всяких пробегов по массивам
Говорят, что индусы так пишут. Или китайцы.

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

634 4 янв, 12:15 634 1320598

>>1320440
Короче, сносишь это васянское говно и ставишь все необходимое окружение на линух на виртуалке

635 4 янв, 13:01 635 1320614

Подмогните с регулярками.
\W[7|8][\d\W]{10}
Мне нужно, чтобы искал ТОЛЬКО 10 цифр и любое кол-во символов между ними. А исходя из моей - ищет всего 10 любых символов. ЧЯДНТ?

Ответы206192062721243

636 4 янв, 13:10 636 1320619

>>1320614
> ЧЯДНТ
Неправильно составляешь регулярку

Ответы20620

637 4 янв, 13:12 637 1320620

>>1320619
Ну это я понимаю. Так а как её правильно составить для моих условий?

Ответы20622

638 4 янв, 13:16 638 1320622

>>1320620
> как её правильно составить

Правильно составив регулярное выражение.

Ответы20625

639 4 янв, 13:29 639 1320625

>>1320622
Хорошо, спрошу по другому. Как мне заставить регулярку искать только 10 цифр, а кол-во других символов не имеет значения? Конструкция вида [\d{10}\W] не работает.

Ответы206262062831369

640 4 янв, 13:35 640 1320626

>>1320625
Я за тебя регулярку писать не буду. https://regexr.com/ вот хороший ресурс для понимания регулярок.

641 4 янв, 13:37 641 1320627

>>1320614
Можешь пример успешных/не успешных строк предоставить? Я по описанию чутка даже охерел, либо не так понял. Мб поебусь тогда, если она действительно интересная.

Ответы20639

642 4 янв, 13:38 642 1320628

>>1320625
ты хочешь искать предположим
1аввара2пврварпорва3нгке4авп5ргпго и.т.д? Или шо?

Ответы20639

643 4 янв, 13:49 643 1320639

>>1320628
>>1320627
Я делю задание ОПа. Ищу номера телефонов любого формата.

https://regex101.com/r/qF7vT8/3
Вот тут заготовка.

644 4 янв, 14:07 644 1320651

>>1320440
.php в названии не надо? или к чему ты обращаешься

645 4 янв, 16:00 645 1320700

7 Кб, 405x54319 Кб, 650x531

Как называется эта болезнь?

Ответы21243

646 4 янв, 18:31 646 1320753

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

https://ideone.com/JdJq9X я не пойму, цикл должен получиться бесконечным или же до суммы 81, но тогда куда впихнуть условие?

Ответы2075521241

647 4 янв, 18:31 647 1320755

>>1320753
https://ideone.com/R75Nht не ту ссылку прикрепил

Ответы20833

648 4 янв, 19:07 648 1320772

Вопрос по yii2 и концепции MVC в целом: не нарушают ли данную идеологию сторонние методы внутри контроллера, которые не являются action-ами? Например, private function setImage()? Так как данный метод необходим в crud операциях и только внутри контроллера
Думаю, что не нарушают, но хочется все сделать красиво

Ответы2124121246

649 4 янв, 22:01 649 1320833

>>1320755
https://ideone.com/eRVH5g
Я не эксперт, но так сойдёт?

Ответы2087721240

650 5 янв, 02:00 650 1320877

>>1320833
Таки да, я просто пропустил, что в echo можно прописывать математические операции типа умножения и т.д.

651 5 янв, 10:24 651 1320962

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

Ответы209762112621240

652 5 янв, 10:57 652 1320976

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

Ответы20982

653 5 янв, 11:02 653 1320982

>>1320976
Ну хуй знает, просто все пишут что вкатиться с проектами на гитхабе легче, чем без него.

Ответы21064

654 5 янв, 14:23 654 1321064

>>1320982
Легче всего вкатится с подвешенным языком и нормальными навыками коммуникации, когда ты за всё можешь всем легко пояснить. В общем-то, как и везде.
А вот зеленый гитхаб тебе вряд ли поможет, если ты совсем уж отбитый аутист.

655 5 янв, 15:02 655 1321097

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

Ответы2114021240

656 5 янв, 15:58 656 1321126

>>1320962
Тащи туда то, что другим пригодиться может. Если нечего тащить, и работу рано тебе искать.

31 Кб, 604x372
657 5 янв, 16:21 657 1321140

>>1321097
>13 для разработки

89 Кб, 1222x836
658 5 янв, 16:51 658 1321153

Всем сап. Пилю магаз, движок самописный, нужно шаблонизировать некоторый код. Правильно ли я ее делаю в 2к19, не будут ли ругаться валидаторы, не будут ли поисковые роботы кидать мой сайт во вредоносные, не будет ли это все потом тормозить при большой посещаемости?

Ответы21162211752119121200

659 5 янв, 17:04 659 1321162

>>1321153

А варианты из этой статьи про шаблонизаторы не подходят? https://github.com/codedokode/pasta/blob/master/php/templates.md

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

Ответы21248

660 5 янв, 17:30 660 1321175

>>1321153
Госпаде исусе, ну и дерьмо.
1) Сейчас десятилетие SPA, але, как там слышно из 2007-го? Бек только генерит жсон и все.
2) Пых имеет отличные встроенные средства шаблонизации, гугли как это сделано в Yii. То, что ты написал - кал чистой воды.

Ну я вижу ты не слишком умный, поэтому предостерегаю: к параше типа smarty или twig не вздумай даже прикасаться.

Ответы2118121248

661 5 янв, 17:40 661 1321181

>>1321175

Ты слишком категоричен, что часто бывает у неопытных разработчиков, впервые с чем-то новым познакомившихся. SPA имеет немало недостатков:

- надо разрабатывать 2 приложения вместо одного
- долгая загрузка
- больше возможностей для ошибки
- плохая индексация поисковиками

Есть случаи, когда SPA больше подходит, есть, когда нет. Я не очень понимаю, зачем делать SPA, если страницу с описанием товара может сразу отдать сервер? Вот человек кликает в Яндекс Маркете на ссылку и получает готовую страницу товара. И не надо ждать пока твой SPA загрузится, загрузит мегабайт яваскрипта, сделает 10 AJAX запросов и тд (это можно оптимизировать, но это требует времени и стоит денег. SPA обойдется гв итоге ораздо дороже). Я не очень понимаю, зачем тут SPA.

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

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

Ответы2118421248

662 5 янв, 17:53 662 1321184

>>1321181
Ну ладно, про SPA это я утрировал.
Но
>надо разрабатывать 2 приложения вместо одного
Очнись, ты обосрался, уже давно надо разрабатывать 2 приложения.
По сути, сейчас чисто серверной бизнес-логики куда меньше, чем фронтенд-логики.
Взять ту же гостевую книгу. Серверный цруд там можно за 100 строк написать, а вот фронт можно такой нахуевертить, что браузер заглохнет.

И находится ли это фронт-приложение в спа или в пых-шаблонах - вопрос вторичный.

663 5 янв, 18:06 663 1321191

>>1321153
Разметку с кодом перемешал смотрю. Нынче так уже не принято делать. Вроде как плохой стиль.
Хотя вордпрессу не мешает, лол.

Так что это скорее кунг-фу веб-мастера, чем веб-кодера. Иди в \web\ - там твои все.

Ответы21248

664 5 янв, 18:16 664 1321198

Что делать, если меня вынудили написать говнокод?
Есть библиотека на гитхабе, 2000 звездочек.
Ну автор, наверное, крутой поц, уж мне ли ему говорить как код надо писать?
Думал я.

А сейчас понимаю, какой же этот чел отбитый говноед, весь код этой либы - полное говно, где каждый пердеж сделан через __callStatic(), магию и КОММЕНТЫ классов блять.
Еще и ПРИМЕРЫ того, как надо юзать его либу, написанные самим автором.
Я по своей наивности слепо им следовал, в итоге только сейчас начал понимать, какой это отбитый кал.
Методы длиной в 500 строк нахуй.
Статик на статике и статиком погоняет.
Мечта тестера блять, тестировать магию нахуй, которой не существует.
Вместо value-объектов тупо массивы))0) с ключами-захардкоженными строками блять, рандомно упоминающимися по всему проекту.

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

Ответы21209

665 5 янв, 18:17 665 1321200

>>1321153
>не будут ли поисковые роботы кидать мой сайт во вредоносные
Они твой серверсайд не видят. С чего бы?

>не будет ли это все потом тормозить при большой посещаемости?
Вот когда убьют будет тормозить, тогда и приходите. А ранняя оптимизация - зло.

666 5 янв, 18:30 666 1321209

>>1321198
Ну так пиши нормально теперь, чего убиваться? Если знаешь, где неправильно - уже полдела.

667 5 янв, 19:08 667 1321240

>>1321097

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

>>1320962

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

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

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

>>1320833

$n можно было не использовать, сразу писать 9.

668 5 янв, 19:08 668 1321241

>>1320772

Из вопроса непонятно, что делает метод. И нельзя сказать, к чему он относится. Приведу примеры:

- допустим, этот метод задает пользователю аватарку. Тогда он должен быть в модели (или в сервисе):

$user->setImage('avatar.jpg');
$userService->setImage($user, 'avatar.jpg');

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

private function setImage()
{
$form = new UploadForm();
$form->file = UploadedFile::getInstance($form, 'imageFile');
if ($form->validate()){
$this->userService->setImage($form->file);
} else {
...
}
}

Урок про MVC, ты прочел его? https://github.com/codedokode/apasta/blob/master/arch/mvc.md Там нет ответа?

>>1320753

Можно завести переменную:

$y = $x ＊ $x;
echo "$x -> $y\n";

Цикл можно сделать от 1 до 9.

668 5 янв, 19:08 668 1321241

>>1320772

Из вопроса непонятно, что делает метод. И нельзя сказать, к чему он относится. Приведу примеры:

- допустим, этот метод задает пользователю аватарку. Тогда он должен быть в модели (или в сервисе):

$user->setImage('avatar.jpg');
$userService->setImage($user, 'avatar.jpg');

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

private function setImage()
{
$form = new UploadForm();
$form->file = UploadedFile::getInstance($form, 'imageFile');
if ($form->validate()){
$this->userService->setImage($form->file);
} else {
...
}
}

Урок про MVC, ты прочел его? https://github.com/codedokode/apasta/blob/master/arch/mvc.md Там нет ответа?

>>1320753

Можно завести переменную:

$y = $x ＊ $x;
echo "$x -> $y\n";

Цикл можно сделать от 1 до 9.

Показать весь текст

669 5 янв, 19:09 669 1321243

>>1320700

А ты не искал определение, как должно быть правильно? Документация PHP говорит: http://php.net/manual/ru/language.operators.arithmetic.php

> Результат операции остатка от деления % будет иметь тот же знак, что и делимое — то есть, результат $a % $b будет иметь тот же знак, что и $a. Например:

>>1320614

Ищем слово "кот": кот

Ищем кота + 1 или более пробелов: кот\s+

Ищем предыдущее выражение 10 раз подряд: (кот\s+){10} (ищет фразу вроде "кот кот кот кот кот кот кот кот кот кот")

Скобки тут используются, чтобы {10} применялось ко всему их содержимому.

>>1320440

Судя по скриншоту, Апач запущен и отвечает на запрос браузера, просто передан неправильный URL или файла нет на диске или в конфиге Апача указана не та корневая папка.

670 5 янв, 19:10 670 1321244

>>1320384

Попробуй такой алгоритм в цикле:

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

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

671 5 янв, 19:13 671 1321246

>>1320772
С подключением, скоро ты начнешь подозревать, что мир не всегда вписывается в три маня-термина: "Model, View, Controller".
Например, будут возникать куски кода, ответственные за обработку данных от разных моделей, используемые в разных контроллерах. Ну и куда это пихать?

Ответы21249

672 5 янв, 19:16 672 1321248

>>1321162
Хороший ответ, пробежал глазками статью, теперь понял, как надо.

>>1321175
>Сейчас десятилетие SPA, але, как там слышно из 2007-го?

Да какая по сути разница? В чем принципиальное отличие SPA от кучи страничек для пользователя? Я стараюсь почти весь код серваку отдать, чтобы пользователя не нагружать ебланскими js-вычислениями.

>Пых имеет отличные встроенные средства шаблонизации, гугли как это сделано в Yii. То, что ты написал - кал чистой воды.

Окей, спасибо, погуглю.

>Ну я вижу ты не слишком умный, поэтому предостерегаю: к параше типа smarty или twig не вздумай даже прикасаться.

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

>>1321181
Двачую.

>>1321191
>Нынче так уже не принято делать
Я вот не понял, и что? Что значит "нынче"? Мне понятен мой код, а главное - работать он будет быстро.
Если отбросить весь этот мусор с кучей библиотек и тонн кода, из-за которого подвисает броузер, то мы увидим, что интернет не изменился с того же самого 2007. Просто изменился дизайн, хтмл5 заменил флеш, ssl прикрутили. Все остальное программисты усложнили сами для себя же, чтобы получать больше бабла.

Ответы21254

673 5 янв, 19:20 673 1321249

>>1321246
Model это не конкретные модельки в том же yii2. Model - это весь слой бизнес логики, он же и самый жирный со всего проекта. Обычно 90%+ кода в проекте и есть модель. И сделать ты его можешь как угодно.

674 5 янв, 19:26 674 1321254

>>1321248
>Я вот не понял, что значит "нынче"?
Последние 30 лет?

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

Ответы21257

675 5 янв, 19:32 675 1321257

>>1321254
>Ты пишешь код не для того, чтобы он тебе был понятен.
А кому?

Ответы21278

676 5 янв, 20:20 676 1321278

>>1321257
Другим погромистам

Ответы21281

677 5 янв, 20:24 677 1321281

>>1321278
Тащемта, я магаз для себя делаю.

Ответы213112132721343

678 5 янв, 20:58 678 1321311

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

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

Ответы2134721462

679 5 янв, 21:15 679 1321327

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

680 5 янв, 21:32 680 1321343

>>1321281
Всегда стремись писать так, чтобы тебя понимали другие программисты - писать на одном с ними языке. Иначе ты никогда не выберешься из вот такого своего июньского лапшекода.
Умные люди много всего нужного и полезного придумали для облегчения разработки. Зачем самому себе буратиной быть?

681 5 янв, 21:37 681 1321347

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

Ответы21382

682 5 янв, 21:41 682 1321352

ОП, посмотри задачи, пожалуйста

Пиши верно https://3v4l.org/UaM8i
Yoda Speak https://3v4l.org/coKeP
Сумма прописью https://3v4l.org/NSeMe
Калькулятор https://3v4l.org/n6fuv

Ответы31370

683 5 янв, 21:55 683 1321361

>>1306121
так пусть жалоба подается с каким-то доказательством, будь то видео или что-либо еще

684 5 янв, 22:45 684 1321382

>>1321347
Это норма и признак того, что ты развиваешься.
Бывает даже когда просто некоторое время проект не трогал и "свежим взглядом" на него посмотришь, без предвзятости, и видишь - что код-то говнявый.

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

685 6 янв, 01:53 685 1321460

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

А когда читаю - не понимаю, нахуй оно надо, если только ты не работаешь с проектами в 500кк строк.

Посоветуйте, с чего начать и что почитать по этому поводу.

Ответы2148321536215802169830536

686 6 янв, 01:55 686 1321462

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

Я не он, но взял тут симфони, написал composer update после чего он сожрал 2гб озу и ушел в своп. Нахуй не надо такие варианты.

Ответы2153721699

687 6 янв, 03:21 687 1321483

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

>в ООП не умею
Охотно верю.

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

>Посоветуйте
Ты в треде по ПХП. Советую читать ОПа.

Ответы30537

688 6 янв, 10:39 688 1321536

>>1321460
Егор, ты?

689 6 янв, 10:43 689 1321537

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

690 6 янв, 13:08 690 1321574

Как работать с интерактивным интерпретатором? Вызываю его командой php -a, но когда ввожу любое выражение, например 2 + 2, результата никакого не выдает. Просто переходит на новую строку.

Ответы215752157721701

691 6 янв, 13:10 691 1321575

>>1321574
Оказывается нужно указывать оператор echo, тогда выражения высчитываются.

692 6 янв, 13:11 692 1321577

>>1321574
Поставь psysh: https://psysh.org/

php -a не для людей, максимально неудобный repl.

Ответы21584

693 6 янв, 13:13 693 1321580

>>1321460
ООП не нужно. Почитай лучше СИКП.

Ответы21587

694 6 янв, 13:17 694 1321584

>>1321577
Попробую, спасибо.

695 6 янв, 13:22 695 1321587

>>1321580
Какой сикп блять, ты че. Мы хардкорные макакоиды, заставляем вкладку браузера жрать 4 гига памяти и грузить проц на 60% на отрисовку веб-странички.
Подключаем зависимости композера на несколько гигов, чтобы использовать оттуда функцию калькулятора.
Сикп, лол...

Ответы21598

696 6 янв, 13:33 696 1321598

>>1321587
Нормально делай - нормально будет.

371 Кб, 821x1200
697 6 янв, 14:00 697 1321621

После общения с битриксом начал жалеть, что устроился на бэкенд.

Ответы22608

698 6 янв, 14:36 698 1321649

Двощь, помогай опять.
Во-первых, почему на ideone.com не работает кириллица? Указываю и кодировку и mb_ приписываю - ошибка и всё.
Во-вторых, почему я после preg_split не могу через foreach пройтись по массиву и поменять буквы на заглавные с помощью ucfirst?
https://ideone.com/MmXhsI

Ответы21702

699 6 янв, 16:15 699 1321698

>>1321460

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

-----

Видимо ты не понял идею разбиения кода на функции. Суть в том, что длинный кусок кода, который делает несколько вещей, сложно понять. Его сложно править, в нем много переменных, и можно нечаянно что-то сломать. Ну и физически прочитать 1000 или 10 000 строк кода быстро невозможно. Поэтому код разбивают на отдельные действия и выносят эти действия в функции. Так, что мы можем вместо огромной портянки кода читать только небольшую функцию, которая нас интересует.

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

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

/＊＊
＊ Принимает на вход целое число от 0 до 999 и возвращает его
＊　текстовое представление.
＊
＊　Например, для числа 312 вернет "триста двенадцать".
＊/
function spellNumber(int $number): string

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

echo spellNumber(123) . "\n";

Комментарий　/＊＊　... ＊/ - это комментарий в формате phpdoc ( https://ru.wikipedia.org/wiki/PHPDoc ). Слово int и string - это тайп-хинты, советую их изучить:

- http://php.net/manual/ru/functions.arguments.php#functions.arguments.type-declaration
- http://php.net/manual/ru/functions.returning-values.php

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

-----

Почитай про хороший код: https://github.com/codedokode/pasta/blob/master/good-code.md

Там недописанный урок, потому самостоятельно погугли про "хороший код" и выпиши еще 5-10 правил.

Потом почитай про шаблоны и про MVC:

- https://github.com/codedokode/pasta/blob/master/php/templates.md
- https://github.com/codedokode/pasta/blob/master/arch/mvc.md

Если нужны книги - поищи "Совершенный код" (Code Complete), хотя он, может быть, будет сложноват тебе.

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

- ООП-Гостиница: https://phpclub.tech/pr/res/1082507.html#1097078
- ООП-Математика: https://phpclub.tech/pr/res/1305368.html#1309814

Предыдущие решения этих задач можно найти на phpclub.tech.

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

Насчет "нужно" - конечно, нужно, как другой человек будет разбирать твой код?

699 6 янв, 16:15 699 1321698

>>1321460

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

-----

Видимо ты не понял идею разбиения кода на функции. Суть в том, что длинный кусок кода, который делает несколько вещей, сложно понять. Его сложно править, в нем много переменных, и можно нечаянно что-то сломать. Ну и физически прочитать 1000 или 10 000 строк кода быстро невозможно. Поэтому код разбивают на отдельные действия и выносят эти действия в функции. Так, что мы можем вместо огромной портянки кода читать только небольшую функцию, которая нас интересует.

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

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

/＊＊
＊ Принимает на вход целое число от 0 до 999 и возвращает его
＊　текстовое представление.
＊
＊　Например, для числа 312 вернет "триста двенадцать".
＊/
function spellNumber(int $number): string

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

echo spellNumber(123) . "\n";

Комментарий　/＊＊　... ＊/ - это комментарий в формате phpdoc ( https://ru.wikipedia.org/wiki/PHPDoc ). Слово int и string - это тайп-хинты, советую их изучить:

- http://php.net/manual/ru/functions.arguments.php#functions.arguments.type-declaration
- http://php.net/manual/ru/functions.returning-values.php

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

-----

Почитай про хороший код: https://github.com/codedokode/pasta/blob/master/good-code.md

Там недописанный урок, потому самостоятельно погугли про "хороший код" и выпиши еще 5-10 правил.

Потом почитай про шаблоны и про MVC:

- https://github.com/codedokode/pasta/blob/master/php/templates.md
- https://github.com/codedokode/pasta/blob/master/arch/mvc.md

Если нужны книги - поищи "Совершенный код" (Code Complete), хотя он, может быть, будет сложноват тебе.

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

- ООП-Гостиница: https://phpclub.tech/pr/res/1082507.html#1097078
- ООП-Математика: https://phpclub.tech/pr/res/1305368.html#1309814

Предыдущие решения этих задач можно найти на phpclub.tech.

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

Насчет "нужно" - конечно, нужно, как другой человек будет разбирать твой код?

Показать весь текст
Ответы2170330538

700 6 янв, 16:17 700 1321699

>>1321462

Не хочешь исследовать причины проблемы и исправить её? Или, может, кто-то из анонов хочет помочь улучшить композер? Для начала, ты бы мог дать пример composer.json и написать, что сделать, чтобы отъесть столько памяти.

Ответы30539

701 6 янв, 16:18 701 1321701

>>1321574

Если интернет под рукой, то можно просто на repl.it запустить - там без echo работает.

702 6 янв, 16:20 702 1321702

>>1321649

На ideone нету mb-функций так как админы забыли поставить расширение mbstring, используй например repl.it.

ucfirst работает только с латинницей в ограниченных случаях, урок: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

Ответы21714

703 6 янв, 16:23 703 1321703

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

704 6 янв, 16:39 704 1321714

>>1321702
Я увидел только то, что ucfirst не работает с utf-8 кодировкой. Однако тут всё отлично работает. https://ideone.com/vqpoX8

Алсо. Чтобы без ucfirst сделать - это мне после разбивки на предложения, надо с помощью substr брать первую букву и переводить её в заглавную?
Или там проще решение есть?

Ответы2225522778

705 7 янв, 00:02 705 1321960

>>1319626
поначалу было норм))
потом немного пописал на джаве и прозрел

Ответы22000

706 7 янв, 02:06 706 1322000

>>1321960
Хочешь сказать джава лучше?

Ответы22080

707 7 янв, 02:07 707 1322001

37 Кб, 590x26640 Кб, 615x264

На скрине, где в роуте "/", все работает хорошо и переходит по другим страницам. Когда добавляю {page}, то больше не переходит по другим страницам, остается на своём view. Почему?

Ответы2202022778

708 7 янв, 03:36 708 1322020

>>1322001
Так дампани пейдж, делов то. Скорее всего там просто нет нихера.

Ответы22093

709 7 янв, 12:17 709 1322080

>>1322000
Ясен хуй джава лучше

Ответы22170

710 7 янв, 13:06 710 1322093

>>1322020
$page на месте с 1

711 7 янв, 14:55 711 1322170

>>1322080
И чем же?

Ответы22219

712 7 янв, 15:32 712 1322219

>>1322170
Абсолютно всем. Попробуй найти хоть одну хуйню, что в пхп сделана лучше, чем в яве.
Не найдешь.

Ответы222332234422778

713 7 янв, 15:40 713 1322233

>>1322219
Как обратиться ко второму символу в существующей строке?

Ответы2224022596

714 7 янв, 15:45 714 1322240

>>1322233
По имени и фамилии

715 7 янв, 16:01 715 1322255

>>1321714
Бампую этот вопрос и прикладываю ещё один.

Пытаюсь писать калькулятор по заданию ОПа, но встал на моменте выполнения вычислений. То есть строку вида "241+142" я разобрал посимвольно, выяснил, где цифра, а где знак мат. операции и засунул цифры в переменную. Как быть со знаком? Я могу для каждого отдельного случая написать условие, вида: if($char == "+") {$result = $a+$b} elseif($char == "-") {$result = $a-$b}
Но можно же как-то компактней сделать это, правильно? У ОПа в примере есть кусок if($char == "+" || $char == "-"){}
Но что с этим делать - ума не приложу.

Ответы2227722365224042260322779

716 7 янв, 16:43 716 1322277

>>1322255
> Но что с этим делать - ума не приложу
Хуй забить и использовать eval().

Ответы22282

717 7 янв, 16:55 717 1322282

>>1322277
Мысль интересная, но что-то я вообще запутался.
Если я все числа кладу в переменную, то у меня получается просто строка с числами. Было 442+511, а стало 442511.
Что-то вообще хуйня получается.

718 7 янв, 18:17 718 1322344

>>1322219
Все там такое же. А иногда и хуже.

719 7 янв, 18:35 719 1322365

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

Ответы22404

720 7 янв, 19:37 720 1322404

>>1322255
Весь код покажи. Только не сюда, а в repl.it какой нибудь скинь. Непонятно что тебе нужно. Нужно видеть весь код.

>>1322365
Это сложные алгоритмы? Смеешься что ли.

Ответы22618

721 7 янв, 22:56 721 1322596

>>1322233
.at() или как там

722 7 янв, 23:04 722 1322603

>>1322255
Гугли вычисления на стеке и базовое устройство трансляторов

Ответы22779

723 7 янв, 23:09 723 1322608

>>1321621
если у тебя на работе битрикс, беги оттуда

724 7 янв, 23:25 724 1322618

>>1322404
Да там смотреть-то нечего особо.
Ну вот всё, что навоял за это время.
https://repl.it/@JoeGreen/GrossPunctualTrapezoids
Алсо, дайте сборник задач годных. Для начинающих. А то в интернетах не особо много. И есть ли конфа пхпшников или что-то такое, а то на борде ответа ждать - долго получается.

Ответы2262022624

725 7 янв, 23:27 725 1322620

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

Ответы2262222627

726 7 янв, 23:30 726 1322622

>>1322620
Так в том то и дело, что я даже задачи опа не могу толком решить. После основного курса, в разделе "Повторим?" вообще толком ни одной не могу. Вот, как пример - калькулятор. Мой максимум - написать функцию или цикл, кажется.
По этому и думаю - другие задачи порешаю, проникнусь/закреплю знания, а дальше попроще будет.

Ответы2262322635

727 7 янв, 23:32 727 1322623

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

Ответы22637

728 7 янв, 23:32 728 1322624

>>1322618
Что ты хочешь написать, калькулятор? Из сообществ советую slack-чат Хекслета, или чаты в Телеграм.

Ответы22639

729 7 янв, 23:35 729 1322627

>>1322620
>если честно, эти задачи в отрыве не так уж много и дают. пройти Опшные и иди дальше. в ооп и в создание проектов. больше профита будет
Не советуй такое. Он скорее всего еще толком ничего не писал. Нужно решать алгоритмические задачи, рекурсия, циклы, структуры данных, деревья. ООП вообще не нужно. Можно писать в ФП стиле. С ООП нужно знакомиться, когда уже уверенно пишешь код. Иначе неокрепший мозг сломается, и получится очередное "ООП головного мозга". И советую тот же путь.

Ответы226362271122779

730 7 янв, 23:39 730 1322635

>>1322622
>Так в том то и дело, что я даже задачи опа не могу толком решить.
Потому что мало решал задачек. Советую эти курсы, там и задачек полно https://ru.hexlet.io/professions/php#education

Рано писать калькулятор, когда не понимаешь как составить алгоритм его работы. Лучше думай над этим алгоритмом. А когда поймешь, то сможешь реализовать. Пока у тебя еще мало опыта, поэтому не понимаешь. Но важно разработать алгоритм решения, а не тупо пытаться писать код. Так не получится. Сначала решение должно появиться в голове.

Ответы22639

731 7 янв, 23:40 731 1322636

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

Ответы22638

732 7 янв, 23:40 732 1322637

>>1322623
Скорее всего на Битриксе.

733 7 янв, 23:42 733 1322638

>>1322636
Роутинг на деревьях как реализовывать будешь?

734 7 янв, 23:44 734 1322639

>>1322624
Я просто хочу решить задачу ОПа, а она состоит в написании калькулятора.
>>1322635
>Потому что мало решал задачек.
Так никто и не спорит. Я решал только те, что были по ходу курса ОПа и всё.
Потом пытался найти в интернете что-то, но там всё примерно одинаковое - "заполните массив 10 случайными числами" или "посчитайте, сколько секунд в часе" и тому подобное.

За хекслет спасибо - завтра посмотрю.

Ответы22645

735 7 янв, 23:53 735 1322645

>>1322639
>Так никто и не спорит. Я решал только те, что были по ходу курса ОПа и всё.
Я не смотрел, но мне кажется там алгоритмических задач нет. Нужны именно алгоритмические. Лучше Хекслета ничего не найдешь, потому что кроме алгоритмических задач, там отлично обучают. Вряд ли где то еще тебя научат как применять функции высшего порядка. А просто на досуге задачки порешать можно на Codewars.

Ответы22648

736 7 янв, 23:57 736 1322648

>>1322645
Понял, спасибо. Завтра точно гляну.

737 8 янв, 01:52 737 1322711

>>1322627
>Иначе неокрепший мозг сломается
Иначе люди пишут такой ООП, который та же функциональщина.
Недавно тут один апи смотрел - там поц засунул все запросы на сервер в один метод. Пара десятков запросов в одном методе, Карл!

Ответы2271422821

738 8 янв, 01:55 738 1322714

>>1322711
У него класс из двух методово состоял.

вот тогда мой мозг сломался

739 8 янв, 05:12 739 1322778

>>1321714

> Я увидел только то, что ucfirst не работает с utf-8 кодировкой. Однако тут всё отлично работает. https://ideone.com/vqpoX8

Если в отдельных случаях (латинница в utf-8) работает, а в отдельных - нет, то это называется "не работает".

Нужно использовать mb-функции, отрезать первую букву, увеличивать и приклеивать остаток строки. Можно это оформить как свою отдельную функцию и использовать в будущем и в других программах.

>>1322001

Непонятно, что именно у тебя не работает? При наборе определенного URL получается страница 404? Пагинатор (какой?) генерирует неправильные ссылки? Поясни, чтобы было понятно.

Также, если ты прописал в роуте "/{page}" то он не будет открываться, если в URL просто "/". Для этого надо сделать отдельный роут, и желательно в /{page} запретить вариант page = 1.

>>1322219

Вам сюда: https://habr.com/post/315152/

И хватит разводить бессмысленный флуд. Ладно, если бы ты конкретные примеры приводил, а твои посты бессодержательны.

740 8 янв, 05:12 740 1322779

>>1322255

Написать блок if/elseif и не заморачиваться. Вот тебе пример калькулятора из phpExcel, если интересно: https://github.com/PHPOffice/PhpSpreadsheet/blob/master/src/PhpSpreadsheet/Calculation/Calculation.php

Он разбирает и вычисляет с помощью PHP значения формул в синтакисе Excel.

>>1322603

Можно без стека.

>>1322627

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

Поддерживается ли ФП в IDE? Есть ли там переход к определению и прочие радости?

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

Ответы228202307023176

741 8 янв, 09:05 741 1322820

>>1322779
>Я не то чтобы против ФП, но плохо представляю, как его использовать, например в бекенде мессенджера, соцсети, IoT-устройства или интернет-магазина
ФП это просто способ писать код. Набор правил или рекомендаций если угодно.

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

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

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

Ответы2282223537

742 8 янв, 09:15 742 1322821

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

Ответы2282222827

743 8 янв, 09:15 743 1322822

>>1322820
>>1322821
нитуда

744 8 янв, 09:30 744 1322827

>>1322821
Математику в школе все учат. В математике все представляется в виде выражений. Почему это сложно понимать?

Ответы22872

745 8 янв, 10:12 745 1322872

>>1322827
Еще в школе нас учили бегать, прыгать и играть в мячик. Это не делает тебя спортсменом или даже разбирающимся в спорте человеком. Я субъективное мнение высказал - функциональщина на больших объемах для меня является лапшой, которая не стоит затраченного на нее времени, особенно на поддержку. Для тебя может и по другому.

Ответы2288322885

746 8 янв, 10:33 746 1322883

>>1322872
>функциональщина на больших объемах для меня является лапшой, которая не стоит затраченного на нее времени, особенно на поддержку
Может ты просто не понимаешь о чем речь. Откуда знать что ты там видел, и что называешь функциональщиной. ФП код не может быть лапшой по определению. Значит ты видел что-то другое.

747 8 янв, 10:38 747 1322885

>>1322872
>Еще в школе нас учили бегать, прыгать и играть в мячик. Это не делает тебя спортсменом или даже разбирающимся в спорте человеком.
Не очень хорошая аналогия. Я бы привел в пример шахматы. Человек, который сыграл хотя бы несколько десятков партий, как минимум знает как ходят фигуры. Поэтому для него нет проблемы понимать как течет партия. Даже если он смотрит партию гроссмейстеров. Да, он не может делать такие же умные ходы, но он знает как двигаются фигуры, по каким правилам, и может видеть кто выигрывает или проигрывает. Со школьной математикой все даже лучше. Если человек решал школьные задачи, а не бездельничал, то он легко может понимать математические выражения. Это не выдающееся умение, просто навык.

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

Ответы22974

748 8 янв, 12:35 748 1322974

Сложные предложения строю, сорянчик, я уже пьян.
>>1322885
А помоему довольно хорошая. Это изначальный тезис был говном.
Это же как приравнять способность к рисованию блоксхемок на информатике к написанию сложных приложений. Вроде и соблюдено начальное условие, но промежуточные напрочь игнорируются.
Если так упрощать любую концепцию, то почему не каждый, кто умеет говорить способен еще и петь? Или че это не каждый из нас художник, хотя карандаш в руках держать способен? А те, кто и способен и художник - хуле не в "приавильном" стиле художники? И тут бы уже пора художникам завести спор о четкости предпочитаемого стиля.
О, а че это этот чувак зная правила шахмат не имеет даже разряда?
Список можно продолжать - это попытка излишнего упрощения в суждениях.
Аналогия с шахматами тоже излишне упрощена. Конечно любой, кто знает правила игры, сможет просто налюдать любую другую игру. Но видеть он ее будет на своем уровне, а нихера не близко к тому майндгейму, который в головах профессиональных игроков происходит. Да и как бы наблюдать игру гроссмейстера не значит сыграть с ним хотя бы достойно. Иначе в чем смысл этой аналогии? Типа тот, кто понимает "правила" фп сможет раздуплить фп код? Да все даже проще - их и понимать то не надо, чтобы раздуплить при достаточной сноровке, т.к фп хоть и оперирует выражениями, но не делает вообще никакой магии (потому что ее, понятное дело, не существует), кроме наложения новой парадигмы с опеределнными целями. Мимо простейшей логики у нас не пройти и все можно свести к ней же, так что упертость поможет решить проблему чтения кода на любом языке с любой применяемой парадигмой даже конченному барану. Захочешь - разберешь. Даже если из математики только яблоки складывать умеешь.
То, на что тот тезис про математику был ответом, вообще не имеет отношения к сказанному изначально, видимо меня не верно поняли. Придется уточнить приведением мысленного примера - если мне дать две версии кода сферического небольшого приложения, но одно будет написано на фп, а второе нет - то второе я смогу и разобрать и поддерживать практически мгновенно, даже если там довольно херовый код, в то время как на фп это будет гораздо медленее проиходить у меня. Не "не понято двоечником", а просто усложнен процесс инвестегирования и прочей поддержки. Объем приложения к примеру в сферические 30к строк императивного кода, на фп хз сколько. Нахер мне про школьную математику втирать, если я в состоянии работать с фп, просто не хочу это повторять?
Почему это должно быть не правдой, тем более что я четко указал, что это конкретно меня касается? На том моменте про "не понял" линию диалога понесло куда-то в сторону "докажи, что твой оппонент просто дурак любым способом". Это же вопрос обычной практики. Для того, кто наяривал фп наверняка все будет по другому, и это тоже не мешает ему высказать свое мнение по этому вопросу и остаться по своему правым. Правда тут есть только субъективная, т.к. это сраный спор о вкусах, где только время покажет, кто жрал говно, а кто нет. А скорее всего время покажет, что говно жрали все, как оно обычно и бывает, и одаримся мы какой-нибудь хитровыебанной парадигмой, на хую вертевшей всех, когда гению в башку клюнет. Сейчас на это по большому счету насрать, потому что элементы фп в любом современном языке чуть ли не в рекомендациях к действую имеются, и это тоже плюс, очень удобно по случаю (хотя и без специального сахара можно было обойтись, нихера же не меняется). Но вот чистое фп, чтоб аж скупая слеза у хардкорных адептов скатилась, пока что не сильно угрожает императивному коду, насколько бы оно простым не казалось например для тебя. Только не говори что в оценке на глаз я тут не прав, ты и сам знать должен, как дела обстоят. На данный момент ниша фп на подхвате в тех местах, где императивщина некрасивой становится. Такое себе перетягивание каната выходит.
Я кстати не спорю, что может я и с какой-то паленой приложухой на фп работал, откуда мне знать, я не прошаренный сильно в этой теме. Однако после этого, как ты верно заметил, желание искать на свою жопу новых функциональных впечатлений у меня отпало. Пока до новой необходимости приоритеты расставлены.

748 8 янв, 12:35 748 1322974

Сложные предложения строю, сорянчик, я уже пьян.
>>1322885
А помоему довольно хорошая. Это изначальный тезис был говном.
Это же как приравнять способность к рисованию блоксхемок на информатике к написанию сложных приложений. Вроде и соблюдено начальное условие, но промежуточные напрочь игнорируются.
Если так упрощать любую концепцию, то почему не каждый, кто умеет говорить способен еще и петь? Или че это не каждый из нас художник, хотя карандаш в руках держать способен? А те, кто и способен и художник - хуле не в "приавильном" стиле художники? И тут бы уже пора художникам завести спор о четкости предпочитаемого стиля.
О, а че это этот чувак зная правила шахмат не имеет даже разряда?
Список можно продолжать - это попытка излишнего упрощения в суждениях.
Аналогия с шахматами тоже излишне упрощена. Конечно любой, кто знает правила игры, сможет просто налюдать любую другую игру. Но видеть он ее будет на своем уровне, а нихера не близко к тому майндгейму, который в головах профессиональных игроков происходит. Да и как бы наблюдать игру гроссмейстера не значит сыграть с ним хотя бы достойно. Иначе в чем смысл этой аналогии? Типа тот, кто понимает "правила" фп сможет раздуплить фп код? Да все даже проще - их и понимать то не надо, чтобы раздуплить при достаточной сноровке, т.к фп хоть и оперирует выражениями, но не делает вообще никакой магии (потому что ее, понятное дело, не существует), кроме наложения новой парадигмы с опеределнными целями. Мимо простейшей логики у нас не пройти и все можно свести к ней же, так что упертость поможет решить проблему чтения кода на любом языке с любой применяемой парадигмой даже конченному барану. Захочешь - разберешь. Даже если из математики только яблоки складывать умеешь.
То, на что тот тезис про математику был ответом, вообще не имеет отношения к сказанному изначально, видимо меня не верно поняли. Придется уточнить приведением мысленного примера - если мне дать две версии кода сферического небольшого приложения, но одно будет написано на фп, а второе нет - то второе я смогу и разобрать и поддерживать практически мгновенно, даже если там довольно херовый код, в то время как на фп это будет гораздо медленее проиходить у меня. Не "не понято двоечником", а просто усложнен процесс инвестегирования и прочей поддержки. Объем приложения к примеру в сферические 30к строк императивного кода, на фп хз сколько. Нахер мне про школьную математику втирать, если я в состоянии работать с фп, просто не хочу это повторять?
Почему это должно быть не правдой, тем более что я четко указал, что это конкретно меня касается? На том моменте про "не понял" линию диалога понесло куда-то в сторону "докажи, что твой оппонент просто дурак любым способом". Это же вопрос обычной практики. Для того, кто наяривал фп наверняка все будет по другому, и это тоже не мешает ему высказать свое мнение по этому вопросу и остаться по своему правым. Правда тут есть только субъективная, т.к. это сраный спор о вкусах, где только время покажет, кто жрал говно, а кто нет. А скорее всего время покажет, что говно жрали все, как оно обычно и бывает, и одаримся мы какой-нибудь хитровыебанной парадигмой, на хую вертевшей всех, когда гению в башку клюнет. Сейчас на это по большому счету насрать, потому что элементы фп в любом современном языке чуть ли не в рекомендациях к действую имеются, и это тоже плюс, очень удобно по случаю (хотя и без специального сахара можно было обойтись, нихера же не меняется). Но вот чистое фп, чтоб аж скупая слеза у хардкорных адептов скатилась, пока что не сильно угрожает императивному коду, насколько бы оно простым не казалось например для тебя. Только не говори что в оценке на глаз я тут не прав, ты и сам знать должен, как дела обстоят. На данный момент ниша фп на подхвате в тех местах, где императивщина некрасивой становится. Такое себе перетягивание каната выходит.
Я кстати не спорю, что может я и с какой-то паленой приложухой на фп работал, откуда мне знать, я не прошаренный сильно в этой теме. Однако после этого, как ты верно заметил, желание искать на свою жопу новых функциональных впечатлений у меня отпало. Пока до новой необходимости приоритеты расставлены.

Показать весь текст
Ответы23042230442304523046

749 8 янв, 14:06 749 1323042

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

Ответы2308023190

750 8 янв, 14:07 750 1323044

>>1322974
>Типа тот, кто понимает "правила" фп сможет раздуплить фп код? Да все даже проще - их и понимать то не надо, чтобы раздуплить при достаточной сноровке, т.к фп хоть и оперирует выражениями, но не делает вообще никакой магии (потому что ее, понятное дело, не существует), кроме наложения новой парадигмы с опеределнными целями.
Ну так чего ты тогда голову морочишь.

Ответы23080

751 8 янв, 14:08 751 1323045

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

Ответы23080

752 8 янв, 14:10 752 1323046

>>1322974
Делай двойной перенос строки, дели текст на небольшие абзацы. Такую простыню сложно читать.

Ответы23080

753 8 янв, 14:32 753 1323070

>>1322779
>Вот тебе пример калькулятора из phpExcel, если интересно:
Может и интересно, но я почти ничего не понимаю, что там происходит.
>Написать блок if/elseif
Чек.
Написал, всё работает. Единственное НО - я не понимаю, как выполнить операцию без указания её самой. То есть, если есть выражение 2+2, то я пишу if($char=='+') {$a+$b}
Я намеренно указываю, что а+б. Так как сделать так, чтобы код сам узнавал оператор?
https://repl.it/@JoeGreen/GrossPunctualTrapezoids

И да. Есть ли смысл на код бейсик проходить тренинги? На Хаскеле написано, что там первая часть уроков находится.

Ответы2309723639

754 8 янв, 14:43 754 1323080

>>1323042
>а теперь говоришь, что выражения в программировании сложно понимать
Думаю тебе так показалось, я об этом не говорил. Может не достаточно ясно писал выше.
Мне проще понимать императивный код, чем функциональный - вот и все, что я с самого начала хотел сказать. Зачем это все выворачивать?
По мне: для поддержки он в несколько раз проще, чем фп. Это критичный момент, и я его упоминаю. Сопровождение кода самое больное место. Написать может любой и в закат уебать довольный, а кому-то потом разгребать и развивать всю красоту. Например тебе или мне. Как это вообще можно забыть? Как будто кривого кода никогда не встречал. (фп я к говнокоду сейчас не приравниваю, просто пример о восприятии)
Я не раз упрощал свои абстрактные финты ушами, чтобы понятнее становилось, зато лучше всем остальным работалось. Красота в понимании одного - проблемы для другого. Надо фидбек получать, чтобы не укатиться в корыто.
А так пойму любой код, дело только в комфорте поддержки, что лирика. Правда эта лирика в человекочасы конвертится.
>>1323044
Смотри выше.
>>1323045
Жопой читаешь.
>>1323046
Оке. Не привык писать длинные посты, чет пробило в этот раз.

Ответы23102

755 8 янв, 15:01 755 1323097

>>1323070
>И да. Есть ли смысл на код бейсик проходить тренинги? На Хаскеле написано, что там первая часть уроков находится.
Чёхго? Ты про code-basics.ru? На Хаскелле? Может Хекслете. Стоит проходить, очень даже стоит.

756 8 янв, 15:08 756 1323102

>>1323080
>По мне: для поддержки он в несколько раз проще, чем фп
Как код с изменяемым состоянием может быть проще в поддержке? Все знают, что изменяемое состояние это зло. Если функция где-то что-то изменяет, то это приводит к ошибкам, и это сложно обнаружить. А ты говоришь это легко отлаживать. Не может быть у тебя 8 лет опыта, как ты написал.

Ответы23116

757 8 янв, 15:23 757 1323116

>>1323102
Никто ни к чему никого не обязывает, ты путаешь холодное с сладким. Ты можешь делать имутабельной импертивщину прикинь))) Главное в правильных местах, чтобы жопа не горела. Хоспаде, откуда вы лезете, надоели уже. Опытнее станьте, а не по методичкам твердите. Хочешь поговорить с кем-то с головой, а тебе уже третий пост цитатами без смысла наяривают.

Ответы2312623132

758 8 янв, 15:38 758 1323126

>>1323116
>Ты можешь делать имутабельной импертивщину прикинь)))
Смешная шутка.

>>1323116
>Опытнее станьте, а не по методичкам твердите.
Эта еще смешнее, если учесть, что ты плаваешь в простых понятиях, а говоришь, что у тебя 8 лет опыта.

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

Ответы23130

759 8 янв, 15:40 759 1323130

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

Ответы23135

760 8 янв, 15:41 760 1323132

>>1323116
Приведу цитату из словаря:

ИМПЕРАТИВНОЕ ПРОГРАММИРОВАНИЕ
Парадигма программирования, которая, в отличие от декларативного программирования, описывает процесс вычисления в виде инструкций, изменяющих состояние программы.

Императивное = изменяемое состояние. Как оно может быть иммутабельным?! Вопрос риторический.

Ответы23134

761 8 янв, 15:43 761 1323134

>>1323132
То есть когда я что-то иммутабельное на чистом ооп напишу ты глазам своим не воверешь, что это не императив? Ну ты и даун, хоспаде.

Ответы231362313923143

762 8 янв, 15:45 762 1323135

>>1323130
>имутабельность это свойство определенной парадигмы
Иммутабельность это свойство состояния. Состояние становится неизменяемым. Неизменяемые структуры данных. Неизменяемые переменные (Джо Армстронг называет их по-другому, не помню как) как в Эрланге.

Ответы23138

763 8 янв, 15:45 763 1323136

>>1323134
Ой, а что если я просто напишу чистую функцию? Это все, я стал чернокнижником? Вы головой, а не словарями, думать умеете? А что если я функциональщину кааак ебну посреди мутабельного состояния - это будет фп или зашкваренное грязным пхп фп? У вас на районе как с этим? У меня всем похуй.

764 8 янв, 15:47 764 1323138

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

Ответы23145

765 8 янв, 15:47 765 1323139

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

Ответы23141

766 8 янв, 15:49 766 1323141

>>1323139
Ну ясно все с вами, тогда отчаливаю, слишком жестко.

767 8 янв, 15:49 767 1323143

>>1323134
>я что-то иммутабельное на чистом ооп напишу
Что такое "чистое ООП"?

Ответы23168

768 8 янв, 15:52 768 1323145

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

Ответы23168

769 8 янв, 16:17 769 1323168

>>1323143
А что такое фп тогда? Просто способ написания кода. Иммутабельность можно сделать везде, и хоть мы тут друг друга уже говном закидываем очень блядь странно что вы этого вообще не понимаете, а на своей непогрешимой параше настаиваете запугивая бедных нюфагов в этом треде. Делов то полкопейки - парадигму под реальный мир приспособить. Чего вам, видимо, не дано. Фанатизма слишком много. Всегда у тебя будет состояние, в этом и ключевой косяк фп - слишком идеализируют и от этого сосут на всем, что выходит за рамки синуса. Вот и не взлетает выше хелперов к грязным мутабельным языкам это хваленое фп (покпок щас кинут какойнибудь твиттер). Хотя чего странного, по вики шпарите, практики и своих мыслей нихуя. Даже ценность мутабельности и иммутаьелности разъяснить не можете, только кейвордами покидаться есть силы.
>>1323145
С чего ты взял что состояние обязано быть везде, кроме фп? С чего ты взял, что везде, кроме фп состояние будет? Что по твоему такое вообще состояние? И с чего ты взял, что это главная фишка фп? Ты думаешь фп это про иммутабельность? Вы там клей нюхаете или что? - одна чушь охуительнее другой.
Ой, извините, с чего ты взял что состояния в фп нет? Еще как есть, ты просто немного в глазки идеализируешь. Я в ахуе с этих даунов, у них состояние просто в идеальном случае не в куче лежит, а на стеке, а они уже из себя уже форму жизни из темной материи строят. И то идеальных случаев не бывает, мы тут не фпшной сказке живем.
>У тебя проблемы с логикой
Сначала за свою логику со школьной математикой ответьте. Хотя куда там фп и логика, сорян за принижение.

Ответы23214

770 8 янв, 16:27 770 1323176

>>1322779
>плохо представляю, как его использовать, например в бекенде мессенджера, соцсети, IoT-устройства или интернет-магазина.
>
Писал простой интернет магазин на функциях задавайте отверты. Вполне реально это делать.
Другое дело, что там без современных модных фич. Да тот же Вордпресс 90% через функции написан.

Ответы231782321623539

771 8 янв, 16:28 771 1323178

>>1323176
Вордпресс и аналогичное это не пример для подражания.

Ответы23195

772 8 янв, 16:40 772 1323190

>>1323042
>Ну ты видел математику, а теперь говоришь, что выражения в программировании сложно понимать
Какая математика? Все стремятся к созданию\описанию модели небольшого кусочка реального мира посредством языка программирования, создавая объекты. Кому нужна математика в программировании? Это было актуально в 70х годах, но не сегодня.
Я тебе что, математик, чтобы формулы писать и считать? Пека у меня для чего нужна тогда? Мне, как кодеру, достаточно только уметь общаться с ней, донося, что хочет заказчик.

Ответы23220

773 8 янв, 16:46 773 1323195

>>1323178
Это не тебе решать, а рыночку, который уже порешал.

774 8 янв, 17:03 774 1323214

>>1323168
Не буду толочь воду в ступе. Слишком много текста чтобы на каждое предложение отвечать. Да и почти все они не предполагают ответа.

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

775 8 янв, 17:04 775 1323216

>>1323176
Через функции не означает ФП.

Ответы23226

776 8 янв, 17:08 776 1323220

>>1323190
>Все стремятся к созданию\описанию модели небольшого кусочка реального мира посредством языка программирования, создавая объекты.
Ешьте в забегаловке у ООП, миллион мух просто так не прилетят.

А если серьезно, то кто сказал, что все стремятся? В математике такого и близко нет. ФП как раз математическая модель, выросшая из Лямбда-исчисления Чёрча.

>>1323190
>Кому нужна математика в программировании? Это было актуально в 70х годах, но не сегодня.
Это вообще нонсенс. Ты хоть знаешь, что все программирование имеет математику под собой. Кроме ООП конечно, это чистой воды костыль, не имеющий никакого серьезного фундамента.

Ответы23234

777 8 янв, 17:11 777 1323226

>>1323216
>"Пить воду" не означает что воду.
Ясно.

Ответы23265

778 8 янв, 17:16 778 1323234

>>1323220
Так и скажи, что неосилил ООП и пишешь как джун.
И не осилишь никогда, судя по всему.

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

Ещё раз - все стараются уйти от математики в программировании, просто потому, что это слишком низкоуровневая тема. Все, кроме тебя.

Ответы23265

779 8 янв, 17:44 779 1323265

>>1323226
>>1323234
Во первых не обобщай. Кто все? Ты несешь такую пургу, что даже смешно. Математика у него низкоуровневая. Я такой чепухи никогда в жизни не слышал. Уйти от математики в программировании - это смешно не меньше. Честно говоря, тебе уже ничем не помочь. К сожалению твой уровень вряд ли поднимется выше написания бесполезного инфраструктурного кода, ибо до алгоритмов (математики) ты не дорос. Пиши дальше бесполезные бойлерплейты.

Ответы23281

780 8 янв, 17:51 780 1323275

Как же оря с веб-макак, которые спорят о математике и парадигмах программирования.

781 8 янв, 17:51 781 1323278

Как же ору с веб-макак, которые спорят о математике и парадигмах программирования.

782 8 янв, 17:54 782 1323281

>>1323265
>Кто все?
Все программисты. Байткод->ассемблер->ЯП->функционалка->ООП.
Ты либо сказочный пионер, либо зеленый.

Ответы23341

783 8 янв, 19:10 783 1323341

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

>>1323281
>функционалка
Функциональное программирование как математическая модель родилось в 30-х годах 20-го века. Еще до первых языков программирования.

Так что зеленый здесь ты. У тебя нулевые знания.

784 8 янв, 20:57 784 1323391

Задача: читать и редактировать двустрочный файл.
Есть ли адеватное, блять, решение такой элементарной задачи? Почему это так сложно и не работает ничего?

Ответы23400

785 8 янв, 21:09 785 1323397

113 Кб, 1077x1344128 Кб, 965x1280202 Кб, 1920x1080159 Кб, 1280x1024

Сегодня с другом обсуждали как выгоднее накопить на хату. Я говорю ему что ипотека не оч, так как ты платишь проценты. И скажем лучше платить за аренду 15к, откладывая 15 про запас, чем платить в ипотеку 30к.

Моя логика в том, что платя за ипотеку 30к, из этой трицадки в среднем 15к и будут проценты. В то время как лучше эти 15к положить на сберегательный счет. И в этом случае проценты уже начинают работать в обратную сторону.

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

Скажем мы простой работяга у которого есть в месяц Х свободных тысяч рублей. Далее что мы делаем. Когда наши накопления становятся больше 50к (минимальный вклад в сбере), то кладем их в наш сбербанк под 7% (опять же есть такой вклад, если время минимум год.

Например имеем такие по 12.5тр. в месяц, стало быть через 4 месяца делаем первый вклад. Через еще 4 месяца уже второй. И так далее.

Допустим мы начали всю нашу затею в сентябре, и наш первый вклад пришелся на новый год. Стало быть через год и 4 месяца начала всей нашей затеи, мы уже снимаем 53.5 тысячи рублей с вклада. Плюсуем их к тому что у нас есть сейчас на руках с зарплаты и создаем новый вклад. Далее процесс начинает циклично повторяться. Снимаем вклады, плюсуем к тому что у нас заработано и закидываем в банк. За какое время при таком подходе мы накопим себе 2 милиона рублей?

Далее допустим мы накопили 2 милиона, сняли все текущие вклады и купили себе квартиру, которую можно тоже сдавать и добавить к нашему доходу еще 12.5к в месяц.

Осуществимо ли это вообще, если скажем изначальная цена квартиры 2миллиона, но при этом она будет в среднем дорожать на 1% каждый месяц на протяжении всего цикла?

В общем никто не хочет начать решать? Сам поделился скорее что бы не забыть, просто сегодня сильно заебан на работке и лень думать.

Ответы23783

786 8 янв, 21:19 786 1323400

>>1323391
http://php.net/manual/ru/function.file.php

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

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

Ответы23419

787 8 янв, 21:36 787 1323419

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

788 8 янв, 21:57 788 1323427

Нашел вот такое компактное решение этой проблемы:

$filePath = 'closed/logpassDB.txt';

// Запись.
$data = serialize($DB);
file_put_contents($filePath, $data);

// Чтение.
$data = file_get_contents($filePath);
$DB = unserialize($data);

631 Кб, 1160x736
789 8 янв, 22:17 789 1323438

Слушайте, нужно удалить инфу из базы нажатием на кнопки. У кнопки есть id хтмлный. В зависимости от id удаляется та или иная информация. Нужно достать оттуда этот id, вычленить из строки последние символы, которые обязательно цифры, и послать запрос в базу на удаление строчки из таблицы, в ячейке которой есть эти самые цифры. Всю таблицу читать не нужно, только один столбец. Как это сделать максимально коротко и эффективно?

Ответы234392344123541

790 8 янв, 22:20 790 1323439

>>1323438
Ах, да. Id у кнопок генерируются динамически, так что простым с жикверным $().on('click', ...) тут не получится совладать, как мне кажется.

791 8 янв, 22:24 791 1323441

>>1323438
Можно сделать форму с hidden полем, через js туда передавать id и после этого отправлять форму.

Ответы23452

792 8 янв, 22:25 792 1323442

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

793 8 янв, 22:42 793 1323452

>>1323441
А что, с базой можно соединиться только посредством формы?

794 8 янв, 22:54 794 1323459

PDO или mysqli?

Ответы23475

795 8 янв, 23:30 795 1323475

>>1323459
windows or linux?

Ответы23479

796 8 янв, 23:41 796 1323479

>>1323475
Для игр винда, для администрирования лексус.

797 9 янв, 05:13 797 1323537

>>1322820

А примера кода нету?

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

А я не про это. Вот, например, в императивном стиле у нас есть классы, и известно в каком файле какой класс. И часто редактор позволяет перейти к нужному методу (а если нет - можно догадаться). А есть ли такое в ФП? Не будет ли большая программа в ФП выглядеть как гигантское выражение, которое надо прочесть и изучить целиком, прежде чем можно что-то понять и начать править? Или как длинный набор определений, которые, опять же, надо все прочесть сначала? Не будет она выглядеть как код на Питоне или JS в плохом смысле этого слова?

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

Вот был бы пример кода - можно было бы посмотреть.

> Выражение вычисляется и возвращается результат.

Я плохо представляю выражения размером хотя бы в 10 000 строк.

Ответы23573

798 9 янв, 05:15 798 1323539

>>1323176

В вордпрессе процедурное программирование, а не функциональное. Ты можешь посмотреть определения в википедии.

Ответы23581

799 9 янв, 05:18 799 1323541

>>1323438

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

Ответы24051

800 9 янв, 09:09 800 1323573

>>1323537
>Я плохо представляю выражения размером хотя бы в 10 000 строк.
Никто не в состоянии написать выражение такой величины. И цели такой нет ни у кого. Наоборот, функциональное программирование склоняет к минимализму.

>>1323537
>А примера кода нету?
На PHP у меня готового кода нет, и искать не хочется. PHP разработчики могут не до конца или не правильно понимать ФП, поэтому учиться ФП по PHP коду плохая идея. У ФП есть математическая база - Лямбда-исчисление, ее нужно понять прежде чем подходить к ФП. Могу посоветовать темы для изучения, книги, курсы.

Для начала можно посмотреть это https://www.youtube.com/watch?v=7BPQ-gpXKt4

Ответы23640

801 9 янв, 09:31 801 1323581

>>1323539
Ты скозал?

802 9 янв, 12:29 802 1323639

>>1323070
Вместо иф-элс используй switch

803 9 янв, 12:33 803 1323640

>>1323573
Это что, за хуйня? Залез в пхп тред, на пхп не пишет, несёт ебень какую-то и впаривает ФП. Коммивояжёр 2.0
Иди-ка ты нахуй с треда, теоретик.

раб божий Митрофан 804 9 янв, 14:20 804 1323703

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

Ответы237302374224002

805 9 янв, 14:50 805 1323730

>>1323703
digitalocean

Ответы23734

806 9 янв, 14:56 806 1323734

>>1323730
Удвою. Пока что стабильно служит, блокировок не наблюдаю. Да и вообще хорошо с ним работается.

807 9 янв, 15:06 807 1323742

>>1323703

Можно поискать тут: https://vps.today/ или https://poiskvps.ru/

Учти, что все, что принимает российские платежные системы вроде webmoney или yandex - это скорее всего российские компании, даже если там стоит другая страна.

Также учти, что реальные характеристики можно выявить только тестами.

Не бери OpenVZ: там часто нельзя загружать модули ядра, менять iptables итд в силу архитектуры. Также, там память считается таким образом, что ее расходуется в 1,5 - 2 раза больше. 1 Гб на OpenVZ может примерно соответствовать 500-700 Мб на KVM.

Хетцнер русских не любит и сразу требует документы.

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

Ответы2374623844

808 9 янв, 15:10 808 1323746

>>1323742
>Хетцнер русских не любит и сразу требует документы.
Разве так плохо с документами? Я просто хз, не был владельцем тут, но понравились цены сильно.

809 9 янв, 16:11 809 1323783

>>1323397
Обидно что никто не заинтересовался задачкой, по сути расширенный вариант задачи с процентами. Одни фрилансеры сидят теперь судя по треду, которые не могут id из дата-аттрибута в мускуль-запрос скормить.

Ответы2378823848

810 9 янв, 16:19 810 1323788

>>1323783
А ты сам чего?

раб божий Митрофан 811 9 янв, 17:41 811 1323844

>>1323742
ВПС брать - дороха. Ещё не известно выйдет ли чего путного, а деньги уже уплочены будут.

812 9 янв, 17:46 812 1323848

>>1323783
Какая ещё задачка? Там портянка левого текста на 5 килобайт. Кто это будет дочитывать?
С первый строк уже насрать на тебя и твоего дружбана.

47 Кб, 952x365
813 9 янв, 19:07 813 1323908

Сап, анонче. Пытаюсь добавить данные в базу, mysqli_query возвращает false. Типы данных совпадают. Что не так?

Ответы2392624485

814 9 янв, 19:29 814 1323926

>>1323908
Понял, функцию с датой нельзя передавать напрямую в запрос.

Ответы23939

815 9 янв, 19:44 815 1323939

>>1323926
У Мускула есть встроенная функция таймштампа, просто укажи её в поле даты по умолчанию. Не надо такие вещи посылать в базу.

Ответы24039

816 9 янв, 22:17 816 1324002

>>1323703
digitalocean если зарегаешься по чей-то рефке упадет 10$, на 2 месяца минимального тарифа хватит.

817 9 янв, 23:06 817 1324039

>>1323939
Один хуй форматировать на стороне клиента придется, ибо мне нужна дата в определенном формате.

Ответы24108

818 9 янв, 23:22 818 1324051

>>1323541
Чем лучше?

819 10 янв, 00:05 819 1324108

>>1324039
>мне нужна дата в определенном формате
Таймштамп на то и таймштамп, что перегоняется в любой формат.
Твоя функция может принимать его - date ( $format, $timestamp)
Используй документацию, Люк. И не городи огород.
http://php.net/manual/ru/function.date.php

Ответы2412324125

820 10 янв, 00:41 820 1324123

>>1324108
Ччерт, я поражаюсь твоей терпеливости, антончик. Спасибо за помощь.

Я тут кстати еще недавно спрашивал совета насчет вытягивания айдишника из элемента и передачи его в обработчик пхп.
Мне посоветовали создать форму с невидимым элементом, передавать в него значение и отправлять. А я сделал еще короче. Я заменил айдишник на value у элемента с тем же значением, вытягиваю его $_POST и отправляю запрос.

821 10 янв, 00:48 821 1324125

>>1324108
Ты забыл еще сказать, что юзая таймштам, нужно передавать ему функцию UNIX_TIMESTAMP(), чтобы метка времени была удобочитаемая функцией date().

822 10 янв, 01:23 822 1324133

Двощь, снова к тебе с вопросом. Не могу понять, как в конец строки вставить определённое кол-во символов. С помощью substr_replace() только один вставляется. А если мне надо 10, на пример? Там, вроде, всё с помощью цикла решается, но я не могу сообразить что-то.
https://repl.it/@JoeGreen/testing
Сама задача:
> Дана строка. Если ее длина больше 10, то оставить в строке только первые 6 символов, иначе дополнить строку символами 'o' до длины 12.

Ответы241382414324283

823 10 янв, 01:31 823 1324134

Сап двач, у меня появился вопрос по безопасности сайтов. Как защитить конфигурационные файлы конекта БД. Ведь к ним есть доступ вообще у всех.
Я пробовал через .htacess выставлять Deny from all
Но тогда сайт перестаёт конектится к базе.

Ответы2413624266

824 10 янв, 01:40 824 1324136

>>1324134
А что у тебя конфиг делает в паблике? Вынеси, например, на уровень ниже.

Ответы24140

27 Кб, 438x411
825 10 янв, 01:40 825 1324138

>>1324133
>как в конец строки вставить определённое кол-во символов.
>С помощью substr_replace()
Конкатенация же.

Ответы24267

826 10 янв, 01:41 826 1324140

>>1324136
В отдельной директории лежит конфиг.

827 10 янв, 01:47 827 1324142

Антоны, а вы вкатывались в какие-нибудь гитхаб репозитории.
У меня например есть пара мест где я бы хотел исправить овер 9000 строк говнокода, перевести всё к PHP7.0 но я имею 0 опыта работы в командных репозиториях и вообще не понимаю как это будет работать на практике. Помогите советом.

Ответы24144

828 10 янв, 01:52 828 1324143

>>1324133
Вот тебе вариант покороче и лаконичнее.

https://repl.it/repls/SinfulShinyBootstrapping

Ответы241472426724292

829 10 янв, 01:53 829 1324144

>>1324142
Обычно в репозитории есть список необходимой работы, в issue. И описание требований для контрибьюторов, стиль кода, и все остальное. Смотришь задачи, клонируешь репо, решаешь, отправляешь пулл реквест. Если твой код устроит, то его внедрят в мастер ветку.

Ответы24176

3,2 Мб, mp4,
640x360, 2:32
830 10 янв, 01:58 830 1324147

>>1324143
>Укорачивание за счёт удаления перевода строки
>Конкатенация через While
Ну... такое себе решение.

Ответы24158

831 10 янв, 02:38 831 1324158

>>1324147
Лол, залезь под капот функции, которую ты юзаешь, и увидишь то же самое.

Ответы24160

832 10 янв, 02:45 832 1324160

>>1324158
>Есть ссылка на исходник
>залезь под капот
Так и так всю функцию видно. Это не повод засовывать туда while, когда можно обойтись без него.

Ответы24161

833 10 янв, 02:48 833 1324161

>>1324160
Я про subst_replace или что он там написал. Залезь в самые недра, так сказать.

834 10 янв, 06:03 834 1324176

>>1324144
А что если репозиторий старый. Я например видел несколько игруль где код не одновлялся аж с 2009 примерно. Там даже ЧПУ не привезли. Можно ли взять этот код и редактировать, но уже как свой проект?
Спасибо за ответ анон.

Ответы24225

835 10 янв, 10:20 835 1324225

>>1324176
Тебе кто то мешает форкнуть проект? Я разрешаю.

836 10 янв, 10:38 836 1324237

Оп, нужно ли пхпшнику учить docker?

Ответы24252

837 10 янв, 11:24 837 1324252

>>1324237
Какая конечная цель? Докер удобен для запуска чего угодно в изолированном окружении.

838 10 янв, 12:02 838 1324266

>>1324134

Если ты вывалил весь код в публично доступную папку сервера, то это неправильно. Надо создать в проекте папку public, настроить ее как корневую, и в эту папку класть только то, что нужно - js/css/картинки, index.php.

Тогда конфиг будет не доступен из веба.

Закрывать папки и файлы по одному, как ты предлагаешь - это ненадежные костыли.

Ответы24695

839 10 янв, 12:05 839 1324267

>>1324138
Немного не то. Я хочу не просто приклеить +n символов, а как-то это в цикле сделать, что ли. Там в задаче написано, мол, если длина меньше 10, то в конец добавить символ "о", чтобы длина стала 12.
>>1324143
Спасибо. Вчера тоже пытался через while сделать, но не приклеивал, а в теле substr_replade() делал.
Алсо, почему вот такой код работать не будет?
while($count < 12)
{
$result = substr_replace($text, "o", $count);
echo $result;
}

Ответы2426824697

840 10 янв, 12:07 840 1324268

>>1324267
То есть, как я это вижу:
Пока длина $text < 12 символов, делаем substr_replace (добавляем в конец строки) символ "о". Где я ошибаюсь?

Ответы24287

841 10 янв, 12:31 841 1324283

>>1324133
https://3v4l.org/0ovOb

Нужное?

Ответы24300

842 10 янв, 12:38 842 1324287

>>1324268
Ошибаешься например в том, что $count не пересчитываешь. Да и вообще попытка такого решения как-то наизнанку простую вещь делает.

Ответы24297

843 10 янв, 12:43 843 1324292

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

Ответы24297

844 10 янв, 12:52 844 1324297

>>1324292
Тогда скажи как через substr_replace() за один шаг добавить нужное кол-во символов. Пока что его решение самое лучшее.
>>1324287
Точно. Про пересчёт забыл.

Ответы24301

845 10 янв, 12:54 845 1324300

>>1324283
За str_repeat() спасибо. Не знал.

846 10 янв, 12:55 846 1324301

>>1324297
Почему ты к str_replace так привязался? Это само по себе не нужно тут. Да и моя придирка была совершенно в другом. Выше лежит мой пример, где показано как высчитать сколько тебе символов нужно. Можно это же сделать тупо циклом, а не str_repeat, но при этом ты считать каждый раз длину строки не будешь.
А была бы она по условию задачи до 1кк символов дополнить например - тогда бы уже точно было некрасиво глаза закрыть на лишние действия.

Ответы243052431824326

847 10 янв, 13:00 847 1324305

>>1324301
https://3v4l.org/sd4Hd

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

848 10 янв, 13:16 848 1324318

>>1324301
И еще вот наглядную демонстрацию почему это плохо завез.
https://3v4l.org/Qr6sY - выполняется хотя бы.
https://3v4l.org/59mRU - ну фактически тоже выполняется, но уже не успевает за лимиты этого сайта выйти.
Из-за одной такой мелочи в простейшем месте можно получить натуральный удар по яйцам. И ведь даже указал на это сразу, а все равно пришлось разжевывать.

849 10 янв, 13:24 849 1324326

>>1324301
>А была бы она по условию задачи до 1кк символов дополнить например - тогда бы уже точно было некрасиво глаза закрыть на лишние действия.
Я, конечно, понимаю, что тут не /web, и на практику тут забивают, но вы все-таки думайте хоть немного при разработке не абстрактно. Если не требуется проверять строку в 1000000 символов, то и нечего мозги ебать, тем более, что цикл, что функции твои встроенные практически с одной скоростью выполнят процедуру.
В общем, хочу я сказать, что задачу решить можно разными способами, но для каждой задачи нужно подбирать оптимальный способ.

Ответы2432924707

850 10 янв, 13:37 850 1324329

>>1324326
Человек, который закрывает глаза на такие неприятные мелочи может наделать их огромное количество, что уже вполне будет аналогично выполнению вот этой залупы на 1кк строк.
Делов то просто сразу написать чуть по другому, понимая что делаешь, даже не затратив дополнительного времени и усилий на это. Не какая-то хардкорная оптимизация или преждевременная, а просто здравый смысл, привычка не писать глупость по принципу "да все ок, не ебанет" в мелочах. Да и попросту привычка не писать говнокод необоснованный. Даже анализатор шторма такие моменты подсвечивает, а он вообще разумом не обладает. И на ревью за это не погладят, а проведут разъяснительную беседу, только уже поспорить не слишком получится.
Ладно, вижу что не понят и оставлю вас при своем.

851 10 янв, 14:39 851 1324352

Посоны, есть условный цикл while($i<100){}, как сделать что бы каждый десятый $i увеличивал на еденицу другую переменную?

Ответы24380

852 10 янв, 15:07 852 1324380

>>1324352
Проверить, что $i делится на 10 без остатка.
Например
https://3v4l.org/ooCHC
Или завести переменную счетчик и сбрасывать ее когда она становится 10.

853 10 янв, 16:46 853 1324420

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

Ответы24430

854 10 янв, 17:15 854 1324427

Хочу значит изменить label формы в Symfony, пишу в твиге {{ form_label(form, "new label") }}, а он мне все равно создает в form_widget еще один label. Что не так? Пробовал как атрибут в контроллере передать, один хер

Ответы31371

855 10 янв, 17:17 855 1324430

>>1324420
range есть к примеру

856 10 янв, 19:17 856 1324485

>>1323908
>UNREGISTERED
>Windows XP
>это нелепое замазывание струйкой
Это просто комбо какое-то

Ответы2450624725

857 10 янв, 20:16 857 1324506

>>1324485
Тебя не должно ебать кто на чём пишет.

Ответы24642

858 10 янв, 21:04 858 1324518

>>1305368 (OP)
https://github.com/asdasdasdasddasasdasdas/StudentList
Оп чекни мой список студентов

Ответы251312535225425

859 10 янв, 22:53 859 1324642

>>1324506
И правда забавное замечание у этого.
>>1324506

860 11 янв, 00:51 860 1324695

>>1324266
Это ведь стандартный хостинг с доступом только к публичной папке.

861 11 янв, 00:53 861 1324697

>>1324267
>в задаче написано, мол, если длина меньше 10, то в конец добавить символ "о", чтобы длина стала 12.
Вообще тебя не понял. Ну удали лишние символы. Всё равно решение подходит для задачи.

862 11 янв, 01:05 862 1324707

>>1324326
Вот из-за таких разрабов хром сжирает к хренам по 2-3 гига оперативы загружая какой-нибудь фэйсбук. И заставляя Крузис тихонько курить в сторонке. Ну подумаешь цикл лишний раз прикрутил туда, где он просто нафиг ненужен. "Чё мозги ебать". Правильно. Говнокодьте и не думайте головой. Зачем это в 2019?

Ответы25351

863 11 янв, 02:12 863 1324725

>>1324485
>UNREGISTERED
Ну не хочу я платить за то, чем можно пользоваться бесплатно. Тебе-то какое дело?

>Windows XP
Что плохого в хрюше?

>это нелепое замазывание струйкой
Это распылитель, даун тупой.

Ответы24729

864 11 янв, 02:40 864 1324729

>>1324725
Двачую, XP - лучшая ось эвар.

865 11 янв, 10:13 865 1324813

Есть кто не смог осилить задачку с банкоматом и это не помешало стать пхп-сеньором 300к?

Ответы24817248492535126043

866 11 янв, 10:17 866 1324817

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

Ответы24818

867 11 янв, 10:23 867 1324818

>>1324817
Ну пездос вы тут гении тогда, если и тут нужно разбираться в таких сложных вещах, а кто-то еще макаками кличет

868 11 янв, 11:48 868 1324849

>>1324813
>стать пхп-сеньором 300к
Ты хотя бы джуниором стать. Неразумно делить шкуру еще не убитого медведя. Сколько вас таких.

Ответы24854

869 11 янв, 11:55 869 1324854

>>1324849
Да это шуточки
Просто приуныл от задачки, что такой непосильной показалась

Ответы24894

870 11 янв, 13:07 870 1324894

>>1324854
Тогда скажу, что некоторые не могут написать даже fizz buzz, но успешно работают программистами. Есть много статей на эту тему. Если задача не решается долго, то не стоит зацикливаться, а идти дальше. В дальнейшем решение может открыться внезапно. Изучаешь новые темы, и вдруг понимаешь, что это то, что нужно для решения. Например стоит изучить деревья, рекурсию, динамическое программирование. Если я правильно понял задачу, то это те темы, которые нужно знать для ее решения. Как звучит задача формально?

Ответы2490025184

871 11 янв, 13:21 871 1324900

>>1324894
>некоторые не могут написать даже fizz buzz, но успешно работают программистами
Это настолько печально, что даже верить в это не хочется.

Ответы24906

872 11 янв, 13:27 872 1324906

>>1324900
Вот пример https://habr.com/post/298134/

Ответы2490825023

873 11 янв, 13:29 873 1324908

>>1324906
Да читал давным давно еще, но пока не встречал ниодного даже самого глупого стажера, который бы физзбазз не осилил.

Ответы25057

874 11 янв, 13:36 874 1324913

https://repl.it/@JoeGreen/testing
1. Как из одной функции менять переменные другой? Они же закрытого типа.
2. Почему меня echo $yodaText не работает?

Ответы249242500125350

875 11 янв, 13:53 875 1324924

>>1324913
Для чего? Почитай про область видимости, лексическую область видимости, и про изменение состояния.

Ответы24935

876 11 янв, 13:59 876 1324935

>>1324924
>Для чего?
Сам не знаю. Дано 2 функции, но зачем там вторая - ума не приложу.

877 11 янв, 15:22 877 1325001

>>1324913
return $result; вместо echo $result;

37 Кб, 800x399
878 11 янв, 15:50 878 1325023

>>1324906
FizzBuzz:

for ($i = 1; $i <= 100; $i++) {
if ($i % 3 === 0) {
echo 'Fizz';
}
if ($i % 5 === 0) {
echo 'Buzz';
} else {
echo $i;
}

echo "/n";
}

Насколько я конечный?

Ответы250262504325046

879 11 янв, 15:56 879 1325026

>>1325023
Все ок. Жаль только этот метод отсеивает только тех, кто с одним только подвешенным языком на работу приходит устраиваться.

Ответы25043

880 11 янв, 16:19 880 1325043

>>1325023
У тебя на числах кратных 3 (но не кратных 5) помимо Fizz еще и само число будет выведено.
>>1325026
Вот ты и спалился, некомпетентный петух.

Ответы2505325064

881 11 янв, 16:22 881 1325046

>>1325023
Без цикла сможешь? Хорошая практика создавать функцию и в ней прятать вычисление. Еще у тебя одно условие не соблюдено, когда делится и на 3 и на 5 должно выводить FizzBuzz.

Из какого фильма пикча?

Ответы2504825052

882 11 янв, 16:23 882 1325048

>>1325046
>Из какого фильма пикча?
Звездный десант

883 11 янв, 16:25 883 1325052

>>1325046
>Еще у тебя одно условие не соблюдено, когда делится и на 3 и на 5 должно выводить FizzBuzz.
Еще один некомпетентный петух, и все главное так уверенно отвечают и дают советы, ахаха.

884 11 янв, 16:25 884 1325053

>>1325043
>Вот ты и спалился, некомпетентный петух.
Ну сорян, я пьяный((

885 11 янв, 16:30 885 1325057

>>1324908
Микроитог: даже ИТТ трое из четырех не смогли в физзбазз. И ладно один из трех честный ньюфаг, а двое других пытались косить под гуру и давать советы.
Такие пироги.

Ответы25059

886 11 янв, 16:33 886 1325059

>>1325057
https://ideone.com/sEtTEs
Правильно?
мимонубас

Ответы2506125066

887 11 янв, 16:35 887 1325061

>>1325059
Да, должно корректно выводить.

888 11 янв, 16:44 888 1325064

>>1325043
>У тебя на числах кратных 3 (но не кратных 5) помимо Fizz еще и само число будет выведено
Бля, вообще ты прав. На самом деле я минут 10 думал, как написать этот FizzBuzz, лол, наиболее лаконично.

Вообще 100%-й вариант:
for ($i = 1; $i <= 100; $i++) {
if ($i % 3 !== 0 && $i % 5 !== 0) {
echo $i;
}

if ($i % 3 === 0) {
echo 'Fizz';
}
if ($i % 5 === 0) {
echo 'Buzz';
}

echo "\n";
}

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

Основной трабл с тем, чтобы без лишних if-ов и дополнительных переменных корректно вывести в нужных местах fizz и buzz и знак переноса строки.

Ответы250682507426496

889 11 янв, 16:47 889 1325066

>>1325059
Ну по выводу выглядит правильно. Однако меня ты удивил таким использованием is_int, даже вдуплить не могу схуяли это работает вообще.

Ответы2506925070

890 11 янв, 16:50 890 1325068

>>1325064
if($i%3 == 0 $$ $i%5==0)
{
echo "fizzbuzz";
}
if ($i % 3 === 0)
{
echo 'Fizz';
}
if ($i % 5 === 0)
{
echo 'Buzz';
}
echo "$i\n";
}

Пофиксил тебя.

891 11 янв, 16:50 891 1325069

>>1325066
А хотя пригледялся - понял. Не обратил внимание, что ты реально делишь. Хитрый ты черт.

892 11 янв, 16:50 892 1325070

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

Ответы25073

893 11 янв, 16:54 893 1325073

>>1325070
Да просто не подумал, что там без % обошлось, невнимательность.

894 11 янв, 16:55 894 1325074

>>1325064
I know that feel. Можно строку использовать.

for ($i = 1; $i <= 100; $i++) {
$s = '';
if ($i % 3 === 0) {
$s .= 'Fizz';
}
if ($i % 5 === 0) {
$s .= 'Buzz';
}
if (!$s) {
$s .= $i;
}
echo $s."\n";
}

Нет больших условий, но по лаконичности все равно такое.

Ответы25082

895 11 янв, 17:09 895 1325078

Аноны, простите, что не по теме, зарегистрировал сайт и сейчас мне пришло письмо: "Ув. Регистрант,
Все практически готово, теперь Вам следует совершить оформление сайтнейм в поисковиках сети Интернет. Оплатить заявку Вы должны до 21.01.2019.", что это за ебала, развод?

Ответы25079

896 11 янв, 17:10 896 1325079

>>1325078
Да.

Ответы25084

897 11 янв, 17:13 897 1325082

>>1325074
https://ideone.com/4PFPv2

Насрать на лаконичность.

898 11 янв, 17:18 898 1325084

>>1325079
Спасибо.

899 11 янв, 17:20 899 1325086

Можно вот так ещё поизвращаться на задачкой:
https://ideone.com/2yiyEu

900 11 янв, 17:30 900 1325089

Вы охуели без ООП и паттернов решать эту задачу?

Ответы25090

901 11 янв, 17:33 901 1325090

>>1325089
Надо регулярку ещё приделать. Чтобы будущий работодатель все скиллы сразу видел.
Можно ещё Симфони поставить и через роутер правил наделать.

Ответы25092

902 11 янв, 17:37 902 1325092

>>1325090
Все значения брать из хранилища через орм, с валидациями на unsigned int. Весь вывод кинуть в очередь на ребит например на второй скрипт, чтобы на первом только процессинг оставался.

Ответы2509425098

903 11 янв, 17:42 903 1325094

>>1325092
И не забыть про кэширование.

Ответы25095

904 11 янв, 17:43 904 1325095

>>1325094
Ага, двухуревновое.

905 11 янв, 17:47 905 1325098

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

Ответы25100

906 11 янв, 17:48 906 1325100

>>1325098
Вполне здравая мысль так то. Не говори мы о физбазе правда.

907 11 янв, 17:50 907 1325101

Алсо предлагаю решение задачи нейронкой сделать.

Ответы25104

908 11 янв, 17:52 908 1325104

>>1325101
Придется прямо на собесе ее обучать, неловко выйдет. Да и все равно у нейронок 100% точности не бывает.

Ответы25112

909 11 янв, 18:05 909 1325112

>>1325104
Твоя задача написать нейронку на листочке, как ее будут запускать — не твоя забота

910 11 янв, 18:14 910 1325115

Пока в треде собралась куча погромистов разного уровня, спрошу: обучился самым самым основам по гайду ОПа. Дошёл до его задач. Решить их = знаний не хватает.
Собственно, сам вопрос - что делать теперь? Что учить/читать/смотреть?

Ответы25118251192512225349

911 11 янв, 18:20 911 1325118

>>1325115
Каких именно задач?

Ответы25121

912 11 янв, 18:22 912 1325119

>>1325115
>Решить их = знаний не хватает.
Значит неуверенно себя чувствуешь - незватает знаний и что-то не усвоил.
Гайд ОПа отлично идёт если его использовать как дополнение. Укради где-нибудь нормальный курс лекций и пройди его, парралельно читая ОПа.

Ответы25121

913 11 янв, 18:27 913 1325121

>>1325119
Что посоветуешь в роли нормального курса лекций?
>>1325118
Все те, что идут после курса: калькулятор, йодаспик, банкомат и т.д.
Частично я их могу решить, но не до конца.

Ответы2512625135

914 11 янв, 18:27 914 1325122

>>1325115
Выдумай себе проект, может даже были мысли что-то сделать - и въебывай.

915 11 янв, 18:36 915 1325126

>>1325121
>Что посоветуешь в роли нормального курса лекций?
Я "Специалист" проходил. Правда не до конца - на третьем курсе сам полез уже копаться на хабре и гите, но это я уже умел немного в код ещё до этого.
Один курс - часов 12-13 по времени.

Ответы25147

916 11 янв, 18:44 916 1325131

>>1324518
bump

Ответы25352

917 11 янв, 18:59 917 1325135

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

Ответы2518525349

918 11 янв, 19:20 918 1325147

>>1325126
Что-то много всего по данному названию вылазит. Не вот этот ли? smart-torrent.org/viewtopic.php?t=117118

Ответы25148

919 11 янв, 19:24 919 1325148

>>1325147
Вроде то.

920 11 янв, 21:01 920 1325184

>>1324894
>некоторые не могут написать даже fizz buzz, но успешно работают программистами
Как-то встречал таких когда вкатывался. Одно из их любимых выражений - "Нах ты вручную всё пишешь? Иди ларавель возьми, а то заебёшься."
Вот такие мартышки на низкоуровневых задачках и сыпятся - выучили только работу с фреймворком, не понимая принципов.
Фактически это уровень детишек с вордпресса, которые только темы накатывать могут из админки, суть та же. Зато все синьоры-помидоры в свои 23 года.

Ответы25214

921 11 янв, 21:02 921 1325185

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

922 11 янв, 21:57 922 1325214

>>1325184
Вы оба говноеды, а использовать какой-нибудь популярный фреймворк при разработке 90% приложений нужно, потому что:
1) Он почти наверняка будет спроектирован и документирован лучше, чем твоя самописная архитектура.
2) Проект будет гораздо более понятен новым сторонним разработчикам.
3) Нехуй писать велосипеды в тех 90% проектов, где можно спокойно использовать уже написанные.

Ответы25272

923 11 янв, 23:31 923 1325272

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

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

>Нехуй писать велосипеды в тех 90% проектов
А это уже не тебе решать где и что использовать, а разработчику. Нехуй советы давать.

924 12 янв, 00:20 924 1325282

подскажите куда копать, есть функция mysqli_connect(), при выполнение кода пишет такое: Uncaught Error: Call to undefined function mysqli_connect(). Версия пхп 7.2, в расширениях все включил. В гуглях искал и узнал что процедурной версий этой функций лучше не пользоваться, но тут простейшее исполнение, что может пойти не так?

Ответы2529725349

925 12 янв, 01:02 925 1325297

>>1325282
Что непонятного?
Пых говорит тебе, что не знает о существовании этой функции.
Посмотри в phpinfo или php -i включено ли расширение.
Возможно также ты вызываешь ее в своем неймспейсе, обращайся через обратный слеш.
Ну и почему ты не используешь PDO?

Ответы25301

926 12 янв, 01:16 926 1325301

>>1325297
>Посмотри в phpinfo или php -i включено ли расширение.
Возможно также ты вызываешь ее в своем неймспейсе, обращайся через обратный слеш.
все это смотрел
>Ну и почему ты не используешь PDO?
это учебный проект

Ответы25349

858-926 927 12 янв, 05:46 927 1325349

858-926

Ой, нафлудили, пока меня не было...

>>1325282

Возможно, не установлено расширение mysqli. Сделай phpinfo() и посмотри, есть ли оно там.

>>1325301

Есть php -m, но я бы не советовал проверять через CLI, так как в некоторых дистрибутивах конфиги CLI и для веба разные.

>>1325135

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

>>1325115

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

928 12 янв, 05:47 928 1325350

>>1324913

> Как из одной функции менять переменные другой? Они же закрытого типа.

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

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

Ты передаешь данные, нужные функции, как аргументы при вызове, и она возвращает результат с помощью return. Вот пример, функция принимает на вход строку, удаляет из нее все пробелы и возвращает результат:

function deleteSpaces($string)
{
$string = str_replace(' ', '', $string);
return $string;
}

А вот, как ее можно использовать:

$input = 'Hello World';
$result = deleteSpaces($input);
echo $result; // HelloWorld

> function makeFirstletterUppercase($text)
> {
> strtolower($result);
> ucfirst($result);
> }

Тут куча ошибок:

- strtolower и ucfirst не работают с кирилиецей в utf-8, используй mb-функции
- результат вызова функций никуда не сохраняется
- в функции нет return и она ничего не вернет

Также, обрати внимание, что mb_split использует диалект регулярных выражений Extended POSIX Regular Expression, в отличие от preg_split, которая использует диалект PCRE.

Также, желательно перевести слова в нижний регистр и хорошо бы расставить точки. Это делается так:

- разбиваем текст на массив предложений
- для каждого предложения, переставляем слова
- склеиваем массив предложений обратно через точку

> Дано 2 функции, но зачем там вторая - ума не приложу.

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

928 12 янв, 05:47 928 1325350

>>1324913

> Как из одной функции менять переменные другой? Они же закрытого типа.

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

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

Ты передаешь данные, нужные функции, как аргументы при вызове, и она возвращает результат с помощью return. Вот пример, функция принимает на вход строку, удаляет из нее все пробелы и возвращает результат:

function deleteSpaces($string)
{
$string = str_replace(' ', '', $string);
return $string;
}

А вот, как ее можно использовать:

$input = 'Hello World';
$result = deleteSpaces($input);
echo $result; // HelloWorld

> function makeFirstletterUppercase($text)
> {
> strtolower($result);
> ucfirst($result);
> }

Тут куча ошибок:

- strtolower и ucfirst не работают с кирилиецей в utf-8, используй mb-функции
- результат вызова функций никуда не сохраняется
- в функции нет return и она ничего не вернет

Также, обрати внимание, что mb_split использует диалект регулярных выражений Extended POSIX Regular Expression, в отличие от preg_split, которая использует диалект PCRE.

Также, желательно перевести слова в нижний регистр и хорошо бы расставить точки. Это делается так:

- разбиваем текст на массив предложений
- для каждого предложения, переставляем слова
- склеиваем массив предложений обратно через точку

> Дано 2 функции, но зачем там вторая - ума не приложу.

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

Показать весь текст

929 12 янв, 05:47 929 1325351

>>1324813

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

- берем самую старшую купюру (5000) и берем ее по максимуму, исходя из суммы выплаты и запаса купюр. Например, в данном случае берем только одну такую купюру, остается выплатить 1600
- берем вторую по старшинству купюру (1000) и берем ее по максимуму, остается к выплате 600
- и так до самой младшей купюры. Если в итоге осталось выплатить 0 - значит, выплата возможна.

В более сложном случае - например, если значения купюр равны 1000, 500, 200, 100 - жадный алгоритм не работает и придется делать полный перебор всех комбинаций, который можно попробовать оптимизировать.

То есть, алгоритм в общем случае такой:

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

Он конечно потребует перебрать очень много вариантов, потому можно его оптимизировать - откидывать варианты, когда сумма выходит слишком большой (для выдачи 11000 нет смысла брать более двух 5000-х купюр) или слишком маленькой.

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

- http://aliev.me/runestone/Recursion/DynamicProgramming.html
- https://habr.com/post/109384/
- https://neerc.ifmo.ru/wiki/index.php?title=Задача_о_рюкзаке#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B0_.D0.BE_.D1.80.D0.B0.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5

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

>>1324707

Справедливости ради, там не цикл, а желание получить большее быстродействие за счет увеличения расхода памяти, которое требуется для современных навороченных HTML5 страниц.

929 12 янв, 05:47 929 1325351

>>1324813

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

- берем самую старшую купюру (5000) и берем ее по максимуму, исходя из суммы выплаты и запаса купюр. Например, в данном случае берем только одну такую купюру, остается выплатить 1600
- берем вторую по старшинству купюру (1000) и берем ее по максимуму, остается к выплате 600
- и так до самой младшей купюры. Если в итоге осталось выплатить 0 - значит, выплата возможна.

В более сложном случае - например, если значения купюр равны 1000, 500, 200, 100 - жадный алгоритм не работает и придется делать полный перебор всех комбинаций, который можно попробовать оптимизировать.

То есть, алгоритм в общем случае такой:

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

Он конечно потребует перебрать очень много вариантов, потому можно его оптимизировать - откидывать варианты, когда сумма выходит слишком большой (для выдачи 11000 нет смысла брать более двух 5000-х купюр) или слишком маленькой.

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

- http://aliev.me/runestone/Recursion/DynamicProgramming.html
- https://habr.com/post/109384/
- https://neerc.ifmo.ru/wiki/index.php?title=Задача_о_рюкзаке#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B0_.D0.BE_.D1.80.D0.B0.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5

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

>>1324707

Справедливости ради, там не цикл, а желание получить большее быстродействие за счет увеличения расхода памяти, которое требуется для современных навороченных HTML5 страниц.

Показать весь текст

https://github.com/asdasdasdasddasasdasdas/StudentList/ 930 12 янв, 05:48 930 1325352

>>1324518
>>1325131

> Нужно создать таблицу на основе дампа в students.sql.

А где дамп? И конечно, хотелось бы чуть более подробный readme, например, такой: https://github.com/foobar1643/filehosting/blob/master/README.md (хотя, я бы его подсократил).

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

Желательно сделать публичную папку и вынести все остальное за ее пределы, как описано тут: https://github.com/codedokode/pasta/blob/master/student-list.md#выносим-код-за-корень-сервера

> $di->bind('StudentTableGateway', new StudentTableGateway);

Не стоит писать имена классов руками, стоит использовать встроенную константу class:

bind(StudentTableGateway::class, ...)

Бонусом получаешь автодополнение в IDE и защиту от опечаток.

Описания коммитов можно делать лучше: https://github.com/asdasdasdasddasasdasdas/StudentList/commits/ads

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

https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/index.php
use должно идти в самом начале файла по PSR. Код надо отформатировать.

В автозагрузчике ты не указал корневую папку, и делается поиск от текущей директории, которая может меняться, например функцией chdir(), погугли "текущая директория процесса". Лучше явно указать корневую папку с помощью __DIR__.

> $router = new Router($di);
Роутер тоже можно положить в контейнер.

> public function bind($key, $value)
Не помешали бы тайп-хинты. Вместо key, value лучше писать name, service или object.

Раз ты делаешь свой контейнер, советую глянуть рекомендацию PSR-11, которая предлагает единый интерфейс для контейнеров: https://www.php-fig.org/psr/psr-11/

https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/core/Router.php
Отформатируй код (смотри второй пост треда), тяжело это читать.

> if($params[1]){
Тут может быть ошибка, если второго элемента в массиве нету. Нужен count/array_key_exists.

Если URL неправильный, надо отдавать страницу ошибки с HTTP-кодом 404, а не выдавать страницу. Страница в идеале должна быть доступна только по одному URL, а не по любому.

> ControllerFactory::CreateController($controller,$this->di)-
А если передано неправльное имя контроллера? Должно быть 404.

> switch($controller)
> {
> case "main":
Не лучше ли определение имени контроллера сделать в роутере, и передавать имя класса? А то, получается, у нас фабрика занимается разбором URL страницы. Нарушается принцип разделения ответственности между классами.

> public static function CreateController($controller,$di)
Нужны тайп-хинты, в идеале и на возвращаемое значение.

> $search=htmlspecialchars($_GET['search']);
зачем тут htmlspecialchars? Она же используется при выводе текста в HTML шаблоне.

> $keyword = "%$search%";
Эту подстановку лучше делать в модели. А то ты внутреннее знание выносишь из модели наружу. Код снаружи не должен знать тонкостей SQL и как устроена модель, он должен лишь передавать строку для поиска в модель и получать результат. И, кстати, пробелы тоже хорошо бы заменять на %.

> $this->paginator->countPage($this->countStudents);
А зачем paginator делать полем? Не проще было сделать просто переменную?

> $_GET['page'] = $_GET['page']==null?1:$_GET['page'];
Не надо ничего записывать в $_GET. Это входные данные, а не временная переменная.

> $offset = $limit*($_GET['page']-1);
Здесь даже нет проверки, что в GET положительное число.

> $_GET['search']!==null
В $_GET не может быть null, там может быть лишь строка или массив. Тебе надо включить вывод ошибок, у тебя он отключен и ты их не видишь. Поставь error_reporting = -1, display_errors = 1 в php.ini.

> public function Cookie($hash)
Имя функции обычно начинают с глагола и с маленнькой буквы, сделайЧтоТо(). Плюс, оно должно отражать, что делает функция, а у тебя это не так. Тут должно быть что-то вроде "залогинить" или "авторизовать как".

> $this->auth->checkHash();

Результат никак не используется.

> private $perpage = 5;
> private $CurrentPage;
Поля начинаются с маленьких букв. Почитай PSR-1 и 2, пожалуйста.

>
$this->render('app/view/profile/profile.php',['student'=>$this->model->getStudentByHash($_COOKIE['hash']),'errors'=>$errors]);
Переменная errors не определена.

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

Например, использование сессии имеет такой недостаток: пользователь отправляет форму, видит ошибки. Закрывает страницу, открывает форму и снова видит старые ошибки.

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

Обновление данных лучше делать так:

- загрузить из БД в объект
- обновить
- сохранить

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

> strval(trim
Лучше trim(strval()) иначе будет ошибка при передаче массива в $_POST['name'].

Регистрацию и обновление данных можно бы совместить, там много общего.

https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/controller/controller.php
Имена классов пишут с большой буквы.

> public function ValidateAll($student)
> $this->errors['name_error']=
Не лучше ли использовать просто переменную вместо поля?

> elseif($this->db->CheckEmail($email)){
> return "Такой E-mail уже сущестует";
При редактировании проблемы не будет?

> Вы не ввели свой пол
"Вы не указали свой пол". Или, что лучше, "Пожалуйста, укажите свой пол.".

> $this->male=1;
> $this->female=0;
Не очень понятно, почему тут 2 поля, а не одно поле с вариантами GENDER_MALE/GENDER_FEMALE.

> public function generateHash(){
В таких функциях нужна документация. Что за хеш? Зачем он нужен? Когда использовать эту функцию и для чего? Качество документирования кода пока что очень плохое. Представь, как неудобно будет другому человеку разбирать твой код.

> function __construct(){
> $config = require 'app/config/db.php';
> $this->db = new PDO('mysql:host='.$config['host'].';dbname='.$config['name'].';',$config['user'],$config['password']);

Параметры соединения лучше бы передавать в конструктор. А еще лучше - передавать объект PDO как зависимость. Иначе, у тебя каждый Gateway будет создавать свое отдельное соединение к БД.

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

Код надо форматировать. Второй раз я читать неформатированный код точно не буду.

> public function CheckEmail(string $email){
Эта функция, наверно, должна возвращать true/false?

> <input type="text" class="search" name="search" placeholder="Поиск по имени">
Сюда стоит подставлять введенное ключевое слово.

> <td class="px-5"> <?=$students[$key]['name']; ?></td>
А не лучше ли сюда передавать объекты, а не массив?

> href=<?="/?page=".$this->paginator->getPreviousPage();
Это тяжело читать. Надо сделать функцию или метод-помощник для формирования ссылок. Также, выводимые в HTML данные надо экранировать.

Если страниц 1 или менее, пагинацию можно не выводить.

> value="<?=$student['name'];?>">
Почитай урок про XSS: https://github.com/codedokode/pasta/blob/master/security/xss.md

> ><?= $_SESSION['errors']['name_error'];
View должен использовать переданные ему данные, а не лезть сам в глобальные переменные.

> <input id="inputLGEx"
id должны быть уникальны.

Для формы стоит добавить HTML5 валидацию.

https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/view/registration/registration.php
Здесь скопирована форма из профиля. Надо избавиться от дублирования кода.

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

https://github.com/asdasdasdasddasasdasdas/StudentList/ 930 12 янв, 05:48 930 1325352

>>1324518
>>1325131

> Нужно создать таблицу на основе дампа в students.sql.

А где дамп? И конечно, хотелось бы чуть более подробный readme, например, такой: https://github.com/foobar1643/filehosting/blob/master/README.md (хотя, я бы его подсократил).

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

Желательно сделать публичную папку и вынести все остальное за ее пределы, как описано тут: https://github.com/codedokode/pasta/blob/master/student-list.md#выносим-код-за-корень-сервера

> $di->bind('StudentTableGateway', new StudentTableGateway);

Не стоит писать имена классов руками, стоит использовать встроенную константу class:

bind(StudentTableGateway::class, ...)

Бонусом получаешь автодополнение в IDE и защиту от опечаток.

Описания коммитов можно делать лучше: https://github.com/asdasdasdasddasasdasdas/StudentList/commits/ads

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

https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/index.php
use должно идти в самом начале файла по PSR. Код надо отформатировать.

В автозагрузчике ты не указал корневую папку, и делается поиск от текущей директории, которая может меняться, например функцией chdir(), погугли "текущая директория процесса". Лучше явно указать корневую папку с помощью __DIR__.

> $router = new Router($di);
Роутер тоже можно положить в контейнер.

> public function bind($key, $value)
Не помешали бы тайп-хинты. Вместо key, value лучше писать name, service или object.

Раз ты делаешь свой контейнер, советую глянуть рекомендацию PSR-11, которая предлагает единый интерфейс для контейнеров: https://www.php-fig.org/psr/psr-11/

https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/core/Router.php
Отформатируй код (смотри второй пост треда), тяжело это читать.

> if($params[1]){
Тут может быть ошибка, если второго элемента в массиве нету. Нужен count/array_key_exists.

Если URL неправильный, надо отдавать страницу ошибки с HTTP-кодом 404, а не выдавать страницу. Страница в идеале должна быть доступна только по одному URL, а не по любому.

> ControllerFactory::CreateController($controller,$this->di)-
А если передано неправльное имя контроллера? Должно быть 404.

> switch($controller)
> {
> case "main":
Не лучше ли определение имени контроллера сделать в роутере, и передавать имя класса? А то, получается, у нас фабрика занимается разбором URL страницы. Нарушается принцип разделения ответственности между классами.

> public static function CreateController($controller,$di)
Нужны тайп-хинты, в идеале и на возвращаемое значение.

> $search=htmlspecialchars($_GET['search']);
зачем тут htmlspecialchars? Она же используется при выводе текста в HTML шаблоне.

> $keyword = "%$search%";
Эту подстановку лучше делать в модели. А то ты внутреннее знание выносишь из модели наружу. Код снаружи не должен знать тонкостей SQL и как устроена модель, он должен лишь передавать строку для поиска в модель и получать результат. И, кстати, пробелы тоже хорошо бы заменять на %.

> $this->paginator->countPage($this->countStudents);
А зачем paginator делать полем? Не проще было сделать просто переменную?

> $_GET['page'] = $_GET['page']==null?1:$_GET['page'];
Не надо ничего записывать в $_GET. Это входные данные, а не временная переменная.

> $offset = $limit*($_GET['page']-1);
Здесь даже нет проверки, что в GET положительное число.

> $_GET['search']!==null
В $_GET не может быть null, там может быть лишь строка или массив. Тебе надо включить вывод ошибок, у тебя он отключен и ты их не видишь. Поставь error_reporting = -1, display_errors = 1 в php.ini.

> public function Cookie($hash)
Имя функции обычно начинают с глагола и с маленнькой буквы, сделайЧтоТо(). Плюс, оно должно отражать, что делает функция, а у тебя это не так. Тут должно быть что-то вроде "залогинить" или "авторизовать как".

> $this->auth->checkHash();

Результат никак не используется.

> private $perpage = 5;
> private $CurrentPage;
Поля начинаются с маленьких букв. Почитай PSR-1 и 2, пожалуйста.

>
$this->render('app/view/profile/profile.php',['student'=>$this->model->getStudentByHash($_COOKIE['hash']),'errors'=>$errors]);
Переменная errors не определена.

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

Например, использование сессии имеет такой недостаток: пользователь отправляет форму, видит ошибки. Закрывает страницу, открывает форму и снова видит старые ошибки.

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

Обновление данных лучше делать так:

- загрузить из БД в объект
- обновить
- сохранить

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

> strval(trim
Лучше trim(strval()) иначе будет ошибка при передаче массива в $_POST['name'].

Регистрацию и обновление данных можно бы совместить, там много общего.

https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/controller/controller.php
Имена классов пишут с большой буквы.

> public function ValidateAll($student)
> $this->errors['name_error']=
Не лучше ли использовать просто переменную вместо поля?

> elseif($this->db->CheckEmail($email)){
> return "Такой E-mail уже сущестует";
При редактировании проблемы не будет?

> Вы не ввели свой пол
"Вы не указали свой пол". Или, что лучше, "Пожалуйста, укажите свой пол.".

> $this->male=1;
> $this->female=0;
Не очень понятно, почему тут 2 поля, а не одно поле с вариантами GENDER_MALE/GENDER_FEMALE.

> public function generateHash(){
В таких функциях нужна документация. Что за хеш? Зачем он нужен? Когда использовать эту функцию и для чего? Качество документирования кода пока что очень плохое. Представь, как неудобно будет другому человеку разбирать твой код.

> function __construct(){
> $config = require 'app/config/db.php';
> $this->db = new PDO('mysql:host='.$config['host'].';dbname='.$config['name'].';',$config['user'],$config['password']);

Параметры соединения лучше бы передавать в конструктор. А еще лучше - передавать объект PDO как зависимость. Иначе, у тебя каждый Gateway будет создавать свое отдельное соединение к БД.

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

Код надо форматировать. Второй раз я читать неформатированный код точно не буду.

> public function CheckEmail(string $email){
Эта функция, наверно, должна возвращать true/false?

> <input type="text" class="search" name="search" placeholder="Поиск по имени">
Сюда стоит подставлять введенное ключевое слово.

> <td class="px-5"> <?=$students[$key]['name']; ?></td>
А не лучше ли сюда передавать объекты, а не массив?

> href=<?="/?page=".$this->paginator->getPreviousPage();
Это тяжело читать. Надо сделать функцию или метод-помощник для формирования ссылок. Также, выводимые в HTML данные надо экранировать.

Если страниц 1 или менее, пагинацию можно не выводить.

> value="<?=$student['name'];?>">
Почитай урок про XSS: https://github.com/codedokode/pasta/blob/master/security/xss.md

> ><?= $_SESSION['errors']['name_error'];
View должен использовать переданные ему данные, а не лезть сам в глобальные переменные.

> <input id="inputLGEx"
id должны быть уникальны.

Для формы стоит добавить HTML5 валидацию.

https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/view/registration/registration.php
Здесь скопирована форма из профиля. Надо избавиться от дублирования кода.

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

Показать весь текст

931 12 янв, 12:12 931 1325425

>>1324518
bump

932 12 янв, 16:29 932 1325532

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

169 Кб, 512x512
933 12 янв, 18:48 933 1325615

Сап
Хелпаните нюфагу
Поставил MAMP на макось. Хотел включить отображение ошибок на в php. Сделал по гайду. Поставил в файле php.ini error_reporting = E_ALL и display_errors = On. Перезапуская серв и все равно при наличии ошибок пустая страница. И так и сяк делал. Не монимаю, в чем косяк. Мудрый анон, помоги

Ответы25644

934 12 янв, 19:13 934 1325634

>>1305368 (OP)
>Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу.
А в 2019 году есть шанс без реакта стать верстальщиком? Зная только js и jquery без реакта? Хочу задрачивать html, css, а не реакт. Я прошел 2 курса по реакту, примерно представляю как верстать под реакт, но я не готов заниматься программированием на реакте. Хочу верстать. Реально ли стать верстальщиком в 2019? (Мухосрань 300 тыс. людей)

Ответы256642566525833

935 12 янв, 19:22 935 1325644

>>1325615
Нашел в чем траблы.
Нужно сделать то же самое, еще раз, как и в Applications/MAMP/conf/php/, но в другом php.ini в Applications/MAMP/bin/php/
Вдруг кто-то такой же додик, как и я
Держу в курсе

Ответы25776

936 12 янв, 19:57 936 1325664

>>1325634
Хуле там учить этот ебаный реакт, какой-то жалкий говнофреймворк блять, это тебе не c++ же.
Хуйня на полторы недели учебы.

Ответы2566625672

937 12 янв, 19:57 937 1325665

>>1325634
Реально, но з.п. меньше, чем с реактом скорее всего.

Ответы25666

938 12 янв, 20:01 938 1325666

>>1325664
>>1325665
Понял, принял, спасибо.

939 12 янв, 20:20 939 1325672

>>1325664
Не скажи, если опыт прогинга есть - то конечно проще.
А вот если ноль - то прихуеет.

Аноны, я вкатываюсь в пхп. Знаю JS, SQL, питон все средненько естественно. С пхп по верхам разобрался.
У меня такая проблема - я решаю задачки, решаю задачки, решаю...
Но я нихуя не понимаю как написать полноценный сайт, пусть простой по сложности, но полноценный со стороны проектирования. Все что я писал - превращалось в кривую кучу говна, в которой я сам путался.
Что прошу - примеры структуры проектов, учебники по проектированию сайтов а не: "ребята - это функция, давайте познакомим ее с аргументами..." ,гайды на тему построения сайта не курильщика, может даже исходники какие нибудь.
Мне нужна основа что бы на ней закреплять свой говно код.

И еще - в JS подход когда страничка возвращается шаблоном - считается устаревшей хотя на Node я делал небольшой сервер с помощью шаблонов. Там модны SPA, изоморфные приложения, свитшоты, смузи и барбершопы, это понятно. Но вообще пхп хорошо дружит с реактом нахуя я его учил? или вью?

Ответы256752572925834

940 12 янв, 20:26 940 1325675

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

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

Ответы25728

941 12 янв, 21:46 941 1325728

>>1325675
А имеет смысл использовать
> фреймворк любой, ларавель, йии
если
> на сервере генеришь жсон
Как это выглядит? Вместо хтмла во вьюхи json ебашишь?

Ответы25760

942 12 янв, 21:46 942 1325729

>>1325672
борисов объясняет в курсах, у котерова есть в книге примеры по архитектуре приложений

943 12 янв, 22:36 943 1325760

>>1325728
Ну как-то так, да

944 12 янв, 23:17 944 1325776

>>1325644
>Держу в курсе
В данном случае все правильно.

945 13 янв, 05:08 945 1325833

>>1325634

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

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

Ответы25853

946 13 янв, 05:12 946 1325834

>>1325672

> Там модны SPA, изоморфные приложения

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

По проектированию - не хочешь почитать нашу задачу про студентов с комментариями и сделать её? Там много ценных советов: https://github.com/codedokode/pasta/blob/master/student-list.md

> Но вообще пхп хорошо дружит с реактом нахуя я его учил? или вью?

PHP работает на сервере, а реакт - на клиенте. Они напрямую никак не связаны.

947 13 янв, 08:00 947 1325853

>>1325833
Понял, спасибо.

948 13 янв, 15:33 948 1325987

Есть функция multi_curl:

$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i]=curl_init($url);
//тут много curl_setopt
curl_multi_add_handle ($mh,$conn[$i]);
}

do { curl_multi_exec($mh,$active); } while ($active);

for ($i = 0; $i < count($urls); $i++) {
$json = curl_multi_getcontent($conn[$i]);
$json = json_decode($json, 1);
if (isset($json['error_code'])) {
sleep($sl);
//????????
}

curl_multi_remove_handle($mh, $conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);

Как в случае ошибки пробовать открыть ссылку снова, после небольшой паузы? curl_multi_getcontent($conn[$i]) возвращает старый результат, похоже.

Ответы26387

949 13 янв, 16:18 949 1326004

>>1305368 (OP)
ОП, проверь плиз мой вектор
https://github.com/php2ch/vector/blob/master/index.php

Ответы263862647826479

565 Кб, 637x478
950 13 янв, 17:06 950 1326018

ОП, посмотри по хтмл:
1
http://jsfiddle.net/h7czk8yt/ - тут, сделал через border-box т.к. уже знал про него
2
http://jsfiddle.net/3h1z7gpb/
3
http://jsfiddle.net/2ojzpuxs/
4
http://jsfiddle.net/pwo5f04r/
5
http://jsfiddle.net/q2L0vr9w/

Ответы2602626385

951 13 янв, 17:19 951 1326026

>>1326018
Это ж вёрстка - это во фронтенд-тред надо, а не бэкэнд.

Ответы2611626385

952 13 янв, 17:37 952 1326043

>>1324813
Я не осилил, но я еще учусь, ща верстку поделал, буду решать и банкомат параллельно. П.с. Что абу сделал с бордой? лагает и тупит все после обновы

953 13 янв, 19:58 953 1326116

>>1326026
Это задачи опа

105 Кб, 617x346
954 13 янв, 22:04 954 1326245

Не знаю, куда написать, вроде и не для /s вопрос, а для прогмикача, но и не совсем. Суть вопроса вот в чем:

есть установленная база данных MariaDB, есть установленный phpMyAdmin. Как мне связать базу и админа? В гугле ничего не нашел. Пытаюсь зайти с логином и паролем от базы - не заходит - не верные данные.
Ось debian 9.

Ответы26339

955 13 янв, 23:58 955 1326339

>>1326245

Попробуй залогиниться в БД с теми же логином и паролем из консоли на сервере, где стоит MariaDB (если у тебя есть ssh-доступ к серверу или если сервер это твой компьютер):

mysql -uusername -p

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

Увидеть пользователей можно, зайдя под админом и сделав запрос SHOW GRANTS.

Ответы26360

956 14 янв, 00:46 956 1326360

>>1326339
Все получилось. Я по недосыпу установил пароль 'password' вместо своего. Спасибо за помощь.

957 14 янв, 02:09 957 1326385

>>1326018

> 1 http://jsfiddle.net/h7czk8yt/ - тут, сделал через border-box т.к. уже знал про него
Ок, все верно.

> 2 http://jsfiddle.net/3h1z7gpb/

> max-height: 250px;
> overflow: hidden;
А это делать не требовалось, и это вообще не очень хорошая идея делать текст недоступным. Как его прочесть тогда?

В остальном, хорошо.

> 3 http://jsfiddle.net/2ojzpuxs/
Для обозначения угловой скобки лучше использовать < - это читабельнее. А для амперсанда &amp;. В остальном, верно.

> 4 http://jsfiddle.net/pwo5f04r/
Все верно.

> 5 http://jsfiddle.net/q2L0vr9w/
Всё правильно.

>>1326026

Мы готовим полноценных разработчиков, а не просто писателей скриптов на PHP.

958 14 янв, 02:10 958 1326386

>>1326004

Вообще, код производит хорошее впечатление: комментарии, типизация.

Я не уверен насчет передачи компании в конструктор. Нужно ли ее хранить там постоянно? Не лучше ли передавать компанию в конкретный метод? А то у тебя получается, для каждой компании надо создавать новый объект Кризисных Мер, а так одним объектом можно было бы обработать кучу компаний.

> $department->getHead() !== $employee
Можно было, но необязательно, сделать у департамента метод isHead().

> $engineers[] = [$employee->getRank(), $employee];
Не требуется создавать массив, чтобы сортировать сотр. по ранку:

usort($engineers, function ($a, $b) {
return $a->getRank() <=> $b->getRank();
});

Если у тебя старый PHP < 7 без spaceship operator ( http://php.net/manual/ru/language.operators.comparison.php ), то используется пара тернарных операторов.

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

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

$people = $department->select(function ($e) { return $e->getRank() > 1; });

Заодно получил бы пример использования анонимных функций.

> Возвращает объект-хранилище департаментов
> @return SplObjectStorage

Можно еще сделать @return iterable чтобы не говорить конкретный тип возвращаемого объекта и можно было бы его поменять потом. Также, твой подход имеет небольшой недостаточек, что возвращаенный объект можно изменять (чем с радостью воспользуются криворукие разработчики). В этой программе это не критично и исправлять не надо, но я сталкивался с такими случаями, когда люди брали коллекциюи изменяли ее, нарушая принцип инкапсуляции.

> private function getAverageValue
> return round($value / $amount, 1)
Это не очень праивльно. Вот у нас есть задача: отобразить среднее по компании. Её можно разбить на 2 независимые части:

- получить среднее по компании (зона ответственности компании)
- вывести среднее в нужном формате (зона ответственности кода вывода данных)

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

> 'Удаление руководителя');
Лучше бы было сделать чуть более подробное сообщение, например "для удаления руководителя необходимо сначала назначить другого руководителя".

> Возвращает заработную плату
> public function getSalary(): int
Эта функция не проверяет, является ли человек руководителем и потому возвращает недостоверные данные. Исправить можно так:

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

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

> @param Company $company
> function printCompany(Company $company)
На мой взгляд, этот комментарий не несет никакой новой информации и его не стоит добавлять. А то при редактировании придется больше кода исправлять.

> function printCompany(Company $company): void {
> // Добавление пробелов слева
> function padLeft($string, $length)
Не определяй именованные функции внутри другой функции, так как это не яваскрипт и второй вызов printCompany() вызовет ошибку. Сделай либо функции на верхнем уровне, либо анонимные.

> for ($i = $length - mb_strlen($string); $i > 0; $i--)
Есть str_repeat

В общем, сделано неплохо. Надеюсь, ты увидел преимущества ООП (если не увидел - попробуй решить задачу без классов). Если хочется еще попрактиковаться в ООП, поищи задачу про ООП-гостиницу или ООП-будильник на phpclub.tech.

958 14 янв, 02:10 958 1326386

>>1326004

Вообще, код производит хорошее впечатление: комментарии, типизация.

Я не уверен насчет передачи компании в конструктор. Нужно ли ее хранить там постоянно? Не лучше ли передавать компанию в конкретный метод? А то у тебя получается, для каждой компании надо создавать новый объект Кризисных Мер, а так одним объектом можно было бы обработать кучу компаний.

> $department->getHead() !== $employee
Можно было, но необязательно, сделать у департамента метод isHead().

> $engineers[] = [$employee->getRank(), $employee];
Не требуется создавать массив, чтобы сортировать сотр. по ранку:

usort($engineers, function ($a, $b) {
return $a->getRank() <=> $b->getRank();
});

Если у тебя старый PHP < 7 без spaceship operator ( http://php.net/manual/ru/language.operators.comparison.php ), то используется пара тернарных операторов.

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

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

$people = $department->select(function ($e) { return $e->getRank() > 1; });

Заодно получил бы пример использования анонимных функций.

> Возвращает объект-хранилище департаментов
> @return SplObjectStorage

Можно еще сделать @return iterable чтобы не говорить конкретный тип возвращаемого объекта и можно было бы его поменять потом. Также, твой подход имеет небольшой недостаточек, что возвращаенный объект можно изменять (чем с радостью воспользуются криворукие разработчики). В этой программе это не критично и исправлять не надо, но я сталкивался с такими случаями, когда люди брали коллекциюи изменяли ее, нарушая принцип инкапсуляции.

> private function getAverageValue
> return round($value / $amount, 1)
Это не очень праивльно. Вот у нас есть задача: отобразить среднее по компании. Её можно разбить на 2 независимые части:

- получить среднее по компании (зона ответственности компании)
- вывести среднее в нужном формате (зона ответственности кода вывода данных)

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

> 'Удаление руководителя');
Лучше бы было сделать чуть более подробное сообщение, например "для удаления руководителя необходимо сначала назначить другого руководителя".

> Возвращает заработную плату
> public function getSalary(): int
Эта функция не проверяет, является ли человек руководителем и потому возвращает недостоверные данные. Исправить можно так:

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

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

> @param Company $company
> function printCompany(Company $company)
На мой взгляд, этот комментарий не несет никакой новой информации и его не стоит добавлять. А то при редактировании придется больше кода исправлять.

> function printCompany(Company $company): void {
> // Добавление пробелов слева
> function padLeft($string, $length)
Не определяй именованные функции внутри другой функции, так как это не яваскрипт и второй вызов printCompany() вызовет ошибку. Сделай либо функции на верхнем уровне, либо анонимные.

> for ($i = $length - mb_strlen($string); $i > 0; $i--)
Есть str_repeat

В общем, сделано неплохо. Надеюсь, ты увидел преимущества ООП (если не увидел - попробуй решить задачу без классов). Если хочется еще попрактиковаться в ООП, поищи задачу про ООП-гостиницу или ООП-будильник на phpclub.tech.

Показать весь текст
Ответы26678

959 14 янв, 02:10 959 1326387

>>1325987

Я думаю, надо создать новый экземпляр curl. То есть один curl делает только один запрос. Также, работать напрямую с методами curl очень неудобно. Я бы советовал переделатьт это на объекты и промисы, например, так:

$manager = new CurlManager();
$manager->get('http://example.com')->then(function ($result) {
...;
}, function ($error) {
....;
});

$manager->get('http://other.example.com')->then(...);

И так далее.

Также, ты можешь взять готовую библиотеку Guzzle, где это уже сделано.

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

Ответы26566

960 14 янв, 02:18 960 1326392

Как много я потеряю спустя 2 года вкатывания в пхп без знания языков типа c++/c?
В смысле останусь ли я к тому моменту макакой с веб головного мозга без возможности перекатиться в нормальный язык, или полученные знания в сфере веб дадут хорошую базу для освоения других инструментов под другие задачи?
мне 26, вкатывался в пыху два раза за два же года. Хочется взять себя в руки и зафорсить за короткий промежуток времени уровень ковыряния пет проектов по фану.

Ответы2667127678

961 14 янв, 04:38 961 1326413

Как можно объединить два запроса

DELETE FROM table1 WHERE id=1
DELETE FROM table2 WHERE id=1

в одну строчку?

Ответы2645826945

962 14 янв, 08:24 962 1326458

>>1326413
DELETE table1., table2.
FROM table1
LEFT JOIN table2
ON table1.id = table2.id
WHERE table1.id=1

А так лучше через ключи настроить каскадное удаление.

963 14 янв, 10:07 963 1326478

>>1326004
ООП головного мозга. По другому такой код не назовешь.

Ответы26945

964 14 янв, 10:09 964 1326479

>>1326004
1000 строк, тысяча Карл! А что они делают? Подозреваю, что реальной логики там на 100 строчек, не больше. Все остальное тупой бойлерплейт aka ООП головного мозга.

Ответы26945

965 14 янв, 11:12 965 1326496

>>1325064
>без лишних if-ов
Ифы не нужны https://ideone.com/fwg3K6
А лаконично это вот
for($i = 1; $i <= 100 and print(($i % 15 ? $i % 5 ? $i % 3 ? $i : 'Fizz' : 'Buzz' : 'FizzBuzz') . "\n"); ++$i);

4 Кб, 423x389
966 14 янв, 13:05 966 1326566

>>1326387
Не понимаю, какое скачивание прерывается при sleep?

Где можно почитать про промисы на русском?

Ответы26946

71 Кб, 640x480
967 14 янв, 15:59 967 1326602

Вопрос опытным людям.

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

Вопрос: для наискорейшего начала работы, мне стоит сконцентрироваться непосредственно на языке, фреймворках и инструментах или мне всё же критически необходимо изучить подобные книги - "Структура и интерпритация компьютерных программ", "Алгоритмы и структуры данных", "Архитектура компьютера"?

Ответы266692680827675

someApprentice 968 14 янв, 18:05 968 1326665

208 Кб, 1920x1080222 Кб, 1920x1080242 Кб, 1920x1080170 Кб, 500x675

Promise Hell

Ответы26947

969 14 янв, 18:11 969 1326669

>>1326602
>Вопрос: для наискорейшего начала работы, мне стоит сконцентрироваться непосредственно на языке, фреймворках и инструментах или мне всё же критически необходимо изучить подобные книги - "Структура и интерпритация компьютерных программ", "Алгоритмы и структуры данных", "Архитектура компьютера"?
Каждый работодатель выдаёт свои требования. Если я правильно понимаю, что твоя задача как можно скорей найти работу, то советую сначала ознакомиться с их требованиями, чтобы самому определиться на чем тебе стоит сконцентрироваться.

970 14 янв, 18:16 970 1326671

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

971 14 янв, 18:33 971 1326678

>>1326386
Благодарю за отзыв.

> 1) переименовать функцию, запретить ее использовать и сделать в департаменте правильную функцию для получения зарплаты

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

>сделать в департаменте правильную функцию
Что-то вроде этого?
private function getSalary(Employee $e): int;
private function getCoffeeVolume(Employee $e): int
private function getDocumentsCount(Employee $e): int

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

Ответы26947

972 14 янв, 22:16 972 1326808

>>1326602
Иди на Хекслет hexlet.io, там специализируются на устройстве на работу таких как ты.

973 14 янв, 22:35 973 1326827

Анончики, в вебе 1,5 землекопа, подскажите куда копать. Задача крайне проста: нужна cms, даже просто криптик, который имеет форму поиска по базе и отдает результаты, а какие столбцы - я сам решу.

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

Не встечали такое готовое? Чтобы мышкой накидал в админке, что будем выбирать и готово? За 5 минут.

Ответы2746827479

974 15 янв, 04:43 974 1326945

>>1326478

Решишь эту задачу без ООП и покажешь, как лучше сделать?

>>1326413

А зачем? Это плохая идея. Если ты хочешь, чтобы они или оба выполнились, или не выполнились, заверни их в транзакцию.

>>1326479

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

Ответы27672

975 15 янв, 04:43 975 1326946

>>1326566

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

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

- определить IP адрес сервера по его имени (example.com -> 1.2.3.4). Для этого ты должен составить пакет с DNS-запросом и попросить ОС его отправить DNS-серверу
- затем ты ждешь получения ответа от DNS-сервера. Он может придти через 0,1с, а может через несколько секунд - все это время твой код стоит и ничего не делает, ждет прихода пакета
- получив IP, ты просишь ОС установить TCP-соединение с этим IP и ждешь подтверждения, что оно установлено
- если все ок, ты шлешь серверу HTTP-запрос. Опять же, ждешь подтверждения, что он дошел до сервера
- затем сервер обрабатывает твой запрос, ты ждешь
- затем он шлет тебе ответ, ты принимаешь его по частям и сохраняешь
- затем ты просишь ОС закрыть соединение и ждешь подтверждения

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

ид1 = установить_соединение('1.2.3.4');
отправить_запрос_в_соединение(ид1, запрос);

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

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

ид1 = установить_соединение_без_блокировки('1.2.3.4');

Так как твоя программа не блокируется, то ты можешь сразу попросить ОС установить второе соединение:

ид2 = установить_соединение_без_блокировки('3.4.5.6');

Теперь у тебя есть 2 идентификатора, но отправлять запрос можно только когда соединение установится. Чтобы дождаться этого, ты просишь ОС заблокировать тебя до того момента, пока любое из соединений не будет готово к приему данных (или пока не обнаружится ошибка):

while (true) {
соединение = ждать_изменения_состояния([ид1, ид2]);

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

если (соединение == ид1 && мы еще не отправили запрос в соединение 1) {
отправить_запрос_в_соединение(ид1, запрос1);
} иначе если (соединение == ид1 && мы отправили запрос в соединение 1) {
начать_прием_ответа(ид1, буфер_для_ответа_1);
} иначе, если (соединение == ид2 && мы не отправили запрос в соединение 2) {
....

}
}

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

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

Если ты в своем коде вызовешь sleep() то все это время curl_multi_exec работать не будет и скачиваться ничего не будет. Потому тебе надо делать паузу в такой же асинхронной манере:

while (true) {
соединение = ждать_изменения_состояния_или_завершения_таймаута([ид1, ид2], 2 секунды);

если (прошло 2 секунды) {
запустить повторное соединение;
}
...

То есть, тебе надо вместо sleep сделать асинхронную проверку прошедшего времени вот в этом цикле: do { curl_multi_exec($mh,$active); } while ($active);

И как я написал выше, без объектов или каких-то других абстракций делать это будет крайне неудобно.

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

- изучить сокеты Беркли, сначала блокирующие, на функциях socket_create, socket_read, socket_write
- потом научиться писать неблокирующий код на функциях вроде socket_select как описано выше
- потом освоить ReactPHP и промисы
- и наконец с этими знаниями либо написать свой код, либо сделать свою задачу с использованием Guzzle

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

975 15 янв, 04:43 975 1326946

>>1326566

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

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

- определить IP адрес сервера по его имени (example.com -> 1.2.3.4). Для этого ты должен составить пакет с DNS-запросом и попросить ОС его отправить DNS-серверу
- затем ты ждешь получения ответа от DNS-сервера. Он может придти через 0,1с, а может через несколько секунд - все это время твой код стоит и ничего не делает, ждет прихода пакета
- получив IP, ты просишь ОС установить TCP-соединение с этим IP и ждешь подтверждения, что оно установлено
- если все ок, ты шлешь серверу HTTP-запрос. Опять же, ждешь подтверждения, что он дошел до сервера
- затем сервер обрабатывает твой запрос, ты ждешь
- затем он шлет тебе ответ, ты принимаешь его по частям и сохраняешь
- затем ты просишь ОС закрыть соединение и ждешь подтверждения

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

ид1 = установить_соединение('1.2.3.4');
отправить_запрос_в_соединение(ид1, запрос);

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

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

ид1 = установить_соединение_без_блокировки('1.2.3.4');

Так как твоя программа не блокируется, то ты можешь сразу попросить ОС установить второе соединение:

ид2 = установить_соединение_без_блокировки('3.4.5.6');

Теперь у тебя есть 2 идентификатора, но отправлять запрос можно только когда соединение установится. Чтобы дождаться этого, ты просишь ОС заблокировать тебя до того момента, пока любое из соединений не будет готово к приему данных (или пока не обнаружится ошибка):

while (true) {
соединение = ждать_изменения_состояния([ид1, ид2]);

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

если (соединение == ид1 && мы еще не отправили запрос в соединение 1) {
отправить_запрос_в_соединение(ид1, запрос1);
} иначе если (соединение == ид1 && мы отправили запрос в соединение 1) {
начать_прием_ответа(ид1, буфер_для_ответа_1);
} иначе, если (соединение == ид2 && мы не отправили запрос в соединение 2) {
....

}
}

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

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

Если ты в своем коде вызовешь sleep() то все это время curl_multi_exec работать не будет и скачиваться ничего не будет. Потому тебе надо делать паузу в такой же асинхронной манере:

while (true) {
соединение = ждать_изменения_состояния_или_завершения_таймаута([ид1, ид2], 2 секунды);

если (прошло 2 секунды) {
запустить повторное соединение;
}
...

То есть, тебе надо вместо sleep сделать асинхронную проверку прошедшего времени вот в этом цикле: do { curl_multi_exec($mh,$active); } while ($active);

И как я написал выше, без объектов или каких-то других абстракций делать это будет крайне неудобно.

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

- изучить сокеты Беркли, сначала блокирующие, на функциях socket_create, socket_read, socket_write
- потом научиться писать неблокирующий код на функциях вроде socket_select как описано выше
- потом освоить ReactPHP и промисы
- и наконец с этими знаниями либо написать свой код, либо сделать свою задачу с использованием Guzzle

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

Показать весь текст
Ответы2712127347

976 15 янв, 04:44 976 1326947

>>1326665

Так зачем писать все одной длинной портянкой? Возможно, надо разбивать код на функции.

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

var result1 = someAsyncFunc();
var result2 = result1.then(function () {
return someOtherAsyncFunc();
});

var result3 = result2.then(function () {
return someOtherAsyncFunc();
});

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

>>1326678

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

> >сделать в департаменте правильную функцию
> Что-то вроде этого?
Я имел в виду, раз работник не знает, босс ли он, то он не может посчитать себе зарплату. Её должны посчитать в департаменте:

public function getEmployeeSalary(Employee $e): int

976 15 янв, 04:44 976 1326947

>>1326665

Так зачем писать все одной длинной портянкой? Возможно, надо разбивать код на функции.

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

var result1 = someAsyncFunc();
var result2 = result1.then(function () {
return someOtherAsyncFunc();
});

var result3 = result2.then(function () {
return someOtherAsyncFunc();
});

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

>>1326678

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

> >сделать в департаменте правильную функцию
> Что-то вроде этого?
Я имел в виду, раз работник не знает, босс ли он, то он не может посчитать себе зарплату. Её должны посчитать в департаменте:

public function getEmployeeSalary(Employee $e): int

Показать весь текст
Ответы27289

977 15 янв, 12:14 977 1327060

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

Объясните нубу плз?

Ответы2706927328

978 15 янв, 12:29 978 1327069

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

Ответы271062710827110

979 15 янв, 13:25 979 1327106

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

980 15 янв, 13:30 980 1327108

>>1327069
Я просто пробовал вывести свой сервер на публику, через особенный порт, перенаправил его внутри роутера на порт 80, вывело стартовую страницу Drupal спокойно в сеть, можно было войти на сайт, но пришлось отключить SELinux и поэтому я сайт положил, нехорошая практика, сейчас планирую сервер сделать на Debian, все хорошо пока что, но нужно все равно разбирать эту тему. Все будет локально как рекомендует сам дебиан и запросы будут брать данные с локальной базы данных. В общем пока разбираюсь.

981 15 янв, 13:34 981 1327110

>>1327069
Щас проверил, провайдер говорит что у меня белый адрес.

4 Кб, 504x288
982 15 янв, 13:54 982 1327121

>>1326946
>распараллеливание, где код выполняется в 3 параллельных потока.
Так потому что multicurl, разве нет?
>Используя curl_multi_exec, мы можем выполнять все эти запросы параллельно, тем самым общее время запроса будет равно времени самого медленного из запросов.

>Если ты в своем коде вызовешь sleep() то все это время curl_multi_exec работать не будет и скачиваться ничего не будет.
Я правильно это изобразил? При условии, что у разных запросов разная продолжительность.

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

Ответы27340

983 15 янв, 17:12 983 1327270

Сразу к делу. Учусь сейчас загружать файлы на сервер, в частности - картинки.

Есть вот такая вырванная из контекста строчка:
move_uploaded_file($_FILES['img']['tmp_name'], 'imgs/uploads/' . $_FILES['img']['name']);

Кому лень думать, она перехватывает заголовки, отправленные методом POST и перемещает картинку из временного каталога в uploads.

Где находится этот временный каталог?
Я играл с php.ini, с директивой upload_tmp_dir путь к этой временной директории, перезагружал апач. Phpinfo() говорит, что директория изменена.
Но код продолжает работать, что бы я ни написал в этой директиве.

Хорошо. Изменяю строчку на:
move_uploaded_file('путь/указанный/в/upload_tmp_dir' . $_FILES['img']['tmp_name'], 'imgs/uploads/' . $_FILES['img']['name']);
Но обработчик не загружает картинку.

По умолчанию эта директива в php.ini закомментирована, то есть есть какой-то путь по умолчанию, о котором я не знаю. Как его найти?

Ответы2727327340

984 15 янв, 17:19 984 1327273

>>1327270
>upload_tmp_dir
Cлеш после этого разумеется поставил. С синтаксисом все ок.

985 15 янв, 17:55 985 1327289

>>1326947
>Так зачем писать все одной длинной портянкой? Возможно, надо разбивать код на функции.
Так всё что можно разбить уже разбито. Валидация делается с помощью ORM библиотеки, на подобии того как это делается в Symfony. Работа с БД тоже выполнена с её помощью. Сравнение пароля с хешем и получение токена выполнены тоже с помощью сторонних библиотек. Остаётся только выдача ответа, которым должен заниматься сам контроллер.

Причина по которой я запостил свой код, это показать как асинхронный код становиться чище после применения async/await. Взгляните, ведь даже после рефакторинга во 2-ом примере, в котором вложенность стала чуть-чуть чище, в 3-ем примере код всё равно стал читаемей.

>Ну и с промисами не должно быть большой вложенности, они обычно пишутся так же:
Если это повсеместно рабочая практика, то у меня плохое предчувствие об этом.

В моём коде пришлось бы писать

let validatePromise...
let findPromise...
let compareHashPromise...

Это же выглядит уродливо. В каких проектах вам довелось это видеть?

Ответы2730327344

986 15 янв, 18:18 986 1327303

>>1327289
Промисы для хипстеров.

987 15 янв, 19:06 987 1327328

>>1327060

Можно, но тут есть несколько проблем.

1) если твой провайдер использует NAT, то снаружи нельзя подсоединиться к твоему компьютеру, так как у него нет видимого снаружи адреса (он виден только в локалке провайдера). Тебе нужно в этом случае приобрести "белый внешний IP" у провайдера, это может стоить денег. Если ты используешь роутер, вдобавок надо пробросить порт на роутере, так как роутер это тот же NAT.

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

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

4) за электричество от постоянно включенного ноутбука придется платить

5) если твой сайт станет очень популярен, и исчерпает лимит трафика, провайдер может потребовать перейти на тариф подороже

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

Ответы27641

988 15 янв, 19:12 988 1327336

Правильно ли я понимаю, что эти ваши фреймворки всего лишь упрощают написание кода?

Ответы2761727681

989 15 янв, 19:16 989 1327340

>>1327121

Да, sleep останавливает твою программу на 2 с и в этом время ничего не делается, данные не принимаются и не передаются.

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

>>1327270

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

$_FILES['img']['name'] предоставляет пользователь и он может вписать туда что угодно. Например, он тебе может загрузить файл с именем backdoor.php и вызвать его. Или .htaccess. Сделай исправления:

- проверяй расширение файла по белому списку, а лучше генерируй имя сам
- так как пользователь может использовать любые, в том числе нечитаемые символы в имени, фильтруй их по списку разрешенных символов или генерируй безопасное имя сам
- если вдруг файл не требуется отдавать наружу и показывать на сайте, то загружай его в непубличную папку, чтобы к нему нельзя было обратиться из браузера
- запрети выполнение php в папке с файлами с помощью htaccess
- если разрешено загружать только картинки, можно проверить ее тип и размеры с помощью http://php.net/manual/ru/function.getimagesize.php
- проверяй размер загружаемого файла

> Где находится этот временный каталог?
Сделай var_dump($_FILES); и смотри, что написано в tmp_name.

> ('путь/указанный/в/upload_tmp_dir' . $_FILES['img']['tmp_name'],
В tmp_name уже хранится полный путь и дописывать ничего не надо.

Ответы27398

990 15 янв, 19:20 990 1327344

>>1327289

Если переменные на каждый шаг писать неохота, можно писать цепочкой (но я не вижу проблем в переменных и это по моему чище, чем цепочка):

var result = async1().then(function () {
return async2();
}).then(function () {
return async3();
})

async/await удобнее, да.

Ответы27549

991 15 янв, 19:21 991 1327347

>>1326946
Где можно почитать о подобном? О принципах работы и внутреннем устройстве PHP? Разобраться, что под капотом и как работает? Что можешь посоветовать?

Ответы27574

992 15 янв, 20:16 992 1327398

>>1327340
>Ни в коем случае не пиши такой код, это просто открывает доступ к твоему серверу. Ты должен был сначала изучить безопасную загрузку файлов, а только потом ее делать.

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

>Сделай var_dump($_FILES); и смотри, что написано в tmp_name.

["tmp_name"]=> string(14) "/tmp/phpGQXuhf"
Я перепутал абсолютный каталог tmp в корне системы с относительным каталогом в корне сайта. Вот я дебич.

Ответы31371

384 Кб, 2002x1080
993 15 янв, 22:14 993 1327468

>>1326827
Php my admin

Ответы27480

994 15 янв, 22:36 994 1327479

>>1326827
Что значит "спарсил"? Скачал себе на комп торрент-файлы? Залил ссылки на них в базу?

Ответы27480

995 15 янв, 22:38 995 1327480

>>1327479
Значит, да, залил. И в csv все есть. Могу переделать под любой формат для импорта в базу.

>>1327468
Не, сайт нужен, для людей.

Ответы27482

996 15 янв, 22:45 996 1327482

>>1327480
Тащемта, если поиск простой, допустим, если пользователь ищет что-то по имени торрент файла gta 5, то тут можно обойтись простой подстановкой значения из поиска в mysql запрос. Умеешь в такое?

Ответы27510

997 15 янв, 23:09 997 1327488

Хорошей ли практикой считается хранение каких-либо счетчиков не в базе, а в обычном файле на сервере?

Ответы31371

998 15 янв, 23:36 998 1327510

>>1327482
Хотелось мы с ajax-подсказками, конечно. Вопрос немного не в этом: может кто видел готовую cms, ориентированную на большие массивы данных и чтобы там была уже пагинация, карта сайта, категори и т.п.?

Шобы оно не падало на нескольких миллионах записей.

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

Ответы2754827617

999 16 янв, 00:19 999 1327548

>>1327510
Не, я с цмсками не связывался.

1000 16 янв, 00:19 1000 1327549

>>1327344
>Если переменные на каждый шаг писать неохота, можно писать цепочкой
Можно посмотреть в 1-ом примере к чему это привело - Promise Hell.

>но я не вижу проблем в переменных и это по моему чище, чем цепочка
Выходит переменные или цепочка, это дело вкуса. Но с async/await мы сходимся во мнениях, и значит нужно использовать это, чтобы это становилось общей рабочей практикой.

Ответы275652776327765

1001 16 янв, 00:42 1001 1327565

>>1327549
>1000
Пилите перекат, суки!
Какая блять разница как должно или положено? Одни блять стереотипы в кодировании. Сами ведь себе сложности хуярите. А ведь можно писать так, как реально удобно.

Ответы27574275842761827770

1002 16 янв, 01:07 1002 1327574

>>1327565
Кто-нибудь, допоможите! Даже у Котерова нет продробностей об этом. >>1327347

Ответы2758527739

1003 16 янв, 01:44 1003 1327584

>>1327565
>Какая блять разница как должно или положено?
Языки программирования созданы чтобы переводить человекочитаемый формат в бинарные инструкции (машинный код). Но человекочитаемый формат, это относительное понятие. Чтобы это понятие стало объективным нужно прийти к своду правил, как это делается в естественных языках, посредством правил грамматики и пунктуации.

Иными словами, код пишется чтобы другие люди его понимали.

1004 16 янв, 01:44 1004 1327585

>>1327574
https://secure.php.net/manual/ru/index.php
https://ru.wikipedia.org/wiki/PHP

1005 16 янв, 06:14 1005 1327617

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

>>1327510
>может кто видел готовую cms, ориентированную на большие массивы данных и чтобы там была уже пагинация, карта сайта, категори и т.п.?
Вукомерц для вордпресса смотрел? Это плагин электронного магазина. Должен подходить под твои нужды. Только подкрутить под задачу.
Вообще, что понимать под "большими массивами"? Ты собираешься весь миллион торрентов пользователю показывать сразу? Зачем? Он их всё равно не прочитает, и даже не оценит. А простой поиск по базе сделать недолго на чистом пхп.

Ответы27677

1006 16 янв, 06:20 1006 1327618

>>1327565
>Одни блять стереотипы в кодировании.
Это хорошо.
Вот говоришь ты человеку - говно, и он понимает, что это такое. А вот если один говорит - студёная коричневая масса с неприятным запахом, второй - органические выделения, а третий вообще - сладкий деревенский хлебушек.
Вот пойди и разбери что там каждый имеет ввиду. Поэтому отсебятина в программировании там, где есть уже ставшее стандартом решение - плохо.

Ответы27770

1007 16 янв, 08:22 1007 1327641

>>1327328
Спасибо.

1008 16 янв, 10:23 1008 1327672

>>1326945
Попробуй думать не стереотипами, а своей головой. Можно использовать ООП, но писать при этом компактно. Можно не использовать ООП, и писать еще компактней. Но для этого нужно думать, а не тупо копировать то что Гради Буч придумал.

1009 16 янв, 10:28 1009 1327675

>>1326602
И то и другое.

1010 16 янв, 10:32 1010 1327677

>>1327617
Не, вордпресс оче хуево работает на овер 30к записях - из-за замудренной структуры бд. Плюс там этот wp api еще - я буду добавлять в базу несколько лет.

1011 16 янв, 10:33 1011 1327678

>>1326392
Отличия в знаниях будут не значительными. Ты будешь знать лучше работу веба. Те кто на C/C++ будут лучше знать работу процессора. Если опыт одинаковый, то нельзя сказать кто из них лучше или хуже. Бывают крутые и PHP разработчики, которые всесторонне развиваются, решают сложные задачи.

1012 16 янв, 10:37 1012 1327681

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

1013 16 янв, 12:00 1013 1327739

Перекат скоро сделаем, погодите, людям работать еще надо.

>>1327574

Я подозреваю, книги "Как делать асинхронные запросы с помощью multi curl в PHP" нету. Можно погуглить, вдруг есть, но я бы не надеялся. Можно почитать про сетевое программирование в linux (чтобы знать, как работают сокеты Беркли) и затем про асинхронное сетевое программирование в linux, мультиплексирование ввода-вывода:

- про сокеты Беркли https://rsdn.org/article/unix/sockets.xml (на примере языка Си, в PHP эти же функции доступны под именами вроде socket_create, socket_bind и тд, см. мануал PHP)
- http://php.net/manual/ru/book.sockets.php
- https://webonrails.ru/post/37878306439173678/ (там в коде есть ошибки)
- книга про сетевое программирование на linux "UNIX: разработка сетевых приложений" на примере Си: https://it.wikireading.ru/6936 Мультиплексирование ввода/вывода описано в главе 6.

А вот про реализацию мультиплексирования I/O уже в PHP:

- https://habr.com/ru/post/111357/

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

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

Я могу проверить твой код и дать тебе советы и подсказки.

Ответы28030

1014 16 янв, 12:47 1014 1327754

Анчоусы, засиделся я в своей конторе, а в портфолио особо нечего вставить.
Буду писать что-то на laravel + vue.js специально для портфолио.
Может подкинете идей для проекта? Было бы неплохо, если бы он ещё и полезен был кому-то.

Ответы27770

1015 16 янв, 13:11 1015 1327763

>>1327549

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

Ну к примеру, возьмем этот код:

user.validate({ skip: ....}).then(() => {
return User.find({ where: ... }).then(u => {
...
return bcrypt.compare(...).then(r => {
...
});
});
}).catch(err => {
...
});

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

userPromise = authService.findOneByLogin(email, password);

Я это и назвал "портянкой", то, что часть кода так и просит, чтобы его вынесли в отдельные функции.

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

var skip = ...;
var userData = user.validate({ skip: skip }).then(function () {
return User.find({ where: email });
}).then(function (u) {
if (!u) {
// Это код 404, а не 204. 204 обозначает успех операции, а не ошибку.
throw new Http404Error(...);
}

return [u, authService.checkPassword(u, password)];
}).then(function (checkResult) {
[u, isPassValid] = checkResult;

if (!isPassValid) {
throw new Http403Error(...);
}

return [u, signUserTokenAsync(u)];
});

// Вся работа с res в одном месте, а не раскидана по коду
responsePromise.then(function (userData) {

[u, jwt] = userData;

res.status(200);
res.json(u.getPublic());
res.cookie(....);
}, function (err) {
if (err instanceof ValidationError) {
res.status(400);
} else if (err instance of HttpError) {
...
} else if (err instance of PasswordInvalidError) {
res.status(403);
} else {
console.error(err);
res.status(503);
}
});

Цепочка промисов - это процесс преобразования данных, где каждый коллбек делает одно преобразование:

данные из Request -> успешный результат валидации -> объект User -> User + результат проверки пароля -> User + токен

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

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

Email -> валидированный Email -> объект User
Password, User -> результат проверки пароля
User -> подписанный токен

За счет этого мы даже можем выполнить 2 последних операции параллельно (проверка пароля и генерация токена), при условии что там асинхронный код и при условии, что это не создает нежелательных эффектов (например, лишние записи в БД):

var validatedUser = user.validate(...).then(function () {
return User.find(where);
});

var isPassValidPromise = validatedUser.then(function (u) {
return authService.checkPassword(u, password);
});

var signedTokenPromise = validatedUser.then(function (u) {
return signTokenAsync(u);
});

Promise.all([validatedUser, isPassValidPromise, signedTokenPromise]).then(function (all) {
[u, isPassValid, signedToken] = all;

res.send(...);
res.json(...);
res.cookie(...);
}).catch(function (err) {
// обработка ошибок
});

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

Цепочки промисов удобно рисовать с помощью квадратиков и стрелочек на бумаге или с помощью утилиты Graphwiz: https://dreampuf.github.io/GraphvizOnline/#digraph Authorization { subgraph cluster_0 { validatedEmail -> User label = "Find User"; } subgraph cluster_1 { User -> isPassValid; label = "Check Pass"; } subgraph cluster_2 { label = "Sign Token"; User -> signedToken } email -> validatedEmail password -> isPassValid User -> successfulResponse isPassValid -> successfulResponse signedToken -> successfulResponse}

На графе узлы обозначают значения, а стрелочки - преобразования.

Разумеется, этот код можно переписать на await и он станет еще лучше. Но рисование цепочек поможет спроектировать код и в этом случае. Только после того, как я придумал эти цепочки, я увидел, что можно часть операций делать параллельно.

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

Также, в твоем коде бросается в глаза "проглатывание" ошибок: при возникновении ошибки в цепи промисов она не логгируется, а просто отдается ответ с кодом 500. Разработчик о ней не узнает, и никто не узнает. Это, на мой взгляд, неправильно, и усложняет поддержку кода. Должно быть так:
user.validate(...).then(function () {
....
}).catch(function (err) {
if (err instanceof ValidationError) {
// мы ловим исключение от user.validate(), хотя тут поймается и исключение
// от других элементов цепочки, и это плохо
return res.sendStatus(400);
}

// Логгируем ошибку
loggerSevrice.logError(err);
res.sendStatus(500);
});

1015 16 янв, 13:11 1015 1327763

>>1327549

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

Ну к примеру, возьмем этот код:

user.validate({ skip: ....}).then(() => {
return User.find({ where: ... }).then(u => {
...
return bcrypt.compare(...).then(r => {
...
});
});
}).catch(err => {
...
});

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

userPromise = authService.findOneByLogin(email, password);

Я это и назвал "портянкой", то, что часть кода так и просит, чтобы его вынесли в отдельные функции.

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

var skip = ...;
var userData = user.validate({ skip: skip }).then(function () {
return User.find({ where: email });
}).then(function (u) {
if (!u) {
// Это код 404, а не 204. 204 обозначает успех операции, а не ошибку.
throw new Http404Error(...);
}

return [u, authService.checkPassword(u, password)];
}).then(function (checkResult) {
[u, isPassValid] = checkResult;

if (!isPassValid) {
throw new Http403Error(...);
}

return [u, signUserTokenAsync(u)];
});

// Вся работа с res в одном месте, а не раскидана по коду
responsePromise.then(function (userData) {

[u, jwt] = userData;

res.status(200);
res.json(u.getPublic());
res.cookie(....);
}, function (err) {
if (err instanceof ValidationError) {
res.status(400);
} else if (err instance of HttpError) {
...
} else if (err instance of PasswordInvalidError) {
res.status(403);
} else {
console.error(err);
res.status(503);
}
});

Цепочка промисов - это процесс преобразования данных, где каждый коллбек делает одно преобразование:

данные из Request -> успешный результат валидации -> объект User -> User + результат проверки пароля -> User + токен

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

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

Email -> валидированный Email -> объект User
Password, User -> результат проверки пароля
User -> подписанный токен

За счет этого мы даже можем выполнить 2 последних операции параллельно (проверка пароля и генерация токена), при условии что там асинхронный код и при условии, что это не создает нежелательных эффектов (например, лишние записи в БД):

var validatedUser = user.validate(...).then(function () {
return User.find(where);
});

var isPassValidPromise = validatedUser.then(function (u) {
return authService.checkPassword(u, password);
});

var signedTokenPromise = validatedUser.then(function (u) {
return signTokenAsync(u);
});

Promise.all([validatedUser, isPassValidPromise, signedTokenPromise]).then(function (all) {
[u, isPassValid, signedToken] = all;

res.send(...);
res.json(...);
res.cookie(...);
}).catch(function (err) {
// обработка ошибок
});

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

Цепочки промисов удобно рисовать с помощью квадратиков и стрелочек на бумаге или с помощью утилиты Graphwiz: https://dreampuf.github.io/GraphvizOnline/#digraph Authorization { subgraph cluster_0 { validatedEmail -> User label = "Find User"; } subgraph cluster_1 { User -> isPassValid; label = "Check Pass"; } subgraph cluster_2 { label = "Sign Token"; User -> signedToken } email -> validatedEmail password -> isPassValid User -> successfulResponse isPassValid -> successfulResponse signedToken -> successfulResponse}

На графе узлы обозначают значения, а стрелочки - преобразования.

Разумеется, этот код можно переписать на await и он станет еще лучше. Но рисование цепочек поможет спроектировать код и в этом случае. Только после того, как я придумал эти цепочки, я увидел, что можно часть операций делать параллельно.

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

Также, в твоем коде бросается в глаза "проглатывание" ошибок: при возникновении ошибки в цепи промисов она не логгируется, а просто отдается ответ с кодом 500. Разработчик о ней не узнает, и никто не узнает. Это, на мой взгляд, неправильно, и усложняет поддержку кода. Должно быть так:
user.validate(...).then(function () {
....
}).catch(function (err) {
if (err instanceof ValidationError) {
// мы ловим исключение от user.validate(), хотя тут поймается и исключение
// от других элементов цепочки, и это плохо
return res.sendStatus(400);
}

// Логгируем ошибку
loggerSevrice.logError(err);
res.sendStatus(500);
});

Показать весь текст
Ответы28015

1016 16 янв, 13:15 1016 1327765

>>1327549

Ответ с нормальным форматированием кода: https://pastebin.com/FEY90cNY

1017 16 янв, 13:25 1017 1327770

>>1327565
>>1327618

В программировании используется инженерный подход: сравниваются разные варианты, их плюсы и минусы и выбирается выгоднейший. Как при проектировании моста или здания. Потому от программиста требуется понимание этих самых плюсов и минусов. Например, нет смысла проектировать архитектуру для скрипта на 200 строчек, который будет выполнен 1 раз. А для приложения на 100К строк, которое будет писать команда в течение нескольких лет - это необходимо.

>>1327754

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

Ленту новостей можно будет показать на собеседовании.

Ответы27809

1018 16 янв, 14:22 1018 1327809

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

36 Кб, 480x360
1019 16 янв, 14:58 1019 1327846

6
http://jsfiddle.net/4Ld60kht/ - думаю поля можно было через паддинг родителя, но я сделал так.
7
http://jsfiddle.net/avu90q3w/
8
http://jsfiddle.net/pvk2rf9a/ - не понял как тут применить отрицательный маргин и не уверен что * хорошо указывать
А так сделал эти задачи вроде.

Ответы2928931371

11 Кб, 648x170
1020 16 янв, 16:49 1020 1327963

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

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

Ответы279922799328012

1021 16 янв, 17:14 1021 1327992

>>1327963

Я вижу метод sendTextMessageAndShowMenu

Во-первых, можно написать просто sendMessage.Во-вторых, а почему у тебя одна функция делает две задачи? Если они независимы, их можно сделать 2 функциями. Если же связаны, то объединить в одну функцию с названием просто sendMessage.

Ответы28055

1022 16 янв, 17:16 1022 1327993

>>1327963

NOTES_SELECTED_CURRENT_MESSAGE_INDEX -> тут одно слово можно сократить, а при желании еще и INDEX убрать.

Ответы28056

1023 16 янв, 17:34 1023 1328012

>>1327963
Лол, я такое встречал в реальной жизни, когда люди с джавы вкатывались в веб. Личный опыт. У джавистов приняты многосложные именования свойств и методов. Но есть в этом плюс, легко понимать, что человек написал. Правда если приходится парсить глазами длинную простыню, то это затянется надолго. Да и джава медленная, хоть и простая.

Ответы28056

1024 16 янв, 17:36 1024 1328015

>>1327763
>Promise.all
Да, я видел и такой вариант обработки промисов. Но всё равно, как вы и сказали, с async/await код станет только лучше.

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

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
>10.4.5 404 Not Found
>The server has not found anything matching the Request-URI.

>Также, в твоем коде бросается в глаза "проглатывание" ошибок: при возникновении ошибки в цепи промисов она не логгируется, а просто отдается ответ с кодом 500.
Спасибо за это замечание. Об этом я как раз и забыл.

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

Ответы28051

1025 16 янв, 17:50 1025 1328030

>>1327739
Здоровья тебе, добрый человек

1026 16 янв, 18:00 1026 1328039

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

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

1. создать для каждой сущности отдельную базу с небольшим количеством таблиц, например, база "товары", таблицы "все товары", "товары в корзине", "товары в 'понравилось'" и т. д.
Получится несколько баз с несколькими таблицами. При большой нагруженности, скорее всего общение сервера с базами будет происходить быстрее.
2. создать одну единую базу магазина с большим количеством таблиц всех сущностей. База "магазин", таблицы "товары", "товары в корзине", ... "отзывы", "ответы на отзывы", ... и т. д.

Как лучше и почему?
Знаю, что у опенкарт, например, база устроена по второму принципу. Но что-то мне подсказывает, что первый вариант удобнее.

Ответы2805228059

1027 16 янв, 18:21 1027 1328051

>>1328015

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

4xx обозначает ошибку клиента. Неправильный id пользователя - это явно ошибка клиента.

Предлагаю посмотреть RFC7231 (чуть более новый, чем устаревший 2616, это упомянуто тут: https://www.w3.org/Protocols/rfc2616/rfc2616.html ):

Код 204: https://tools.ietf.org/html/rfc7231#section-6.3.5

> The 204 (No Content) status code indicates that the server has
> successfully fulfilled the request and that there is no additional
> content to send in the response payload body.

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

> For example, a 204 status code is commonly used with document editing
> interfaces corresponding to a "save" action, such that the document
> being saved remains available to the user for editing.

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

Код 404: https://tools.ietf.org/html/rfc7231#section-6.5.4

> The 404 (Not Found) status code indicates that the origin server did
> not find a current representation for the target resource or is not
> willing to disclose that one exists.

Можно заметить, что тут убрано упоминание URI. Думаю, в RFC2616 авторы имели в виду запрос вида /user/12345 и в ответ на него предполагали отдавать 404 если id неправильный. Но по моему, его вполне логично отдавать, даже если id пользователя передан не через URI.

И тут: https://tools.ietf.org/html/rfc7231#section-6.5

> The 4xx (Client Error) class of status code indicates that the client
> seems to have erred. Except when responding to a HEAD request, the
> server SHOULD send a representation containing an explanation of the
> error situation, and whether it is a temporary or permanent
> condition.

1027 16 янв, 18:21 1027 1328051

>>1328015

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

4xx обозначает ошибку клиента. Неправильный id пользователя - это явно ошибка клиента.

Предлагаю посмотреть RFC7231 (чуть более новый, чем устаревший 2616, это упомянуто тут: https://www.w3.org/Protocols/rfc2616/rfc2616.html ):

Код 204: https://tools.ietf.org/html/rfc7231#section-6.3.5

> The 204 (No Content) status code indicates that the server has
> successfully fulfilled the request and that there is no additional
> content to send in the response payload body.

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

> For example, a 204 status code is commonly used with document editing
> interfaces corresponding to a "save" action, such that the document
> being saved remains available to the user for editing.

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

Код 404: https://tools.ietf.org/html/rfc7231#section-6.5.4

> The 404 (Not Found) status code indicates that the origin server did
> not find a current representation for the target resource or is not
> willing to disclose that one exists.

Можно заметить, что тут убрано упоминание URI. Думаю, в RFC2616 авторы имели в виду запрос вида /user/12345 и в ответ на него предполагали отдавать 404 если id неправильный. Но по моему, его вполне логично отдавать, даже если id пользователя передан не через URI.

И тут: https://tools.ietf.org/html/rfc7231#section-6.5

> The 4xx (Client Error) class of status code indicates that the client
> seems to have erred. Except when responding to a HEAD request, the
> server SHOULD send a representation containing an explanation of the
> error situation, and whether it is a temporary or permanent
> condition.

Показать весь текст
Ответы28307

1028 16 янв, 18:23 1028 1328052

>>1328039

Не сталкивался с первым подходом. Есть такой принцип, как нормализация БД: https://github.com/codedokode/pasta/blob/master/db/normalization.md и он явно с ним не сочетается.

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

Ответы28085

1029 16 янв, 18:24 1029 1328055

>>1327992
>почему у тебя одна функция делает две задачи? Если они независимы, их можно сделать 2 функциями. Если же связаны, то объединить в одну функцию с названием просто sendMessage.
Есть и отдельный метод sendTextMessage(), без показа меню, который обычно и используется.

А зачем я сделал еще и sendTextMessageAndShowMenu(). Вот зачем.
Возвращаемое значение sendTextMessage() всегда используется как возвращаемое значение вышестоящего метода.
То есть, return sendTextMessage();

Есть метод showMenu(), он не возвращает нихуя.

То есть, если есть какое-то условие типа пикрила и мне надо еще и показать меню, то надо писать:
if (...) {
$result = sendTextMessage();
showMenu();
return $result;
}

Вместо того, чтобы написать:
if (...) {
return sendTextMessageAndShowMenu();
}

Это охуенно так упрощает понимание кода за счет снижения когнитивной нагрузки.

Можно было показ меню сделать опциональным аргументом.
Типа
sendTextMessage (string $msg, bool $isShowMenu = false);

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

Чет какой-то невротъебенный анализ тут привел, ну да ладно, а хуле поделать.

1029 16 янв, 18:24 1029 1328055

>>1327992
>почему у тебя одна функция делает две задачи? Если они независимы, их можно сделать 2 функциями. Если же связаны, то объединить в одну функцию с названием просто sendMessage.
Есть и отдельный метод sendTextMessage(), без показа меню, который обычно и используется.

А зачем я сделал еще и sendTextMessageAndShowMenu(). Вот зачем.
Возвращаемое значение sendTextMessage() всегда используется как возвращаемое значение вышестоящего метода.
То есть, return sendTextMessage();

Есть метод showMenu(), он не возвращает нихуя.

То есть, если есть какое-то условие типа пикрила и мне надо еще и показать меню, то надо писать:
if (...) {
$result = sendTextMessage();
showMenu();
return $result;
}

Вместо того, чтобы написать:
if (...) {
return sendTextMessageAndShowMenu();
}

Это охуенно так упрощает понимание кода за счет снижения когнитивной нагрузки.

Можно было показ меню сделать опциональным аргументом.
Типа
sendTextMessage (string $msg, bool $isShowMenu = false);

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

Чет какой-то невротъебенный анализ тут привел, ну да ладно, а хуле поделать.

Показать весь текст
Ответы31372

1030 16 янв, 18:26 1030 1328056

>>1327993
Ну можно подсократить немного, но один хуй в 2 раза короче мои идентификаторы от этого не станут.
>>1328012
Ты прав, такое говно после java началось у меня, теперь ооп головного мозга и любой код превращается в ебаную простыню.

Ответы281152821728222

1031 16 янв, 18:29 1031 1328059

>>1328039
Читай про шардинг, репликацию, и прочие способы разработки высоконагруженных БД.
Но в 99.99% приложений, с которыми ты когда-либо столкнешься, тебе это нахуй не понадобится.
А как понадобится - так изучишь.

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

Ответы28085

1032 16 янв, 18:50 1032 1328085

>>1328059
>>1328052
Ох, спасибо за ответы и ссылки.

1033 16 янв, 19:02 1033 1328089

>>1305368 (OP)
https://github.com/asdasdasdasddasasdasdas/StudentList
Op я переделал свой список. Чкни.

Ответы2851229271

1034 16 янв, 19:58 1034 1328115

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

Ответы28205

1035 16 янв, 21:37 1035 1328181

Паханы, на чем щас проще найти работу: на симфонии или ларавеле? Или может есть еще актуальнее фреймы?

1036 16 янв, 22:06 1036 1328205

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

Ответы2821328217

1037 16 янв, 22:11 1037 1328213

>>1328205
Ну так ты вспомни, для каких проектов джава, а для каких похапэ.

Ответы28241

1038 16 янв, 22:15 1038 1328217

>>1328205
>В яве я узнал, что такое настоящий объектно-ориентированный код

>>1328056
>Ты прав, такое говно после java началось у меня, теперь ооп головного мозга и любой код превращается в ебаную простыню.

Никакого ООП не существует. Были идеи, но их не поняли, и не реализовал на должном уровне. Никаких математических обоснований у ООП нет. Все что сейчас преподносится под видом ООП просто сектантство. Код ради кода. Полное отсутствие логики. Чем хуже тем лучше. Все это характеризует современное ООП.

Ответы28218

1039 16 янв, 22:19 1039 1328218

>>1328217
>Никаких математических обоснований у ООП нет
Ооп нужен для упрощения написания программ

Ответы28222

1040 16 янв, 22:26 1040 1328222

>>1328218
>Ооп нужен для упрощения написания программ

>>1328056
>у меня, теперь ооп головного мозга и любой код превращается в ебаную простыню

Типичный сектантский ответ без фактов. Большая часть кода в ООП стиле ничего не делает. Это просто тупой бойлерплейт. А если большая часть кода написана ради кода, а не для решения задачи, то какое может быть упрощение вообще?! Вопрос риторический.

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

Ответы28228

1041 16 янв, 22:29 1041 1328228

>>1328222
Но больше никак не выходит, если бы люди придумали что-то лучше — все бы это и использовали.
Вот и пишем абстрактные фабрики медиаторов фасадов синглтонов.

Ответы28235

1042 16 янв, 22:37 1042 1328235

>>1328228
>если бы люди придумали что-то лучше
Придумали еще в 30-е годы 20-го века, называется Лямбда-исчисление.

Ответы28249

1043 16 янв, 22:43 1043 1328241

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

Ответы28255

1044 16 янв, 23:06 1044 1328249

>>1328235
Чувак, ты тредом ошибся. В этом треде никто не программирует. Веб 21 века это:
1. натягивание готовых шаблонов на cms
2. редактирование этих шаблонов под себя
3. подключение js-библиотек
4. php-шный/js-сный копипаст во фреймворках.
5. готовые решения sql/nosql
И все это тянется из проекта в проект на автомате. Не на автомате даже, а на пулемете. Как макаки-копирайтеры хуярят килознаки текста, так и веб-"программисты" копипастят свои сниппеты.

Ответы2827628353

116 Кб, 800x575
1045 16 янв, 23:15 1045 1328255

>>1328241
>компилятор на пхп

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

Ответы28264282712829728354

1046 16 янв, 23:27 1046 1328264

>>1328255
Как там в 2005м?

1047 16 янв, 23:41 1047 1328269

https://web.archive.org/web/20000511213919/http://www.rockstargames.com:80/front.html
ОНИ МОГЛИ ДЕЛАТЬ ТАКОЕ В 2000 ГОДУ!?! АХУЕТЬ Я ДАУН!!!!

Ответы2827028352

1048 16 янв, 23:42 1048 1328270

>>1328269
Ааа ну да эпоха FP же была... Сук мода же делать все с помощью CSS&HTML&JS только сейчас началась.

1049 16 янв, 23:43 1049 1328271

>>1328255
Все уговорил иду учить РУБИ! Хотя пихуй Руби я бы и так изучил.

1050 16 янв, 23:48 1050 1328275

В чем разница между kernel и core?
Как вот вы лично считаете, не гугля?

Ответы28277

1051 16 янв, 23:48 1051 1328276

>>1328249
Но подожди можно же без копипаста делать все, использовать библиотеки и CMS без копирования, а как все это делают, даже опытные, подстраивают под себя зная что делает код. Просто если ты будешь свой фрейм писать на это уйдет время и если ты захочешь разработать свой, мало того, что ты потратишь ресурсы и время, так еще и потом будут говорить, что твоя копипаста нам не нужна. У тебя есть какие то другие варианты?
Про копирование и бесконечное использование стака если ты не учишься то это конечно же, позор. Но ведь не все идут под эту дудку, есть люди которые пишут и свои библиотеки и развиваются в другой манере, я не из них, ибо ничего не умею.

1052 16 янв, 23:48 1052 1328277

>>1328275
Kernel is a core.

1053 16 янв, 23:49 1053 1328278

Хочу стать миллиардером, с чего начать, аноны?

Ответы28280

1054 16 янв, 23:51 1054 1328280

>>1328278
С самопознания, найти себя и свое дело надо (Секрет: Заниматься хобби, например это тред PHP хоббитов).

Ответы28282

1055 16 янв, 23:53 1055 1328282

>>1328280
Благодарю! Я задал вопрос для разбавления атмосферы, но ты дал верный ответ. Всем добра.

1056 17 янв, 00:25 1056 1328297

>>1328255
И как всё это мешает написать компилятор на php?

Ответы28332

1057 17 янв, 01:03 1057 1328307

>>1328051
Спасибо! Это имеет больше смысла!

1058 17 янв, 03:04 1058 1328332

>>1328297
При помощи php можно распараллелить вычисления на каждое ядро процессора?

Ответы2835428355

1059 17 янв, 03:19 1059 1328334

Аноны если я свой проект по советам из шапки буду пилить вы код посмотрите, или надо строго файлообменник делать?

Ответы2834228397

1060 17 янв, 05:26 1060 1328342

>>1328334
Лучше файлообменник, ибо найдешь ответы на вопросы после процесса и поддержку быстрее получишь. Сначала сделай уже известное, а потом и проект посмотрим.

Ответы28441

1061 17 янв, 07:36 1061 1328352

>>1328269
Так это Flash.

Ответы28454

1062 17 янв, 07:41 1062 1328353

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

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

Ответы28363

1063 17 янв, 07:44 1063 1328354

>>1328332
>>1328255

PHP может создавать процессы ОС. Для работы с потоками есть библиотеки.

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

1064 17 янв, 07:45 1064 1328355

>>1328332
Многопоточность не равна параллелизму.

1065 17 янв, 08:12 1065 1328363

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

Ответы28387

1066 17 янв, 09:40 1066 1328387

>>1328363
Само собой нужен опыт. Но если не начать это делать, то откуда опыт возьмется?! В 95% случаев все говорят, что СИКП не нужен из-за того, что сейчас все занимаются только состыковкой готовых библиотек. Если они сами себе поставили ограничение заниматься только состыковкой готовых либ, то опыта написания либ у них никогда не появится.

1067 17 янв, 10:17 1067 1328397

>>1328334

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

Ответы28441

fv 1068 17 янв, 12:11 1068 1328441

>>1328342
>>1328397
Спасибо. Я когда то давно делал студентов, их даже проверили.
Вопрос, а почему в студентах DataMapper заменили на TableDataGateway. Я честно говоря, не совсем улавливаю разницу.

Ответы28751

1069 17 янв, 12:24 1069 1328454

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

1070 17 янв, 14:03 1070 1328512

>>1328089
bump

1071 17 янв, 14:58 1071 1328552

Вкачусь с важным для меня вопросом
Анонче, чем использование laravel принципиально отличается от нативной пыхи
Нужно сделать задание для компании,а я уже третий день ебусь со всякими композерами, хомстедами и прочим долбоеб щито поделать и даже не начинал писать, хотелось бы узнать заранее как отличается код и процесс написания

Ответы285632875929364

1072 17 янв, 15:04 1072 1328558

Хотел спросить тех, кто использовал MS SQL Server с PHP. Если мне нужно поквирить свою базу данных через PHP, который идёт с XAMPP, то мне нужно настроить конфигурацию самого PHP или SQL Server?

1073 17 янв, 15:16 1073 1328563

>>1328552
Погугли зачем вообще нужны фреймворки.
Вкратце:
1. Фреймворк задает тебе архитектуру приложения, у тебя гораздо меньше шансов написать откровенно хуевую архитектуру.
2. Фреймворк предоставляет тебе различные классы и библиотеки в добровольно-принудительном порядке, в итоге, опять же, у тебя меньше шансов использовать левые хуевые библиотеки для стандартных нужд.
3. Фреймворк знаешь не только ты, другим разработчиком написанное на фреймворке приложение гораздо ГОРАЗДО понятнее, чем самописный говнокод

Ответы2856728625

1074 17 янв, 15:21 1074 1328567

>>1328563
Спасибо, понял
В плане разницы с нативным кодом пыха/ларавел можно сравнить с жс/jQuery?
Я про то что по сути это заранее запиленные за тебя классы/функции и тд

Ответы28574

1075 17 янв, 15:24 1075 1328574

>>1328567
Скорее с реактом тогда.
Жс - просто набор хуйни, чтобы воротить хтмл-тегами.
Фреймворк это не какая-то сторонняя хуйня, которую ты используешь в своем приложении.

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

Ответы2857728603

1076 17 янв, 15:25 1076 1328577

>>1328574
>jquery - просто набор хуйни, чтобы воротить хтмл-тегами.

1077 17 янв, 15:41 1077 1328603

>>1328574
Грасиас, амиго

Ответы28696

Composer 1078 17 янв, 16:01 1078 1328618

Лень проверять. Ответьте.

Ставлю, через композер, например либу "a", которая зависит от либы "b" с версией 1.0.0, которую она очевидно подтягивает.

Но, также, необходимо поставить либу "b", но с версией 1.5.0.

Шо будет?

Ответы28744

1079 17 янв, 16:05 1079 1328625

>>1328563
>у тебя гораздо меньше шансов написать откровенно хуевую архитектуру
Талантливых говнокодеров ничто не останавливает. Видел не раз использование фреймворков только для роутинга, мб еще какой-нибудь мелочи, и все остальное самописный пиздец. Зато кейвордик в резюме.

1080 17 янв, 17:13 1080 1328696

>>1328603
Оооооой пор пафор

1081 17 янв, 17:58 1081 1328744

>>1328618

Нельзя поставить 2 разных версии одной библиотеки. Если удовлетворить твои требования и требования библиотеки a одной версией b нельзя, будет выдана ошибка с разъяснением причин.

Ответы28749

1082 17 янв, 18:05 1082 1328749

>>1328744
Хулеж они так криворуко сделали то

1083 17 янв, 18:07 1083 1328751

>>1328441

DataMapper - это по идее сложная система вроде Доктрины, которая мапит объекты на строки в БД. Там могут быть реализованы IdentityMap, UnitOfWork и прочие радости поклонников Фаулера. TableGateway - это просто класс, в котором собраны все операции с одной таблицей. Вообще, Gateway у Фаулера - это класс, который собирает в себе все действия с какой-то системой, например, внешней системой, БД и так далее и операции с этой системой нельзя делать в обход Gateway.

А так - можно использовать и другие паттерны, например, activeRecord.

1084 17 янв, 18:23 1084 1328759

>>1328552

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

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

Фреймворк - это каркас приложения, который избавляет от необходимости писать код, который есть в каждом приложении (роутинг, доступ к БД, валидация, шаблоны). Ты пишешь только то, что уникально для твоего приложения и экономишь время. Также, другим разработчикам проще разобраться в коде (проект на фреймворке с документацией понять проще, чем разбираться в полностью самописном коде без документации). Если ты сделал хотя бы 2-3 проекта, то наверняка прихоилось писать почти одинаковый код. Его и выносят во фреймворк.

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

Хотя мне лично больше нравятся библиотеки, как компоненты Симфони, из которых можно собрать свой фреймворк.

Хомстед (вирутальная машина с линуксом) наверно не обязателен, но под Windows придется настроить все нужные инструменты, и это потребует еще время.

Чтобы понять, как происходит процесс написания, открой любой туториал по созданию сайта на фреймворке и прочти: https://laravel.com/docs/5.1/quickstart#building-layouts-and-views (не понимаешь английский - нагугли перевод или статью на русском). Устанавливаешь фреймворк, выполняешь комнады, пишешь код.

Опять же, тут нужно время, чтобы разобраться.

Ответы28780

1085 17 янв, 19:01 1085 1328780

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

16 Кб, 517x529
1086 18 янв, 02:30 1086 1329066

Здарова, бандиты. Пишу свой фреймворк велосипед, хочу кое-что спросить.

В композиторского автозагрузчика есть json, в который я пишу что-то типа { "Huita1\\Huita2": "huita/huita1/huita2" }

В классе Huita.php пишу:

namespace Huita1\Huita2
Class Huita
{
public static function getHuita()
{
return 'huita';
}
{
}

Теперь, чтобы обратиться к этому классу из каких-нибудь ебеней, я пишу в другом файле ebenya.php:

Huita1\Huita2\Huita::getHuita();

А теперь сам вопрос: если перед каждым классом писать его пространство имен, то выходит очень, очень много кода. Как современные фреймворки решают этот вопрос?
Сохраняют неймспейс в константу и подставляют, куда нужно?

Ответы2906729095

1087 18 янв, 02:38 1087 1329067

>>1329066
>А теперь сам вопрос: если перед каждым классом писать его пространство имен, то выходит очень, очень много кода. Как современные фреймворки решают этот вопрос?
>Сохраняют неймспейс в константу и подставляют, куда нужно?
Не надо перед каждым классом писать полное имя. Достаточно импортировать его используя use.

В твоём случае это выглядело бы так:
Вначале ипортируешь пространство имён use Huita1/Huita2
А потом просто обращаешься к своему синглтону просто по имени Huita::getHuita() где надо.

Только загрузчик правильно напиши - по ПИЭСАР, или юзай композеровский.

Ответы29082

1088 18 янв, 03:33 1088 1329082

>>1329067
Ты вообще хуйню написал.
>Huita1/Huita2
Надо Huita1\Huita2
>Huita::getHuita()
Надо Huita2\Huita::getHuita()
Еле разобрался.

И нормальной практикой считается более одного use?
И еще, причем тут синглтон? Разве только в сингтоне может быть статический метод, лол?

Ответы2909729102

1089 18 янв, 05:09 1089 1329095

>>1329066

Пожалуйста прочитай сначала урок про неймспейсы, может быть, там есть ответ на вопрос: https://github.com/codedokode/pasta/blob/master/php/autoload.md

Конструкция use позволяет избежать длинных имен в коде.

Ответы29100

1090 18 янв, 05:13 1090 1329097

>>1329082

Нормальной практикой считается не писать use руками, а поручить это редактору или IDE. Я видел файлы, где было до 30-40 строчек use, да и ты можешь сам увидеть такие файлы в коде Symfony:

https://github.com/symfony/symfony/blob/5aa0967f9f0ab803ededefb040d48a0ebc7a27a6/src/Symfony/Bundle/FrameworkBundle/Controller/AbstractController.php

https://github.com/symfony/symfony/blob/7cc7c716acd27d2245fa3365547484ade7695052/src/Symfony/Bundle/SecurityBundle/SecurityBundle.php

Ответы29100

1091 18 янв, 05:14 1091 1329098

Перекат будет ориентировочно вечером в пятницу или субботу. Посидим еще немного тут.

1092 18 янв, 05:18 1092 1329100

>>1329095
>>1329097
Вот это помог. Ты офигенен, расписал все коротко и понятно. Прирожденный учитель.

1093 18 янв, 05:21 1093 1329102

>>1329082
>Ты вообще хуйню написал.
>Еле разобрался.
Ну извини.
Надо документацию читать, а не детские вопросы в треде задавать. Есть IDE и подсветка, а я в рот ебал пляску с этими долбанными палками во все стороны. Объявлять - в одну сторону, использовать - в другую, а ещё эта хуйня иногда экранирует. И винда с линуксом их по разному воспринимают.
Это не я хуйню написал, а они хуйню сделали.

Ответы29104

1094 18 янв, 05:32 1094 1329104

>>1329102
Тащемта, если ты не знаешь, как что-то написать вручную, то ты не про.

1095 18 янв, 13:18 1095 1329271

>>1328089
bump

1096 18 янв, 13:45 1096 1329289

>>1327846
ОП, чекни плиз, что-то я запутался в следующих заданиях.

1097 18 янв, 14:16 1097 1329318

>>1305368 (OP)
Ребята, изучать php еще актуально.
Можно ли вкатиться в ДС, не имея опыт работы?
Node или python сильно жмут?

1098 18 янв, 15:31 1098 1329364

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

33 Кб, 785x391
1099 18 янв, 17:45 1099 1329453

Что за ерунда с областью видимости? Почему переменная объявленная внутри второго цикла нормально работает в теле внешнего цикла?

Ответы295052950629507

1100 18 янв, 18:53 1100 1329505

>>1329453
>В большинстве случаев все переменные PHP имеют только одну область видимости. Эта единая область видимости охватывает также включаемые (include) и требуемые (require) файлы.

Ответы29565

1101 18 янв, 18:54 1101 1329506

>>1329453
Короче, локальная область видимости генерируется только при объяве функции внутри ее тела.
А в твоем случае область видимости одна.

1102 18 янв, 18:57 1102 1329507

>>1329453

Локальная переменная видна внутри всей функции с момента создания. Блоки вроде if/while не ограничивают ее видимость.

81 Кб, 902x723
1103 18 янв, 19:11 1103 1329516

Блин, аноны, почему не получается?

Ответы2953529536

1104 18 янв, 19:56 1104 1329535

>>1329516
Посмотри, что у тебя в переменной $page.

Ответы29593

1105 18 янв, 19:56 1105 1329536

>>1329516
http://localhost/ing.php?page=cmd.php

Ответы29593

1106 18 янв, 20:25 1106 1329565

>>1329505
Сука, вот какой сверхразум это придумал?
Что упарывал создатель php в этот момент?

Ответы29625

1107 18 янв, 20:52 1107 1329593

>>1329535
>>1329536
Там оказывается редактор был ебанутый, который не сохранял изменения. Открыл через другой и получилось.

Ответы29595

92 Кб, 825x700
1108 18 янв, 20:53 1108 1329595

>>1329593

1109 18 янв, 21:26 1109 1329625

>>1329565
Для разделения есть неймспейсы. Include и require ныне напрямую почти не используют.

1110 18 янв, 22:45 1110 1329683

не понимаю как мне передать гет параметр через ссылку.
есть ссылка типа <a href="add2basket.php/?id=<?= $item['id']?>"> В корзину</a> где$item['id'] это номер товара, но на странице куда должно передаваться нихуя не передается, как правильно то?

Ответы29689

1111 18 янв, 22:50 1111 1329689

>>1329683
сорян братья, заработало, почему то как только напишу в тред все сразу сам решаю, чудеса

Ответы299422994829955

1112 19 янв, 05:01 1112 1329861

1-126

>>1306284

> Может, хотя бы, получиться поддерживать старые браузеры. Нужно проводить тесты.

Для старых браузеров (если хочется поизвращаться) есть такие возможности хранения данных:

- document.cookie (ограничение порядка 2-4 Кб, только текст). Минус - куки будут отправляться на сервер при каждом запросе, что не очень безопасно. Также, пользователь может их очистить. Плюс - работает вообще везде, включая IE6 или Firefox 1.
- flash shared object - можно через флеш-приложение хранить данные в хранилище флеша. Доки по флешу (еле нашел такую древность) https://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7d80.html . Минус - нужен Adobe Flash. Но в старом браузере он скорее всего есть. Готовая JS библиотека для взаимодействия: https://github.com/nfriedly/Javascript-Flash-Cookies

Библиотека, которая поддерживает хранилища, о которых я даже не слышал (вроде userdata behaviour для IE 5.5+)

Еще статья по теме: https://developer.mozilla.org/ru/docs/Web/Guide/API/DOM/Storage

> Поэтому для express'а нет никакого смысла ставить обработчик на каждый роут. Как можно заметить роут для '/' и для '/somewhere' имеет абсолютно идентичный код. Так может для рендеринга просто поставить обработчик с регулярным выражением для всех роутов '/.*', а сверху перезаписать отдельные для POST (если такие потребуются) и для API?

Это схема, когда при HTTP-запросе сервер express рендерит HTML-страницу, отдает, и дальше клиент (если включен яваскрипт) на реакте инициализируется и прикрепляется к этой странице? Тогда да, можно поставить роут на звездочку. Только надо проверить, что он будет корректно отдавать код 404 для несуществующих страниц.

1113 19 янв, 05:02 1113 1329862

>>1306399

> Дизассемблированный код пихается в блок div у которого overflow-y: scroll
> Каждая строчка это div в котором ещё 5 дивов. Адрес, мнемоника и аргументы

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

> Это я нашёл. Но как вычислять чему этот scrollTop равен к примеру для 4 строчке.

Если высота одной строки известна, и нет переносов строк, то это не сложно.

> Главная функция эмулятора дёргается каждые 16мс. Если с таким интервалом менть css свойства браузер нормально будет отрабатывать?

Надо тестировать, но думаю, что не очень. Это будет отнимать больше времени, чем сама эмуляция. Перерисовка DOM - это ведь сложный процесс, там много тонкостей и сложностей. Тут можно было бы использовать канвас и самому вычислять, что надо перерисовать, но еще лучше будет снизить частоту обновления. Какой смысл обновлять код с такой скоростью, если человек не способен его читать? Я бы вообще отключил обновление кода во время выполнения.

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

Также, если ты пишешь на JS, обрати внимание на WebAssembly. Это позволяет писать програмы на ассемблере (естественно, не руками, а используя высокоуровневый язык и компилятор). Это позволит достичь максимально возможной скорости эмуляции, быстрее чем JS.

1114 19 янв, 05:06 1114 1329863

>>1307134

Вот тут описан довольно простой способ сделать REST API на Yii, не подойдет? http://developer.uz/blog/restful-api-in-yii2/

>>1307386

Неплохо, но выражение $creditItogo*$percent+$commision повторяется аж 3 раза, а можно без повторений сделать?

> $openSchetHomo=0;
> $percentHomo=1.04;
> $commisionHomo=500;

> $HomoCredit=calcIpadPrice($depositt,$paymentt,$percentHomo,$commisionHomo,$openSchetHomo);

Тут можно было не создавать переменные, а писать ... = calcIpadPrice($deposit, $payment, 1.04, 500, 0);

>>1307732

MariaDb - это форк (ответвление) от MySQL, на 99% там все одинаково. Чем отличается, написано в Гугле: https://mariadb.com/kb/ru/mariadb-vs-mysql-features/

1115 19 янв, 05:41 1115 1329870

ПЕРЕКАТ
>>1305368 (OP)
ПЕРЕКАТ
>>1305368 (OP)
ПЕРЕКАТ
>>1305368 (OP)
ПЕРЕКАТ
>>1305368 (OP)
ПЕРЕКАТ
>>1305368 (OP)
ПЕРЕКАТ
>>1305368 (OP)

Ответы29946

1116 19 янв, 06:57 1116 1329885

Где можно посмотреть, сколько занимает памяти тот или иной скрипт в рантайме и как быстро он отрабатывает?

Ответы31372

1117 19 янв, 10:10 1117 1329928

Аноны, есть что-то типа CRM системы для владельцев магазов.
Туда барыжки загружают прайс листы, номенкалатуры,категори товаров, приходят чеки с онлаин касс и т.д
Нужно реализовать функционал СКИДОК на товар/категорию товаров/все товары. Но загвоздка вот в чем: СКИДКА ДОЛЖНА БЫТЬ ВРЕМЕННАЯ. Барыжка заходит в crm-> выбирает категорию пивко-> ставит скидку 5%-> Время валидности скидки 48 часов.
Цены хранятся в MySQL. Сделать доп. колонку time_sail и чекать каждый раз валидна ли скидка? Может есть более гибкое решение?

Ответы2993531372

1118 19 янв, 10:29 1118 1329935

>>1329928
Сделай через куки со сроком годности 48 часов.

Ответы29954

1119 19 янв, 10:48 1119 1329942

>>1329689
Для этого тред и создан

1120 19 янв, 10:58 1120 1329946

>>1329870
Рекурсивно

1121 19 янв, 11:06 1121 1329948

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

Ответы2995529969

1122 19 янв, 11:32 1122 1329954

>>1329935
Очень плохое решение.

1123 19 янв, 11:33 1123 1329955

>>1329948
>>1329689
Эффект резиновой утки
https://ru.m.wikipedia.org/wiki/Метод_утёнка?wprov=sfla1

Ответы30183

1124 19 янв, 11:54 1124 1329959

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

1125 19 янв, 12:25 1125 1329969

>>1329948
>и вдумчиво перечитаю свой вопрос
Я могу ебланиться несколько часов, а потом решусь где-то спросить. Начинаю писать вопрос и пока его составляю - обнаруживаю ошибку

1126 19 янв, 13:37 1126 1330014

7.3 на прод кто-то уже обновлял?

Ответы3002630125

1127 19 янв, 13:50 1127 1330026

>>1330014
Проекты, написанные до официального релиза 7.0 пока не решаются переходить на версии выше в силу сам понимаешь каких причин. Обратная совместимость и банальная лень - работает, и заебись. Поэтому 5.6 до сих пор обновляют и поддерживают.
Ну а если ты аццкий прогер на пхп, то юзай ту версию, какую хочешь. Большинству людей хватит 7.0. Если ты уже матерый прогмик, которому скучно писать на одной и той же версии каждый проект, то обновляйся, хули.

Ответы3003230051

1128 19 янв, 13:57 1128 1330032

>>1330026
>пока не решаются переходить на версии выше в силу сам понимаешь каких причин. Обратная совместимость и банальная лень - работает, и заебись. Поэтому 5.6 до сих пор обновляют и поддерживают.
>Ну а если ты аццкий прогер на пхп, то юзай ту версию, какую хочешь. Большинству людей хватит 7.0. Если ты уже матерый прогмик, которому скучно писать на одной и той же версии каждый проект, то обновляйся, хули.

я не про это немного, а про фактическое обновление кем-либо из анонов. у нас на главноем проекте 7.1 и обновлять его на даже 7.2 никто просто так не даст.

я к тому что аноны писали, что 7.3 сегфолтится, интересуюсь поправили ли это. ну и захотелось попасть в прон-тред

Ответы30057

1129 19 янв, 14:10 1129 1330051

>>1330026
>Поэтому 5.6 до сих пор обновляют и поддерживают
и кстати я тебя разочарую, бро
https://secure.php.net/supported-versions.php
5.6 уже два года не обновляют и с январая даже секьюрити апдейты не пилят. но ты не переживай, пхп-тред и создан для того, чтобы учиться новому

Ответы30073

1130 19 янв, 14:19 1130 1330057

>>1330032
>проекте 7.1 и обновлять его на даже 7.2 никто просто так не даст
Почему? Он же стейбл. Я на следующей неделе буду древний кусок говна с 5.6 на 7.2 сразу переводить.

Ответы3007530154

1131 19 янв, 14:36 1131 1330073

>>1330051
Не понял, а почему тогда я частенько вижу, когда захожу на php.net, наверху страницы, PHP 5.6.* Released!

Ответы30154

1132 19 янв, 14:38 1132 1330075

>>1330057
К слову, если я пишу проект на пых-пых 7.0, а на серваке будет 7.3, код ведь будет работать?

Ответы30076

1133 19 янв, 14:42 1133 1330076

>>1330075
Без понятия, 7.3 еще не пробовал. 7.2 у меня везде работал нормально, где был 7.0, но тоже не факт, что мне просто не повезло.

1134 19 янв, 15:34 1134 1330108

Антошки, форма не передает данные в бд (сначала обрадовался, что получилось отправить половину данных (имя, ошибка была в отсутствии скобочек между условиями isset).

https://pastebin.com/xVatJU99 - форма и код.

Как исправить ошибку (или безграмотность, или и то, и другое)?

Ответы30146

1135 19 янв, 16:15 1135 1330125

>>1330014
Пока нет, но собираюсь.
А так, юзаю 7.2 из-за pthreads.

Ответы30154

1136 19 янв, 16:49 1136 1330146

>>1330108
У вас поебень в инсерте.
>`test` `user`
Что эта?

Ответы30149

1137 19 янв, 16:52 1137 1330149

>>1330146
первое - выбор базы данных.
второе - выбор таблицы в базе данных.

Ответы30160

1138 19 янв, 16:58 1138 1330154

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

>>1330073
с 1 января больше не увидишь

>>1330125
а какие задачи решаешь с прмощью pthreads?

Ответы3015930472

1139 19 янв, 17:02 1139 1330159

>>1330154
>зависит от количества кода и возраста проекта
Ну, там проект 5+ лет на херовой технологии. Посмотрим, что получится. Если что отпишусь.

1140 19 янв, 17:06 1140 1330160

>>1330149
А точкой их разделять кто будет?

Ответы3017230173

1141 19 янв, 17:25 1141 1330172

>>1330160
Точнее, соединять.

1142 19 янв, 17:26 1142 1330173

>>1330160
поставил, 0 эмоций.
INSERT INTO `test` . `user`(user_name, e_mail) VALUES ($name, $email);
В sql запрос проходит, только вместо переменных строчные данные, заключенные в кавычки ' ' .
С переменными кавычки не прокатывают.

Ответы301743017931372

1143 19 янв, 17:29 1143 1330174

>>1330173
Теперь убери пробелы между всем этим хозяйством.

Ответы30185

1144 19 янв, 17:32 1144 1330179

>>1330173
Алсо вот атрибуты слились:
<p>Name: <input name="user_name"type="text"> </p>

1145 19 янв, 17:33 1145 1330181

Нубовопрос:
Зачем мне создавать объекты если я всегда могу обращаться к ним статически?

Ответы30182304183042531373

1146 19 янв, 17:34 1146 1330182

>>1330181
К классам, в смысле

1147 19 янв, 17:37 1147 1330183

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

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

160 Кб, 1280x800
1148 19 янв, 17:39 1148 1330185

>>1330174
пробелы убрал, атрибуты разделил.
Результат такой же.

Ответы30186301943019530205

1149 19 янв, 17:45 1149 1330186

>>1330185
Проверь корректность настроек БД. Например, точно ли у тебя адрес БД test?

Ответы30212

1150 19 янв, 17:56 1150 1330194

>>1330185
А зачем пробелы убирать? Это типа как в питоне работает?

1151 19 янв, 17:59 1151 1330195

>>1330185
Ты не правильно расположил аргументы в mysqli, лол.
Cначала идет хост, потом юзер с паролем, потом только база в конце.

Ответы3020030212

1152 19 янв, 18:06 1152 1330200

>>1330195
Алсо, если у тебя в $user записано 'test', то и обращайся к тесту.
Или блять подставляй переменную вместо юзера.

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

Ответы30212

1153 19 янв, 18:10 1153 1330205

>>1330185
Это у тебя стоит убунта?

Ответы30212

1154 19 янв, 18:14 1154 1330212

191 Кб, 1280x800164 Кб, 1280x800

>>1330186
да, адрес бд test (пик 1)
>>1330195
исправил, нет эффекта (пик2)
>>1330200
где обращаться к тесту, если это бд?
>>1330205
да, убунта

Ответы302223048231373

1155 19 янв, 18:18 1155 1330218

Пока тред не перекотился ответьте на вопрос.
На яркую жизнь php программистам хватает?

Ответы3022430237

1156 19 янв, 18:20 1156 1330222

>>1330212

if (mysqli_connect_errno()) {
echo 'Что-то пошло не так... ' . 'Ошибка ' . mysqli_connect_errno() .
'. ' . mysqli_connect_error();
exit();
}

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

Ответы30229

1157 19 янв, 18:21 1157 1330224

>>1330218
Иди нахуй отсюда, сука.

1158 19 янв, 18:23 1158 1330229

>>1330222
\t только удали.

Ответы30234

155 Кб, 1280x800
1159 19 янв, 18:28 1159 1330234

>>1330229
вставил, не выдает ошибку.

Ответы3024430246

1160 19 янв, 18:29 1160 1330237

>>1330218
Вполне. Если ты не обезьянка, то на хорошую зп тебя с руками отрывают.

1161 19 янв, 18:38 1161 1330244

>>1330234
Значит, подключился. У тебя неправильно сформировать SQL.
Надо так:
Insert into user (user_name, e_mail) values ($name, $email)
И точку с запятой убери после запроса перед закрывающей кавычкой, ее там не должно быть.

Ответы30256

1162 19 янв, 18:40 1162 1330246

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

Ответы30256

154 Кб, 1280x800
1163 19 янв, 18:47 1163 1330256

>>1330246 >>1330244

исправил не работает.

Ответы30265

1164 19 янв, 18:56 1164 1330265

>>1330256
Напиши значение VALUES руками.

Ответы3026630268

1165 19 янв, 18:58 1165 1330266

>>1330265
работает

Ответы30272

1166 19 янв, 18:59 1166 1330268

>>1330265
в чем может быть подстава с переменными?

Ответы30272

1167 19 янв, 19:04 1167 1330272

>>1330266
>>1330268
Да, собственно, проблема и не в них. Ты неверно обрабатываешь форму. Вот у тебя данные из поста и не подсасываются.

Ответы3027930303

1168 19 янв, 19:11 1168 1330279

>>1330272
бля, зашел на стак и увидел такую конструкцию в запросе при желании вставить переменную.
Оказалась рабочей, лол.

VALUES (' ".$name." ', ' ".$email." ')

Ответы30304

1169 19 янв, 19:48 1169 1330303

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

Ответы30304

1170 19 янв, 19:49 1170 1330304

>>1330303
>>1330279

1171 19 янв, 20:04 1171 1330310

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

Ответы30324

1172 19 янв, 20:21 1172 1330324

>>1330310
Разбирать чужие ошибки сложнее чем просто самому учиться.

Ответы30355

1173 19 янв, 20:45 1173 1330355

>>1330324
Когда у тебя самого возникают проблемы с кодом, не работает одно выражение, и ты сидишь и думаешь над ней 4-5 часов, то потом решение само появляется. И ты уже автоматически видишь эти косяки у других.

Ответы30553

1174 19 янв, 21:49 1174 1330418

>>1330181
бамп вопросу

Ответы3042231373

1175 19 янв, 21:52 1175 1330422

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

Ответы30427

1176 19 янв, 21:57 1176 1330425

>>1330181
Ой, забыл тебе ответить.
Лично я все системные функции в своей стандартной библиотеке делаю статическими. То есть все, что должно что-то принять, обработать и вернуть я всегда делаю статическим.
А вот если нужно сделать много экземпляров чего-то, к примеру, много постов, товаров, категорий сделать, которые в свою очередь наследуются от абстрактов и интерфейсов, то тут объекты лучше использовать.
Конечно, можно полностью весь сайт сделать со статическим кодом на счетчиках, но это уже не ООП подход, а что-то из разряда лямбда-исчислений, которые постепенно вытесняют ООП. Но это всего лишь мои философствования. В любом случае, каждый пишет так, как он хочет.

Ответы3042630527

1177 19 янв, 22:03 1177 1330426

>>1330425
>из разряда лямбда-исчислений, которые постепенно вытесняют ООП
Много ты коммерческого софта на том же Хаскеле видел? А теперь с одним лишь пхп сравни масштабы. Обычная хипстерская болтовня короче.

Ответы30428

1178 19 янв, 22:03 1178 1330427

>>1330422
Хуево ты ООП выучил. Памятник это абстрактный класс, методы которого нельзя вызывать динамически. И экземпляр которого создать тоже нельзя. Статический класс (это класс, в котором нет ни одного не статического метода и свойства) в пыхе можно заэкземплярить и вызывать его методы динамически.
Кстати, очень хуевая реализация ООП в пыхе уже не раз критиковалась многими людьми, писали письма с просьбами исправить эту хуйню, но пока они только попивают коктейли на очередных конференциях.
То есть статический класс в пыхе это нихуя не памятник, он может сохранять в своих свойствах значения. Это его и отличает от обычного класса со своими объектами.

Ответы3043030432

1179 19 янв, 22:05 1179 1330428

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

Ответы30433

1180 19 янв, 22:08 1180 1330430

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

Ответы30435

1181 19 янв, 22:09 1181 1330432

>>1330427
>Памятник это абстрактный класс
Абстрактный класс - проект памятника. За щекой проверь.

Ответы30435

1182 19 янв, 22:10 1182 1330433

>>1330428
Список коммерческого софта в студию. Пока что я вижу, что одни фанатики с этой хуйнёй носятся, а выхлоп околонулевой.

Ответы30435

1183 19 янв, 22:18 1183 1330435

>>1330430
Мутный только для тебя, макакушка.

>>1330432
Проект памятника - интерфейс. За щекой у твоей мамки проверю.

>>1330433
Сам ищи, если надо.

Ответы3043830439

1184 19 янв, 22:23 1184 1330438

>>1330435
Типичный токсичный кукаретик. Пришёл и обосрался.

Ответы30441

1185 19 янв, 22:25 1185 1330439

>>1330435
>Сам ищи, если надо
Так значит это всё в твоей больной голове, дружок.

Ответы30441

1186 19 янв, 22:26 1186 1330441

>>1330439
>>1330438
Идите нахуй оба из этого треда.

Ответы30442

1187 19 янв, 22:28 1187 1330442

>>1330441
Или что?

Ответы30456

1188 19 янв, 22:55 1188 1330456

>>1330442
Ну или оставайтесь. Сами же знаете правила.

1189 19 янв, 23:17 1189 1330472

>>1330154
>а какие задачи решаешь с прмощью pthreads?
Многопоточный постинг в несколько соц-сетей с нескольких аккаунтов

1190 19 янв, 23:24 1190 1330482

>>1330212
>да, убунта
Значки какие-то другие. Накатывал тему?

1191 20 янв, 00:57 1191 1330527

>>1330425
Честно говоря, не совсем тебя понял.

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

Ответы3053030917

1192 20 янв, 01:31 1192 1330530

>>1330527
А, и еще пару вопросов сразу, скажите плз где взять норм инфу по паттернам. А то я тока MVC освоил, а остальное не понимаю как применить в своем коде, но задачу себе поставил не по уровню и знаний временами явно не хватает. И когда можно на работу подаваться, а то заебался в магазине батрачить? Хочется сменить сферу

Ответы306683091731374

1193 20 янв, 02:05 1193 1330536

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

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

1194 20 янв, 02:08 1194 1330537

>>1321483
>Ты не напишешь ни одного более-менее толкового приложения меньше 1к строк. С нуля в смысле - без васянских либ. Но для школоскриптиков в 100 строчек это и правда - нахуй не надо. Тут ты прав.
Толковое приложение - это инстаграм или вакаба? Какая мне нахуй разница, сколько в проекте строк и как оно запускается, если оно быстро работает, не падает и делает свою работу? Я же не хайлоад пишу в 100500 рпс (как остальные в этом треде).

Ответы3054230623

1195 20 янв, 02:16 1195 1330538

>>1321698
Я так понимаю, ты ОП этих тредов.
Спасибо за твой титанический труд, ты охуенен.

>Видимо ты не понял идею разбиения кода на функции. Суть в том, что длинный кусок кода, который делает несколько вещей, сложно понять. Его сложно править, в нем много переменных, и можно нечаянно что-то сломать. Ну и физически прочитать 1000 или 10 000 строк кода быстро невозможно. Поэтому код разбивают на отдельные действия и выносят эти действия в функции. Так, что мы можем вместо огромной портянки кода читать только небольшую функцию, которая нас интересует.

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

Я ПОНИМАЮ, что ты работаешь в команде, очевидно, где все погромисты должны читать код друг друга и тд, но я ведь один! Зачем мне самому устраивать в своей инфраструктуре хаос?

>То есть ты должен в идеале каждую функцию так описать.
Зачем мне ее описывать, если никто ее не увидит? Хороший тон?

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

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

Ответы3062331374

1196 20 янв, 02:23 1196 1330539

>>1321699
>Не хочешь исследовать причины проблемы и исправить её?
Разумеется не хочу. Что npm, что composer - лютый пиздец. Сначала мы создаем проблему, а затем героически ее решаем костылями (безуспешно).
>Или, может, кто-то из анонов хочет помочь улучшить композер?
Сначала написал: "Убить разработчика?", но потом подумал, что и правда было бы интересно потрейсить, что там жрет 1гб озу. Попробую разобраться на днях, если не протрезвею.
Но смотри, куча народа со мной согласна https://github.com/composer/composer/issues/1898 (что характерно, они пишут про Это в 2013 году, а я в 2019, и ничего не изменилось! За 5, сука, лет).
>Yep, same here - have to increase memory limit to 1G. And indeed it eats up to 980M.
Гигабайт! Что оно делает с ним, грузит все в память одним куском, все скачанные пакеты?
>Для начала, ты бы мог дать пример composer.json и написать, что сделать, чтобы отъесть столько памяти.
https://gitlab.com/edgyemma/Postmill

inb4: написал composer update и ничего не жрет!

Ответы3054031374

1197 20 янв, 02:25 1197 1330540

>>1330539
и не хочу портить ОП-у тред, но как ты объяснишь это?
https://stackoverflow.com/questions/33299302/composer-update-failed-out-of-memory

1198 20 янв, 02:53 1198 1330542

>>1330537
> Какая мне нахуй разница, сколько в проекте строк и как оно запускается, если оно быстро работает
Хочу объяснить этот момент.
Все люди, кто рассказывал мне про правильный код, синтаксис и хуё-моё - были максимум разработчиками сайтов визиток или кривых магазинов где даже 1 rps нет, зато у них композер, грунт, докер и красивое форматирование.

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

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

ОПу респект, материалы хорошо написаны и читать интересно.

Ответы31375

1199 20 янв, 04:53 1199 1330553

>>1330355
Или наоборот, когда ты уже решил для кого то проблему и она для тебя никогда не возникнет в будущем.

1200 20 янв, 10:04 1200 1330623

>>1330537
>Какая мне нахуй разница, сколько в проекте строк и как оно запускается, если оно быстро работает, не падает и делает свою работу?
Это заказчику похуй, а не разработчику - это твоё дело. Тебе похуй пока ничего более-менее большого не писал, да и разрабатывать удобно - работаешь с отдельным модулем, а не всю простыню правишь в пяти разных местах а потом всё падает потому, что ещё в трёх пропустил и надо искать полдня дырку в логике, в файле на 1.5к строк. П - продуктивность..

>>1330538
>хуй потом разберешь что и где
>устраивать в своей инфраструктуре хаос
У тебя уровень проганья низковат для правильной оценки рекомендация PSR. Как начнёшь писать, как все нормальные кодеры пишут, так оценишь. Я тоже не сразу въехал во всё это, а теперь только так и делают. + ты начинаешь понимать что пишут другие, и другие тебя понимают. Но это уже промышленные стандарты.

1201 20 янв, 11:12 1201 1330663

Анончики, милые помогите, не запускается apache24 с php72, как можно понять почему он не хочет работать с LoadModule php7_module libexec/apache24/libphp7.so
И как понял что конкретно в php.ini ему не нравится
Выглядит это так (и с версией 56 стартует):

service apache24 start
Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.

kernel: pid 1902 (httpd), uid 0: exited on signal 11 (core dumped)

apachectl configtest
Performing sanity check on apache24 configuration:
Syntax OK

php -v
PHP 7.2.14 (cli) (built: Jan 15 2019 01:14:39) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.14, Copyright (c) 1999-2018, by Zend Technologies

ls -la /usr/local/libexec/apache24/
total 8524
drwxr-xr-x 2 www www 4608 Jan 20 00:16 .
drwxr-xr-x 10 root wheel 1024 Jan 20 00:36 ..
-rwxr-xr-x 1 www www 15727 Jan 19 21:13 httpd.exp
-rwxr-xr-x 1 www www 4976672 Jan 15 04:15 libphp7.so

1201 20 янв, 11:12 1201 1330663

Анончики, милые помогите, не запускается apache24 с php72, как можно понять почему он не хочет работать с LoadModule php7_module libexec/apache24/libphp7.so
И как понял что конкретно в php.ini ему не нравится
Выглядит это так (и с версией 56 стартует):

service apache24 start
Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.

kernel: pid 1902 (httpd), uid 0: exited on signal 11 (core dumped)

apachectl configtest
Performing sanity check on apache24 configuration:
Syntax OK

php -v
PHP 7.2.14 (cli) (built: Jan 15 2019 01:14:39) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.14, Copyright (c) 1999-2018, by Zend Technologies

ls -la /usr/local/libexec/apache24/
total 8524
drwxr-xr-x 2 www www 4608 Jan 20 00:16 .
drwxr-xr-x 10 root wheel 1024 Jan 20 00:36 ..
-rwxr-xr-x 1 www www 15727 Jan 19 21:13 httpd.exp
-rwxr-xr-x 1 www www 4976672 Jan 15 04:15 libphp7.so

Показать весь текст
Ответы3069631375

1202 20 янв, 11:22 1202 1330668

>>1330530
По книжкам MVC осваивал? Посоветуешь что-нибудь интересное?

Ответы31357

1203 20 янв, 11:52 1203 1330696

>>1330663

удалил расширения из /usr/local/etc/php
заработало, глючное расширение пока не нашёл, но думаю, что победил проблему

Ответы30726

1204 20 янв, 12:38 1204 1330726

>>1330696
>удалил расширения
и действительно, зачем апачу кококонфиг, если можно ВЗЯТЬ И УДАЛИТЬ

1205 20 янв, 16:31 1205 1330877

Дошёл до игры в кубики. Добавил туда три условия на случай, когда сумма очков меньше, больше или равна.

Работает всё, но меня смущает одно.

Смотрите.

echo "У анона выпало {$anonDice1} и {$anonDice2}\nУ компьютера {$compDice1} и {$compDice2}\n";

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

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

Ответы3089631375

1206 20 янв, 17:17 1206 1330895

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

Ответы30905

1207 20 янв, 17:20 1207 1330896

>>1330877
>Зачем здесь нужны скобки у переменных? Если их убрать, то ничего не меняется.
Так не должно работать. У тебя какая версия пхп?

Ответы30900

1208 20 янв, 17:27 1208 1330900

>>1330896
А, отбой вопроса, я спутал с другим языком. Просто ОП считает, что ставить вокруг переменной это правило хорошего тона.
Потому что если тебе нужно будет написать вот так:
"Хуй$pizdaджигурда ", то такая конструкция не отработает, потому что интерпретатор поймет, что есть некая переменная $pizdaджигурда, которой на самом деле нет.

1209 20 янв, 17:33 1209 1330905

>>1330895
Просто многие решения, особенно в e-commerce, растут еще из очень темных времен уровня php 4, а может и раньше. По инерции это легаси до сих пор существует, т.к. все еще остается рабочим. Есть подвижки к развитию, но это не слишком быстро движется. Ну а что-то новое нормальный разраб не станет делать по лет на 10 устаревшим подходам.

1210 20 янв, 17:57 1210 1330917

>>1330530
>>1330527
бамп вопросам

Ответы30959

1211 20 янв, 18:08 1211 1330923

Нужен ли фреймворк, если не собираешься использовать БД?

Ответы30976

1212 20 янв, 18:53 1212 1330959

>>1330917
Ты про синглтоны и прочую ахинею?

Ответы30986

1213 20 янв, 19:14 1213 1330976

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

Ответы30979

1214 20 янв, 19:15 1214 1330979

>>1330976
Я писал без них и с ними чуток для своих супер мелких проектов. Но на вопрос ответь плиз.

Ответы31318

1215 20 янв, 19:25 1215 1330986

>>1330959
Да

Ответы31318

1216 21 янв, 00:29 1216 1331318

>>1330986
Книги из шапки читал? Если нет - почитай.

>>1330979
Удобная связка с бд это всего лишь одна из фич фреймворков. Хочешь - юзай, не хочешь - не юзай.

Ответы31359

1217 21 янв, 01:05 1217 1331325

Ни у кого случайно PHP: Объекты, шаблоны, методики программирования 5 издание не завалялось? Нашел только на инглише.

1218 21 янв, 01:56 1218 1331333

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

Шло время начали придумываться варианты для адаптивной верстки, так как разрешение экранов начало расти от 1024 до 1920 и все понимали, что прописывать маржины для каждого разрешения это не вариант и появился флоат, который дал возможность адаптивно верстать немного закрывая глаза на разрешение. И если ты входил в режим флоат, то добавляли в конце всех блоков ещё 1 с пустым содержанием, но с clear : both. Т.е. обнуление флоата. Затем прошло еще время. Страницы начали расти в объемах и кол-во этих пустых блоков тоже стало расти. И решили что можно сделать класс с ::after, который позволит избежать постоянного создания блока. И стали писать content : "." и там же следующей строчкой делать её невидимой. Ну и уже еще через какое-то время все пришло к пустой строке.

Ответы31375

1219 21 янв, 04:09 1219 1331357

>>1330668
видосы зинченко. За два часа отлично поясняет как работает паттерн. Мозги на место становятся (при наличии оных). Лично я начал писать что то реально стоящее только после его объяснения.

1220 21 янв, 04:12 1220 1331359

>>1331318
Попробую, спасибо. А еще что то посоветуете? Кроме шапки? В свое время лучшим толчком мне были первые два видео зинченко и задачи из шапки. Причем это работало так, что основы я узнал из примерно половины текста шапки, после чего мне это все стало казаться ве глупым, и двух видео зинченко, после которых, опять же, мне все начало пахнуть говном. Просто подчерпнул свое и пиздец

1221 21 янв, 05:41 1221 1331368

>>1308417

> На вашем счету семьдесят миллионов_____восемь (70000008) рублей

Что-то пробелов дофига. Надо пропускать такие части числа, если они равны нулю.

> function getWordForm ($threeDigit, $selectName)
Можно было просто передавать сюда все формы слова и получилась бы универсальная функция, которая может выбирать любое слово. А то с номером получается, что это не отдельная функция, а продолжение функции spellNumber, в которой есть счетчик от 0 до 3.

Плюс, у тебюя слишком большая вложенность if. Вместо этого:

if (условие) {
много кода
} else {
return ...;
}

Лучше писать

if(!условие) {
return ...
}

много кода...

В остальном, сделано неплохо.

По калькулятору: сделано верно.

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

Нет, надо делать через if/elseif.

>>1319485

> if($arrayRand == $arrayRand)

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

1221 21 янв, 05:41 1221 1331368

>>1308417

> На вашем счету семьдесят миллионов_____восемь (70000008) рублей

Что-то пробелов дофига. Надо пропускать такие части числа, если они равны нулю.

> function getWordForm ($threeDigit, $selectName)
Можно было просто передавать сюда все формы слова и получилась бы универсальная функция, которая может выбирать любое слово. А то с номером получается, что это не отдельная функция, а продолжение функции spellNumber, в которой есть счетчик от 0 до 3.

Плюс, у тебюя слишком большая вложенность if. Вместо этого:

if (условие) {
много кода
} else {
return ...;
}

Лучше писать

if(!условие) {
return ...
}

много кода...

В остальном, сделано неплохо.

По калькулятору: сделано верно.

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

Нет, надо делать через if/elseif.

>>1319485

> if($arrayRand == $arrayRand)

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

Показать весь текст

1222 21 янв, 05:42 1222 1331369

>>1320458

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

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

>>1320461

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

>>1320625

> Как мне заставить регулярку искать только 10 цифр, а кол-во других символов не имеет значения?

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

А затем пишешь, что это повторяется 10 раз: (xxx){10} . Круглые скобки значат, что {10} применено ко всему выражению.

1223 21 янв, 05:42 1223 1331370

>>1321352

> Пиши верно https://3v4l.org/UaM8i

> (?<=[.!?])+
Я думаю, + тут бессмысленнен, так как утверждения не поглощают символы при совпадении и не смещают позицию в строке и повторная применяется к тому же месту строки. То есть, выражение вида (?<=!){2} ищет один восклицательный знак (просто проверяет его наличие 2 раза), а не два: https://repl.it/repls/NaturalCalculatingProtocols

Чтобы искать 2 воскл. знака, надо писать {2} внутри утверждения.

Более того, плюс у тебя не очень и нужен, так как одной точки достаточно для
определения границы предложения.

А так, решено верно.

> Yoda Speak https://3v4l.org/coKeP

> /[.|!|?|;]
В квадратных скобках | обозначает символ вертикальной черты, а не "один из вариантов". Надо писать [.!?;].

В остальном, верно.

> Сумма прописью https://3v4l.org/NSeMe

> if (floor($number / 1000000) >= 1) {
Лучше if ($number >= 1000000)

> На вашем счету{$text1}
Лучше бы функция возвращала фразу без лишнего пробела в начале.

А так, верно.

> Калькулятор https://3v4l.org/n6fuv

> [+]|[-]|[=]
Можно просто [+-=...]

> [0-9]+[.]＊
Надо [.]?

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

1223 21 янв, 05:42 1223 1331370

>>1321352

> Пиши верно https://3v4l.org/UaM8i

> (?<=[.!?])+
Я думаю, + тут бессмысленнен, так как утверждения не поглощают символы при совпадении и не смещают позицию в строке и повторная применяется к тому же месту строки. То есть, выражение вида (?<=!){2} ищет один восклицательный знак (просто проверяет его наличие 2 раза), а не два: https://repl.it/repls/NaturalCalculatingProtocols

Чтобы искать 2 воскл. знака, надо писать {2} внутри утверждения.

Более того, плюс у тебя не очень и нужен, так как одной точки достаточно для
определения границы предложения.

А так, решено верно.

> Yoda Speak https://3v4l.org/coKeP

> /[.|!|?|;]
В квадратных скобках | обозначает символ вертикальной черты, а не "один из вариантов". Надо писать [.!?;].

В остальном, верно.

> Сумма прописью https://3v4l.org/NSeMe

> if (floor($number / 1000000) >= 1) {
Лучше if ($number >= 1000000)

> На вашем счету{$text1}
Лучше бы функция возвращала фразу без лишнего пробела в начале.

А так, верно.

> Калькулятор https://3v4l.org/n6fuv

> [+]|[-]|[=]
Можно просто [+-=...]

> [0-9]+[.]＊
Надо [.]?

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

Показать весь текст

1224 21 янв, 05:43 1224 1331371

>>1324427

label нужно указать при создании формы (читай мануал). Если ты сам хочешь выводить label, то надо либо отключить встроенный, либо самому выводить весь виджет, кроме label (то есть свой label, потом form_widget, потом область ошибок).

>>1327398

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

>>1327488

Плохой. Так как ты не решаешь конфликты. Банальный пример: сейчас в файле цифра 100. Первый скрипт запускается, читает "100". Параллельно работающий скрипт тоже читает 100. Первый меняет на 101. второй тоже. Один просмотр потерян. Еще хуже, если файл большой и 2 параллельно работающих скрипта перезапишут его одновременно, так что получится смесь из 2 кусков.

Используй sqlite - она тоже хранит данные в файле, только правильно и с блокировками.

>>1327846

6 http://jsfiddle.net/4Ld60kht/ - думаю поля можно было через паддинг родителя, но я сделал так.

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

7 http://jsfiddle.net/avu90q3w/

Правильно.

8 http://jsfiddle.net/pvk2rf9a/ - не понял как тут применить отрицательный маргин и не уверен что * хорошо указывать

> p, ul, ol, h1, h2, h3, h4, h5, h6, img {
> margin-left: 110px;

Это, на мой взгляд, плохая идея и правильнее тут поставить padding на article. А то твое правило не применится к тексту без тегов.

> aside + ＊ {
Это не очень праивльно, ты так можешь сбросить нужный оступ у абзаца (если он идет после aside), например. Зачем вообще это правило? На случай, когда в начале текста идет aside, а за ним p?

> article > ＊:first-child {
Это не очень правильно. Может, там вначале такой элемент, которому надо добавить маргин. Лучше явно указать, к каким тегами применено правило и сделать article > p:first-of-type

Вообще, если тебе не нравится лишний отступ сверху у первого абзаца/заголовка, надо придумать способ получше. Мне пришла в голову такая мысль:

- заменяем паддинг вверху article на див нулевой высоты с margin-bottom: 10px
- этот маргин будет коллапсировать с маргин-топ идущего далее элемента
- если у идущего далее элемента нет маргин-топ (например, картинка), то отступ все равно будет

Не хочешь проверить эту идею и поискать, есть ли у нее недостатки? Интересно, это я придумал или до меня уже кто-то?

1224 21 янв, 05:43 1224 1331371

>>1324427

label нужно указать при создании формы (читай мануал). Если ты сам хочешь выводить label, то надо либо отключить встроенный, либо самому выводить весь виджет, кроме label (то есть свой label, потом form_widget, потом область ошибок).

>>1327398

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

>>1327488

Плохой. Так как ты не решаешь конфликты. Банальный пример: сейчас в файле цифра 100. Первый скрипт запускается, читает "100". Параллельно работающий скрипт тоже читает 100. Первый меняет на 101. второй тоже. Один просмотр потерян. Еще хуже, если файл большой и 2 параллельно работающих скрипта перезапишут его одновременно, так что получится смесь из 2 кусков.

Используй sqlite - она тоже хранит данные в файле, только правильно и с блокировками.

>>1327846

6 http://jsfiddle.net/4Ld60kht/ - думаю поля можно было через паддинг родителя, но я сделал так.

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

7 http://jsfiddle.net/avu90q3w/

Правильно.

8 http://jsfiddle.net/pvk2rf9a/ - не понял как тут применить отрицательный маргин и не уверен что * хорошо указывать

> p, ul, ol, h1, h2, h3, h4, h5, h6, img {
> margin-left: 110px;

Это, на мой взгляд, плохая идея и правильнее тут поставить padding на article. А то твое правило не применится к тексту без тегов.

> aside + ＊ {
Это не очень праивльно, ты так можешь сбросить нужный оступ у абзаца (если он идет после aside), например. Зачем вообще это правило? На случай, когда в начале текста идет aside, а за ним p?

> article > ＊:first-child {
Это не очень правильно. Может, там вначале такой элемент, которому надо добавить маргин. Лучше явно указать, к каким тегами применено правило и сделать article > p:first-of-type

Вообще, если тебе не нравится лишний отступ сверху у первого абзаца/заголовка, надо придумать способ получше. Мне пришла в голову такая мысль:

- заменяем паддинг вверху article на див нулевой высоты с margin-bottom: 10px
- этот маргин будет коллапсировать с маргин-топ идущего далее элемента
- если у идущего далее элемента нет маргин-топ (например, картинка), то отступ все равно будет

Не хочешь проверить эту идею и поискать, есть ли у нее недостатки? Интересно, это я придумал или до меня уже кто-то?

Показать весь текст

1225 21 янв, 05:43 1225 1331372

>>1328055

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

>>1329885

Внешними утилитами, например в линуксе в командной строке скрипт можно запустить через time:

time php script.php

Также, есть функции microtime(true) и php_memory_get_usage(true) (или как-то так), которые позволяют мерять это внутри скрипта.

Также, можно с помощью Apache Benchmark или siege проверить, какую нагрузку выдерживает скрипт.

>>1329928

Да, хранить дату окончания в БД.

>>1330173

Ты данные экранируешь перед вставкой хоть?

1226 21 янв, 05:44 1226 1331373

>>1330212

Выучи сначала наизусть урок про SQL инъекции, а то взломают: https://github.com/codedokode/pasta/blob/master/security/sql-injection.md

Также, true это не строка, а булево значение и пишется без кавычек. Погугли про булевы значения.

При сравнении надо писать ==, а не =.

Далее, любой вызов mysqli может вернуть false при ошибке и ты должен проверять, и выводить сообщение с подробностями в этом случае. Тогда бы ты увидел причину ошибки, а сейчас ты вслепую отлаживаешь, что довольно глупо. Вот пример обработки ошибок: http://php.net/manual/ru/mysqli.quickstart.statements.php

Естественно, на продакшене ошибки должны идти в лог, а не на экран.

Если тебе надоело писать if после каждого вызова, то освой исключения и mysqli_report: http://php.net/manual/ru/mysqli-driver.report-mode.php

>>1330181
>>1330418

Ответный вопрос: зачем тебе нужны классы со статическими методами, если их можно заменить просто на набор функций? Зачем ты их вообще пишешь?

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

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

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

function registerUser(array $user)...

Вопрос: как ты определишь, какие поля в $user, какого типа, что они значат? В случае с объектами ты бы мог посмотреть код класса:

function registerUserWithOOP(User $user)

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

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

У тебя не ООП код, а код на массивах и функциях, в котором иногда для видимости добавлено слово class. Если ты хочешь изучить ООП, попробуй решить задачу про ООП-Гостиницу или ООП-будильник:

- ООП-Будильник: https://phpclub.tech/pr/res/1232710.html#1263399
- ООП-Гостиница: https://phpclub.tech/pr/res/1082507.html#1097078

Без ООП там будет довольно плохой код.

1226 21 янв, 05:44 1226 1331373

>>1330212

Выучи сначала наизусть урок про SQL инъекции, а то взломают: https://github.com/codedokode/pasta/blob/master/security/sql-injection.md

Также, true это не строка, а булево значение и пишется без кавычек. Погугли про булевы значения.

При сравнении надо писать ==, а не =.

Далее, любой вызов mysqli может вернуть false при ошибке и ты должен проверять, и выводить сообщение с подробностями в этом случае. Тогда бы ты увидел причину ошибки, а сейчас ты вслепую отлаживаешь, что довольно глупо. Вот пример обработки ошибок: http://php.net/manual/ru/mysqli.quickstart.statements.php

Естественно, на продакшене ошибки должны идти в лог, а не на экран.

Если тебе надоело писать if после каждого вызова, то освой исключения и mysqli_report: http://php.net/manual/ru/mysqli-driver.report-mode.php

>>1330181
>>1330418

Ответный вопрос: зачем тебе нужны классы со статическими методами, если их можно заменить просто на набор функций? Зачем ты их вообще пишешь?

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

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

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

function registerUser(array $user)...

Вопрос: как ты определишь, какие поля в $user, какого типа, что они значат? В случае с объектами ты бы мог посмотреть код класса:

function registerUserWithOOP(User $user)

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

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

У тебя не ООП код, а код на массивах и функциях, в котором иногда для видимости добавлено слово class. Если ты хочешь изучить ООП, попробуй решить задачу про ООП-Гостиницу или ООП-будильник:

- ООП-Будильник: https://phpclub.tech/pr/res/1232710.html#1263399
- ООП-Гостиница: https://phpclub.tech/pr/res/1082507.html#1097078

Без ООП там будет довольно плохой код.

Показать весь текст

1227 21 янв, 05:45 1227 1331374

>>1330530

Поизучай код Симфони, например Symfony Forms, там есть и примеры ООП, и паттерны.

>>1330538

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

> и выносить простой код в 100500 файлов, где хуй потом разберешь что и где.

Если непонятно - значит, это как раз плохо сделано. Вот попробуй ООП-гостиницу или ООП-будильник без ООП решить - получится код хуже.

> вам там про алгоритмы думать не сильно надо

Если ты думаешь про алгоритмы 2 часа и 6 часов пишешь код, то как оформление кода тебе мешает думать?

> В последние дни я заметил что больше времени уделяю форматированию кода

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

>>1330539

> Сначала мы создаем проблему, а затем героически ее решаем

И как можно "не создавать" проблему зависимостей? Изобретать велосипед и тратить на это лишнее время?

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

Ну вот выяснил бы.

1227 21 янв, 05:45 1227 1331374

>>1330530

Поизучай код Симфони, например Symfony Forms, там есть и примеры ООП, и паттерны.

>>1330538

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

> и выносить простой код в 100500 файлов, где хуй потом разберешь что и где.

Если непонятно - значит, это как раз плохо сделано. Вот попробуй ООП-гостиницу или ООП-будильник без ООП решить - получится код хуже.

> вам там про алгоритмы думать не сильно надо

Если ты думаешь про алгоритмы 2 часа и 6 часов пишешь код, то как оформление кода тебе мешает думать?

> В последние дни я заметил что больше времени уделяю форматированию кода

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

>>1330539

> Сначала мы создаем проблему, а затем героически ее решаем

И как можно "не создавать" проблему зависимостей? Изобретать велосипед и тратить на это лишнее время?

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

Ну вот выяснил бы.

Показать весь текст
Ответы31377

1228 21 янв, 05:46 1228 1331375

>>1330542

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

Одно к другому отношения не имеет. Как grunt (уже webpack) влияет на производительность PHP кода?

> сайтов визиток или кривых магазинов где даже 1 rps нет

Ты же не маленький и понимаешь, что важно не сколько rps, а сколько проект приносит прибыли (или хотя бы общественной пользы).

>>1330663

> Анончики, милые помогите, не запускается apache24 с php72, как можно понять почему он не хочет работать с LoadModule

А там версии совместимые? Ты не пытаешься расширение к старой версии PHP загрузить? Вообще, Signal 11 = SIGSEGV - говорит о баге где-то в коде (не твоем), и может тебе стоит написать баг-репорт разработчикам дистрибутива. Только перед этим проверить, что у тебя актуальные и совместимые версии библиотек.

>>1330877

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

>>1331333

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

> Я хотел бы уточнить правильно ли я понял как работает clearfix.

clearfix заставляет контейнер растягиваться, чтобы вместить все флоаты. Свойство clear добавляет элементу margin сверху так, чтобы он оказался ниже всех флоатов в потоке. Спецификация: https://www.w3.org/TR/CSS2/visuren.html#floats

1228 21 янв, 05:46 1228 1331375

>>1330542

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

Одно к другому отношения не имеет. Как grunt (уже webpack) влияет на производительность PHP кода?

> сайтов визиток или кривых магазинов где даже 1 rps нет

Ты же не маленький и понимаешь, что важно не сколько rps, а сколько проект приносит прибыли (или хотя бы общественной пользы).

>>1330663

> Анончики, милые помогите, не запускается apache24 с php72, как можно понять почему он не хочет работать с LoadModule

А там версии совместимые? Ты не пытаешься расширение к старой версии PHP загрузить? Вообще, Signal 11 = SIGSEGV - говорит о баге где-то в коде (не твоем), и может тебе стоит написать баг-репорт разработчикам дистрибутива. Только перед этим проверить, что у тебя актуальные и совместимые версии библиотек.

>>1330877

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

>>1331333

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

> Я хотел бы уточнить правильно ли я понял как работает clearfix.

clearfix заставляет контейнер растягиваться, чтобы вместить все флоаты. Свойство clear добавляет элементу margin сверху так, чтобы он оказался ниже всех флоатов в потоке. Спецификация: https://www.w3.org/TR/CSS2/visuren.html#floats

Показать весь текст

1229 21 янв, 05:53 1229 1331377

>>1331374
>>1331374
>Поизучай код Симфони, например Symfony Forms, там есть и примеры ООП, и паттерны.
ООП и паттерны - это антипаттерны, костыли чистой воды. Если разработчик о них говорит, изучает, то это показывает его низкую квалификацию.

Перекот 1230 21 янв, 05:55 1230 1331381

Аноны, переходите в новый тред >>1331378 (OP) , этот тред закрыт. Если вас пропустили в этом или предыдущих тредах, напомните о себе в новом треде, а в этом требе больше писать ничего не надо.

Тред утонул или удален.
Это копия, сохраненная 22 января 2019 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

« /pr/В начало тредаВеб-версияНастройки/a//b//mu//s//vg/Все доски

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion