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

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Клуб изучающих PHP #106 /php/ 1305368 В конец треда | Веб
Брр, холодно-то как. Но даже это нас не остановит. Тут мы, несмотря ни на что, изучаем язык 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? — Да, однозначно. Посмотри любую вакансию.
2 1305372
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть. Если каждый будет оформлять код как хочет, будет бардак.

Если тебе лень выравнивать код руками, закачай его на 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
3 1305375
Если вы в предыдущем треде >>1281608 (OP) написали вопрос или запостили решение, но вас не проверили - напомните о себе в этом треде.

Ну и посмотрите, я там в конце треда на многие вопросы ответил.
image.png493 Кб, 514x480
4 1305376

>2019


>php

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

>https://ideone.com/5R215K


Скобки круглые должны быть, ты чего?
7 1305418
>>05413
https://secure.php.net/manual/ru/language.types.array.php
Это прочитать не судьба?
8 1305421
>>05416
>>05418
Посоны, использую версию 5.5, в них же квадратные должны быть?
9 1305441
>>05372
Как меня бесит когда пидарасы всякие { ставят в одну линию с условием. Только в css так делаю
10 1305442
>>05372

>4 пробелами


Про табы у вас в селе не слышали еще, да?
11 1305464
>>05441
Чмо про PSR не слыхало?
12 1305546
Чем обычно занимаются джуны пхп на своей первой работе? Какие вообще советы можете дать по поиску работы на позицию джуна? Думаю после зимы могу уже начать искать себе работу. До этого никогда не работал
13 1305547
>>05546
Актуальный вопрос. Поддвачну.
14 1305562
Первый мой перекат в этом треде, посоны.

У кого какой?
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/Клауза).
16 1305587
За сколько перекатов среднестатистический вкатывальщик зарабатывает первые деньги?
17 1305599
Оп, это анон, который про игру пошаговую спрашивал. Можешь привести пару примеров проектов по бэку на php, которые можно на собеседовании показать? Кроме магазинов и соцсетей ничего в голову не идёт.
18 1305609
Чем дальше иду по мануалу ОПа, тем больше понимаю, какой же мерзкий это язык! Смешной момент на 2-й картинке где регулярка задается кастрированной версией, заместо полноценной с указанием флагов, и чтобы, например, игнорировать регистр заместо простого флага придумали ОТДЕЛЬНУЮ функцию. Ну что это за peezdos ?
php functions solved.jpg226 Кб, 1264x741
19 1305614

>Функции и новый айпад


>


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



А у меня прошло. Так-то! Ну или ОП ворвется и скажет, что strawbery не начисляет процент на свои 7777, тогда этот случай придется считать немного иначе.
21 1305649
>>05587
У всех разная скорость обучения. Да и не перекаты учат, а решённые задачи.
22 1305655
>>05609
Есть там флаги. Для второй пикчи: i - ignore case, u - utf8.
23 1305665
>>05464
Каво нахуй?
lTzHqm.jpg14 Кб, 320x233
24 1305712
>>05655
Действительно есть, но отдельным параметром для функции.
25 1305713
Вот вроде люди которые советуют использовать фреймворки, вы блять сами то их использовали. я только на установку ебучего laravel потратил 4 часа, каждый шаг сопровождался жопной болью. В плане "установи composer/настрой его правильно, настрой переменные,настрой ебучий файл хостс", но и это еще не всё. Работа с этим фреймворком это просто какой-то пиздец.
Переведу стандартную ситуацию в более реальную плоскость - для решения задачки уровня 2+2 второкласнику предлагают сначала выучить диффуры.
Четыреждеблядская ярость уже отошла. Я просто шлю фпизду этот фреймворк. Вот серьезно.
26 1305714
>>05713
Стандартная ситуация для любого бэк-энд фреймворка.
27 1305716
>>05714
Ок, что делать, если эти ебучие фреймворки нужны везде кроме Битриксоидов?
28 1305719
>>05716
Страдать, что ж еще. Вообще, бэк-энд(нормальный) это не какая-то хуйня. Безопасность, вот это всё - учитывается. Отсюда с наскоку осилить установку/настройку не просто.
29 1305754
>>05368 (OP)
Подскажите, почему в $_SERVER нет элемента 'HTTP_REFERER'?
30 1305759
>>05754
Потому, что страница, с которой был переход, в ссылке имеет rel="noreferrer" ? https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types
31 1305765
>>05759
Это я валет. Элемент появляется, если перешел по ссылке, а я руками урл писал. Но всё равно спасибо, добрый человек!
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 запись в базу?
Где я еблан?
33 1305775
>>05772
PDOStatement::fetch — Fetches the next row from a result set
PDOStatement::fetchAll — Returns an array containing all of the result set rows
34 1305776
>>05775

>atement::fetch — Fetches the next row from a result set


>PDOStatement::fetchAll — Ret



fetchAll - не выводит в итоге вообще нихуя
35 1305779
Почему при pecl install grpc убунта ебёт мозги по поводу отсутствия zlib? При том, что apt install zlib1g говорит, что все ок и уже установлено. У кого-нибудь получалось без ебли установить грпц?
36 1305791
>>05609
дваждую, ещё и с юникодом не дружит
37 1305810
>>05712

>для функции


Нет, не для функции, нуб.
Ты чем учебник ОПа читал? Там есть всё.
38 1305811
>>05791
И базу данных не прикрутишь никак без костылей.
39 1305838
не обоссывайте плз.
Вопрос следующий: видеокурсы, типа "Cпециалист php"(хвалебные) не прокатят? Начинать нужно именно с книг?
40 1305840
>>05838
дополню вопрос: пытался вкатить в js, по книге нихуя не понял(начинать вкатывание с объектов это охуеть конечно), с видеокурса очень даже зашло.
41 1305927
>>05838
Курсы норм, только устарели порядком и учат там говнокоду по сути. Но для того чтобы разобраться поначалу покатит, правда потом уже самому надо пыхтеть, чтобы не писать лапшу как в 2015 году.

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

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

>>05442

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

>>05584

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

>>05599

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

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

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

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

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

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

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

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

>>05614

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

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

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

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

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

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

>>05810

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

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

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

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

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

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

>>05614

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

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

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

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

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

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

>>05810

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

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

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

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

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

>>05754

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

>>05776

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

А почему 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.

>>05840

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

А почему 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.

>>05840

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

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


Но любая функция в программировании это же математическое вычисление, не так ли?
49 1306066
>>06050

statement это например if. Он не является выражением.
50 1306067
>>06066
if тоже можно представить как математическое выражение (вычисление).
51 1306070
>>06066
Тогда, "statement" можно перевести как "утверждение". Если касаться перевода.
52 1306087
>>05810

>нуб


Потише, бывалый.

>Ты чем учебник ОПа читал? Там есть всё.


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

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


>


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


>


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


Какие замечательные идеи для стартапов! Любой анон может реализовать любую из этих идей и получать пассивный доход.
55 1306212
>>05368 (OP)
Сап, аноны.В php я полный ноль, потому нужна ваша помощь. Как сделать CRUD для комментариев?
someApprentice 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?
57 1306323
58 1306331
>>06323
И не буду, ничего интересного не нашёл.
59 1306341
>>06331
Ну правильно, хули ожидать от человека без собственной фантазии.
60 1306343
>>06341
Ну так зачем кидать идеи человека без собственной фантазии?
screencap.gif954 Кб, 611x377
61 1306344
/web совсем помер. Спрошу сдесь.

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

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

Если 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 может подвесить браузер. Может понадобиться оптимизировать код, например, создавая элементы только по мере прокрутки.
63 1306399
>>06382

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


Голый JavaScript и HTML. Браузер хром.

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

> scrollTop


Это я нашёл. Но как вычислять чему этот scrollTop равен к примеру для 4 строчке.

> Подсветку строки


Это буду делать изменяя background-color дива

> Имей в виду, что если у тебя большой текст


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

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

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

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

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

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

Какой смысл брать готовое решение и чуть-чуть подправлять? делай с нуля. В нашей задаче про студентов из шапки есть много полезных советов и комментариев, которые и тут пригодятся.
66 1306548
>>06476
цель - запустить как можно быстрее, а не научиться юзать ларавел.
67 1306638
Тут есть мастера по joomla? Нужна хелпа!
someApprentice 68 1306737
>>06284

>


>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 1306751
может кто-нибудь объяснить нофане, почему

>echo "$sas + \$ucc" + "30%8";


выводит "35"?
70 1306756
>>06751
Что ты ожидал? Ты складываешь строки, при этом они конвертируются в числа, при конвертации отбрасывается хвост после первого нечислового символа.
Чтобы соединить строки нужно использовать "."
71 1306766
>>06756
понял, спасибо большое!
72 1306774
>>06445
Я делал комменты через рекурсию.
Нагуглил функцию и под себя переделал.
Вроде как понимаю, что написано, а вроде нет.
73 1306842
Аноны, нид сам хэлп.
Имеется некое подобие подачи заявки. Необходимо отправлять в бд дату подачи заявки.
Проблема в следующем:
Сама инфа отправляется в бд с помощью sprintf через %s\%d(плейсхолдеры вроде?)
Как отправить дату через эти плейсхолдеры? Гугол уже прочитал чёт там по поводу даты ничего нет. Мануал официальный тоже прочитал есть только про строки( str_to_date мэйби юзануть?)и про числа(напомню в бд столбец сделан с datetime)
Собственно вопрос как подготовить строку для отправки, для datetime
74 1306847
>>06842
Отбой тревоги пасаны. Я еблан и писал в отображении заявки а не в подаче.

Короче если кому-то будет необходимо то datetime отправляется в бд через sprintf с помощью строчного коофициента( '%s')
75 1306896
>>06847
А что, обязательно дату в базу отправлять из приложения? Там должна быть встроенная функция автозаполнения датой, при создании новой записи. На MySQL есть, я пользовался.
76 1307039
Есть ресурс с которого нужно спарсить csv файлы. Например их около 50 и имеют они размер от килобайта до 300мб. На самом сайте довольно всрато все и хоть и написано что файлы для базы, но раздаются они в виде урлов на странице.

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

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

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

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

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

>можно авторизоваться


>нет валидации, куков



Это как? Ну а вообще думаешь долго доделать этимелочи? Посидеть вечерок и попилить хотя бы пару заготовок для всяких классов там. Ну и в целом конечно же стоит.
API API ебаный API 79 1307134
Аноны, третий день пытаюсь запилить API на yii2 базовый шаблон.
Мануалы курил, но нихрена не понял)
Проект уже весь запилен, осталось запилить папку API для react приложения.
Есть может у кого в закромах посмотреть где, как организованно API со всеми настройками..
Никак не пойму как настроить маршруты внутри http/lockalhost/projectName/API/index.php !!
Тут могу отдавать что угодно, а вот дальше как подключать контроллеры, экшены самомго API, не понимаю...
80 1307205
Аноны, есть ли смысл брать Котерова "пхп7 в подлиннике"? Или лучше что то другое по 7ой пыхе?
81 1307255
>>07205

>Котерова


не стоит
82 1307278
>>07039

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


Отключи уйму времени и качай по очереди.
83 1307286
>>07039

В крон-скриптах лимит времени можно ставить любой, по умолчанию там его скорее всего нету. А чтобы память не тратилась, не храни все в памяти, а сохраняй на диск. В принципе, при желании можно сделать скачивание сразу в файл, например, с помощью stream_copy_to_stream или опций к curl, Guzzle.
84 1307359
>>05368 (OP)
Если я пишу сразу на удаленный сервак, то никак не получится накрутить xdebug?
85 1307373
>>06049
Благодарю за развернутое объяснение, всё получилось. Задача у меня изначально была подружить пхп-клиент с го-сервером по грпц, докеризировать всё это дело и довести до продашкн-реди ума.
Если будет кому интересно, могу залить на гит то, что в итоге получится.
vg - Crossout поток №84.jpg62 Кб, 595x447
86 1307386
2 дня задачу из учебника делол, оказалось всё очень просто https://ideone.com/h3Zk89
87 1307434
>>07359
Через ssh тунель я делал так.
88 1307641
>>07434
А можно как то дебажить код на удаленном сервере без танцев с бубном?
2ch.PNG4 Кб, 333x78
89 1307666
Привет двач, делаю задачку про студентов и возникла такая проблема, не знаю как сделать чтобы столбец ID в бд заполнялся сам, в базе стоит параметр AI. Сейчас он ищет последний элемент через foreach, что очень хуево. Что подскажете?
90 1307668
>>07666
без кавычек пиши $id
91 1307673
>>07668
А остальные переменные тоже без кавычек писать лучше?
92 1307674
>>07673
Понял, не нужно
93 1307692
>>07673
Когда что то не работает или чето не понимаешь каким образом работает, то распечатывай переменную, которая вызывает вопросы.
Ты можешь распечатать твой скл запрос:
$sql ='INSERT INTO hooy WHERE id = zhopa ......';
echo $sql;
И ты увидишь что конкретно сжирает сервер
94 1307718
>>07641
Если у тебя публичный статически ip можеш попробовать в настройках php на сервере:
xdebug.remote_enable=1
xdebug.remote_host=твой айпи
xdebug.remote_port=твой открытый порт
В настройках иде слушаешь этот порт.
SSH тунель едва-ли подходит под танцы с бубном - прокидываешь порт и айпи ставишь локальный.
Зато сразу защищено и не требует статики.
95 1307720
>>07666
Чтобы автоинкремент заработал тебе не нужно вообще указывать id в INSERT, пропускай этот столбец.
96 1307722
>>07720
Спасибо! Похоже я раньше, что-то не так сделал и это не работало
97 1307732
Объясните как правильно развернуть дев-окружение php + php-fpm + nginx + mysql в докере. Чем отличается MariaDB от MySQL? Дело в том, что для Alpine есть только Мария.
98 1307742
>>05368 (OP)
Почему YII и Symfony, а не Laravel?
99 1307776
>>07742
Нравится ларавел - бери его
100 1307787
>>07776
Считается, что в Symfony много джавовой наркомании. Но это не точно. Поэтому спросил почему именно они.
101 1307791
>>07787
Симфони - более тырпрайзный вариант, эдакий спринг для мира пхп.
Ларавел больше про хуяк-хуяк-в-продакшен.
Юи не трогай - устаревший кусок говна.мимо 1.5 года сидел на юи2 в галерке
102 1307826
PHP - кусок говна. Совсем не мотивирует меня работать на нем.
103 1307828
бамп
104 1307830
>>07826
Зачем пишешь сюда тогда?
Чего стек не сменишь?
image.png166 Кб, 640x294
105 1307939
>>07826
Ну-ну.
106 1307965
'SELECT * FROM student LIMIT $limit OFFSET $offset'
Такие же запросы можно использовать? Просто в задаче про студентов написано, что нельзя переменные вставлять прямо в запрос. Но здесь нет никаких данных введенных пользователем, для них же защита не нужна?
107 1308014
Аноны, туплю.
Как обратиться к этим элементам? Надо просуммировать их все.
Снимок.PNG5 Кб, 154x266
108 1308016
Не прикрепилось
109 1308018
Отбой, я понял
111 1308059
>>07965

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


Ты, скорее всего, функцию запроса к БЖ не очень удачно реализовал - в норме она очищает вообще все данные извне, пользователь там или само прилетело.
Покаж функцию свою.
112 1308062
>>08059
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;
}
image.png223 Кб, 500x500
113 1308066
>>08019
Велосипеды конструировать изволите?
http://php.net/manual/ru/function.array-sum.php
114 1308071
>>08066
Это ваще пиздец, особенно когда это не что-то очевидное, вроде сложений значений массива, а какая-нибудь ебанутая хуйня. Тратишь кучу времени на нормальную реализацию и поиск решения, а потом узнаешь, что уже есть готовая функция для этого случая, а ты просто изобретал велосипед.
115 1308081
>>08071
Знакомо. Наверное, все через это проходили.
Рекомендую всегда, вообще всегда, смотреть документацию при работе с каким-то типом данных.
Вот работаешь ты с массивами - открой вкладку со списком функций на сайте и просмотри их все.
Это же самообман всё - думаешь, что долго открывать, искать эти функции, как дурак, тогда как ИРЛ всё обычно наоборот - функции имеют понятное название, а пилить велосипед с тем же foreach выйдет гораздо дольше, чем просто взять и использовать нужную из документации.
116 1308084
>>08071
в вебе уже всё изобретено, гуглишь как сделать хуйня нейм и получаешь уже готовый код
117 1308109
>>07965

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

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

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

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

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

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

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

Кстати, в случае чисел для защиты достаточно применить intval() или поставить тайп-хинт int, но через плейсхолдеры все же будет надежнее. Их убрать труднее, чем заменить int на string, не заметив что это для обеспечения безопасности.
118 1308113
>>08062
Не оч реализация, как по мне.
Обычно так пишу - https://ideone.com/TPhsrf
я там скобки посеял где-то пока писал

Если у кого есть ещё идеи - делитесь.
119 1308169
>>08109
Пользователь не может передать туда ничего, у меня там идет не через гет, а просто типа site.com/page/2. Там все рассчитывается для создания пагинации. В оффсет и лимит не может попасть ничего кроме числа по идее. Я понимаю что этого не видно и тут не экстрасенсы сидят. Может я вопрос не так задал: можно ли вставлять переменные прямо в sql запрос, если я уверен, что туда не попадет какая-нибудь левая хуйня? Не будут ли на меня смотреть как на дауна из-за этого?
120 1308176
>>08109
А хотя не, что-то я невнимательно твой ответ прочитал. Чтобы кто-нибудь, кто 'в теории' будет использовать скрипт, не сломал ничего, нужно действительно использовать какую-нибудь защиту. Завтра сделаю.
121 1308178
>>08169

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

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

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

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

Попробуй подумать чуть масштабнее: проект может разрабатывать несколько человек, код может быть большой и ты замучаешься весь изучать. Потому функция была должна быть написана безопасно сама по себе, чтобы для ее проверки не надо было изучать остальной код.
122 1308183
>>08178
Да, спасибо, я понял. Просто не подумал, что нужно защищать код не только от злых хакеров (лол), но и от мифического человека, использующего мой скрипт.
123 1308189
>>08183

>от мифического человека, использующего мой скрипт


Ты сам через месяц забудешь что там накалякал.
124 1308207
>>08062

>$db = $this->dbase;


Какая-то бессмысленная строка. Зачем она нужна?
Почему заместо этого всего:

>$db = $this->dbase;


>$stmt = $db->prepare()


просто не использовать:
$this->dbase->prepare()
125 1308244
Сапсан, как вывести погоду через API в динамическую обложку для вк
126 1308331
>>05368 (OP)

https://ideone.com/YZhoeC

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

https://ideone.com/Kj2GBG
Версия с тестами, выглядит не так стильно но работает. Ну эмм, я пошел делать вектор.
127 1308417
Это снова я!
Сумма прописью ULTIMATE FINALLY (надеюсь) EDITION - https://repl.it/@MaksimSienchien/GrowingStarkProducts

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

https://repl.it/@MaksimSienchien/LimitedTrimAfkgaming-1
128 1308429
ОП, глянь "Гостиницу" мою, если будет время:
http://sandbox.onlinephpfunctions.com/code/bf265b1dcfaab38559a459812aa03f0c5583fc7b

Также есть вопрос по оформлению кода, в PSR-1, PSR-2 ответа не нашел, PHPStorm на автомате не форматирует это. Как правильно разбивать построчно различные конструкции. Вот примеры у меня в коде - 55-60 строки (сокращенный if), 188-192 строки (длинное условие в if-е), 268-274 строки (массив).
129 1308456
>>05368 (OP)
Может ли не работать перенаправление header("Location: /") из за того, что есть деприкейтед ошибка, на которую я пока забил хуй?
130 1308457
>>08456
Cannot modify header information - headers already sent by...
131 1308459
>>08456
Разобрался. Если кому интересно, да, может. Выводимые серваком ошибки не дают изменять заголовки
132 1308663
Если кому-то интересно - статья с вопросами и задачками с собеседования в Яндексе: https://medium.com/@olgakozlova/вопросы-из-яндекса-895261c94e16

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

Там код на яваскрипт, но его без проблем можно написать и на PHP. Аноны, поломайте голову, проверьте себя. Я подскажу, если есть вопросы.
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 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 1308685
Делаю телеграм-бота.
С локального сервера или через браузер все работает, но при отправлении текста из сервера "Aukštųjų" превращается в "Auk", а с urlencode в "Auk&#353;t&#371;j&#371;". Что делать? Использую Heroku, если это важно.
135 1308690
>>05368 (OP)
ОП, что там с решением задачки TestHub? Есть какие-то варианты? Не совсем понимаю как сделать БД для вопросов с несколькими вариантами ответа.
136 1308790
>>08690

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

- вопросы - questions
- варианты ответов - options - связаны с вопросами как M-1
- сеанс теста - session
- ответ на вопрос - answer, связан с session и questions
- выбранные варианты ответов - selected_options, связаны с answer и options
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 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 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 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 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 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.

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

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



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

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

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

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

> Анончики, требуется помощь с задачей ОПа.


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



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

>>1297532

>>Потому ArrayObject надо оборачивать:


> То бишь, самому реализовать все нужные интерфейсы?


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

>>1293491

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



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

> что делает эта функция? mysqli_fetch_array()


В офиц. мануале написано. Что именно там непонятно?

> И почему в конце mysqli стоит буква i?


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

>>1292670

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



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

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



Можно.

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



Зато ты можешь создать объект класса-наследника и на нем вызвать этот метод.
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 1308859
>>1291781

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

>>08429

> 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 1308859
>>1291781

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

>>08429

> 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 1308860
ОП, а ты богатый?
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 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 (читайте правила прежде чем постить).
149 1308946
Посаны, можно ли с помощью call_user_func_array вызвать не статический метод?
150 1308962
Посмотрел требования в куче вакансий, чет охуел, при том что я не первый месяц php дрочу. Что нужно знать, чтобы вкатиться: html, css, php (ООП, MVC), опыт больше года, sql, laravel или yii2 (остальные фреймворки гораздо реже), js, linux, git, еще куча всякой хуеты. Часто в требованиях дополнительно встречается jquery, еще какие нибудь джс фреймворки, битрикс, всякие цмс вроде джумлы или вордпресса. Иногда требуется вышка. Реже техническая вышка. Еще реже профильная. Понятно, что выучить sql на уровне 'select * from %huina%' можно очень быстро, но если по всей этой хуете требуют глубокие знания, то это учить заебешься. Есть конечно и вакансии аля PHP, sql, js, html, css даже без фреймворков и прочего, но их гораздо меньше.
151 1309030
Помогите написать функцию, которой я бы в некотором виде кормил массив с состоящий из ассоциативных массивов ключей и значений, а она бы за 1 инсерт все это записывала в базу. Пока что на основе pdo пытался написать. Но чет не особо работает. Да еще и ошибки не могу отловить.

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

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

Можно и другой формат рассмотреть, где будут отдельно передаваться ключи, и отдельно массив из массивов значений (не ассоциативные), главное что бы это дело отрабатывало как часы и могло за раз сделать в базу хотя бы 10 000 записей.
152 1309134
>>09030
Губу закатай - с хайлоадом надо ебстись порядочно и простой функцией тут не отделаешься.
153 1309144
>>08946
Д - документация.
154 1309297
>>09134
Это не особо хайлолад. Просто есть csv файлы которые нужно парсить раз в месяц. В самом большом файле 1.1милиона строк пока.
155 1309299
Подкиньте материалов по хуйло аду.
156 1309639
Authorizer.authenticate(() => {this.setState({redirectToReferrer: true})}) читаемый формат записи?

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

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

Authorizer.authenticate(() => {
this.setState(
{
redirectToReferrer: true
}
)
});
157 1309679
>>09144
Я нуфаг и ничего не понимаю че там написано
158 1309690
>>09679
Нет, ты просто ленишься и предпочитаешь задавать людям тупые вопросы вместо самостоятельных поисков.
160 1309694
>>08868
Бесполезная хуйня
161 1309696
>>09690
Бро ты прав как никто. Просто меня пугает документация т.к. раньше я вобще не понимал ни слова там и поэтому мне легче спросить.
Я посидел сейчас 5 блять минут в гугле и всё понял лол
162 1309699
Но так или иначе, официальную документацию мне всё равно сложно воспринимать. Я могу использовать ее как дополнение к объяснению от какого то живого человека.
Как с этим бороться?
163 1309708
>>09699

>Как с этим бороться?


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

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

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


Чтобы C++ дебилам было дегче стать Java дебилам.

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


Нельзя, получатся жестки связи, а это плохо.

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

> 2-х месяцев


Идешь на ВСЕ фриланс биржи, ищешь заказы на WordPress, берешь и делаешь сидишь по 8 и хуяришь, получаешь свои гроши.
168 1309785
>>09765
Могу попробовать, но с WP не особо дружу, да и не очень он мне нравиться. Как вариант, спасибо
169 1309814
>>09758

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

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



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

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



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

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

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

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

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

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 1309814
>>09758

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

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



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

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



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

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

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

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

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

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 1309887
>>09297

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


Очевидный import numpy as np, pandas as pd очевиден
171 1309980
Чет щас начал вкатываться в PHP после C и у меня ощущение что это тот же C только с ебанутым синтаксисом и поломанный к хуям. Пардон май фрэнч.
172 1309981
>>09980
так и есть
173 1309989
как меня трясёт от того что пхп не умеет с кириллицей работать, белые люди берут и просто кодят, а я с кодировками ебусь
174 1310071
>>09989
Привыкай это не только в пыхе, это везде.
175 1310117
>>09980
Держи в курсе
176 1310137
>>10117
Держу в курсе, соси классы свои долбоеб.
177 1310142
>>08685
Блядь, запарился уже. Всё перепробовал. Если просто выводишь получаемые данные в браузер и копируешь их, вставляешь в код и отправляешь через heroku же, то все работает. Вручную и через локальный сервер и без этого работает. А когда данные просто получаются извне и отправляются, то обрезаются до первого необычного символа. Все эти utf8_decode, utf8_encode, htmlentities - ничего не помогает, максимум - символы заменяются на &#353;. Как я ненавижу все эти кодировки.
178 1310150
А че можно почитать/посмотреть по базам данных? Книгу какую или видосики там.
Снимок.JPG17 Кб, 510x111
179 1310153
Помогач.
есть строка на входе. Ищу регляркой там дату в определенном формате. нужно к дате добавить например ЗАЛУПА.

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

Сделать:

предлагаю 10.04.2014 Залупа пообедать.
180 1310156
>>10153
угараешь?
181 1310161
>>10156
нет. Строку поиска регулярки составил вот в конструкторе. А что дальше делать хз.
183 1310169
>>10162
ну оно заменит полностью найденое совпадение, а мне надо добавить прост слово к совпадению.
184 1310170
>>10169
напиши регулярку, которая будет искать слово пообедать рядом с датой и замени его на залупа пообедать
185 1310171
>>10170
или можно просто заменить слово пообедать на залупа пообедать, без регулярок, че ты мозги ебешь
186 1310176
ЛАдно, пытался просто объяснить, чекните мое говно, почему оно не работает?
https://ideone.com/34FAk8
187 1310177
>>10137
Сосу свои классы и радуюсь жизни.
188 1310179
>>10177
А теперь глотни ка двойной массив который нахуй не нужен.
EeES3qxvWBU.jpg52 Кб, 960x540
189 1310181
>>10179

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

190 1310191
>>10170
Думал это легко сделать, но не тут то было, хыыы, придется массивы городить
191 1310199
>>10176
>>10191

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

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

Алсо почему у тебя авторайзер занимается аутентификацией? Почитай про разницу между авторизацией и аутентификацией: https://stackoverflow.com/a/6367931
193 1310305
JS задачки душные какие-то. Сижу третий час вдупляю в 4-ое
1342240872894.jpg51 Кб, 600x729
194 1310349
>>05368 (OP)
Как то тут уютно у вас, господа. Пожалуй пополню ваши ряды. Всем добра.
195 1310371
Че, поцоны, говорят пыха-то мертвый язык.
196 1310397
>>10349
Добро пожаловать!
197 1310423
>>10371
На нём говорили древние?
LlStdLGp.png10 Кб, 949x79
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";
?>

нормально не работает!Ни на сервере(у меня сайт есть), ни в онлайн интерпритаторе. Может кто-нибудь объяснить почему. Буду благодарен.
Screenshot2018-12-1307-36-36.png21 Кб, 652x142
199 1310437
>>10433
Потому, что пример нужно выполнить в консоли, через php-cli.
200 1310445
>>10437
спасибо , анон . Еще бы узнать можно ли это как то запустить на сервере? Ну реалньо, смотрю , полезная вроде книга, но даже первый код не запускается
202 1310447
>>10445

> даже первый код не запускается


фейспалп.жпг

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

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

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

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

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

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

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

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

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

Не знаю как проще обьяснить.
207 1310462
>>10450
Ну так а как ты с сервером общаешься?
208 1310463
>>10459

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

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

Да ради обучения можно сказать нужное ПО и все это запустить и тп. Но в конечном то итоге все равно все на сервере применять придется. И вот как этого добится? Может есть пособия где сразу на сервере показано?
209 1310464
>>10450
PHP - язык общего назначения.
210 1310468
>>10463
Начни с гайда в ОП-посте.
211 1310470
>>10463

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


Будет, просто у тебя знаний не хватает.

>И вот как этого добится?


Перестать задавать тупые вопросы и читать гайд ОП.

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


Иди нахуй
212 1310471
>>10470
UPD: ,иди читать
213 1310474
>>10464
но мне интересно применение на сервере

>>10459
просто , щас вот какой момент. В сети есть не мало материалов, про 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 выводит. То есть все подключились. А тут такая вроде элементарна функия и предупреждения рисует. Наверное я что-то делаю не так, но вот где написано что имено?
214 1310491
>>10474

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

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

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

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

>Я запускаю его так: 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 1310637
>>05368 (OP)
Друзья, хочу удалить строку из базы. Пишу запрос в пхп файле: "DELETE FROM db WHERE id_cat = 1". Результата ноль, ошибок тоже нет.

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

Вопрос: зачем после WHERE писать db.id_cat? Для чего нужно еще раз указывать название базы?
218 1310642
Оп и не только он, посоветуете книги какие по алгоритмам, или где ещё можно поучить их?
219 1310643
>>10642
Порешать онлайн:
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
220 1310650
>>10643
Спасибо.
image.png782 Кб, 958x570
221 1310672
Сап.Подскажите, как сделать нечто подобное? По сути я вывожу информацию из бд в нужный блок/блоки, но как это сделать в цикле?
222 1310676
>>09754
Надеюсь успел ответить, и мой ответ дойдет до тебя.

Если ты хочешь стать как можно быстрей востребованным юниором, то, возможно, с твоим объемом знаний стоит выбрать какой-нибудь фреймворк для 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.

И если ты так хочешь во фриланс, то может быть тебе лучше будет найти просто удалённую работу?
223 1310681
>>10676
иди толсти в другом месте, бротишь
224 1310682
>>10681
что толстого в посте этом, брат?
225 1310908
Уважаемые костылитаны. Так композер с грушей и прочие технологий нужно прям от зубов знать? Пиздеть не буду административку Шлинукса знаю, клитор могу развить, ебашил скрипты. Мне уже этот язык нравится, конечно кроме этих ебаных долларов, тот же С4 только немного уродливый, зависимости эти ебучие, все как в С4 только уебищно. Но радует что можно ебать байты. Ахуеть сколько куков.
226 1310911
>>10682
Я не он, но ты хуйню советуешь, настоящие масты идут в девопс, фуллстак. Ты сидишь в Пыхотреде и советуешь JS, ну не ебанутый? Без обид.
227 1310924
>>10911

>фуллстак


Это которые CMS обслуживают? Они кроме говнокода ничего родить не могут - знают всё, но самые азы.
228 1310934
>>10924
Я про тех что могут написать свой фрейм.
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 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);

сделать одним куском?
230 1310946
не вот эту проверку
231 1310948
>>10934
Не видел таких.
232 1310958
>>10945
Должно выйти через array_map.
Снимок.PNG171 Кб, 1359x662
233 1310976
>>05368 (OP)
Аноны, я почти доделал движок по видеоурокам.
Но блять где то в коде я сделал дамп сессии и теперь не могу его найти ааааааа
Вот что делать?
234 1310978
>>10976

из консоли:

grep -rni "var_dump" *

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

>RAINBOWTHEME


>RUNINTOTHERAINBOWTRACKRUNALONGWITHCAPTAINJACKD-RA-RO-DA-RI-RA-RO

236 1310983
>>10978

>из консоли:


У меня хостинг

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


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

>>10979
Да, я не скрываюсь
237 1310984
>>10945
Я бы сделал так:

$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 1311022
>>10676
Хорошо, как раз думал об изучении фреймворка какого нить. Да и 2 вариант понравился.
Спасибо.
239 1311029
Только вкатился. Зачем отбивать 4 пробела если существует tab?
image.png3,1 Мб, 1252x1252
240 1311037
>>11022

>Да и 2 вариант понравился.


Двачую, бротиш. Пацаны в жс треде подтвердили, учишь ЕКСПРЕСС + ВУЕ + МОНГО и со старда 300к минимум будешь получать на удалёнке. Говорят, будешь делать СПА с БОГАТЫМ АПИ и АСИНХРОННЫМ БЭКЕНДОМ и горя не знать. Работаешь, говорят, 3 часа в день максимум. Остальное время играешь в эксклюзивы и ссышь пукарям в /v на головы 4к скриншотами. В общем, все советуют подумать о будущем сразу вкатываться в НОД ЖС.
241 1311044
>>10976
Аноны, у меня в коде вобще нет print_r и var_dump. Я в шоке, как такое может быть? Хелп!
242 1311048
>>11029
Фича на в том какие педали ты там давишь. Все вменяемые редакторы имеют опцию ставить 4 пробела по нажатию Tab. Нужно для того, что бы код выглядел более менее одинаково, независимо от размера табуляции.
243 1311056
>>11037
Выучил alert и confirm, можно уже джс джуном идти устраиваться? Или еще надо html выучить?
244 1311081
>>10672

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

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

Жирным выделил то что является собственно php-кодом внутри твоего html кода. Надеюсь макаба не испортит разметку
Снимок.PNG13 Кб, 624x198
245 1311098
Ну и чего ты добился, ОП-хуй?
13925547362135986208.jpg153 Кб, 1000x1094
246 1311131
Недавно закончил свой первый проект на Yii2. Потратил довольно много свободного времени. Над описанием я особо не старался и комментарии к методам есть на русском языке, не бейте.

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

Если кому интересно, то очень помог вот этот курс:
https://www.youtube.com/watch?v=B1Q44OKh5YA&list=PLSdH7dYnlGYht0eGi9-14X87hrSl9plCc
247 1311135
Как написать программу с генерацией стихотворения? Перечитал начало урока (град информации без примеров, 95% не понятно как работает. Все предыдущие уроки были прекрасные) миллион раз, даже на предыдущий зашел. До этого задачи щелкал как орешки
Снимок.PNG38 Кб, 783x636
248 1311141
https://ideone.com/EzRrHO

Все что смог из себя высрать (И то случайно получилось)
249 1311153
>>11131
Ты типа фулстак какой то? у тебя в гитхабе и чето на реакте и yii2
250 1311155
>>11153
Да, так, баловался. На реакте делал проект, чуть не ёбнулся без Redux. Запутался в архитектуре и сделал кучу костылей. А так реакт, как view часть в SPA - это вещь
251 1311167
>>11155
Бля молодец.
252 1311172
>>11131
О, я тоже через пару дней начинаю. Сейчас закончил пхп старт. Дашь какое нибудь напутствие?
253 1311175
>>11172
Конспекты, ОБЯЗАТЕЛЬНО. Не большие, но по важным темам нужно делать. + читать хотя бы чуть-чуть литературы, которую он к урокам прикрепляет. Выполнять домашку, которую он даёт(не обязательно самостоятельно, можно опять же взять решение на сайте, но, при этом, разобрать всё, что он написал.)

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

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

Удачи
254 1311184
>>11175
Спасибо.
А вобще можно начинать к пхп ап, если из реальных проектов у меня только пхп старт?
255 1311193
>>11184
вполне, но могут быть проблемы
256 1311196
как в preg_replace изменить регистр символа следующего после точки?
257 1311213
Где искать норм фрилансеров пхп на снг биржах?
258 1311232
>>11213
На апворке не пробовал посмотреть?
259 1311245
>>11193
Спасибо, мужик
260 1311327
>>11098
да, кстати встречал в задачках учебника глупые моменты
261 1311419
>>11037

>и АСИНХРОННЫМ БЭКЕНДОМ


Ну-к, на этом моменте поподробней. Возможно ли делать с помощью Vue + React асинхронный server side rendering?
262 1311431
>>11419
Я ебу? Мне посоны в жс треде сказали... Иди у них спрашивай.
263 1311448
Почему все последние уроки связаны со строками которые у меня не работают на ideone? Столько информации вывалили, а как ее использовать потом не поймешь
264 1311465
>>11448
Ты можешь воспользоваться другой песочницей. Например https://3v4l.org/
265 1311467
>>11448
подними апач
Bin-Laden-Geronimo-600x928.jpg136 Кб, 600x928
266 1311473
>>11467
Не надо нас поднимать!
267 1311510
>>08331
бамп
268 1311566
Короче сделаю еще какой-нибудь круд с админкой на слиме и пойду ларавел учить. А то чет заебало столько времени учу, а до сих пор сижу без нихуя.
269 1311567
>>11566
что бы джуном вкатиться много знать надо? задачку про студентов осилил если чё
270 1311568
>>11232
Я хз, на апворке за далары всё.
271 1311571
>>11567
Я не знаю, анон. Я сам сделал студентов и файлообменник, плюс еще один говнопроект. Получается говнокод, но с каждым разом получше. Сейчас еще один круд сделаю и начну ларавель задротить. Ну и жс начну учить. Надеюсь к лету вкачусь.
272 1311589
>>11571
Ебать к лету...
А сколько времени в день ты тратишь на это?
273 1311593
>>11571
И какой у тебя план развития?
274 1311595
>>11589
Если пишу код, то могу целый день сидеть. Не знаю часов 8. А если я смотрю какие-нибудь видосы или читаю туториалы всякие, то гораздо меньше. Сразу лень становится и все такое. Короче 1-3 часа в день, если смотрю что-то и до 7-8 часов если пишу код.
275 1311601
>>11593
Сидеть учить PHP, Laravel, Js, в базах данных разобраться получше, чем просто делать самые простые запросы. Ну и английский. В алгоритмах разобраться хоть на каком-то начальном уровне, чтобы на собеседовании не обосраться. В конце марта - середине апреля уже начну искать работу, ну и просто по собеседованиям ходить (если меня на них пустят ваще, лол). А то типа я могу так и три года сидеть изучать всякую хуйню на васянском уровне, а потом даже джуном не возьмут.
276 1311658
Не смог осилить задачи на регулярки и соответсвенно сами регулярки (ОП вместо нормального урока решил посрать справочником, да и еще и в картинке, так чтобы потом нельзя было найти нужную информацию с помощью поиска)

Следующей задачей после регулярки идет задача "Чилса прописью". От нее я просто охуел. Я не знаю как ее решать. В моей голове вообще нету никаких идей и знаний от прочитанных уроков. Искать информацию в уроках ОПа невозможно. Что мне делать, искренне хочу научиться PHP
277 1311670
>>11658
А что у тебя конкретно не получилось. Пришли свои наработки, пиши вопросы
278 1311671
>>11658
Для поиска документация же есть, а у опа наглядные картинки, где выбрано основное и разжевано.
279 1311674
>>11595
Так же сижу - то практика день-два, то теории три. Поначалу так вообще сидел: 7 статей прочитай - одно говно напиши. Уже четвертый месяц так торчу.
280 1311770
>>05368 (OP)
https://ideone.com/WnhXAL
почему второй elseif не срабатывает?
281 1311799
>>11770
что за задача?
282 1311800
>>11674
Бля а я сижу читаю и одновременно ебашу код, тип проект есть нужно сайт с каким то функционалом до определенного времени создать (Это я для себя цель поставил) и я его сделать должен за месяц.

--мимокрок
Снимок.JPG8 Кб, 177x38
283 1311814
чёт у меня phpmyadmin к базе не цепляется, всё по туторам делал, примерно можете почуствовать что может быть?
284 1311816
>>11814
Мож какой то компонент права не может получить?
285 1311818
>>11816
Как это чекнуть? Алсо через командную строку всё myqsl исправно добавляет базы, проблема именно в phpmyadmin
286 1311824
>>11814

Напиши какого пользователя (пароль не надо) ты указываешь в phpmyadmin.

Затем в командной строке зайди в mysql под пользователем или под админом и выведи, какие права даны пользователю:

SHOW GRANTS FOR 'username'@'localhost';

или

SHOW GRANTS FOR CURRENT_USER;

Обрати внимание что в mysql права привязаны к IP адресу. То есть ты можешь дать одни права пользователю x, заходящему с localhost, и другие - пользователю x, зашедшему с 10.0.0.1
287 1311827
>>11824
Решил проблему, установил более старую версию пхпамйадмина и всё само заработало. Видимо в последней версии разрабы что то напортачили
288 1311854
>>11827
Мне кажется зря, мог бы просто через права все решить. Присвоить как тебе кот показал.
image.png64 Кб, 540x786
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++;
}
290 1312085
>>11799
число прописью, я там проверяю десятки и добавляю их в массив, но условие почему то не выполняется
291 1312349
>>11956
Эта задача сверху вниз слова пишет?
Там $key->$value лишний, можно на $line заменить
Вывод будет такой:
Д | К
ы | о
м | м
292 1312364
Не получается выровнять block по центру с минимальным отступом в 10px.
Помогите, аноны.
image.png34 Кб, 1894x803
293 1312365
>>12364
Такая бадья соответственно
294 1312379
сделал часть от задачи про число прописью
https://repl.it/@askarpro24/VivaciousFaithfulScandisk-1
не могу понять как использовать массив из 1й функции чтобы через foreach подставить из массива с (400,20,1) сделать (четыреста,двадцать,один), просто обратиться к массиву из другой функции я так понял нельзя.
295 1312400
>>12379
//В основном теле программы:
$result = numberToText(421);
$text = smallNumberToText($result,0);
echo $text;

//в smallNumberToText:
$translatedNumber = "";
foreach ($result as $num){
$translatedNumber = $translatedNumber . ' ' . $spelling[$num];
}
return $translatedNumber;
296 1312403
>>12364

Ну так у тебя нет правил, которые бы задавали центрирование. Элемент с блочным позиционированием можно отцентрировать с помощью трюка с margin = auto:

- http://softwaremaniacs.org/blog/2005/08/27/css-layout-flow/
- и немного тут https://github.com/codedokode/pasta/blob/master/html/positioning.md
297 1312405
>>12403
Пробежался по статейкам. Так там используется display, в задании сказано, что без него нужно делать. Или я просто тупой
298 1312406
>>12403
Бля, работает. Спасибо большое
299 1312408
>>12405

У блочных элементов вроде div по умолчанию стоит display: block, и явно это прописывать не требуется. Думаю, имелось в виду это.
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?
301 1312412
>>12410
Настоящие индейцы уже не декодируют полученные строки?
Прогони через
http://php.net/manual/ru/function.urldecode.php
302 1312414
>>12412

>http://php.net/manual/ru/function.urldecode.php


Я прогонял, няша. Он выдает мне списком все данные оттуда имя фамилия пол. А как вытащить конкретную переменную?
303 1312416
>>12414

Ты умеешь работать с XML и массивами в PHP? Если нет, то иди читай теорию, так как невооруженным глазом видно, что строка в XML.
304 1312417
>>12414

В PHP есть расширения DOM и SimpleXML для разбора XML данных.
305 1312419
>>12414

>как вытащить конкретную переменную?


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

>>12416

>XML


Там json, как я видел.
306 1312421
>>12416
>>12417
>>12419

Спасибо, буду читать мануалы по json decode
307 1312425
>>12400

>$result = numberToText(421);


>$text = smallNumberToText($result,0);


>echo $text;


спасибо, теперь разобрался как вызывать функции чтобы они массив возвращали
308 1312498
>>12410

заработало вот так:

<?php
$string = $_GET['api_result'];
$xml = simplexml_load_string($string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
echo $array['user']['sex'];
?>

Всем спасибо за совет, целую вас в аунсы каждого.
309 1312516
Что начать читать чтобы создавать простенькие сайты? Знаю основы php и html. Пока смотрю 8 часовой курс про регулярки - нужно куда-то двигаться.
310 1312519
>>12516

>8 часовой курс про регулярки


ебать
311 1312528
>>12519
Не, ну а чо. Уроков ОПа для решения его задач не хватает
312 1312541
>>12516
Сеньор Регулярка Девелопер?
313 1312600
>>12498

>json_encode


>json_decode


Ты сперва закодировал, потом раскодировал.

$response = $_GET['api_result'];

>рас


$json= urldecode($response);

>дфа


$result= json_decode($json,TRUE);

И готово.
echo $result['user']['sex'];
15328217184450.jpg29 Кб, 798x514
314 1312603
>>12516

>8 часовой курс про регулярки


Есть ссылка на курс? Может я чего упустил, когда за полчаса их освоил? Вдруг ими Абу можно унижать?
315 1312610
>>12519

Что плохого, что человек хочет нормально разобраться в предмете, а не проскочить и потом задавать вопросы, как извлечь текст из строки?
316 1312630
>>12610
Хочешь нормально разобраться - напарси говна через регулярки, а курсы хоть 24 часа смотри - без практики толку 0.
317 1312634
посоны, как вы синтаксис запоминаете? всё время приходится держать перед собой пример или гуглить документацию
318 1312654
>>12634
Никак. Пиши каждый день немного кода. Само запомнится до уровня автомата.
319 1312657
>>12603
Вот курс https://www.youtube.com/playlist?list=PLT0-cCYWU-_SIlYYwScRLLKpTRQlTqp1r
Ну скажите мне чего почитать чтобы делать что-нибудь типо этого http://php.net/manual/ru/tutorial.forms.php
320 1312660
>>12634
Так и запоминаем. В голове только часто используемые функции и основные операторы синтаксиса. За специфическими фичами приходится лазать в доки.
321 1312661
>>12660
Главное запомнить, что эти фичи вообще есть, чтобы не изобретать велосипед.
322 1312667
Как начать перебор foreach с начала, если какое-то условие не выполняется? Каким-нибудь goto?
323 1312674
>>12657
На хтмлакадеми фастом проходишь основы хтмл, там формы будут, потом у опа читаешь про http(get,post), как поставить wamp. Можешь ещё это все в видосах php start глянуть, тут советовали пару раз.
324 1312691
>>12667
Что то я не нашел вменяемого способа. Или упаковывают foreach в функцию и рекурсивно вызывают ее или упаковывают в цикл while.
0baa1b9fae6aec55bbb73037f3016001-xkcd-goto.png25 Кб, 740x201
325 1312696
>>12667
Короче, сам замутил чота такое. Делает 10 попыток и завершает цикл. Как раз сегодня про goto узнал.
$num = 0;
repeat:
foreach($list as $id) {
действия
if ($id == null) {
if ($num < 10) {
$num++;
goto repeat;
} else {$num = 0; break;}
}
}
326 1312697
>>12696
Забыл, что отступы убираются. А о том, что они превращаются в \t, я вообще не знал. Прастити.
327 1312701
>>12674

> опа читаешь про http(get,post), как поставить wamp.


Не понял. Это где?
328 1312706
>>12696
goto это пиздец...
329 1312729
>>12667
1. Можно вынести foreach в функцию и просто выходить из неё когда надо, сбрасывая его.
2. Посмотри на пхп.нет про итераторы-генераторы.

goto не используй вообще никогда - нинужно и говнокод.
330 1312737
>>12701
В шапке все ссылки есть, ищи.
331 1312763
>>06121
Пытаешься изобрести bnb?
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 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
)
333 1312911
>>12661
чёт обосрался. ебался с регулярками, оказывается в пхп есть функция filter_input которая заменяет длинную регулярку одним словом
334 1312952
>>12911
Постоянно такая хуйня.
335 1312992
>>12729
1. Не понял.
2. Еще сильнее не понял.
И я не понимаю, почему говнокод? Запись короткая, читается легко, работает хорошо.
336 1313019
>>12992

>И я не понимаю, почему говнокод? Запись короткая, читается легко, работает хорошо.


Потому что говнокод. Запись короткая, читается легко и все прочее - это пока у тебя скрипт на 10 строк. Если бы все скрипты были в 10 строчек, то ваще не нужно ни ооп, ни всякая другая хуйня, все сразу понятно. А так ты высрешь в процедурном стиле скрипт на 500 строк с бесконечными циклами, разветлениями и прочей залупой. А сверху еще приправишь это goto. И твой код нельзя будет без ящика водки прочитать.
337 1313026
>>12992

>1. Не понял.


>2. Еще сильнее не понял.


Учи ОПовские уроки - рано тебе ещё программировать.
338 1313031
>>13019

>И твой код нельзя будет без ящика водки прочитать.


Это заблуждение. Если писать говно, то и с ООП и без ООП говно будет. А если писать нормально, то и в процедурном, и в ООП, и даже с гоуту хороший код будет.
339 1313041
>>12696

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

То есть мы видим

if () {
...
}

x();

И понимаем, что независимо от того, выполнится if или нет, управление дойдет до вызова x() (если только там нет return или throw). А с goto логика выполнения может быть сколь угодно запутанной.

Также, у тебя не соблюдаются отступы.

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

Также, есть break. Если ты про него не знал, то тебе надо начать с перечитывания мануала по PHP.
340 1313042
>>12696

>Делает 10 попыток и завершает цикл


>Как раз сегодня про goto узнал


А про for ты ещё не узнал? Нахуевертил чёрт пойми чего. Выглядит так, будто ты меня в жопу этим кодом послал.
Лучше бы просто описал чего конкретно хочешь.

>>13031

>Если писать говно, то и с ООП и без ООП говно будет


Если человек дорос до использования ООП, то уже понимает зачем это и почему.

>даже с гоуту хороший код будет


НЕ-БУ-ДЕТ. Это низкоуровневая хуета из ассемблера.
Используют её 2 типа людей: 1 - дикие нубасы-говнокодеры, и 2 - годные спецы на диких и очень специфичных задачах, когда обычным методом выйдет хуже и сложнее.
341 1313047
>>13042

>Если человек дорос до использования ООП, то уже понимает зачем это и почему.


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

>НЕ-БУ-ДЕТ. Это низкоуровневая хуета из ассемблера.


Если используется так, что понятно что происходит, то почему бы и нет?
342 1313050
>>13047

>Мало кто правильно использует ООП.


Чего ты несёшь? Давай показывай тогда как правильно - код свой приведи, или кукаретик.

>Если используется так, что понятно что происходит, то почему бы и нет?


В твоём правильном ООП, ты хочешь сказать?
343 1313056
>>13050

>Чего ты несёшь? Давай показывай тогда как правильно


Правильно это как-то так: https://github.com/yegor256/takes

>В твоём правильном ООП, ты хочешь сказать?


Да в любом, где есть хоть немного императивного кода.
344 1313059
>>13056

>Правильно это как-то так: https://github.com/yegor256/takes


Там обычный ООП, пионер.

>Да в любом, где есть хоть немного императивного кода.


В приведённой тобой ссылке покажи.
345 1313061
>>13056
Алсо, это не твой код, судя по всему.

Нехорошо чужое воровать, пионер.
346 1313066
>>13056

>yegor256


>>13059

>ам обычный ООП, пионер.


кек
Асло как правильно использовать гото написано у МакКоннела в Совершенном коде, нехуй тут тупые дискуссии устраивать.
кро
347 1313068
>>13059

>Там обычный ООП


Ты даже не посмотрел что там внутри. "Обычный" ООП - это императивная хуйня. Взять какой-нибудь PHP фреймворк, CMS, мудл. Вот там типичный "обычный" ООП.

>В приведённой тобой ссылке покажи.


Там нет императивщины, там pure OOP.

>>13061
Не мой. Но я почти так же пишу.
348 1313070
>>13066

>кек


В чём его необычность. Давай рассказывай, а не кукарекай.
349 1313071
>>13068

>Но я почти так же пишу


Лул. А ещё ты лидер митол-группы.
350 1313082
>>13071
Ясно-понятно. У нас тут диванный кукаретик.
351 1313089
>>13082
Ты главное гото почаще ставить в код не забывай, ссылаясь на настоящий ООП и срать левыми ссылками в ответ на реквест пруфа своих навыков.
352 1313090
>>13047

> низкоуровневая хуета из ассемблера.



Читал про разработку первых электронных таблиц 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 имеет преимущество перед структурным программированием.
353 1313092
Помогите пожалуйста настроить ngnix. Ставлю сервер на виртуалке, всё установил, всё сделал по гайду, сделал сайт test-lemp.local. Захожу на него и вижу белый экран, хотя должен заработать index.php. Почему не работает? Хелп!
354 1313097
>>13090

>там, хоть и писали на ассемблере


Так это, по-моему, первое, чему учат программеров - наглядности кода, а goto тут явно расходится с парадигмой.
Да даже доморощенные макаки как-то понимают, что goto это путь в жопу и алкоголизм.
355 1313098
>>13090

>Приведи пример, где goto имеет преимущество перед структурным программированием.


Да хотя бы организовать быстрый выход из нескольких вложенных циклов. Есть, конечно, языки с чем-нибудь типа break n;
Но в питоне, например, нет такой конструкции, и гото тоже нет, лол, и приходится извращаться.
356 1313099
>>13092

>хотя должен заработать index.php


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

Сам недавно трахался, то только с апачем - есть убунта серв, ну типичный такой lamp, только пых там не заводится - модуль не подключается. А не подключается потому, что его нету в списке модулей, хотя ставил. Возможно это из-за того, что я php на консолько ставил изначально. Думаю снести всё это дело и поставить по гайду.
357 1313102
>>13092
А php-fpm то хоть поставил и запустил?
358 1313103
>>13098

>организовать быстрый выход из нескольких вложенных циклов


>goto


В аду заставляют работать с твоим кодом.
Красиво, наверное, выглядит этот бросок через десятки строк и конструкций, вникуда.
359 1313104
>>13103
Никогда не пишу больше десяти строк в одной процедурке. А уж в циклах и подавно.
360 1313107
>>13102
>>13099
Всё поцаны, я проебался с одной строкой в конфиге. 10 раз пересмотрел, написал в тред, а потом нашел ошибку. И у меня так вобще всегда.
Щас буду ебаться с установкой xdebug
361 1313149
>>13104

>не пишу больше десяти строк в одной процедурке. А уж в циклах и подавно.


>быстрый выход из нескольких вложенных циклов


Кто-то запизделся.
362 1313161
>>13149
Не, ну если брать во внимание строчки с одной операторной скобкой по PSR-2, то, таки, да, я напиздел, лол.
363 1313163
>>13161

>строчки с одной операторной скобкой по PSR-2


>из нескольких вложенных циклов

364 1313176
>>13163
Для имбецилов: по одной скобке на каждую строчку.
365 1313180
>>13176

>путает скобки и вложенные циклы


>юзает гото


>называет кого-то имбецилом


А ты шутник, как я посмотрю.
Иди нахуй, короче. А то ОП придёт и во флуде обвинит из-за тебя - мудака жопорукого.
366 1313197
>>13180
А ты, типа, не используешь операторные скобки при написании циклов?

Кроме того, я лишь сказал, что в гото ничего плохого нет, если его правильно готовить, а твое больное воображение нарисовало, что я его использую везде, лол.
367 1313213
опа
368 1313215
Ситуация такая, сначала было максимально интересно делать что-либо, но как только перешел на фреймворк, стало максимально лень, что со мной не так?
369 1313228
>>08331
Бамп
370 1313247
>>13215
Примерно та же ситуация. Интересных задач нету, а бессмысленное говно писать, ненужное никому, смысла нету. Вот и сидим как фуфелы.
image.png3,8 Мб, 1600x1284
371 1313262
>>13247

>а бессмысленное говно писать, ненужное никому, смысла нету


В айти будущее большое ждет тебя.
372 1313314
>>13262
Идёт четвёртый месяц изучения веб - мозги кипят, особенно вечером.
15396405250582.jpg160 Кб, 640x638
373 1313379
То чувство когда набросал лапши в редактор, на перспективу, а она с первого раза всё правильно отработала.
374 1313401
>>13247
почему нет треда совместной разработки? можно было бы вместе реализовать интересное говно, заодно получив опыт работы в команде
375 1313406
>>13314
так возьми отпуск. сходит в баньку с посонами. водовки наверни, блядей помацай
на ёбаной пыхе свет клином не сошелся
376 1313422
>>13379
Бля ахаха сделал мой день анон
377 1313426
Аноны кто-нибудь вкатился в этом году? Сколько искали работу? Что знали на момент вката? Были ли у вас какие-нибудь проекты нормальные? А то чет я уже заебался сидеть. Вдруг остальные уже вкатились со знаниями на моем уровне или не очень сильно выше, а я сижу сычую.
378 1313439
Аноны спрашивали, где нужны трейты? Их ведь не было в оригинальном ООП.

Вот, что мне в голову приходит:

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

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

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

Какие есть минусы?

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

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

trait LastEditLogger requires SomeBaseClass, SomeInterface, SomeOtherTrait.

Также, у трейтов нет конструкторов и нельзя сделать инициализацию.

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

function x(SomeTrait $y)

А вы, аноны, видите в таком подходе какие-то минусы? И видите другие применения трейтов? Поломайте голову, если хотите лучше разбираться в ООП.
378 1313439
Аноны спрашивали, где нужны трейты? Их ведь не было в оригинальном ООП.

Вот, что мне в голову приходит:

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

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

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

Какие есть минусы?

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

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

trait LastEditLogger requires SomeBaseClass, SomeInterface, SomeOtherTrait.

Также, у трейтов нет конструкторов и нельзя сделать инициализацию.

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

function x(SomeTrait $y)

А вы, аноны, видите в таком подходе какие-то минусы? И видите другие применения трейтов? Поломайте голову, если хотите лучше разбираться в ООП.
379 1313440
НАчинал с пхп потом перешел на нормальный язык Джава.
теперь мне опять нужно писать на слонике.
Я теперь не могу нормально относится к этому синтаксису. Что делать?
380 1313444
>>13439

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


А разве нельзя в трейте просто создать необходимы абстрактные методы? Тогда класс, использующих их должен реализовать эти методы.
Я-новичек-если-сказал-хуйню-не-бейте-лучше-обоссыте
381 1313451
>>13439
Inteface + trait>>13439

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


Тупое говно тупого говна.
Лучше это решать через композицию.
Сервисы, DTO.

>- трейт для добавления функционала в модели. Ну например, мы хотим в несколько моделей Доктрины добавить поля "когда и кто последним редактировал сущность". Это удобно оформить в виде трейта.


Да можно, типа TimestampTrait. Ток надо проверить сможет ли доктрина прочитать анотации в трейте.

>Какие есть минусы?


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

>>13439

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


Трейты можно в тайпхинте использовать.

>>13439

>И видите другие применения трейтов?


Interface + trait.

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

Пример использования:
https://github.com/igorw/evenement/tree/master/src/Evenement
381 1313451
>>13439
Inteface + trait>>13439

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


Тупое говно тупого говна.
Лучше это решать через композицию.
Сервисы, DTO.

>- трейт для добавления функционала в модели. Ну например, мы хотим в несколько моделей Доктрины добавить поля "когда и кто последним редактировал сущность". Это удобно оформить в виде трейта.


Да можно, типа TimestampTrait. Ток надо проверить сможет ли доктрина прочитать анотации в трейте.

>Какие есть минусы?


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

>>13439

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


Трейты можно в тайпхинте использовать.

>>13439

>И видите другие применения трейтов?


Interface + trait.

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

Пример использования:
https://github.com/igorw/evenement/tree/master/src/Evenement
382 1313508
>>13439
Нахуй оно нужно? Чтобы забить пробел между интерфейсами и наследованием: нет как множественного наследования, так и дефолтной имплементации у интерфейсов. Трейт - это код, который копипастится в твой класс с.

Вот тебе некоторый абстрактный пример:
https://ideone.com/jZYlWs
383 1313537
Анон, подскажи: IE не хочет открывать страницу в UTF8, упорно открывает в кириллице (windows), автовыбор отключен, в гугле ничего путного не нашел.
384 1313562
Аноны, что за хня со мной, 4тый месяц подряд учу программирование, каждый день увеличивал часы проведенные за компом, но последние две недели появляется странное чувство уже через час после того как
сел за комп , головокружение, затупы, как будто сильно нервничаю. Раньше сидел играл в ту же дотку по 5-8 часов к ряду и все было збс, а сейчас ни по прогать ни поиграть нормально не могу. Всего лишь 23лвл, может у кого похожее было, как фиксить?
385 1313576
>>13562
Возможно, микроинсульт схватил, сходи к врачу.
386 1313593
>>13562
Ыыы а у меня спондилез шеи в 20.
387 1313679
>>13562
шея\голова болит иногда? трещит шея если поворачивать?
388 1313761
>>13406
В пизду блядство и алкоголизм - я у мамы погроммист.
389 1313819
>>13679
Да, голова болит довольно часто если перестаю соблюдать режим, шея хрустит при резких поворотах либо когда наклоняю голову назад.
i-know-that-feel-bro.png31 Кб, 500x461
390 1313821
>>13819

>шея хрустит при резких поворотах либо когда наклоняю голову назад.

download.jpg3 Кб, 264x191
391 1313827
>>13819
Некогда обьяснять, мышцы твоей шеи в хлам после сидений(плюс ты наверняка напрягаешься и пережимаешь все что угодно), ложишься на ровное, вытягиваешься, на спине поднимаешь голову(как маленький ребенок если ты видел, когда он учится шею держать) 5-6 подходов по 5-10 секунд держания на весу
Чем выше держишь, тем легче, со временем можно будет совсем немного поднимать и это будет обеспечивать хорошую нагрузку
На животе руки по швам смотришь вниз(не вперед) - то же самое делаешь, аля маня учится ползать в кроватке в годик
Через недельку должно быть полегче, ключевые слова "нестабильность шейного отдела позвоночника"
Делаю постоянно перед сном, если совсем пиздец можно погреть в ванной
цэпэ! тоже делает упражнениее второе
392 1313830
>>13819
Шейный остеохондроз, бро.
393 1313838
>>13827
>>13830
Спасибо за советы, но думаю это одна из проблем. Такая вещь как тут >>13562 еще происходит если выпить кофе/какао. У врача был, поставил ВСД, но в интернетах пишут что этот диагноз все совковые врачи ставят, а на платных еще не заработал.

Еще на счёт шеи, может какую гель/мазь посоветуйте?
394 1313840
>>13838
Извиняюсь сразу за оффтопы, просто это решает судьбу, не представляю как я буду работать по 8 часов в офисе если дома не могу и 2-3 часов нормально поучиться.
Сами темпы обучения идут быстро, планирую уже через 6-8 месяцев искать работку
395 1313849
>>13838
У меня была подобная проблема. Занялся легким спортом и она ушла. Сейчас забросил и периодически проблема возникает.
396 1313855
>>13838
Мази все хуйня, укрепляй мышцы регулярными несложными упражнениями, чай можно не пить, всд хуйня, начинай думать о здоровье, вон космонавты тоже по кайфу чилят в невесомости, но потом если не будут там заниматься по пизде сразу всё пойдет как спустятся, те же перегрузки отсутствием нагрузки
всд + па стаж 5+ лет
397 1313930
Анончики как вкатится в пхп,если нихуя не знаешь?
398 1313931
>>13930
Шапка опа.
399 1313959
CentOS7, Apache2.4, PHP7.2
Посоны, есть такое желание: получать переменные окружения для всех сайтов на хостинге (сайтов много - больше 50) из одного источника, не копируя в каждый виртуальный хост apache.
Но веб-сервер ограничен в правах и не может получать переменные окружения из /etc/profile.d например.
Как быть? Как делают гуру?
400 1314047
Вопрос, нахуя нужен JS для php прогера?
401 1314048
>>14047
нигде не нужен чисто пых прогер, обычно нужно знать пых, хтмл, жс и прочую малафью
402 1314049
>>14047
Грань между бекендом и фронтом щас размывается. Можно хуярить всё на одном языке (js). Ты со своим "онли пхп" уже динозавр.
Снимок.JPG17 Кб, 1783x144
403 1314063
да как этот ебучий список нормально сделать?
Снимок1.JPG41 Кб, 1454x744
404 1314065
вот такая дрянь
405 1314078
>>14048
>>14049
То есть если я просто хочу клепать сайтики на bitrix, wordpress за дошикм, надо столько всякой ебалы знать? Мне js с его ебанутыми промисами, коллбэками как-то не зашел
406 1314098
>>13959
Используй виртуализацию. Погугли например про docker-контейнер.
407 1314099
>>14078
Да дохуя знать надо. Может если только ты выпускник вуза какого-нибудь в Москве, можешь изи вкатиться на джуна. Там вроде вакансии есть с требованиями аля знать синтаксис php. А так ебашить придется и учить много хуеты. Я сам начал джс учить потихоньку так лень пиздец.
408 1314104
>>14063
>>14065
Покажи код!

>>14078

>То есть если я просто хочу клепать сайтики на bitrix, wordpress за дошикм, надо столько всякой ебалы знать?


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

Моё личное мнение, JS для проектов на таких помойных фреймворках обладает таким же низким уровнем вхождения. А промисы и коллбэки, это не конкретная специфика JS и есть в любом языке. Понимание этого зависит от твоего общего уровня программирования. Коротко говоря, моя мысль заключается в том, что ты можешь изучить и JS, и это так же легко как html/css для твоего выбранного уровня.
410 1314107
>>14106
А что в массивах находится показать? Пожалуйста, старайся выдать максимальное количество информации о своей проблемы за один пост, дабы не разводить флуд.
412 1314117
>>14104

>Моё личное мнение, JS для проектов на таких помойных фреймворках обладает таким же низким уровнем вхождения.


Там весь Джай Асс - прикрутить Джай Куэри и поназначать селекторы для эффектов. Где там программирование вообще? Мартышки отлично справляются тыкая наугад.
Уровень ПХП там точно такой же.

мимоковырятель вордпресса палочкой
413 1314128
>>14117
А какие вообще задачи по вордпрессу ты делаешь? Плагины новые создаешь или че?
414 1314133
>>14108

>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 1314133
>>14108

>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, то прочитай шапку этого треда, там много полезных ссылок и задач от которых твои навыки просто взлетят вверх.

Можешь свободно задавать любые вопросы если они появились.
415 1314135
>>14133

>и закрываешь эту строку </tr>*


Опечатался.
416 1314141
>>14128
Или че.
417 1314312
>>13537
Решилось комментированием строки
#AddDefaultCharset windows-1251
в конфиге денвера
418 1314364
Как передать свойство с одного класса в метод другого класса? Только статик?
Снимок.JPG23 Кб, 827x376
419 1314368
>>14133
Слава аллаху отзывчивому анону, не знал что так можно делать, только сейчас узнал о функции array_combine
mb problem.jpg84 Кб, 776x856
420 1314425
Почему мне 2 выдает заместо 1 ? Мультибайто-проблемы? Но я же указал флаг /u , че ей не нравится?
http://sandbox.onlinephpfunctions.com/code/34c2e0e95accd4a9551b591f8b10745da88877bd
421 1314426
>>14364
Статические сущности - корень зла.
422 1314444
>>14364

Через аргументы:

$otherClass->method($this->property);
423 1314454
>>14426
>>14426
Да нифига. Просто группировка переменных и обрабатывающего их функционала в один пакет.
Тот же класс для дебага удобно в виде статика использовать - всё включается и выключается в одном месте, и смысла в инициализации тут нету.
Другое дело, когда всё на ней пишут - тогда пиздос.

Типичная аксиома Эскобара короче.
424 1314512
>>14047
Потому что JAMstack
425 1314514
>>14454

>Просто группировка переменных и обрабатывающего их функционала в один пакет.


Инкапсуляция, конечно, всегда хорошо. Но статические сущности в ООП не нужны.
426 1314584
>>14514
Речь не об ООП, а о хелперах, намертво прикрученных к приложению.
427 1314623
>>14426
А что лучше? Дублировать одинаковый код?
428 1314674
>>14623
Пересмотреть архитектуру приложения.
429 1314762
А правда ли, что для программирования на пхп нужно быть еще и дизайнером и верстальщиком?
430 1314788
>>14762
В днищеконторах только если.
Видишь такую - укатывайся подальше.
laravel начинающий бог в треде 431 1314797
спрашивайие
432 1314804
И сразу накидайте пошаговую инструкцию для линукса чтоб поставить все двумя строчками. lamp уже стоит, если что.
433 1314805
>>14797
Есть два стула: один - с толстыми контроллерами, другой - на статиках сделанный. Что себе оставишь, что на собес отправишь?
434 1314807
>>14804
Как положено заходить в опен спейс? Если тебе под ноги кружку печенек кинут, что надо делать?

Как определить тимлида, где его рабочее место должно быть?
435 1314808
>>14805
Буду ебашить лапшу кода покамест монстр не разрастется до размеров галактики, а потом сьебну на другую работу мидлом. И так до сеньора с 300к в день.
436 1314809
>>14807

>Как положено заходить в опен спейс?


на гироскутере

>Если тебе под ноги кружку печенек кинут


сразу же спросить где тут смузимашина свежайшего смузи испить

>Как определить тимлида, где его рабочее место должно быть?


ближайшее к смузимашине
437 1314810
>>14808
А не боишься, что тебе неперезвонят с такими закидонами? Пойдёшь веслать в козлиную галеру.
438 1314813
>>14809

>смузимашина свежайшего смузи испить


С этим - к гламурным питорастам. У ПХПшников за это не погладят - у нас народ суровый и прожжёный.
439 1314818
>>14813

> у нас народ суровый и прожжёный.


одним словом уёбки-ноулайферы

>>14810

>не перезвонят


мне похуй, хуже веб-макаки профессии нет
440 1314819
>>14818
Ты не вкатишься.
441 1314820
>>14819
б-г миловал
442 1314821
>>14820
Это вообще шениально - называть людей неизвестной тебе профессии уёбками и макаками.

>б-г миловал


Веб от тебя.
443 1314822
>>14821

>Это вообще гениально


А ты подумой почему среди айтишнегов нет гениев? Тотоже!
444 1314855
>>14818
Этот лев.
Day014-LocationWidget[1].jpg722 Кб, 1000x800
445 1314886
Анон, а как сделать фон и поверх него блок с тем же фоном только без «зетмнения», как на пике?
446 1314894
>>14886

Самый простой способ - просто сделать 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 для проверки.
447 1314895
>>14818

>уёбки-ноулайферы


Вот какое тебе дело до чужой личной жизни? Ты ебаный вуерист извращенец?
448 1314949
>>14895
На самом деле у него всё ещё хуже:
1 - он жирный-пассажирный, который за каким-то хреном залез в пхп-тред и троллит тут. Уж точно не от избытка общения такое делают.
2 - он не жирный, а просто идиот, который залез в пхп-тред из-за нехватки дураков в /б.
449 1314972
369-448

>>14454

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

>>14425

Флаг u говорит о том, что шаблон для поиска и строка в кодировке utf-8. Увы, он не влияет на тот факт, что PREG_MATCH_OFFSET возвращает смещение в байтах, а не символах. Русские буквы занимают 2 байта.

Если тебе принципиально надо перевести байты в символы, то это можно сделать через mb_strlen(substr(....)), используя тот факт, что функции без mb_ работают со смещением в байтах. Вырезать кусок строки, указав смещение в байтах, и найти его длину в символах.

>>14368

Это все хорошо, но не храни пароли в открытом виде, а храни соленый хеш от них: https://github.com/codedokode/pasta/blob/master/security/password-hashing.md

>>13537

Надо указать кодировку заголовком Content-Type или тегом meta charset. Не стоит использовать устаревшие однобайтовые кодировки вроде 1251, в них, например, нет эмодзи и многих других символов.
450 1314973
>>13959

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

>>14098

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

>>13508

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

>>13451

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

> 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 1314973
>>13959

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

>>14098

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

>>13508

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

>>13451

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

> 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, мне не очень нравится. Но это мое мнение.
451 1314974
>>13444

Да, можно.

>>13426

Поищи сам в архиве: https://phpclub.tech/search/?q=устроился

>>13401

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

>>13247

А что для тебя было бы интересно?
452 1314975
>>13228
>>08331

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

> $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 1314975
>>13228
>>08331

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

> $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-файла.
453 1315134
Насколько сложно сейчас(конец 2018 года) найти работу php junior во Львове?
454 1315142
>>14894
Спасибо тебе огромное и побольше здоровья.
455 1315175
>>14972

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


У меня ПХП как консольное приложение крутился - вывод прямо на экран в реалтайме.

>var_dump


Если у тебя скрипт 10 строк, то да, а если под 300? Задолбаешься потом это вар_дамп выковыривать из кода.
456 1315176
>>15175

>а если под 300?


На каждый модуль, размазанные по файловой системе, в смысле
457 1315179
>>14886
А еще можно открыть source и посмотреть как там это сделано.
458 1315215
>>14975

> Возможно, было бы лучше использовать 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, в которой даты не иммутабельны и разработчики писали пост с извинениями за то, что сразу не сделали нормально. Сейчас уже слишком поздно что-то менять из-за обратной совместимости, поэтому приходится постоянно клонировать даты.
459 1315228
>>15215

Вообще, да, справедливое замечание. Не стоит тогда менять DTImmutable на DTInterface.

Я ловил себя на мысли, что эти классы не очень совместимы, но как-то глубоко не думал.

Действительно, интерфейс определяет не только названия методов, но и определенные требования к ним. И неправильно, когда одна реализация modify создает новую сущность, а другая - модифицирует существующую. Трудно написать интерфейс, который корректно работает с обоими типами.
460 1315230
>>15179
Это изображение, лол.
461 1315231
>>15228

* трудно написать код, который корректно работает с обоими типами
462 1315258
>>05609
екземпл
463 1315297
Отпишитесь, кто работает на пыхе в ДС. Сколько получаете?
464 1315300
>>12630
Вспомнил свою спам-молодость.
И только попробуйте мне пиздануть, что нельзя парсить HTML регулярками — я напишу регулярку в 10 раз быстрее, чем вы будете подключать свою нескучную либу от васяна (которая ещё и поперхнется при первом нарушении формата) и этого будет достаточно для 98% задач.
465 1315365
как же блевотно на чистом пхп писать сайт
466 1315369
>>15365
Держи нас в курсе.
Фреймворк 467 1315498
Зимой будет долгий отпуск. Планирую ознакомиться с парой фреймворков. Сам работаю с ларой.

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

И еще вопрос. Какой фреймворк считается самым тру? Симфони вроде как?
468 1315598
>>15498

>


Необходим дохуя простой фреймворк.
Slim/Silex.

> Какой фреймворк считается самым тру?


Zend > Symfony> Yii > ...
469 1315653
>>15598
Чем плох Laravel?
470 1315667
>>15653
Ничем.
471 1315670
>>15667
медленный,самый главный тормоз
472 1315713
Аноны! Дайте советов мудрых по теоретическому вопросу.
Есть некий сайт с видео на пример возьмём паблик вкакахе. Нужно написать скрипт, который будет выкачивать видео оттуда и заливать на фтп. Пхп с этим справится? Если что, каждое видео открывается в новом окне. Скачивание вручную происходит путём ПКМ->Сохранить видео как...
473 1315715
>>15713
Да, вполне справится.
474 1315784
Можно ли в пхп работать с тредами и нужно ли это вообще?
475 1315838
Не могу заставить Slim работать ни на локалхосте, ни на хостинге. Выдает Page Not Found.
Вот код index.php:
<?php
require 'vendor/autoload.php';
$app = new \Slim\App();
$app->run();
476 1315851
>>15838

htaccess настроил как в документации?
477 1315857
>>15851
Нет. Настроил по видео https://www.youtube.com/watch?v=TcFUNG7M3VE&t=554s хостинг выдает ошибку
478 1315865
>>15297
100к
479 1315866
>>14972

>PREG_MATCH_OFFSET возвращает смещение в байтах


Спасибо за развернутый ответ!
480 1315868
>>14973

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



Понятно, дальше не читал.
481 1315931
>>15868
Да, придётся подтянуть матчасть чтобы понять что написано.
482 1315955
>>15851
Все я разобрался
483 1316084
>>14975
Спасибо за замечания!

>Комментариев, мягко, говоря маловато


Понял, сделаю

>А зачем этот id?


Переделаю

>Интересное решение.


> $currentTime->modify($ordinal.' '.$spelling[$dayOfWeek].' '.$this->time);



Что-то не так? Есть вариант с $time-add(DateInterval::createFromDateString('параметры')); , но он выглядит слишком массивно и по-моему имеет какой-то подвох.

>Здесь есть проблема: если ни один день недели не выбран, то массив будет пуст и произойдет ошибка



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

У меня возник вопрос насчет функции setAlarm. Как она в нынешнем виде (замена объекта на объект) может пригодиться в реальном проекте? Ведь можно завести метод getAlarms():array и настраивать нужный нам объект выбрав его из массива. Это нарушит принцип solid?
FUMk8eNINX8.jpg34 Кб, 369x604
484 1316130
>>05368 (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 объект профессии, который может быть у каждого работника уникальным или наоборот у всех сотрудников одной профессии в компании он будет одинаковым.

Буду благодарен за подсказки. Возможно я ещё не дорос до уровня на котором стоит пытаться вникать в паттерны?
FUMk8eNINX8.jpg34 Кб, 369x604
484 1316130
>>05368 (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 объект профессии, который может быть у каждого работника уникальным или наоборот у всех сотрудников одной профессии в компании он будет одинаковым.

Буду благодарен за подсказки. Возможно я ещё не дорос до уровня на котором стоит пытаться вникать в паттерны?
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>... и так далее.

Короче пройтись по всему массиву, сделать по сути смещение на единицу и вывести с таким синтаксисом?
486 1316164
>>16154
Даже не так лучше, анончики, простите: нужно просто вывести карту сайта в виде всех страничек (то есть просто вы ключи из массива без значений):

<?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 1316164
>>16154
Даже не так лучше, анончики, простите: нужно просто вывести карту сайта в виде всех страничек (то есть просто вы ключи из массива без значений):

<?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>
487 1316170
>>16164
Тут по хорошему нужно бы разнести на несколько файлов и реализовать хотя бы примитивный темплейт, но если "хуяк хуяк и в продакшн" то как то так:
<?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() . тут нужно будет читнуть мануал по массивам
*/
14572086925030.jpg81 Кб, 604x604
488 1316175
>>16170
Спасибо большое! Сделал твой вариант в виде html и сделал xml по этому коду: gist.github.com/artlung/210438

Все получилось.
489 1316200
>>08014
array_reduce();
490 1316210
Нужно ли пхпшнику задротить JS?
491 1316243
>>16210
Необязательно, но желательно. Зависит от того, чем ты хочешь заниматься.
492 1316273
>>16210
Если и лезть в эту тему, то с головой, не стоит относится к этому ЯП с пренебрежением или с отвращением. Подойдите к этому как к навыку работы с еще одним инструментом, который заслуживает отдельного внимания и детального изучения. К тому же, изучение JS приведет к встряске устоявшихся ментальных конструкций, полученных при изучении PHP.
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 раз. Я делаю это исключительно в целях обучения.
494 1316325
>>16313
Мудак ты ёбаный, ну есть же json, нахуй тебе парсить хтмл?
495 1316333
>>16325
То есть мне надо кодировать всю страницу в json, найти там нужные мне блоки, записать их, а потом раскодировать?
496 1316336
>>16333
Кодера найми просто и он всё сделает за день. Сам ты неделю возиться будешь, мозг сломаешь, и не факт, что результат будет.

А так ты ересь несёшь.
497 1316337
>>16325
Если там мускул, то жсон не нужен - прямо с базы можно брать данные.
498 1316340
>>16336
Бро ты чего какой злой? Я учу пхп, хочу понять как мне запарсить блоки, вот и спрашиваю.
499 1316343
Найс, посоветуйте книг
500 1316344
>>16340
Почему я злой? Нормально общались вроде.
Если сайт твой - парсить его выдачу смысла не имеет и создаёт лишнюю нагрузку.
Проще запрос к БД составить и получить свой массив куда надо. Ну или API с json прикрутить, но тут долго пыхтеть будешь.
501 1316346
>>16344
Мне не принципиально с какого сайта парсить, хоть с яндекс ньюс. Просто у меня есть свой сайт, который я написал сам, мне проще парсить с него.
Цель - научиться и понять как вытаскивать блоки с одинаковым классом и записывать информацию из них в массив на чистом пхп.
На данный момент я запутался.
502 1316478
Спаси и сохрани
Screencast from 12-27-2018 10:30:07 AM.webm479 Кб, webm,
1920x1080, 0:11
someApprentice 503 1317102
Как вам код? Мне очень нравится.
504 1317103
>>16346
Получаешь страницу, парсишь регулярками по ситуации. Или какой-нибудь либой, которая уже умеет прекрасно работать с дом. Вероятно соснешь на динамичном контенте, придется выкручиваться.
505 1317107
>>17102
жмот
screencast.mp4633 Кб, mp4,
1920x1080, 0:30
someApprentice 506 1317143
507 1317353
Аноны, подскажите, можно-ли сгенерировать новую папку на PHP, если можно, то как?
508 1317356
>>17353
mkdir
509 1317362
>>17356
Спасибо.
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(). Не понимать. Функции для пхп можно как то доустанавливать?
511 1318327
>>18313
Разобрался. Надо было установить mbstring
Почему так происходит? Почему надо что то доустанавливать в пхп лол?
VirtualBox + MySQL 512 1318338
Хз где спросить. Спрошу у вас.

Есть необходимость иметь отдельный виртуальны сервер под MySQL (в моем случае MariaDB).
Настроил все на VirtualBox. Проблема в том, что соединение с хоста происходит очень долго. Кто-то может пояснить почему и можно ли это исправить?

На виртуалке использую ubuntu server 18.04 и виртуальный адаптер хоста со статическим ip. Виртуальный адаптер хоста нужен для того, чтобы с базой можно было соедениться как с хоста, так и с других виртуальных образов.

Я тупой, поэтому если кто знает в чем проблема поясните на пальцах плез
513 1318356
>>18338
Вопрос решился очень просто
514 1318400
Двощь, помоги мне.
$x = 2;
echo "$x $x = ($x$x)\n";
Мне нужно, чтобы выводило 2 2 = 4, а не 2 2 = (2*2)
515 1318401
>>18400
Блядская разметка.
Мне нужно, чтобы выводило 2 умножить 2 = 4, а не 2 умножить 2 = (2*2)
516 1318404
>>18400

Заведи новую переменную, в нее помести результат умножения и эту переменную подставляй в строку. В строку нельзя вставлять выражения.
517 1318405
>>18404

>В строку нельзя вставлять выражения.


Очень жаль. Спасибо.
Grade-Middle.png76 Кб, 730x738
518 1318406
В два треда закинул, сюда тоже закину
Ну что, погроммисты, можете сдать грейд на мидла?
Screenshot20181229183929.png1 Кб, 211x48
519 1318420
>>18404
Въебал бы тебе с ноги

>>18400
520 1318436
>>18420
Въебал бы тебе за щеку за тупые выебоны на детской теме. Кодер из тебя дерьмо, если ты экономишь переменные в ущерб читабельности.
521 1318502
>>18406

Выглядит как набор обязательных знаний для любого разработчика. А, кстати, в вебе применяется паттерн Команда? Мне на ум в основном приходят примеры вроде редактора текста, где бы подошел этот паттерн.
522 1318503
>>18420
>>18436

Замечание справедливое - можно подставить результат выражения в строку через конкатенацию (я бы добавил скобки, чтобы не гадать о приоритетах выражений), но, увы, если его подавать в такой манере, то впечатление производится крайне негативное. Давайте вести себя культурнее.
523 1318518
>>18503

>Давайте вести себя культурнее.


Да я, вроде, старался в стиле поста ответить. Но ты прав, пожалуй.
524 1318575
>>18356
Расскажи как
525 1318633
В пыхе можно замутить нормальные дженерики каким-нибудь расширением?
Есть rfc, но это лишь бумажка для подтирания жопы, которой уже подтерлись.
Нужен какой-то реальный рабочий код или мод языка
526 1318647
>>18406
На Сениора и Июня
527 1318654
>>18406
>>18647
Какая-то хуита. Вообще ничего нет про виртуализацию/контейнеризацию и системы деплоя.
Нихуя нет про сети кроме "http протокол".
При этом вопросы по БД на более высоком уровне, чем требуется при разработке 95% говносайтов.
При этом еще и чисто под SQL заточены, судя по всему.
Я уж молчу про отсутствие требований знаний структур данных и алгоритмов.
528 1318656
Нихуя не могу найти блять.
Можно ли в пыхе изменять область видимости члена класса при наследовании?
529 1318678
>>18575
В настройках всего этого сетевого говна (в убунте 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
Screenshot10.png16 Кб, 979x169
530 1318682
Насколько я конченый?
531 1318705
>>18656

>область видимости члена класса


Какого ещё члена? Ты класс объявляешь или объект этого класса? И причём тут наследование?
Ничего не понятно из твоего поста.
532 1318707
>>18656

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

А вообще, почему бы тебе не сделать эксперимент? Сделай 3 базовых класса с 3 разными видимостями полей, для каждого по 2 наследника, где видимость меняется, чтобы были все комбинации. И тогда обсудим, почему так выходит.
533 1318708
>>18707
>>18705
Уже сделал.
1. В пыхе нельзя менять область видимости членов класса.
2. Можно объявить в дочернем классе член с таким же именем и увеличить ему область видимости, но это будет не тот же самый член, что в базовом классе, а новый член, прост с таким же именем. Значение не копируется.
При этом если уменьшить область видимости члена с идентичным именем, то выкинет фатал еррор.
534 1318714
>>18708

private члены класса видны только в нем. Если ты хочешь расширить область видимости, надо брать в базовый класс protected, а в наследнике делать public.
Screenshot11.png3 Кб, 455x78
535 1318727
Почему я не могу задать в возвращаемом тайпхинте сразу дочерний класс?
При этом фактически я возвращаю дочерний и далее из метода возвращается полноценный дочерний объект.
Но если задать тайпхинт на дочерний, пых падает с фатал-еррором.
536 1318734
>>18727

Это случайно не связано с багом, который описан тут:

- https://phpclub.tech/pr/res/1305368.html#1308865
- https://phpclub.tech/pr/res/1281608.html#1297483

То есть когда ты в наследнике сужаешь возвращаемый тайп-хинт? Расширять его нельзя из-за приципа Лисков, а сужать можно, но PHP не позволяет.
537 1318743
>>16130
Up!
Снимаю все вопросы, кроме.

>Надеюсь принципы ООП не запрещают иметь внутри объекта Employee объект профессии, который может быть у каждого работника уникальным или наоборот у всех сотрудников одной профессии в компании он будет одинаковым.



Объект профессии не имеет смысла в системе без объекта сотрудника, получается его нужно создавать внутри конструктора сотрудника? Композиция, так кажется это называется.
538 1318750
>>18734
Да, сужаю. В 7.2 подвезли какой-то костыль для этих дел, но это бред
https://wiki.php.net/rfc/object-typehint
539 1318783
>>18633
Дженериков нет и не будет. Даже если будут, всё перечёркивает динамическая натура 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. Тем, кто писал только на динамических языках, нас не понять.
540 1318793
>>18783

>статический анализ


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

>кто писал только на динамических языках, нас не понять


Нахуй вообще нужны динамические языки? Для домохозяек? Что б тип было "проще" писать?
Они всегда генерят только гораздо больше проблем, чем дают профита.
Точнее лично я вообще ни вижу какие весомые преимущества могут быть в динамической типизации.
Это просто бесполезная тупая хуйня, кто это придумал вообще, пиздос...
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.


В одном месте скобка на той же строке, в другом блядь на следующей. В одном месте есть пробелы возле скобок функции, в другом нет.
Какой говнарь это писал?
542 1318813
>>18812
Ооо блядь, там и группового форматирования полей и переменных нет. Фу блядь, фу нахуй.
Жрите вы сами это говно, я ебал.
Стандарт-хуедарт, в рот ебал это казино блять, так им и передайте.
543 1318821
>>18793

> вообще ни вижу какие весомые преимущества могут быть в динамической типизации


Это удобно тогда, когда вся программа может уместиться в голове: https://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two

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

> Ну это же костыль, причем лютейший, чет уровня "тайпхинтов в комментах".


Зависит от реализации, например Flow для JS это статический анализатор, но по мощи и удобству использования он обходит многие статически типизированные языки вроде джавы благодаря выводу типов. Только вот за анализаторами для JS стоят крупные компании - Facebook и Microsoft, анализаторы для PHP пишут энтузиасты в свободное время.

>>18813
Поставь php-cs-fixer, сделай его precommit-хуком и не парься.
544 1318879
>>18793

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

Сайт ОПа например представляет собой HTML-страницы с небольшой обвязкой на PHP (для вывода меню, подвала, ссылок итд), слепленной за один вечер.
545 1318899
Двощь, дай совета!
Мне каждый шаг цикла нужно записывать процент от суммы кредита, чтобы в конце посчитать потраченную сумму общую. Как мне это сделать?
https://ideone.com/l2f86A
546 1318938
И ещё вопрос.
Почему переменная $number увеличивается всего на 1?
https://ideone.com/3f1uxG
547 1318940
>>18938

>https://ideone.com/3f1uxG


Потому что рост анона больше только по сравнению с Семеном, а остальных меньше.
548 1318941
>>18938
Тут уже я просто затупил. Элементарно не так значения переменных сравнивал.
549 1318942
>>18940
>>18941
Да, я уже увидел, спасибо.

Вот это ещё интересует
https://ideone.com/l2f86A
550 1319120
Оп, спасибо за то что ты делаешь. Зашел сюда, так как 2 года назад, я работал в мухосране, за 20к и постояно душила нехватка денег, неинтересная работа и я решил попробовать что то изменить, перекатившись в ит. И выбор пал на php, благодаря твоему сайту и твоей постоянной помощи. Сейчас же хоть все проблемы и не ушли, но у меня уже нет проблем, с тем что не хватает денег или я не вижу своего будущего. Работаю мидл php девелопером, учу низкоуровневый язык и проблемы с острой нехваткой денег или самореализацией отпали. Все началось с тебя, так что огромное тебе спасибо.
551 1319165
>>19120
пили кулстори, мотивируй
552 1319167
553 1319199
>>18899
Бамп вопросу
554 1319214
>>18647
Все изи, как-то даже не густо, но вот по бд накрутили лишнего помоему, обычно эти тонкости мало кто знает до реального опыта проблем. + nosql обязательно, хотя бы парочку популярных на общем уровне.
555 1319223
С наступающим, программисты! ОПу огромное, человеческое спасибо помощь и терпение к тупости ньюфагов.
php-noob-01-new-year.png88 Кб, 500x500
556 1319266
448 - 555, 247 - 369

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

>>18942

> $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.

>>18899

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



Лучше по-другому:

- считаем, сколько набежало процентов
- прибавляем к долгу
- считаем, сколько мы заплатим в этом месяце
- уменьшаем долг
- увеличиваем сумму потраченных денег
php-noob-01-new-year.png88 Кб, 500x500
556 1319266
448 - 555, 247 - 369

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

>>18942

> $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.

>>18899

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



Лучше по-другому:

- считаем, сколько набежало процентов
- прибавляем к долгу
- считаем, сколько мы заплатим в этом месяце
- уменьшаем долг
- увеличиваем сумму потраченных денег
557 1319267
>>18812

Стандарт не обязан соответствовать твоим вкусам.

>>16130
>>18743

> Нужно каким-то образом наполнить компанию департаментами и сотрудниками



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

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

> Но я подсмотрел в phpclub.tech, что вы рекомендовали для построения фирмы использовать паттерн Builder.



Удивительно, но я такого не помню. Но, не исключаю, что советовал.

> первый - это создать класс CompanyBuilder в котором будут методы создатьДепартаменты, создатьРаботников, получитьКомпанию.



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

> Второй вариант, это - создать класс DepartmentBuilder с методами создатьРаботников, получитьДепартамент.



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

> Ещё была идея сделать фабрику со статическим классом, которая будет отдавать нам массив с работниками.



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

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

> Также я написал абстрактный класс Profession для возможности смены профессии сотруднику из которого наследуются инженер, менеджер, аналитик и маркетолог.



Хорошо.

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



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

> Надеюсь принципы ООП не запрещают иметь внутри объекта Employee объект профессии, который может быть у каждого работника уникальным или наоборот у всех сотрудников одной профессии в компании он будет одинаковым.



Логичнее один объект. У нас же у многих работников одна и та же профессия. Значит, логично и объект сделать один. Если у каждого будет своя копия профессии, то мы:

- получим сложности при создании (нам надо создавать кучу объектов-профессий с одинаковыми свойствами и ничего не перепутать)
- при сравнении (сравнение $e1->getProfession() === $e2->getProfesion() не сработает и непонятно, как сравнивать профессии - придется добавлять какой-то идентификатор или название и следить за их уникальностью)
- при обновлении данных. Представим, что у профессии есть свойство "надбавка к пенсии", и нам надо ее поменять. Нам надо будет найти каждый объект профессии в программе и обновить у него это свойство.В большом, сложном коде, где создается и хранится много объектов в разных местах, это сделать нереально.

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

> Возможно я ещё не дорос до уровня на котором стоит пытаться вникать в паттерны?



Ну почему, с билдером же ты разобрался. В реальности, например, билдер используется в Symfony Forms для построения форм (вроде формы регистрации).

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



Не так. Вроде (я не уверен) композиция применяется когда объект является составной частью другого. Ну например, мотор и машина. Или факультет и университет. Профессия не является частью работника.
557 1319267
>>18812

Стандарт не обязан соответствовать твоим вкусам.

>>16130
>>18743

> Нужно каким-то образом наполнить компанию департаментами и сотрудниками



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

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

> Но я подсмотрел в phpclub.tech, что вы рекомендовали для построения фирмы использовать паттерн Builder.



Удивительно, но я такого не помню. Но, не исключаю, что советовал.

> первый - это создать класс CompanyBuilder в котором будут методы создатьДепартаменты, создатьРаботников, получитьКомпанию.



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

> Второй вариант, это - создать класс DepartmentBuilder с методами создатьРаботников, получитьДепартамент.



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

> Ещё была идея сделать фабрику со статическим классом, которая будет отдавать нам массив с работниками.



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

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

> Также я написал абстрактный класс Profession для возможности смены профессии сотруднику из которого наследуются инженер, менеджер, аналитик и маркетолог.



Хорошо.

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



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

> Надеюсь принципы ООП не запрещают иметь внутри объекта Employee объект профессии, который может быть у каждого работника уникальным или наоборот у всех сотрудников одной профессии в компании он будет одинаковым.



Логичнее один объект. У нас же у многих работников одна и та же профессия. Значит, логично и объект сделать один. Если у каждого будет своя копия профессии, то мы:

- получим сложности при создании (нам надо создавать кучу объектов-профессий с одинаковыми свойствами и ничего не перепутать)
- при сравнении (сравнение $e1->getProfession() === $e2->getProfesion() не сработает и непонятно, как сравнивать профессии - придется добавлять какой-то идентификатор или название и следить за их уникальностью)
- при обновлении данных. Представим, что у профессии есть свойство "надбавка к пенсии", и нам надо ее поменять. Нам надо будет найти каждый объект профессии в программе и обновить у него это свойство.В большом, сложном коде, где создается и хранится много объектов в разных местах, это сделать нереально.

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

> Возможно я ещё не дорос до уровня на котором стоит пытаться вникать в паттерны?



Ну почему, с билдером же ты разобрался. В реальности, например, билдер используется в Symfony Forms для построения форм (вроде формы регистрации).

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



Не так. Вроде (я не уверен) композиция применяется когда объект является составной частью другого. Ну например, мотор и машина. Или факультет и университет. Профессия не является частью работника.
558 1319268
>>18750

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

>>18708

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



Если это случай когда:

class Parent
{
protected $x = 5;
}

class Child extends Parent
{
public $x;
}

То ты переопределяешь значение по умолчанию на null и потому оно не "наследуется".

>>18682

Читать ужасно. Элементы массива надо разбить переносами по одному на строке. Чтобы не копипастить $this->ts(), сохрани это в переменную и обращайся к ней.

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

Не используй подчеркивание перед переменной.

Не ставь пробел перед ().

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

Пока, код плоховат.
558 1319268
>>18750

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

>>18708

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



Если это случай когда:

class Parent
{
protected $x = 5;
}

class Child extends Parent
{
public $x;
}

То ты переопределяешь значение по умолчанию на null и потому оно не "наследуется".

>>18682

Читать ужасно. Элементы массива надо разбить переносами по одному на строке. Чтобы не копипастить $this->ts(), сохрани это в переменную и обращайся к ней.

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

Не используй подчеркивание перед переменной.

Не ставь пробел перед ().

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

Пока, код плоховат.
559 1319269
>>18327

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

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

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

>>17102

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

>>16313

> Составил такую регулярку


Возможно, проблема в том что точка соответствует любому символу кроме перевода строки. Почитай официальный мануал по рег. выражениям http://php.net/manual/ru/pcre.pattern.php если не знал.

>>16164

Сайтмап удобно генерировать методами DOM так как это обеспечивает его корректность и экранирует все нужные символы. Гугли DOMDocument. Не надо тут делать велосипеды и писать уродливые циклы с конкатенацией строк.

>>16084

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

>>Здесь есть проблема: если ни один день недели не выбран, то массив будет пуст и произойдет ошибка


> Но это невозможно, массив с днями недели не может быть пустым.



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

> У меня возник вопрос насчет функции setAlarm. Как она в нынешнем виде (замена объекта на объект) может пригодиться в реальном проекте? Ведь можно завести метод getAlarms():array и настраивать нужный нам объект выбрав его из массива. Это нарушит принцип solid?



Она никак не может пригодиться и довольно бессмысленна, и ты скорее всего ее написал, так как не выучил, как копируются указатели на объекты. Если ты пишешь:

$a = new Alarm();
$b = $a;
$a->setEnabled(true);

То тут $a и $b указывают на один объект и писать $b->setEnabled() или дополнительное $b = $a не требуется. А ты зачем-то это пишешь.

В реальном проекте у тревог, скорее всего, придется сделать какие-то id (ради сохранения в БД например) и ты скорее всего будешь их искать по id и придется добавить findAlarmById(). Но, конечно, зависит от ситуации, можно и без идентификаторов.
559 1319269
>>18327

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

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

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

>>17102

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

>>16313

> Составил такую регулярку


Возможно, проблема в том что точка соответствует любому символу кроме перевода строки. Почитай официальный мануал по рег. выражениям http://php.net/manual/ru/pcre.pattern.php если не знал.

>>16164

Сайтмап удобно генерировать методами DOM так как это обеспечивает его корректность и экранирует все нужные символы. Гугли DOMDocument. Не надо тут делать велосипеды и писать уродливые циклы с конкатенацией строк.

>>16084

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

>>Здесь есть проблема: если ни один день недели не выбран, то массив будет пуст и произойдет ошибка


> Но это невозможно, массив с днями недели не может быть пустым.



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

> У меня возник вопрос насчет функции setAlarm. Как она в нынешнем виде (замена объекта на объект) может пригодиться в реальном проекте? Ведь можно завести метод getAlarms():array и настраивать нужный нам объект выбрав его из массива. Это нарушит принцип solid?



Она никак не может пригодиться и довольно бессмысленна, и ты скорее всего ее написал, так как не выучил, как копируются указатели на объекты. Если ты пишешь:

$a = new Alarm();
$b = $a;
$a->setEnabled(true);

То тут $a и $b указывают на один объект и писать $b->setEnabled() или дополнительное $b = $a не требуется. А ты зачем-то это пишешь.

В реальном проекте у тревог, скорее всего, придется сделать какие-то id (ради сохранения в БД например) и ты скорее всего будешь их искать по id и придется добавить findAlarmById(). Но, конечно, зависит от ситуации, можно и без идентификаторов.
560 1319270
>>15784

Ну, гугление выдает например http://php.net/manual/ru/book.pthreads.php

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

>>15498

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

>>12807

Судя по всему, у тебя там проблемы с соединением с сервером и файлы не качаются. Либо проблемы на удаленном сервере, либо с интернетом.

Я бы для начала просто скопировал URL https://vagrantcloud.com/laravel/boxes/homestead/v
ersions/6.4.0/providers/virtualbox.box в браузер и попробовал скачать файл через него для проверки. Если не качается - сделал бы traceroute и посмотрел, доходят ли пакеты до сервера.

>>12701

Наверно тут: https://github.com/codedokode/pasta/

>>12528

Да, урок про регулярки требует улучшения.
561 1319271
>>12379

Форматируй код. Добавляй отступы. Если редактор не позволяет это делать, возьми редактор кода получше. А то читать невозможно.

> 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 1319271
>>12379

Форматируй код. Добавляй отступы. Если редактор не позволяет это делать, возьми редактор кода получше. А то читать невозможно.

> 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 1319272
>>11956

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

Это надо сделать самому.

>>11770

> elseif (($remainder>10) & ($remainder<20)){


Ты использовал вместо логического И && оператор "побитовое И" &, который делает кое-что другое: https://ru.wikipedia.org/wiki/Битовые_операции

Также, в блоке if-elseif... срабатывает только одна ветка и остальные не проверяются.

>>11658

да, урок по регуляркам требует обновления.

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

Спасибо за информацию о непонятных моментах в учебнике.

>>11196

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

>>11141

С виду нормально. Выражение сложноватое получилось, и можно было вынести получение слова отдельно:

$part1 = $word1[array_rand(...)];

>>11135

Как в следующем посте можно. Или через цикл по такому массиву:

$choices = [
['Чудесных', ....],
[варианты второго слова],
[варианты третьего],
...
];
562 1319272
>>11956

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

Это надо сделать самому.

>>11770

> elseif (($remainder>10) & ($remainder<20)){


Ты использовал вместо логического И && оператор "побитовое И" &, который делает кое-что другое: https://ru.wikipedia.org/wiki/Битовые_операции

Также, в блоке if-elseif... срабатывает только одна ветка и остальные не проверяются.

>>11658

да, урок по регуляркам требует обновления.

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

Спасибо за информацию о непонятных моментах в учебнике.

>>11196

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

>>11141

С виду нормально. Выражение сложноватое получилось, и можно было вынести получение слова отдельно:

$part1 = $word1[array_rand(...)];

>>11135

Как в следующем посте можно. Или через цикл по такому массиву:

$choices = [
['Чудесных', ....],
[варианты второго слова],
[варианты третьего],
...
];
563 1319273
Все, остальное посмотрим с вами в следующем году.
564 1319318
С Новым Годом, гайс.

Всем удачного вката и пусть никто не уйдёт обиженным.
565 1319332
>>18879

>в некоторых случаях это просто быстрее и проще


>Сайт ОПа например представляет собой HTML-страницы с небольшой обвязкой на PHP (для вывода меню, подвала, ссылок итд), слепленной за один вечер.


Ну я и говорю, в этом есть смысл, только если ты домохозяйка с говносайтом из 1.5 страниц.
В любом нормальном приложении статически типизируемый язык будет БЫСТРЕЕ И ПРОЩЕ
566 1319376
https://github.com/asdasdasdasddasasdasdas/StudentList
Чекните мой список студентов
567 1319432
Ребята посоветуйте видеокурсов годных. Каналов на ютубе
568 1319481
Есть массив времен. Формат - часы:минуты.
Надо сделать функцию, которая его сортирует.

Внимание, охуительный вопрос.
Как мне проверить, что мне передали в функцию именно массив времен в заданном формате, а не какое-то левое говно?
569 1319485
Двощь, помоги с таким вопросом.
Добавил проверку к array_rand() на предмет одинаковых элементов массива. Почему каждый раз пишется предупреждение? По сути же должно писать только тогда, когда выпадает 2 одинаковых элемента массива.
Или как сделать так, чтобы никогда одинаковые элементы не выпадали?
https://ideone.com/mUEyfD
570 1319499
>>19481
preg_grep, пихаешь регулярочку и твой массив и получаешь именно те элементы которые соответствуют формату. Ну или прям в функции где будешь сортировать регулируй и сортируй.
'[012]\d:[0-5]\d'
571 1319500
>>19376
Что у тебя там с гейтвеем Студента? Вроде запрос описал , а дёргаешь чистый PDO в половине методов.

мимокрок
572 1319553
>>19485
Бамп
573 1319563
>>19499
А в нормальном языке это делается List<DateTime> и проверяется на уровне тайпхинтов
15453217017260.jpg66 Кб, 602x653
574 1319564
>>19563
Работаем с тем, что есть.
575 1319591
Я могу кидать стандартные исключения пыха?
Заебался уже на каждый пук свое исключение делать.
Иногда надо просто просигнализировать, допустим, если аргумент хуевый и все.
576 1319600
>>19481

> Формат - часы:минуты.


Что ты подразумеваешь под часами и минутами? Под твой формат подходит как период времени, например "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/

>>19499

> '[012]\d:[0-5]\d'


Можно выбрать 29 часов? Если проблему можно решить без регулярки, её лучше решить без регулярки.

>>19591

> Заебался уже на каждый пук свое исключение делать.



Ну и это бессмысленно, у ОПа есть урок по исключениям: https://github.com/codedokode/pasta/blob/master/php/exceptions.md

> Иногда надо просто просигнализировать, допустим, если аргумент хуевый и все.



http://php.net/manual/en/class.invalidargumentexception.php#102218

Свои исключения есть смысл делать только тогда, когда тебе их нужно ловить.
576 1319600
>>19481

> Формат - часы:минуты.


Что ты подразумеваешь под часами и минутами? Под твой формат подходит как период времени, например "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/

>>19499

> '[012]\d:[0-5]\d'


Можно выбрать 29 часов? Если проблему можно решить без регулярки, её лучше решить без регулярки.

>>19591

> Заебался уже на каждый пук свое исключение делать.



Ну и это бессмысленно, у ОПа есть урок по исключениям: https://github.com/codedokode/pasta/blob/master/php/exceptions.md

> Иногда надо просто просигнализировать, допустим, если аргумент хуевый и все.



http://php.net/manual/en/class.invalidargumentexception.php#102218

Свои исключения есть смысл делать только тогда, когда тебе их нужно ловить.
577 1319610
>>19600

>usort($dates, function (\DateTime $left, \DateTime $right)


Лол, так и сделал. Только я малец прихуел с оператора <=>.
Не знал о его существовании, существенно укорачивает код, збс.

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

>хорошая практика для таких ситуаций использовать объекты значения


Это самый лучший вариант, но только это все ДОЛГО пиздец, на каждый пук отдельный объект писать, создавать класс, геттеры, сеттеры и прочую поебистику.

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

>Свои исключения есть смысл делать только тогда


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

Вот если тебе надо вернуть там какой-нибудь объект файла, допустим.
А файла-то нихуя и нет.
Что ты будешь делать - возвращать какое-то говно в виде "пустого" объекта, нула и прочую срань?

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

Причина, по которой программа на яве почти никогда не падает, если она скомпилилась - именно в политике языка в повсеместном кидании исключений при малейшей ошибке и принуждению говнокодера их все ловить.
А не как в пыхе и c++.
577 1319610
>>19600

>usort($dates, function (\DateTime $left, \DateTime $right)


Лол, так и сделал. Только я малец прихуел с оператора <=>.
Не знал о его существовании, существенно укорачивает код, збс.

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

>хорошая практика для таких ситуаций использовать объекты значения


Это самый лучший вариант, но только это все ДОЛГО пиздец, на каждый пук отдельный объект писать, создавать класс, геттеры, сеттеры и прочую поебистику.

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

>Свои исключения есть смысл делать только тогда


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

Вот если тебе надо вернуть там какой-нибудь объект файла, допустим.
А файла-то нихуя и нет.
Что ты будешь делать - возвращать какое-то говно в виде "пустого" объекта, нула и прочую срань?

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

Причина, по которой программа на яве почти никогда не падает, если она скомпилилась - именно в политике языка в повсеместном кидании исключений при малейшей ошибке и принуждению говнокодера их все ловить.
А не как в пыхе и c++.
578 1319613
>>19610
Дополню, вернуть null вместо ожидаемого результата - весьма приемлимый вариант, но эта затея идет по пизде как только у тебя возникает несколько типов ошибок в методе.
Тут онли исключения.

Ну и еще идеологически исключения полезны, когда возникает совершенно лютая хуйня, при которой дальнейшее выполнение бессмысленно.
Такие исключения я обычно не ловлю (уходят в самый верхний обработчик).
579 1319626
кого еще корежит от этого языка?
580 1319635
>>19626
Всех. Чем больше его знаю, тем больше бесит.
581 1319642
>>19610

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



Зачем, \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

Вообще, я ещё раз посоветую просто взять другой язык. (Я вот вообще во фронтенд укатился)
582 1319648
>>19642

> посоветую просто взять другой язык


какой?
583 1319650
>>19642

>\DateTime ведь выбросит исключение, если не сможет создать дату из строки


Да, но DateTime жрет далеко не только hh:mm.

>в 95% случаев хватит встроенных исключений в PHP


Это да.
Кстати, PhpStorm, ВНЕЗАПНО, почему-то не сует в throws в phpdoc для встроенных исключений. А для сторонних сует.
584 1319663
Аноны, а тут есть кто перегорел? Я начал изучать laravel и уже больше недели даже не открывал код и ничего не смотрел. Пропало желание пиздец, как будто хуетой какой-то занимаюсь. Че делать? Дропать или продолжать учить через силу (мб в процессе желание появится)?
585 1319665
>>19663
Надо пилить что-нибудь, лучше свое, но если идей нет то копию чего-нибудь что нравится.
От документации лары у меня тоже депрессия наступает.
586 1319667
>>19665
что скажешь за сам фреймворк?
587 1319669
>>19667
Лично мне больше нравится Symfony. Но игнорировать лару в текущей ситуации невозможно. Это как фронтенд. По идее знать php пограмисту не обязательно, но тогда сильно сокращаются опции на рынке труда.
588 1319679
>>19669
почему сиmфони?
589 1319682
>>19663
Это не от пыха зависит.
Дело в дисциплине, почитай про это.
"Будь лучшей версией себя", "правило в 10 раз больше".
590 1319685
>>19682
еще как от пыха
591 1319695
>>19685
Не оправдывай свою слабохарактерность уебанством пыха
592 1319704
>>19695
это не оправдывает его херовость
593 1319716
>>19704
Не нравится - катись в другой. Жаловаться на свою немощь в пхп-треде это удел маминого неосилятора.
Держи в курсе.
594 1319722
Двощь, всё таки не понимаю, как запилить проверку на повторы.
https://ideone.com/CWYEdX
595 1319724
3 года пишу на PHP, сегодня первый раз устанавливаю PHPUnit, поздравьте меня
596 1319729
>>19682
Что же ты забросил свой бложек, няша?
597 1319747
Не только магазины решают на Пыхе. Думай о больше, делай, блять, больше.
598 1319756
>>19722
Ты зачем операцию в условие цикла засунул, норкоман? Если туда можно класть что-то, что срабатывает каждую итерацию, то это ещё не значит, что туда можно класть всё подряд.
Там место только для обработки условия, а само действие пиши где положено - в теле цикла.

Что у тебя с повторами? Телепаты уехали за бугор, от жизни такой.
599 1319857
>>19756
Бля, не ту ссыль дал. Уже завтра скину.
А это я просто код с хелпы тестировал. Там такой давали в примере, так что вопрос не ко мне.

Алсо, перекатывать тред кто-то будет?
601 1320176
Зачем проходить в 2к19 году учебник ОПа, если есть гениальнейший code-basics? Он еще и опенсорсный
602 1320218
>>20176
Тебя никто не заставляет, можешь читать любые говносайты, какие захочешь, разрешаю
603 1320240
Какой же пиздос в пхп с отсутствием дженериков и коллекций.
Надо отсортировать массив объектов.
Как это делается в нормальном языке.
В объекте переопределяется компаратор и все.
А в пхп тонна анальных извращений.
604 1320283
Может у кого есть рабочий скрипт (PHP!) для скачивания картинок из треда? Как вы обходите https? Кашу кашную получаю, хз, или так и должно быть.
605 1320294
>>19857

Погоди перекатывать, еще до конца праздников можно тут сидеть.
606 1320317
607 1320323
>>20283
Поехавший?
Начнем с того, что как картинки, так и треды доступны по http.
Во-вторых, обычно низкоуровневой работой с SSL занимается библиотека, с помощью которой ты осуществляешь запросы.
608 1320326
>>20240
Как обычно много гонору, а толку ноль. Все твои проблемы решаемы за считанные минуты, если ты банально на уровне джуна кодить умеешь. Или хотя бы гуглить. И да, дженерики к данной ситуации вообще не относятся, узколобая ты обезьяна.
609 1320334
>>20326
Вся суть в том, что в крестах или яве операции выполняют САМИ коллекции.
А в пхп надо писать левые велосипеды, чтобы отсортировать массив объектов.

Короче процедурщина ебаная получается.
610 1320346
>>20334
https://github.com/italolelis/collections
https://github.com/akanehara/ginq

Минута в гугле. Там еще дохуя такого же. И всегда можно сделать самому себе под задачу, а не сокрушаться, что язык плохой, и не как у людей.
611 1320348
>>20346
Сраный говнокод. Вся суть коллекций в том, что это коллекции не рандомного дерьма, а объектов одного типа.
Принес какие-то нескучные обертки над массивами и выебывается тут.
612 1320354
>>20326
Я вообще не понимаю зачем обращать внимания на такие посты. По мне, так это один и тот же жиртрест пишет, чтобы тред в срач скатить.

Ну не нравится - не используй это язык, пиши на ноде, или яве. Какой смысл тут высераться своим очень нужным всем мнением?
613 1320355
>>20348
Точно жиробас.
614 1320361
>>20348

>что это коллекции не рандомного дерьма, а объектов одного типа.


List<object> тебе за щеку, ни к чему строгому коллекции не обязывают.

>Принес какие-то нескучные обертки над массивами


То есть ты настолько донный, что не представляешь как сделать собственную коллекцию на коленке со строгой типизацией? Просто прекрасно, что ты хейтишь пхп - одним говнокодером у нас будем меньше.
Добавлю, что не все коллекции это дженерики, и кину в лицо тебе пожалуй коллекцию из шарпа - ArrayList - которая даже по названию очевидно нескучная обертка над массивом (хотя хуй знает в действительности ли это так, лень ради тебя это чекать).
Специально для "без массивов" ебни коллекцию на ссылках. Реализовать таким образом можно что угодно, были бы руки из того места.
>>20354
Настроение поганое, захотелось проораться.
615 1320373
Анончики, а теперь нетбинс только с апачем работает, что ли? Как отдельное приложение не накатить?
616 1320382
>>20361

>сделать собственную коллекцию на коленке


Да заебался я уже делать на коленке то, что обычно за меня уже сделано.
В итоге не проект пишешь, а коленочные реализации всякой хуйни.
617 1320383
>>20145
Возвращайся давай!
ipad.png38 Кб, 613x488
618 1320384
Двощик, иду дальше по курсу ОПа и мне нужна твоя помощь.
Задание на пике.
https://ideone.com/M66Z31
1. Почему кол-во месяцев $month не прибавляется? Я же, вроде, в цикле прибавляю.
2. Как сделать проверку на отрицательное число остатка по выплате?
То есть, школьник в 12 месяц останется должен банку какую-то сумму, но цикл закончится, так как стоит условие $price>0. Как мне ему остаток-то выплатить?
619 1320385
>>20384
И сразу же 1-ый вопрос снимается. Пока писал - проверил, а там, оказывается, хуйня написана.
620 1320387
>>20176
Не обманывай. Ничего там гениального, тупо пересказ документации.
621 1320393
>>20382
Так не бывает, чтобы всегда были готовые решения. Особенно такие, чтобы подходили как родные на каждый конкретный случай. Как пример - древовидные (но не симметричные) структуры с разным типом нод внутри, логика у которых разная, и работу с которыми нужно оптимизировать - тут уже слабо помогут готовые коллекции, т.к. много работы с источниками данных, хитровыебанным кешированием, да и просто сама логика коллекции не ложится на готовые реализации из-за специфических требований. В общем писать свои коленочные решения так или иначе придется.
622 1320394
>>20384
Там проще всё реализуется. Переписывай нормально.
623 1320399
Как удалить несколько элементов из массива во время итерации по нему с конца в начало, если для ключей не гарантируется то, что они будут непременно с 0 и до N.

То есть, массив вида [3=>15, 42=22, 1005=>13]
Копировать содержимое во временные массивы нельзя
624 1320401
>>20394
Как проще то? Хоть скажи, где изменить надо.
625 1320407
>>20399

>Как удалить несколько элементов из массива во время итерации по нему


unset($varname)

>>20401

>if($forOpen!=0)


Убирай проверку $forOpen на 0. Зачем она там нужна? Достаточно просто сложить её с кредитом вначале. Если 0, то и будет + 0. А ещё лучше укажи этот $forOpen на 0 по умолчанию при объявлении ф-ции.

>for($price = 40000 + $forOpen;$price>0;$price = ($price + $inMonth +$comm)-5000)


Тут вообще бред.
У тебя цикл со счётчиком, а ты его как условный юзаешь по сути. Тут лучше танцевать от месяцев, а не от прайса. Просто за каждый месяц пересчитывай кредит.
Ну и циклы объявлять научись - там не надо лишнего писать.
626 1320416
>>20407
Так а как я буду от месяцев плясать, если неизвестно как раз количество месяцев, требуемое для погашения кредита?

>Убирай проверку $forOpen на 0. Зачем она там нужна?


Тут согласен. Не подумал об этом.

>А ещё лучше укажи этот $forOpen на 0 по умолчанию при объявлении ф-ции.


Типо вот так сделать$forOpen = 0?
Зачем?

>У тебя цикл со счётчиком, а ты его как условный юзаешь по сути.


И вот тут по подробнее, пожалуйста.
627 1320423
>>20416

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


$month++
И пересчитывай кредит. В теле цикла, а не в объявлении.

>Типо вот так сделать$forOpen = 0?


>Зачем?


Затем, что в 2х случаях из 3х она не указывается. Будет логично сделать её необязательной.

>вот тут по подробнее


For () - цикл со счётчиком. У тебя нет счётчика. Вернее есть $month=$month+1, но криво реализованный и к циклу отношения не имеет. Отсюда и цикл поехавший.
628 1320440
Уважаемые аноны занимаюсь по книжке. Установил XMAPP. Но эта сука не запускается в браузере через localhost или через 127.01.01
Закидывал в каталог апачи. Бесполезно. Есть более менее разбирающиеся аноны. Хочу проконсультироваться. Отпишите пожалуйста.
629 1320451
>>20423
Я тут цикл починил.
https://ideone.com/aJTU6W
Всё ещё второй вопрос остался открытым

>Как сделать проверку на отрицательное число остатка по выплате?


То есть, школьник в 12 месяц останется должен банку какую-то сумму, но цикл закончится, так как стоит условие $price>0. Как мне ему остаток-то выплатить?
630 1320458
Анонче буду тралировать вас занудством, начиная с нубовских задач
https://ideone.com/EeoltU вот тут в условиях задачи про игру в кубики было сказано только про дубли, но одинаковая сумма может выпасть и при разных числах, правильно ли решена задача?
631 1320461
Получилась задача-стихотворение без всяких пробегов по массивам https://ideone.com/niDPTN
Просто через эхо вывод стиха, норм?
632 1320465
>>20451

>Как сделать проверку на отрицательное число остатка по выплате?


>но цикл закончится, так как стоит условие $price>0


Как вариант - поставить условие $price>$pay, где $pay это ежемесячный платёж. А сразу после цикла вывести остатки.
Тогда в минус не должно уходить.
633 1320466
>>20461

>без всяких пробегов по массивам


Говорят, что индусы так пишут. Или китайцы.

Меня бы писать так задолбало. Лучше головой разок цикл прикинуть, чем по клавишам долбить как секретарша.
634 1320598
>>20440
Короче, сносишь это васянское говно и ставишь все необходимое окружение на линух на виртуалке
635 1320614
Подмогните с регулярками.
\W[7|8][\d\W]{10}
Мне нужно, чтобы искал ТОЛЬКО 10 цифр и любое кол-во символов между ними. А исходя из моей - ищет всего 10 любых символов. ЧЯДНТ?
636 1320619
>>20614

> ЧЯДНТ


Неправильно составляешь регулярку
637 1320620
>>20619
Ну это я понимаю. Так а как её правильно составить для моих условий?
638 1320622
>>20620

> как её правильно составить



Правильно составив регулярное выражение.
639 1320625
>>20622
Хорошо, спрошу по другому. Как мне заставить регулярку искать только 10 цифр, а кол-во других символов не имеет значения? Конструкция вида [\d{10}\W] не работает.
640 1320626
>>20625
Я за тебя регулярку писать не буду. https://regexr.com/ вот хороший ресурс для понимания регулярок.
641 1320627
>>20614
Можешь пример успешных/не успешных строк предоставить? Я по описанию чутка даже охерел, либо не так понял. Мб поебусь тогда, если она действительно интересная.
642 1320628
>>20625
ты хочешь искать предположим
1аввара2пврварпорва3нгке4авп5ргпго и.т.д? Или шо?
643 1320639
>>20628
>>20627
Я делю задание ОПа. Ищу номера телефонов любого формата.

https://regex101.com/r/qF7vT8/3
Вот тут заготовка.
644 1320651
>>20440
.php в названии не надо? или к чему ты обращаешься
645 1320700
Как называется эта болезнь?
646 1320753
Аноны, условие задачи: Напиши программу, выводящую таблицу умножения чисел от 1 до N на самих себя, используя цикл.

https://ideone.com/JdJq9X я не пойму, цикл должен получиться бесконечным или же до суммы 81, но тогда куда впихнуть условие?
647 1320755
>>20753
https://ideone.com/R75Nht не ту ссылку прикрепил
648 1320772
Вопрос по yii2 и концепции MVC в целом: не нарушают ли данную идеологию сторонние методы внутри контроллера, которые не являются action-ами? Например, private function setImage()? Так как данный метод необходим в crud операциях и только внутри контроллера
Думаю, что не нарушают, но хочется все сделать красиво
649 1320833
>>20755
https://ideone.com/eRVH5g
Я не эксперт, но так сойдёт?
650 1320877
>>20833
Таки да, я просто пропустил, что в echo можно прописывать математические операции типа умножения и т.д.
651 1320962
Аноны, а поясните за "зеленый" гитхаб. Это че надо любой свой говнокод туда тащить, чтобы он зеленый был или как?
652 1320976
>>20962
Говно этот ваш гитхаб.
Полно людей с очень высокими зп, которые в эту помойку никогда ничего не комитили.
К тому же, толку от полутора говнопроектов на полторы строки один хуй немного, а погромировать больше без оплаты - так себе занятие.
К тому же, твой говнокод быстро устаревает или становится неактуальным.
Короче, поддерживать гитхаб в актуальном качественном состоянии - достаточно геморойное занятие в большинстве случаев.
653 1320982
>>20976
Ну хуй знает, просто все пишут что вкатиться с проектами на гитхабе легче, чем без него.
654 1321064
>>20982
Легче всего вкатится с подвешенным языком и нормальными навыками коммуникации, когда ты за всё можешь всем легко пояснить. В общем-то, как и везде.
А вот зеленый гитхаб тебе вряд ли поможет, если ты совсем уж отбитый аутист.
655 1321097
Аноны, что скажете про мак 13 для разработки, хватит его? Или без линукса никуда в бэке на пыхе? Придётся тогда с виртуалками ебаться.
656 1321126
>>20962
Тащи туда то, что другим пригодиться может. Если нечего тащить, и работу рано тебе искать.
whatmini.jpg31 Кб, 604x372
657 1321140
>>21097

>13 для разработки

Безымянный.PNG89 Кб, 1222x836
658 1321153
Всем сап. Пилю магаз, движок самописный, нужно шаблонизировать некоторый код. Правильно ли я ее делаю в 2к19, не будут ли ругаться валидаторы, не будут ли поисковые роботы кидать мой сайт во вредоносные, не будет ли это все потом тормозить при большой посещаемости?
659 1321162
>>21153

А варианты из этой статьи про шаблонизаторы не подходят? https://github.com/codedokode/pasta/blob/master/php/templates.md

Не очень понятно, зачем тут изобретать велосипед.
660 1321175
>>21153
Госпаде исусе, ну и дерьмо.
1) Сейчас десятилетие SPA, але, как там слышно из 2007-го? Бек только генерит жсон и все.
2) Пых имеет отличные встроенные средства шаблонизации, гугли как это сделано в Yii. То, что ты написал - кал чистой воды.

Ну я вижу ты не слишком умный, поэтому предостерегаю: к параше типа smarty или twig не вздумай даже прикасаться.
661 1321181
>>21175

Ты слишком категоричен, что часто бывает у неопытных разработчиков, впервые с чем-то новым познакомившихся. SPA имеет немало недостатков:

- надо разрабатывать 2 приложения вместо одного
- долгая загрузка
- больше возможностей для ошибки
- плохая индексация поисковиками

Есть случаи, когда SPA больше подходит, есть, когда нет. Я не очень понимаю, зачем делать SPA, если страницу с описанием товара может сразу отдать сервер? Вот человек кликает в Яндекс Маркете на ссылку и получает готовую страницу товара. И не надо ждать пока твой SPA загрузится, загрузит мегабайт яваскрипта, сделает 10 AJAX запросов и тд (это можно оптимизировать, но это требует времени и стоит денег. SPA обойдется гв итоге ораздо дороже). Я не очень понимаю, зачем тут SPA.

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

Попробуй вместо категоричных заявлений рассматривать разные подходы со всеми плюсами и минусами.
662 1321184
>>21181
Ну ладно, про SPA это я утрировал.
Но

>надо разрабатывать 2 приложения вместо одного


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

И находится ли это фронт-приложение в спа или в пых-шаблонах - вопрос вторичный.
663 1321191
>>21153
Разметку с кодом перемешал смотрю. Нынче так уже не принято делать. Вроде как плохой стиль.
Хотя вордпрессу не мешает, лол.

Так что это скорее кунг-фу веб-мастера, чем веб-кодера. Иди в \web\ - там твои все.
664 1321198
Что делать, если меня вынудили написать говнокод?
Есть библиотека на гитхабе, 2000 звездочек.
Ну автор, наверное, крутой поц, уж мне ли ему говорить как код надо писать?
Думал я.

А сейчас понимаю, какой же этот чел отбитый говноед, весь код этой либы - полное говно, где каждый пердеж сделан через __callStatic(), магию и КОММЕНТЫ классов блять.
Еще и ПРИМЕРЫ того, как надо юзать его либу, написанные самим автором.
Я по своей наивности слепо им следовал, в итоге только сейчас начал понимать, какой это отбитый кал.
Методы длиной в 500 строк нахуй.
Статик на статике и статиком погоняет.
Мечта тестера блять, тестировать магию нахуй, которой не существует.
Вместо value-объектов тупо массивы))0) с ключами-захардкоженными строками блять, рандомно упоминающимися по всему проекту.

И только теперь я понял, в какой пучине говна я погряз, потому что слепо следовал выданным мне рекомендациям.
Такая хуйня вот
665 1321200
>>21153

>не будут ли поисковые роботы кидать мой сайт во вредоносные


Они твой серверсайд не видят. С чего бы?

>не будет ли это все потом тормозить при большой посещаемости?


Вот когда убьют будет тормозить, тогда и приходите. А ранняя оптимизация - зло.
666 1321209
>>21198
Ну так пиши нормально теперь, чего убиваться? Если знаешь, где неправильно - уже полдела.
667 1321240
>>21097

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

>>20962

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

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

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

>>20833

$n можно было не использовать, сразу писать 9.
668 1321241
>>20772

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

- допустим, этот метод задает пользователю аватарку. Тогда он должен быть в модели (или в сервисе):

$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 Там нет ответа?

>>20753

Можно завести переменную:

$y = $x * $x;
echo "$x -> $y\n";

Цикл можно сделать от 1 до 9.
668 1321241
>>20772

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

- допустим, этот метод задает пользователю аватарку. Тогда он должен быть в модели (или в сервисе):

$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 Там нет ответа?

>>20753

Можно завести переменную:

$y = $x * $x;
echo "$x -> $y\n";

Цикл можно сделать от 1 до 9.
669 1321243
>>20700

А ты не искал определение, как должно быть правильно? Документация PHP говорит: http://php.net/manual/ru/language.operators.arithmetic.php

> Результат операции остатка от деления % будет иметь тот же знак, что и делимое — то есть, результат $a % $b будет иметь тот же знак, что и $a. Например:



>>20614

Ищем слово "кот": кот

Ищем кота + 1 или более пробелов: кот\s+

Ищем предыдущее выражение 10 раз подряд: (кот\s+){10} (ищет фразу вроде "кот кот кот кот кот кот кот кот кот кот")

Скобки тут используются, чтобы {10} применялось ко всему их содержимому.

>>20440

Судя по скриншоту, Апач запущен и отвечает на запрос браузера, просто передан неправильный URL или файла нет на диске или в конфиге Апача указана не та корневая папка.
670 1321244
>>20384

Попробуй такой алгоритм в цикле:

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

«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
671 1321246
>>20772
С подключением, скоро ты начнешь подозревать, что мир не всегда вписывается в три маня-термина: "Model, View, Controller".
Например, будут возникать куски кода, ответственные за обработку данных от разных моделей, используемые в разных контроллерах. Ну и куда это пихать?
672 1321248
>>21162
Хороший ответ, пробежал глазками статью, теперь понял, как надо.

>>21175

>Сейчас десятилетие SPA, але, как там слышно из 2007-го?



Да какая по сути разница? В чем принципиальное отличие SPA от кучи страничек для пользователя? Я стараюсь почти весь код серваку отдать, чтобы пользователя не нагружать ебланскими js-вычислениями.

>Пых имеет отличные встроенные средства шаблонизации, гугли как это сделано в Yii. То, что ты написал - кал чистой воды.



Окей, спасибо, погуглю.

>Ну я вижу ты не слишком умный, поэтому предостерегаю: к параше типа smarty или twig не вздумай даже прикасаться.



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

>>21181
Двачую.

>>21191

>Нынче так уже не принято делать


Я вот не понял, и что? Что значит "нынче"? Мне понятен мой код, а главное - работать он будет быстро.
Если отбросить весь этот мусор с кучей библиотек и тонн кода, из-за которого подвисает броузер, то мы увидим, что интернет не изменился с того же самого 2007. Просто изменился дизайн, хтмл5 заменил флеш, ssl прикрутили. Все остальное программисты усложнили сами для себя же, чтобы получать больше бабла.
673 1321249
>>21246
Model это не конкретные модельки в том же yii2. Model - это весь слой бизнес логики, он же и самый жирный со всего проекта. Обычно 90%+ кода в проекте и есть модель. И сделать ты его можешь как угодно.
674 1321254
>>21248

>Я вот не понял, что значит "нынче"?


Последние 30 лет?

>Мне понятен мой код, а главное - работать он будет быстро.


Ты пишешь код не для того, чтобы он тебе был понятен.
675 1321257
>>21254

>Ты пишешь код не для того, чтобы он тебе был понятен.


А кому?
676 1321278
>>21257
Другим погромистам
677 1321281
>>21278
Тащемта, я магаз для себя делаю.
678 1321311
>>21281
Если ты не думаешь о других программистах, кто будет работать над проектом, ты - говнокодер, без вариантов, иначе быть не может.

Плюс это тебе сейчас кажется, что ты не в рот ебаться как хорошо разбираешься там. Через пару месяцев уже будешь вспоминать что и как, через полгода будешь вообще охуевать как ты мог такое высрать и хуй разберешь.
679 1321327
>>21281
Выше верно сказали. Когда сделаешь перерыв и вернешься будешь со своим же кодом разбираться как с незнакомым, и тогда будет печально, если нахуевертил с легкой руки.
680 1321343
>>21281
Всегда стремись писать так, чтобы тебя понимали другие программисты - писать на одном с ними языке. Иначе ты никогда не выберешься из вот такого своего июньского лапшекода.
Умные люди много всего нужного и полезного придумали для облегчения разработки. Зачем самому себе буратиной быть?
681 1321347
>>21311

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


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

Пиши верно https://3v4l.org/UaM8i
Yoda Speak https://3v4l.org/coKeP
Сумма прописью https://3v4l.org/NSeMe
Калькулятор https://3v4l.org/n6fuv
683 1321361
>>06121
так пусть жалоба подается с каким-то доказательством, будь то видео или что-либо еще
684 1321382
>>21347
Это норма и признак того, что ты развиваешься.
Бывает даже когда просто некоторое время проект не трогал и "свежим взглядом" на него посмотришь, без предвзятости, и видишь - что код-то говнявый.

Когда ты постоянно долго над проектом работаешь, тут скостылишь, там скостылишь, не замечаешь этого.
А потом уже смотришь и видишь - ну очевидно хуйня же и фейспалмишь.
685 1321460
Прошу помощи в смене парадигмы "пишу все в одном файле, похуй на стиль и синтаксис, все равно никто кроме меня не увидит" на нормальную. Всегда писал только для себя, даже в ООП не умею.

А когда читаю - не понимаю, нахуй оно надо, если только ты не работаешь с проектами в 500кк строк.

Посоветуйте, с чего начать и что почитать по этому поводу.
686 1321462
>>21311

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



Я не он, но взял тут симфони, написал composer update после чего он сожрал 2гб озу и ушел в своп. Нахуй не надо такие варианты.
687 1321483
>>21460

>пишу все в одном файле


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

>в ООП не умею


Охотно верю.

>не понимаю, нахуй оно надо, если только ты не работаешь с проектами в 500кк строк.


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

>Посоветуйте


Ты в треде по ПХП. Советую читать ОПа.
688 1321536
>>21460
Егор, ты?
689 1321537
>>21462
Погоди, это ты ещё охуительные васянские фреймворки и либы на js не паковал. Там все 16 на изи сожрёт
690 1321574
Как работать с интерактивным интерпретатором? Вызываю его командой php -a, но когда ввожу любое выражение, например 2 + 2, результата никакого не выдает. Просто переходит на новую строку.
691 1321575
>>21574
Оказывается нужно указывать оператор echo, тогда выражения высчитываются.
692 1321577
>>21574
Поставь psysh: https://psysh.org/

php -a не для людей, максимально неудобный repl.
693 1321580
>>21460
ООП не нужно. Почитай лучше СИКП.
694 1321584
>>21577
Попробую, спасибо.
695 1321587
>>21580
Какой сикп блять, ты че. Мы хардкорные макакоиды, заставляем вкладку браузера жрать 4 гига памяти и грузить проц на 60% на отрисовку веб-странички.
Подключаем зависимости композера на несколько гигов, чтобы использовать оттуда функцию калькулятора.
Сикп, лол...
696 1321598
>>21587
Нормально делай - нормально будет.
71507285p0master1200.jpg371 Кб, 821x1200
697 1321621
После общения с битриксом начал жалеть, что устроился на бэкенд.
698 1321649
Двощь, помогай опять.
Во-первых, почему на ideone.com не работает кириллица? Указываю и кодировку и mb_ приписываю - ошибка и всё.
Во-вторых, почему я после preg_split не могу через foreach пройтись по массиву и поменять буквы на заглавные с помощью ucfirst?
https://ideone.com/MmXhsI
699 1321698
>>21460

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

-----

Видимо ты не понял идею разбиения кода на функции. Суть в том, что длинный кусок кода, который делает несколько вещей, сложно понять. Его сложно править, в нем много переменных, и можно нечаянно что-то сломать. Ну и физически прочитать 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 1321698
>>21460

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

-----

Видимо ты не понял идею разбиения кода на функции. Суть в том, что длинный кусок кода, который делает несколько вещей, сложно понять. Его сложно править, в нем много переменных, и можно нечаянно что-то сломать. Ну и физически прочитать 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.

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

Насчет "нужно" - конечно, нужно, как другой человек будет разбирать твой код?
700 1321699
>>21462

Не хочешь исследовать причины проблемы и исправить её? Или, может, кто-то из анонов хочет помочь улучшить композер? Для начала, ты бы мог дать пример composer.json и написать, что сделать, чтобы отъесть столько памяти.
701 1321701
>>21574

Если интернет под рукой, то можно просто на repl.it запустить - там без echo работает.
702 1321702
>>21649

На ideone нету mb-функций так как админы забыли поставить расширение mbstring, используй например repl.it.

ucfirst работает только с латинницей в ограниченных случаях, урок: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
703 1321703
>>21698
Функции более широкое понятие нежели просто блок кода. Функция прежде всего выступает абстракцией, черным ящиком. Например функция возведения в квадрат, это механизм, черный ящик содержащий в себе механизм. Из таких маленьких механизмов можно строить более сложные. Вся программа это тоже черный ящик как и функция. В него опускают данные, и получают результат. Функция может принимать другую функцию, также как и программа можно принимать на вход другую программу.
704 1321714
>>21702
Я увидел только то, что ucfirst не работает с utf-8 кодировкой. Однако тут всё отлично работает. https://ideone.com/vqpoX8

Алсо. Чтобы без ucfirst сделать - это мне после разбивки на предложения, надо с помощью substr брать первую букву и переводить её в заглавную?
Или там проще решение есть?
705 1321960
>>19626
поначалу было норм))
потом немного пописал на джаве и прозрел
706 1322000
>>21960
Хочешь сказать джава лучше?
707 1322001
На скрине, где в роуте "/", все работает хорошо и переходит по другим страницам. Когда добавляю {page}, то больше не переходит по другим страницам, остается на своём view. Почему?
708 1322020
>>22001
Так дампани пейдж, делов то. Скорее всего там просто нет нихера.
709 1322080
>>22000
Ясен хуй джава лучше
710 1322093
>>22020
$page на месте с 1
711 1322170
>>22080
И чем же?
712 1322219
>>22170
Абсолютно всем. Попробуй найти хоть одну хуйню, что в пхп сделана лучше, чем в яве.
Не найдешь.
713 1322233
>>22219
Как обратиться ко второму символу в существующей строке?
714 1322240
>>22233
По имени и фамилии
715 1322255
>>21714
Бампую этот вопрос и прикладываю ещё один.

Пытаюсь писать калькулятор по заданию ОПа, но встал на моменте выполнения вычислений. То есть строку вида "241+142" я разобрал посимвольно, выяснил, где цифра, а где знак мат. операции и засунул цифры в переменную. Как быть со знаком? Я могу для каждого отдельного случая написать условие, вида: if($char == "+") {$result = $a+$b} elseif($char == "-") {$result = $a-$b}
Но можно же как-то компактней сделать это, правильно? У ОПа в примере есть кусок if($char == "+" || $char == "-"){}
Но что с этим делать - ума не приложу.
716 1322277
>>22255

> Но что с этим делать - ума не приложу


Хуй забить и использовать eval().
717 1322282
>>22277
Мысль интересная, но что-то я вообще запутался.
Если я все числа кладу в переменную, то у меня получается просто строка с числами. Было 442+511, а стало 442511.
Что-то вообще хуйня получается.
718 1322344
>>22219
Все там такое же. А иногда и хуже.
719 1322365
>>22255
если ты планируешь заниматься вебом, то такие сложные алгоритмы не пригодятся
720 1322404
>>22255
Весь код покажи. Только не сюда, а в repl.it какой нибудь скинь. Непонятно что тебе нужно. Нужно видеть весь код.

>>22365
Это сложные алгоритмы? Смеешься что ли.
721 1322596
>>22233
.at() или как там
722 1322603
>>22255
Гугли вычисления на стеке и базовое устройство трансляторов
723 1322608
>>21621
если у тебя на работе битрикс, беги оттуда
724 1322618
>>22404
Да там смотреть-то нечего особо.
Ну вот всё, что навоял за это время.
https://repl.it/@JoeGreen/GrossPunctualTrapezoids
Алсо, дайте сборник задач годных. Для начинающих. А то в интернетах не особо много. И есть ли конфа пхпшников или что-то такое, а то на борде ответа ждать - долго получается.
725 1322620
>>22618
если честно, эти задачи в отрыве не так уж много и дают. пройти Опшные и иди дальше. в ооп и в создание проектов. больше профита будет
726 1322622
>>22620
Так в том то и дело, что я даже задачи опа не могу толком решить. После основного курса, в разделе "Повторим?" вообще толком ни одной не могу. Вот, как пример - калькулятор. Мой максимум - написать функцию или цикл, кажется.
По этому и думаю - другие задачи порешаю, проникнусь/закреплю знания, а дальше попроще будет.
727 1322623
>>22622
если честно, я тоже не смог изначально решить большинство задач. и я забил на многие. пока что ничего сложнее этих задач, я не встретил. а я работаю уже пол года.
728 1322624
>>22618
Что ты хочешь написать, калькулятор? Из сообществ советую slack-чат Хекслета, или чаты в Телеграм.
729 1322627
>>22620

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


Не советуй такое. Он скорее всего еще толком ничего не писал. Нужно решать алгоритмические задачи, рекурсия, циклы, структуры данных, деревья. ООП вообще не нужно. Можно писать в ФП стиле. С ООП нужно знакомиться, когда уже уверенно пишешь код. Иначе неокрепший мозг сломается, и получится очередное "ООП головного мозга". И советую тот же путь.
730 1322635
>>22622

>Так в том то и дело, что я даже задачи опа не могу толком решить.


Потому что мало решал задачек. Советую эти курсы, там и задачек полно https://ru.hexlet.io/professions/php#education

Рано писать калькулятор, когда не понимаешь как составить алгоритм его работы. Лучше думай над этим алгоритмом. А когда поймешь, то сможешь реализовать. Пока у тебя еще мало опыта, поэтому не понимаешь. Но важно разработать алгоритм решения, а не тупо пытаться писать код. Так не получится. Сначала решение должно появиться в голове.
731 1322636
>>22627
Я ни разу не применил рекурсию за время работы. Мне не нужна было знать, что такое стек, деревья, графы (ну графы кстати в одной задачке Опа используются), до того момента пока я не начал писать, на низкоуровневом языке. Мне кажется, что задач со строками и циклами хватит на большую часть веба. А остальное нужно просто знать и может быть, если ты не останешь говнокодером на всю жизнь, те это пригодится.
732 1322637
>>22623
Скорее всего на Битриксе.
733 1322638
>>22636
Роутинг на деревьях как реализовывать будешь?
734 1322639
>>22624
Я просто хочу решить задачу ОПа, а она состоит в написании калькулятора.
>>22635

>Потому что мало решал задачек.


Так никто и не спорит. Я решал только те, что были по ходу курса ОПа и всё.
Потом пытался найти в интернете что-то, но там всё примерно одинаковое - "заполните массив 10 случайными числами" или "посчитайте, сколько секунд в часе" и тому подобное.

За хекслет спасибо - завтра посмотрю.
735 1322645
>>22639

>Так никто и не спорит. Я решал только те, что были по ходу курса ОПа и всё.


Я не смотрел, но мне кажется там алгоритмических задач нет. Нужны именно алгоритмические. Лучше Хекслета ничего не найдешь, потому что кроме алгоритмических задач, там отлично обучают. Вряд ли где то еще тебя научат как применять функции высшего порядка. А просто на досуге задачки порешать можно на Codewars.
736 1322648
>>22645
Понял, спасибо. Завтра точно гляну.
737 1322711
>>22627

>Иначе неокрепший мозг сломается


Иначе люди пишут такой ООП, который та же функциональщина.
Недавно тут один апи смотрел - там поц засунул все запросы на сервер в один метод. Пара десятков запросов в одном методе, Карл!
738 1322714
>>22711
У него класс из двух методово состоял.

вот тогда мой мозг сломался
739 1322778
>>21714

> Я увидел только то, что ucfirst не работает с utf-8 кодировкой. Однако тут всё отлично работает. https://ideone.com/vqpoX8



Если в отдельных случаях (латинница в utf-8) работает, а в отдельных - нет, то это называется "не работает".

Нужно использовать mb-функции, отрезать первую букву, увеличивать и приклеивать остаток строки. Можно это оформить как свою отдельную функцию и использовать в будущем и в других программах.

>>22001

Непонятно, что именно у тебя не работает? При наборе определенного URL получается страница 404? Пагинатор (какой?) генерирует неправильные ссылки? Поясни, чтобы было понятно.

Также, если ты прописал в роуте "/{page}" то он не будет открываться, если в URL просто "/". Для этого надо сделать отдельный роут, и желательно в /{page} запретить вариант page = 1.

>>22219

Вам сюда: https://habr.com/post/315152/

И хватит разводить бессмысленный флуд. Ладно, если бы ты конкретные примеры приводил, а твои посты бессодержательны.
740 1322779
>>22255

Написать блок if/elseif и не заморачиваться. Вот тебе пример калькулятора из phpExcel, если интересно: https://github.com/PHPOffice/PhpSpreadsheet/blob/master/src/PhpSpreadsheet/Calculation/Calculation.php

Он разбирает и вычисляет с помощью PHP значения формул в синтакисе Excel.

>>22603

Можно без стека.

>>22627

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

Поддерживается ли ФП в IDE? Есть ли там переход к определению и прочие радости?

Я не то чтобы против ФП, но плохо представляю, как его использовать, например в бекенде мессенджера, соцсети, IoT-устройства или интернет-магазина.
741 1322820
>>22779

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


ФП это просто способ писать код. Набор правил или рекомендаций если угодно.

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

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

В Лиспах к примеру if является выражением. Он всегда возвращает результат. И его можно вставлять в любой участок кода. В императивных языках if является инструкцией. Он ничего сам не возвращает, не становится значением. А выражение всегда возвращает значение. Поэтому if в императивных языках громоздкий и ограниченный по возможностям.
742 1322821
>>22711

>Код в функциональном стиле выглядит как выражение. Как в математике. Выражение вычисляется и возвращается результат.


На словах очень хорошо звучит, но на практике мне адово тяжело это читать. Даже когда понимаешь хуле там делается и код сам красивенький - все равно нюансы ускользают. 8 лет опыта работы.
743 1322822
>>22820
>>22821
нитуда
744 1322827
>>22821
Математику в школе все учат. В математике все представляется в виде выражений. Почему это сложно понимать?
745 1322872
>>22827
Еще в школе нас учили бегать, прыгать и играть в мячик. Это не делает тебя спортсменом или даже разбирающимся в спорте человеком. Я субъективное мнение высказал - функциональщина на больших объемах для меня является лапшой, которая не стоит затраченного на нее времени, особенно на поддержку. Для тебя может и по другому.
746 1322883
>>22872

>функциональщина на больших объемах для меня является лапшой, которая не стоит затраченного на нее времени, особенно на поддержку


Может ты просто не понимаешь о чем речь. Откуда знать что ты там видел, и что называешь функциональщиной. ФП код не может быть лапшой по определению. Значит ты видел что-то другое.
747 1322885
>>22872

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


Не очень хорошая аналогия. Я бы привел в пример шахматы. Человек, который сыграл хотя бы несколько десятков партий, как минимум знает как ходят фигуры. Поэтому для него нет проблемы понимать как течет партия. Даже если он смотрит партию гроссмейстеров. Да, он не может делать такие же умные ходы, но он знает как двигаются фигуры, по каким правилам, и может видеть кто выигрывает или проигрывает. Со школьной математикой все даже лучше. Если человек решал школьные задачи, а не бездельничал, то он легко может понимать математические выражения. Это не выдающееся умение, просто навык.

Значит у тебя нет навыка. И ты не хочешь его приобретать. Поэтому придумываешь отговорки, что оно непонятно и сложно. Хотя в реале все наоборот. Это просто и понятно.
748 1322974
Сложные предложения строю, сорянчик, я уже пьян.
>>22885
А помоему довольно хорошая. Это изначальный тезис был говном.
Это же как приравнять способность к рисованию блоксхемок на информатике к написанию сложных приложений. Вроде и соблюдено начальное условие, но промежуточные напрочь игнорируются.
Если так упрощать любую концепцию, то почему не каждый, кто умеет говорить способен еще и петь? Или че это не каждый из нас художник, хотя карандаш в руках держать способен? А те, кто и способен и художник - хуле не в "приавильном" стиле художники? И тут бы уже пора художникам завести спор о четкости предпочитаемого стиля.
О, а че это этот чувак зная правила шахмат не имеет даже разряда?
Список можно продолжать - это попытка излишнего упрощения в суждениях.
Аналогия с шахматами тоже излишне упрощена. Конечно любой, кто знает правила игры, сможет просто налюдать любую другую игру. Но видеть он ее будет на своем уровне, а нихера не близко к тому майндгейму, который в головах профессиональных игроков происходит. Да и как бы наблюдать игру гроссмейстера не значит сыграть с ним хотя бы достойно. Иначе в чем смысл этой аналогии? Типа тот, кто понимает "правила" фп сможет раздуплить фп код? Да все даже проще - их и понимать то не надо, чтобы раздуплить при достаточной сноровке, т.к фп хоть и оперирует выражениями, но не делает вообще никакой магии (потому что ее, понятное дело, не существует), кроме наложения новой парадигмы с опеределнными целями. Мимо простейшей логики у нас не пройти и все можно свести к ней же, так что упертость поможет решить проблему чтения кода на любом языке с любой применяемой парадигмой даже конченному барану. Захочешь - разберешь. Даже если из математики только яблоки складывать умеешь.
То, на что тот тезис про математику был ответом, вообще не имеет отношения к сказанному изначально, видимо меня не верно поняли. Придется уточнить приведением мысленного примера - если мне дать две версии кода сферического небольшого приложения, но одно будет написано на фп, а второе нет - то второе я смогу и разобрать и поддерживать практически мгновенно, даже если там довольно херовый код, в то время как на фп это будет гораздо медленее проиходить у меня. Не "не понято двоечником", а просто усложнен процесс инвестегирования и прочей поддержки. Объем приложения к примеру в сферические 30к строк императивного кода, на фп хз сколько. Нахер мне про школьную математику втирать, если я в состоянии работать с фп, просто не хочу это повторять?
Почему это должно быть не правдой, тем более что я четко указал, что это конкретно меня касается? На том моменте про "не понял" линию диалога понесло куда-то в сторону "докажи, что твой оппонент просто дурак любым способом". Это же вопрос обычной практики. Для того, кто наяривал фп наверняка все будет по другому, и это тоже не мешает ему высказать свое мнение по этому вопросу и остаться по своему правым. Правда тут есть только субъективная, т.к. это сраный спор о вкусах, где только время покажет, кто жрал говно, а кто нет. А скорее всего время покажет, что говно жрали все, как оно обычно и бывает, и одаримся мы какой-нибудь хитровыебанной парадигмой, на хую вертевшей всех, когда гению в башку клюнет. Сейчас на это по большому счету насрать, потому что элементы фп в любом современном языке чуть ли не в рекомендациях к действую имеются, и это тоже плюс, очень удобно по случаю (хотя и без специального сахара можно было обойтись, нихера же не меняется). Но вот чистое фп, чтоб аж скупая слеза у хардкорных адептов скатилась, пока что не сильно угрожает императивному коду, насколько бы оно простым не казалось например для тебя. Только не говори что в оценке на глаз я тут не прав, ты и сам знать должен, как дела обстоят. На данный момент ниша фп на подхвате в тех местах, где императивщина некрасивой становится. Такое себе перетягивание каната выходит.
Я кстати не спорю, что может я и с какой-то паленой приложухой на фп работал, откуда мне знать, я не прошаренный сильно в этой теме. Однако после этого, как ты верно заметил, желание искать на свою жопу новых функциональных впечатлений у меня отпало. Пока до новой необходимости приоритеты расставлены.
748 1322974
Сложные предложения строю, сорянчик, я уже пьян.
>>22885
А помоему довольно хорошая. Это изначальный тезис был говном.
Это же как приравнять способность к рисованию блоксхемок на информатике к написанию сложных приложений. Вроде и соблюдено начальное условие, но промежуточные напрочь игнорируются.
Если так упрощать любую концепцию, то почему не каждый, кто умеет говорить способен еще и петь? Или че это не каждый из нас художник, хотя карандаш в руках держать способен? А те, кто и способен и художник - хуле не в "приавильном" стиле художники? И тут бы уже пора художникам завести спор о четкости предпочитаемого стиля.
О, а че это этот чувак зная правила шахмат не имеет даже разряда?
Список можно продолжать - это попытка излишнего упрощения в суждениях.
Аналогия с шахматами тоже излишне упрощена. Конечно любой, кто знает правила игры, сможет просто налюдать любую другую игру. Но видеть он ее будет на своем уровне, а нихера не близко к тому майндгейму, который в головах профессиональных игроков происходит. Да и как бы наблюдать игру гроссмейстера не значит сыграть с ним хотя бы достойно. Иначе в чем смысл этой аналогии? Типа тот, кто понимает "правила" фп сможет раздуплить фп код? Да все даже проще - их и понимать то не надо, чтобы раздуплить при достаточной сноровке, т.к фп хоть и оперирует выражениями, но не делает вообще никакой магии (потому что ее, понятное дело, не существует), кроме наложения новой парадигмы с опеределнными целями. Мимо простейшей логики у нас не пройти и все можно свести к ней же, так что упертость поможет решить проблему чтения кода на любом языке с любой применяемой парадигмой даже конченному барану. Захочешь - разберешь. Даже если из математики только яблоки складывать умеешь.
То, на что тот тезис про математику был ответом, вообще не имеет отношения к сказанному изначально, видимо меня не верно поняли. Придется уточнить приведением мысленного примера - если мне дать две версии кода сферического небольшого приложения, но одно будет написано на фп, а второе нет - то второе я смогу и разобрать и поддерживать практически мгновенно, даже если там довольно херовый код, в то время как на фп это будет гораздо медленее проиходить у меня. Не "не понято двоечником", а просто усложнен процесс инвестегирования и прочей поддержки. Объем приложения к примеру в сферические 30к строк императивного кода, на фп хз сколько. Нахер мне про школьную математику втирать, если я в состоянии работать с фп, просто не хочу это повторять?
Почему это должно быть не правдой, тем более что я четко указал, что это конкретно меня касается? На том моменте про "не понял" линию диалога понесло куда-то в сторону "докажи, что твой оппонент просто дурак любым способом". Это же вопрос обычной практики. Для того, кто наяривал фп наверняка все будет по другому, и это тоже не мешает ему высказать свое мнение по этому вопросу и остаться по своему правым. Правда тут есть только субъективная, т.к. это сраный спор о вкусах, где только время покажет, кто жрал говно, а кто нет. А скорее всего время покажет, что говно жрали все, как оно обычно и бывает, и одаримся мы какой-нибудь хитровыебанной парадигмой, на хую вертевшей всех, когда гению в башку клюнет. Сейчас на это по большому счету насрать, потому что элементы фп в любом современном языке чуть ли не в рекомендациях к действую имеются, и это тоже плюс, очень удобно по случаю (хотя и без специального сахара можно было обойтись, нихера же не меняется). Но вот чистое фп, чтоб аж скупая слеза у хардкорных адептов скатилась, пока что не сильно угрожает императивному коду, насколько бы оно простым не казалось например для тебя. Только не говори что в оценке на глаз я тут не прав, ты и сам знать должен, как дела обстоят. На данный момент ниша фп на подхвате в тех местах, где императивщина некрасивой становится. Такое себе перетягивание каната выходит.
Я кстати не спорю, что может я и с какой-то паленой приложухой на фп работал, откуда мне знать, я не прошаренный сильно в этой теме. Однако после этого, как ты верно заметил, желание искать на свою жопу новых функциональных впечатлений у меня отпало. Пока до новой необходимости приоритеты расставлены.
749 1323042
>>22974

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


Ну ты видел математику, а теперь говоришь, что выражения в программировании сложно понимать. Во первых они проще математических. Во вторых что сложного вообще может быть в выражении? Есть операнды, есть операторы, есть приоритет операций, - все, больше ничего нет.
750 1323044
>>22974

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


Ну так чего ты тогда голову морочишь.
751 1323045
>>22974

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


Так и скажи, что не осилил, не хочешь, не понимаешь, и т.п.
752 1323046
>>22974
Делай двойной перенос строки, дели текст на небольшие абзацы. Такую простыню сложно читать.
753 1323070
>>22779

>Вот тебе пример калькулятора из phpExcel, если интересно:


Может и интересно, но я почти ничего не понимаю, что там происходит.

>Написать блок if/elseif


Чек.
Написал, всё работает. Единственное НО - я не понимаю, как выполнить операцию без указания её самой. То есть, если есть выражение 2+2, то я пишу if($char=='+') {$a+$b}
Я намеренно указываю, что а+б. Так как сделать так, чтобы код сам узнавал оператор?
https://repl.it/@JoeGreen/GrossPunctualTrapezoids

И да. Есть ли смысл на код бейсик проходить тренинги? На Хаскеле написано, что там первая часть уроков находится.
754 1323080
>>23042

>а теперь говоришь, что выражения в программировании сложно понимать


Думаю тебе так показалось, я об этом не говорил. Может не достаточно ясно писал выше.
Мне проще понимать императивный код, чем функциональный - вот и все, что я с самого начала хотел сказать. Зачем это все выворачивать?
По мне: для поддержки он в несколько раз проще, чем фп. Это критичный момент, и я его упоминаю. Сопровождение кода самое больное место. Написать может любой и в закат уебать довольный, а кому-то потом разгребать и развивать всю красоту. Например тебе или мне. Как это вообще можно забыть? Как будто кривого кода никогда не встречал. (фп я к говнокоду сейчас не приравниваю, просто пример о восприятии)
Я не раз упрощал свои абстрактные финты ушами, чтобы понятнее становилось, зато лучше всем остальным работалось. Красота в понимании одного - проблемы для другого. Надо фидбек получать, чтобы не укатиться в корыто.
А так пойму любой код, дело только в комфорте поддержки, что лирика. Правда эта лирика в человекочасы конвертится.
>>23044
Смотри выше.
>>23045
Жопой читаешь.
>>23046
Оке. Не привык писать длинные посты, чет пробило в этот раз.
755 1323097
>>23070

>И да. Есть ли смысл на код бейсик проходить тренинги? На Хаскеле написано, что там первая часть уроков находится.


Чёхго? Ты про code-basics.ru? На Хаскелле? Может Хекслете. Стоит проходить, очень даже стоит.
756 1323102
>>23080

>По мне: для поддержки он в несколько раз проще, чем фп


Как код с изменяемым состоянием может быть проще в поддержке? Все знают, что изменяемое состояние это зло. Если функция где-то что-то изменяет, то это приводит к ошибкам, и это сложно обнаружить. А ты говоришь это легко отлаживать. Не может быть у тебя 8 лет опыта, как ты написал.
757 1323116
>>23102
Никто ни к чему никого не обязывает, ты путаешь холодное с сладким. Ты можешь делать имутабельной импертивщину прикинь))) Главное в правильных местах, чтобы жопа не горела. Хоспаде, откуда вы лезете, надоели уже. Опытнее станьте, а не по методичкам твердите. Хочешь поговорить с кем-то с головой, а тебе уже третий пост цитатами без смысла наяривают.
758 1323126
>>23116

>Ты можешь делать имутабельной импертивщину прикинь)))


Смешная шутка.

>>23116

>Опытнее станьте, а не по методичкам твердите.


Эта еще смешнее, если учесть, что ты плаваешь в простых понятиях, а говоришь, что у тебя 8 лет опыта.

Как может императивный код быть иммутабельным, если он состоит из состояний, которые последовательно меняют? о_О Иммутабельный переводится как неизменяемый.
759 1323130
>>23126

>Иммутабельный переводится как неизменяемый.


Ну пятерочку по ангельскому ты заслужил, но схуя ты думаешь, что имутабельность это свойство определенной парадигмы, а другие НУ НИКАК не смогут? То, что ты больной не предлагай, слишком очевидно.
760 1323132
>>23116
Приведу цитату из словаря:

ИМПЕРАТИВНОЕ ПРОГРАММИРОВАНИЕ
Парадигма программирования, которая, в отличие от декларативного программирования, описывает процесс вычисления в виде инструкций, изменяющих состояние программы.


Императивное = изменяемое состояние. Как оно может быть иммутабельным?! Вопрос риторический.
761 1323134
>>23132
То есть когда я что-то иммутабельное на чистом ооп напишу ты глазам своим не воверешь, что это не императив? Ну ты и даун, хоспаде.
762 1323135
>>23130

>имутабельность это свойство определенной парадигмы


Иммутабельность это свойство состояния. Состояние становится неизменяемым. Неизменяемые структуры данных. Неизменяемые переменные (Джо Армстронг называет их по-другому, не помню как) как в Эрланге.
763 1323136
>>23134
Ой, а что если я просто напишу чистую функцию? Это все, я стал чернокнижником? Вы головой, а не словарями, думать умеете? А что если я функциональщину кааак ебну посреди мутабельного состояния - это будет фп или зашкваренное грязным пхп фп? У вас на районе как с этим? У меня всем похуй.
764 1323138
>>23135
Ты выдрал часть саркастического предложения и на серьезных щах на это отвечаешь. Иммутабельно так сказать.
765 1323139
>>23134

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


Сам понял что написал. Учись ясно выражать свои мысли.
766 1323141
>>23139
Ну ясно все с вами, тогда отчаливаю, слишком жестко.
767 1323143
>>23134

>я что-то иммутабельное на чистом ооп напишу


Что такое "чистое ООП"?
768 1323145
>>23138

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


У тебя проблемы с логикой. Только состояние может быть иммутабельным. Как и то, что только жидкость может быть жидкой.
769 1323168
>>23143
А что такое фп тогда? Просто способ написания кода. Иммутабельность можно сделать везде, и хоть мы тут друг друга уже говном закидываем очень блядь странно что вы этого вообще не понимаете, а на своей непогрешимой параше настаиваете запугивая бедных нюфагов в этом треде. Делов то полкопейки - парадигму под реальный мир приспособить. Чего вам, видимо, не дано. Фанатизма слишком много. Всегда у тебя будет состояние, в этом и ключевой косяк фп - слишком идеализируют и от этого сосут на всем, что выходит за рамки синуса. Вот и не взлетает выше хелперов к грязным мутабельным языкам это хваленое фп (покпок щас кинут какойнибудь твиттер). Хотя чего странного, по вики шпарите, практики и своих мыслей нихуя. Даже ценность мутабельности и иммутаьелности разъяснить не можете, только кейвордами покидаться есть силы.
>>23145
С чего ты взял что состояние обязано быть везде, кроме фп? С чего ты взял, что везде, кроме фп состояние будет? Что по твоему такое вообще состояние? И с чего ты взял, что это главная фишка фп? Ты думаешь фп это про иммутабельность? Вы там клей нюхаете или что? - одна чушь охуительнее другой.
Ой, извините, с чего ты взял что состояния в фп нет? Еще как есть, ты просто немного в глазки идеализируешь. Я в ахуе с этих даунов, у них состояние просто в идеальном случае не в куче лежит, а на стеке, а они уже из себя уже форму жизни из темной материи строят. И то идеальных случаев не бывает, мы тут не фпшной сказке живем.

>У тебя проблемы с логикой


Сначала за свою логику со школьной математикой ответьте. Хотя куда там фп и логика, сорян за принижение.
770 1323176
>>22779

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


>


Писал простой интернет магазин на функциях задавайте отверты. Вполне реально это делать.
Другое дело, что там без современных модных фич. Да тот же Вордпресс 90% через функции написан.
771 1323178
>>23176
Вордпресс и аналогичное это не пример для подражания.
772 1323190
>>23042

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


Какая математика? Все стремятся к созданию\описанию модели небольшого кусочка реального мира посредством языка программирования, создавая объекты. Кому нужна математика в программировании? Это было актуально в 70х годах, но не сегодня.
Я тебе что, математик, чтобы формулы писать и считать? Пека у меня для чего нужна тогда? Мне, как кодеру, достаточно только уметь общаться с ней, донося, что хочет заказчик.
773 1323195
>>23178
Это не тебе решать, а рыночку, который уже порешал.
774 1323214
>>23168
Не буду толочь воду в ступе. Слишком много текста чтобы на каждое предложение отвечать. Да и почти все они не предполагают ответа.

Ты сам все спутал изначально, а теперь выкручиваешься. Состояние есть везде, но в ФП состояние не изменяемое, то есть то самое иммутабельное. В Эрланге к примеру все неизменяемое. Ты пишешь, что можно сделать иммутабельное состояние при императивном программировании, что само по себе абсурд.
775 1323216
>>23176
Через функции не означает ФП.
776 1323220
>>23190

>Все стремятся к созданию\описанию модели небольшого кусочка реального мира посредством языка программирования, создавая объекты.


Ешьте в забегаловке у ООП, миллион мух просто так не прилетят.

А если серьезно, то кто сказал, что все стремятся? В математике такого и близко нет. ФП как раз математическая модель, выросшая из Лямбда-исчисления Чёрча.

>>23190

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


Это вообще нонсенс. Ты хоть знаешь, что все программирование имеет математику под собой. Кроме ООП конечно, это чистой воды костыль, не имеющий никакого серьезного фундамента.
777 1323226
>>23216

>"Пить воду" не означает что воду.


Ясно.
778 1323234
>>23220
Так и скажи, что неосилил ООП и пишешь как джун.
И не осилишь никогда, судя по всему.

>в забегаловке у ООП


>миллион мух просто так не прилетят


>математическая модель


>все программирование имеет математику под собой


>ООП - костыль


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

Ещё раз - все стараются уйти от математики в программировании, просто потому, что это слишком низкоуровневая тема. Все, кроме тебя.
779 1323265
>>23226
>>23234
Во первых не обобщай. Кто все? Ты несешь такую пургу, что даже смешно. Математика у него низкоуровневая. Я такой чепухи никогда в жизни не слышал. Уйти от математики в программировании - это смешно не меньше. Честно говоря, тебе уже ничем не помочь. К сожалению твой уровень вряд ли поднимется выше написания бесполезного инфраструктурного кода, ибо до алгоритмов (математики) ты не дорос. Пиши дальше бесполезные бойлерплейты.
780 1323275
Как же оря с веб-макак, которые спорят о математике и парадигмах программирования.
781 1323278
Как же ору с веб-макак, которые спорят о математике и парадигмах программирования.
782 1323281
>>23265

>Кто все?


Все программисты. Байткод->ассемблер->ЯП->функционалка->ООП.
Ты либо сказочный пионер, либо зеленый.
783 1323341
>>23281

>Байткод


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

>>23281

>функционалка


Функциональное программирование как математическая модель родилось в 30-х годах 20-го века. Еще до первых языков программирования.

Так что зеленый здесь ты. У тебя нулевые знания.
784 1323391
Задача: читать и редактировать двустрочный файл.
Есть ли адеватное, блять, решение такой элементарной задачи? Почему это так сложно и не работает ничего?
785 1323397
Сегодня с другом обсуждали как выгоднее накопить на хату. Я говорю ему что ипотека не оч, так как ты платишь проценты. И скажем лучше платить за аренду 15к, откладывая 15 про запас, чем платить в ипотеку 30к.

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

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

Скажем мы простой работяга у которого есть в месяц Х свободных тысяч рублей. Далее что мы делаем. Когда наши накопления становятся больше 50к (минимальный вклад в сбере), то кладем их в наш сбербанк под 7% (опять же есть такой вклад, если время минимум год.

Например имеем такие по 12.5тр. в месяц, стало быть через 4 месяца делаем первый вклад. Через еще 4 месяца уже второй. И так далее.

Допустим мы начали всю нашу затею в сентябре, и наш первый вклад пришелся на новый год. Стало быть через год и 4 месяца начала всей нашей затеи, мы уже снимаем 53.5 тысячи рублей с вклада. Плюсуем их к тому что у нас есть сейчас на руках с зарплаты и создаем новый вклад. Далее процесс начинает циклично повторяться. Снимаем вклады, плюсуем к тому что у нас заработано и закидываем в банк. За какое время при таком подходе мы накопим себе 2 милиона рублей?

Далее допустим мы накопили 2 милиона, сняли все текущие вклады и купили себе квартиру, которую можно тоже сдавать и добавить к нашему доходу еще 12.5к в месяц.

Осуществимо ли это вообще, если скажем изначальная цена квартиры 2миллиона, но при этом она будет в среднем дорожать на 1% каждый месяц на протяжении всего цикла?

В общем никто не хочет начать решать? Сам поделился скорее что бы не забыть, просто сегодня сильно заебан на работке и лень думать.
786 1323400
>>23391
http://php.net/manual/ru/function.file.php

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

Ну и еще проверь что бы у твоего интерпретатора доступы были к папкам в которых ты шаришься и что бы путь к файлу был правильный и все такое.
787 1323419
>>23400
Спасибо, не ожидал увидеть ответ, писал уже просто от отчаяния. Но тут тоже не могу разобраться, как обратную операцию провести, т.е. записать измененный массив в файл. Еще же ведь и перезапись нужна, а не в конец писать. Ох.
788 1323427
Нашел вот такое компактное решение этой проблемы:

$filePath = 'closed/logpassDB.txt';

// Запись.
$data = serialize($DB);
file_put_contents($filePath, $data);

// Чтение.
$data = file_get_contents($filePath);
$DB = unserialize($data);
19r-1160x736.jpg631 Кб, 1160x736
789 1323438
Слушайте, нужно удалить инфу из базы нажатием на кнопки. У кнопки есть id хтмлный. В зависимости от id удаляется та или иная информация. Нужно достать оттуда этот id, вычленить из строки последние символы, которые обязательно цифры, и послать запрос в базу на удаление строчки из таблицы, в ячейке которой есть эти самые цифры. Всю таблицу читать не нужно, только один столбец. Как это сделать максимально коротко и эффективно?
790 1323439
>>23438
Ах, да. Id у кнопок генерируются динамически, так что простым с жикверным $().on('click', ...) тут не получится совладать, как мне кажется.
791 1323441
>>23438
Можно сделать форму с hidden полем, через js туда передавать id и после этого отправлять форму.
792 1323442
Вот заходишь сюда, а эти нубы задают вопросы, внутри которых месяцы моего изучения сидят, отвечаешь им отвечаешь, а они все не кончаются, впизду.
793 1323452
>>23441
А что, с базой можно соединиться только посредством формы?
794 1323459
PDO или mysqli?
795 1323475
>>23459
windows or linux?
796 1323479
>>23475
Для игр винда, для администрирования лексус.
797 1323537
>>22820

А примера кода нету?

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



А я не про это. Вот, например, в императивном стиле у нас есть классы, и известно в каком файле какой класс. И часто редактор позволяет перейти к нужному методу (а если нет - можно догадаться). А есть ли такое в ФП? Не будет ли большая программа в ФП выглядеть как гигантское выражение, которое надо прочесть и изучить целиком, прежде чем можно что-то понять и начать править? Или как длинный набор определений, которые, опять же, надо все прочесть сначала? Не будет она выглядеть как код на Питоне или JS в плохом смысле этого слова?

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

Вот был бы пример кода - можно было бы посмотреть.

> Выражение вычисляется и возвращается результат.



Я плохо представляю выражения размером хотя бы в 10 000 строк.
798 1323539
>>23176

В вордпрессе процедурное программирование, а не функциональное. Ты можешь посмотреть определения в википедии.
799 1323541
>>23438

Лучше класть id в дата-атрибуты, которые для этого придуманы. Также, можно каждую кнопку обернуть в форму со скрытым полем и обойтись без JS.
800 1323573
>>23537

>Я плохо представляю выражения размером хотя бы в 10 000 строк.


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

>>23537

>А примера кода нету?


На PHP у меня готового кода нет, и искать не хочется. PHP разработчики могут не до конца или не правильно понимать ФП, поэтому учиться ФП по PHP коду плохая идея. У ФП есть математическая база - Лямбда-исчисление, ее нужно понять прежде чем подходить к ФП. Могу посоветовать темы для изучения, книги, курсы.

Для начала можно посмотреть это https://www.youtube.com/watch?v=7BPQ-gpXKt4
801 1323581
>>23539
Ты скозал?
802 1323639
>>23070
Вместо иф-элс используй switch
803 1323640
>>23573
Это что, за хуйня? Залез в пхп тред, на пхп не пишет, несёт ебень какую-то и впаривает ФП. Коммивояжёр 2.0
Иди-ка ты нахуй с треда, теоретик.
раб божий Митрофан 804 1323703
Поцантрэ, порекомендуйте хостинг забугорный европейский. Парашкины блокировки всего подряд достали уже. Хочу кодить как европеец - без ватно-совковых ограничений.
805 1323730
>>23703
digitalocean
806 1323734
>>23730
Удвою. Пока что стабильно служит, блокировок не наблюдаю. Да и вообще хорошо с ним работается.
807 1323742
>>23703

Можно поискать тут: https://vps.today/ или https://poiskvps.ru/

Учти, что все, что принимает российские платежные системы вроде webmoney или yandex - это скорее всего российские компании, даже если там стоит другая страна.

Также учти, что реальные характеристики можно выявить только тестами.

Не бери OpenVZ: там часто нельзя загружать модули ядра, менять iptables итд в силу архитектуры. Также, там память считается таким образом, что ее расходуется в 1,5 - 2 раза больше. 1 Гб на OpenVZ может примерно соответствовать 500-700 Мб на KVM.

Хетцнер русских не любит и сразу требует документы.

Многие хостинги не примут виртуальные карты из России. Например, DO не принимает виртуальные карты киви. Другие хостинги не принимают карты сами, а делают это через пейпал, где от русских требуют заполнить подробную анкету. По моему опыту, удобнее всего платить биткойнами, без лишних заморочек.
808 1323746
>>23742

>Хетцнер русских не любит и сразу требует документы.


Разве так плохо с документами? Я просто хз, не был владельцем тут, но понравились цены сильно.
809 1323783
>>23397
Обидно что никто не заинтересовался задачкой, по сути расширенный вариант задачи с процентами. Одни фрилансеры сидят теперь судя по треду, которые не могут id из дата-аттрибута в мускуль-запрос скормить.
810 1323788
>>23783
А ты сам чего?
раб божий Митрофан 811 1323844
>>23742
ВПС брать - дороха. Ещё не известно выйдет ли чего путного, а деньги уже уплочены будут.
812 1323848
>>23783
Какая ещё задачка? Там портянка левого текста на 5 килобайт. Кто это будет дочитывать?
С первый строк уже насрать на тебя и твоего дружбана.
Безымянный.PNG47 Кб, 952x365
813 1323908
Сап, анонче. Пытаюсь добавить данные в базу, mysqli_query возвращает false. Типы данных совпадают. Что не так?
814 1323926
>>23908
Понял, функцию с датой нельзя передавать напрямую в запрос.
815 1323939
>>23926
У Мускула есть встроенная функция таймштампа, просто укажи её в поле даты по умолчанию. Не надо такие вещи посылать в базу.
816 1324002
>>23703
digitalocean если зарегаешься по чей-то рефке упадет 10$, на 2 месяца минимального тарифа хватит.
817 1324039
>>23939
Один хуй форматировать на стороне клиента придется, ибо мне нужна дата в определенном формате.
818 1324051
>>23541
Чем лучше?
819 1324108
>>24039

>мне нужна дата в определенном формате


Таймштамп на то и таймштамп, что перегоняется в любой формат.
Твоя функция может принимать его - date ( $format, $timestamp)
Используй документацию, Люк. И не городи огород.
http://php.net/manual/ru/function.date.php
820 1324123
>>24108
Ччерт, я поражаюсь твоей терпеливости, антончик. Спасибо за помощь.

Я тут кстати еще недавно спрашивал совета насчет вытягивания айдишника из элемента и передачи его в обработчик пхп.
Мне посоветовали создать форму с невидимым элементом, передавать в него значение и отправлять. А я сделал еще короче. Я заменил айдишник на value у элемента с тем же значением, вытягиваю его $_POST и отправляю запрос.
821 1324125
>>24108
Ты забыл еще сказать, что юзая таймштам, нужно передавать ему функцию UNIX_TIMESTAMP(), чтобы метка времени была удобочитаемая функцией date().
822 1324133
Двощь, снова к тебе с вопросом. Не могу понять, как в конец строки вставить определённое кол-во символов. С помощью substr_replace() только один вставляется. А если мне надо 10, на пример? Там, вроде, всё с помощью цикла решается, но я не могу сообразить что-то.
https://repl.it/@JoeGreen/testing
Сама задача:

> Дана строка. Если ее длина больше 10, то оставить в строке только первые 6 символов, иначе дополнить строку символами 'o' до длины 12.

823 1324134
Сап двач, у меня появился вопрос по безопасности сайтов. Как защитить конфигурационные файлы конекта БД. Ведь к ним есть доступ вообще у всех.
Я пробовал через .htacess выставлять Deny from all
Но тогда сайт перестаёт конектится к базе.
824 1324136
>>24134
А что у тебя конфиг делает в паблике? Вынеси, например, на уровень ниже.
Repl.it - ElderlyObedientAttributes - Google Chrome 2019-01[...].png27 Кб, 438x411
825 1324138
>>24133

>как в конец строки вставить определённое кол-во символов.


>С помощью substr_replace()


Конкатенация же.
826 1324140
>>24136
В отдельной директории лежит конфиг.
827 1324142
Антоны, а вы вкатывались в какие-нибудь гитхаб репозитории.
У меня например есть пара мест где я бы хотел исправить овер 9000 строк говнокода, перевести всё к PHP7.0 но я имею 0 опыта работы в командных репозиториях и вообще не понимаю как это будет работать на практике. Помогите советом.
828 1324143
>>24133
Вот тебе вариант покороче и лаконичнее.

https://repl.it/repls/SinfulShinyBootstrapping
829 1324144
>>24142
Обычно в репозитории есть список необходимой работы, в issue. И описание требований для контрибьюторов, стиль кода, и все остальное. Смотришь задачи, клонируешь репо, решаешь, отправляешь пулл реквест. Если твой код устроит, то его внедрят в мастер ветку.
15464546874620.mp43,2 Мб, mp4,
640x360, 2:32
830 1324147
>>24143

>Укорачивание за счёт удаления перевода строки


>Конкатенация через While


Ну... такое себе решение.
831 1324158
>>24147
Лол, залезь под капот функции, которую ты юзаешь, и увидишь то же самое.
832 1324160
>>24158

>Есть ссылка на исходник


>залезь под капот


Так и так всю функцию видно. Это не повод засовывать туда while, когда можно обойтись без него.
833 1324161
>>24160
Я про subst_replace или что он там написал. Залезь в самые недра, так сказать.
834 1324176
>>24144
А что если репозиторий старый. Я например видел несколько игруль где код не одновлялся аж с 2009 примерно. Там даже ЧПУ не привезли. Можно ли взять этот код и редактировать, но уже как свой проект?
Спасибо за ответ анон.
835 1324225
>>24176
Тебе кто то мешает форкнуть проект? Я разрешаю.
836 1324237
Оп, нужно ли пхпшнику учить docker?
837 1324252
>>24237
Какая конечная цель? Докер удобен для запуска чего угодно в изолированном окружении.
838 1324266
>>24134

Если ты вывалил весь код в публично доступную папку сервера, то это неправильно. Надо создать в проекте папку public, настроить ее как корневую, и в эту папку класть только то, что нужно - js/css/картинки, index.php.

Тогда конфиг будет не доступен из веба.

Закрывать папки и файлы по одному, как ты предлагаешь - это ненадежные костыли.
839 1324267
>>24138
Немного не то. Я хочу не просто приклеить +n символов, а как-то это в цикле сделать, что ли. Там в задаче написано, мол, если длина меньше 10, то в конец добавить символ "о", чтобы длина стала 12.
>>24143
Спасибо. Вчера тоже пытался через while сделать, но не приклеивал, а в теле substr_replade() делал.
Алсо, почему вот такой код работать не будет?
while($count < 12)
{
$result = substr_replace($text, "o", $count);
echo $result;
}
840 1324268
>>24267
То есть, как я это вижу:
Пока длина $text < 12 символов, делаем substr_replace (добавляем в конец строки) символ "о". Где я ошибаюсь?
841 1324283
842 1324287
>>24268
Ошибаешься например в том, что $count не пересчитываешь. Да и вообще попытка такого решения как-то наизнанку простую вещь делает.
843 1324292
>>24143
Плохой код. Ты считаешь длину получающейся строки каждую итерацию вместо того, чтобы один раз высчитать нужное количество новых символов.
844 1324297
>>24292
Тогда скажи как через substr_replace() за один шаг добавить нужное кол-во символов. Пока что его решение самое лучшее.
>>24287
Точно. Про пересчёт забыл.
845 1324300
>>24283
За str_repeat() спасибо. Не знал.
846 1324301
>>24297
Почему ты к str_replace так привязался? Это само по себе не нужно тут. Да и моя придирка была совершенно в другом. Выше лежит мой пример, где показано как высчитать сколько тебе символов нужно. Можно это же сделать тупо циклом, а не str_repeat, но при этом ты считать каждый раз длину строки не будешь.
А была бы она по условию задачи до 1кк символов дополнить например - тогда бы уже точно было некрасиво глаза закрыть на лишние действия.
847 1324305
>>24301
https://3v4l.org/sd4Hd

Вот держи, тут изменил немного, без реплейса канеш, ибо это совсем глупость, но с циклом вместо готовой функции и без какого-либо пересчета длины строки на каждой итерации.
848 1324318
>>24301
И еще вот наглядную демонстрацию почему это плохо завез.
https://3v4l.org/Qr6sY - выполняется хотя бы.
https://3v4l.org/59mRU - ну фактически тоже выполняется, но уже не успевает за лимиты этого сайта выйти.
Из-за одной такой мелочи в простейшем месте можно получить натуральный удар по яйцам. И ведь даже указал на это сразу, а все равно пришлось разжевывать.
849 1324326
>>24301

>А была бы она по условию задачи до 1кк символов дополнить например - тогда бы уже точно было некрасиво глаза закрыть на лишние действия.


Я, конечно, понимаю, что тут не /web, и на практику тут забивают, но вы все-таки думайте хоть немного при разработке не абстрактно. Если не требуется проверять строку в 1000000 символов, то и нечего мозги ебать, тем более, что цикл, что функции твои встроенные практически с одной скоростью выполнят процедуру.
В общем, хочу я сказать, что задачу решить можно разными способами, но для каждой задачи нужно подбирать оптимальный способ.
850 1324329
>>24326
Человек, который закрывает глаза на такие неприятные мелочи может наделать их огромное количество, что уже вполне будет аналогично выполнению вот этой залупы на 1кк строк.
Делов то просто сразу написать чуть по другому, понимая что делаешь, даже не затратив дополнительного времени и усилий на это. Не какая-то хардкорная оптимизация или преждевременная, а просто здравый смысл, привычка не писать глупость по принципу "да все ок, не ебанет" в мелочах. Да и попросту привычка не писать говнокод необоснованный. Даже анализатор шторма такие моменты подсвечивает, а он вообще разумом не обладает. И на ревью за это не погладят, а проведут разъяснительную беседу, только уже поспорить не слишком получится.
Ладно, вижу что не понят и оставлю вас при своем.
851 1324352
Посоны, есть условный цикл while($i<100){}, как сделать что бы каждый десятый $i увеличивал на еденицу другую переменную?
852 1324380
>>24352
Проверить, что $i делится на 10 без остатка.
Например
https://3v4l.org/ooCHC
Или завести переменную счетчик и сбрасывать ее когда она становится 10.
853 1324420
Двощь. Придумал себе занятие. Хочу написать функцию, которая создаёт массив с требуемым количеством элементов массива. Или такая уже есть функция уже есть?
Алсо, накидайте каких-нибудь интересных, не сложных заданий. А то в интернетах какое-то всё не то.
854 1324427
Хочу значит изменить label формы в Symfony, пишу в твиге {{ form_label(form, "new label") }}, а он мне все равно создает в form_widget еще один label. Что не так? Пробовал как атрибут в контроллере передать, один хер
855 1324430
>>24420
range есть к примеру
856 1324485
>>23908

>UNREGISTERED


>Windows XP


>это нелепое замазывание струйкой


Это просто комбо какое-то
857 1324506
>>24485
Тебя не должно ебать кто на чём пишет.
858 1324518
>>05368 (OP)
https://github.com/asdasdasdasddasasdasdas/StudentList
Оп чекни мой список студентов
859 1324642
>>24506
И правда забавное замечание у этого.
>>24506
860 1324695
>>24266
Это ведь стандартный хостинг с доступом только к публичной папке.
861 1324697
>>24267

>в задаче написано, мол, если длина меньше 10, то в конец добавить символ "о", чтобы длина стала 12.


Вообще тебя не понял. Ну удали лишние символы. Всё равно решение подходит для задачи.
862 1324707
>>24326
Вот из-за таких разрабов хром сжирает к хренам по 2-3 гига оперативы загружая какой-нибудь фэйсбук. И заставляя Крузис тихонько курить в сторонке. Ну подумаешь цикл лишний раз прикрутил туда, где он просто нафиг ненужен. "Чё мозги ебать". Правильно. Говнокодьте и не думайте головой. Зачем это в 2019?
863 1324725
>>24485

>UNREGISTERED


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

>Windows XP


Что плохого в хрюше?

>это нелепое замазывание струйкой


Это распылитель, даун тупой.
864 1324729
>>24725
Двачую, XP - лучшая ось эвар.
865 1324813
Есть кто не смог осилить задачку с банкоматом и это не помешало стать пхп-сеньором 300к?
866 1324817
>>24813
Лол, нет конечно. Все, что у опа представлено для обучения - должно с легкостью щелкаться нормальным джуном, не говоря о сеньорах.
867 1324818
>>24817
Ну пездос вы тут гении тогда, если и тут нужно разбираться в таких сложных вещах, а кто-то еще макаками кличет
868 1324849
>>24813

>стать пхп-сеньором 300к


Ты хотя бы джуниором стать. Неразумно делить шкуру еще не убитого медведя. Сколько вас таких.
869 1324854
>>24849
Да это шуточки
Просто приуныл от задачки, что такой непосильной показалась
870 1324894
>>24854
Тогда скажу, что некоторые не могут написать даже fizz buzz, но успешно работают программистами. Есть много статей на эту тему. Если задача не решается долго, то не стоит зацикливаться, а идти дальше. В дальнейшем решение может открыться внезапно. Изучаешь новые темы, и вдруг понимаешь, что это то, что нужно для решения. Например стоит изучить деревья, рекурсию, динамическое программирование. Если я правильно понял задачу, то это те темы, которые нужно знать для ее решения. Как звучит задача формально?
871 1324900
>>24894

>некоторые не могут написать даже fizz buzz, но успешно работают программистами


Это настолько печально, что даже верить в это не хочется.
872 1324906
873 1324908
>>24906
Да читал давным давно еще, но пока не встречал ниодного даже самого глупого стажера, который бы физзбазз не осилил.
874 1324913
https://repl.it/@JoeGreen/testing
1. Как из одной функции менять переменные другой? Они же закрытого типа.
2. Почему меня echo $yodaText не работает?
875 1324924
>>24913
Для чего? Почитай про область видимости, лексическую область видимости, и про изменение состояния.
876 1324935
>>24924

>Для чего?


Сам не знаю. Дано 2 функции, но зачем там вторая - ума не приложу.
877 1325001
>>24913
return $result; вместо echo $result;
1547211026498.jpg37 Кб, 800x399
878 1325023
>>24906
FizzBuzz:

for ($i = 1; $i <= 100; $i++) {
if ($i % 3 === 0) {
echo 'Fizz';
}
if ($i % 5 === 0) {
echo 'Buzz';
} else {
echo $i;
}

echo "/n";
}

Насколько я конечный?
879 1325026
>>25023
Все ок. Жаль только этот метод отсеивает только тех, кто с одним только подвешенным языком на работу приходит устраиваться.
880 1325043
>>25023
У тебя на числах кратных 3 (но не кратных 5) помимо Fizz еще и само число будет выведено.
>>25026
Вот ты и спалился, некомпетентный петух.
881 1325046
>>25023
Без цикла сможешь? Хорошая практика создавать функцию и в ней прятать вычисление. Еще у тебя одно условие не соблюдено, когда делится и на 3 и на 5 должно выводить FizzBuzz.

Из какого фильма пикча?
882 1325048
>>25046

>Из какого фильма пикча?


Звездный десант
883 1325052
>>25046

>Еще у тебя одно условие не соблюдено, когда делится и на 3 и на 5 должно выводить FizzBuzz.


Еще один некомпетентный петух, и все главное так уверенно отвечают и дают советы, ахаха.
884 1325053
>>25043

>Вот ты и спалился, некомпетентный петух.


Ну сорян, я пьяный((
885 1325057
>>24908
Микроитог: даже ИТТ трое из четырех не смогли в физзбазз. И ладно один из трех честный ньюфаг, а двое других пытались косить под гуру и давать советы.
Такие пироги.
886 1325059
>>25057
https://ideone.com/sEtTEs
Правильно?
мимонубас
887 1325061
>>25059
Да, должно корректно выводить.
888 1325064
>>25043

>У тебя на числах кратных 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 и знак переноса строки.
889 1325066
>>25059
Ну по выводу выглядит правильно. Однако меня ты удивил таким использованием is_int, даже вдуплить не могу схуяли это работает вообще.
890 1325068
>>25064
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 1325069
>>25066
А хотя пригледялся - понял. Не обратил внимание, что ты реально делишь. Хитрый ты черт.
892 1325070
>>25066
Ну если без остатка разделилось, получится целое число, пых сконвертит его в тип int.
893 1325073
>>25070
Да просто не подумал, что там без % обошлось, невнимательность.
894 1325074
>>25064
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";
}

Нет больших условий, но по лаконичности все равно такое.
895 1325078
Аноны, простите, что не по теме, зарегистрировал сайт и сейчас мне пришло письмо: "Ув. Регистрант,
Все практически готово, теперь Вам следует совершить оформление сайтнейм в поисковиках сети Интернет. Оплатить заявку Вы должны до 21.01.2019.", что это за ебала, развод?
896 1325079
>>25078
Да.
897 1325082
>>25074
https://ideone.com/4PFPv2

Насрать на лаконичность.
898 1325084
>>25079
Спасибо.
899 1325086
Можно вот так ещё поизвращаться на задачкой:
https://ideone.com/2yiyEu
900 1325089
Вы охуели без ООП и паттернов решать эту задачу?
901 1325090
>>25089
Надо регулярку ещё приделать. Чтобы будущий работодатель все скиллы сразу видел.
Можно ещё Симфони поставить и через роутер правил наделать.
902 1325092
>>25090
Все значения брать из хранилища через орм, с валидациями на unsigned int. Весь вывод кинуть в очередь на ребит например на второй скрипт, чтобы на первом только процессинг оставался.
903 1325094
>>25092
И не забыть про кэширование.
904 1325095
>>25094
Ага, двухуревновое.
905 1325098
>>25092

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


Можно еще сразу горизонтальное масштабирование наладить.
906 1325100
>>25098
Вполне здравая мысль так то. Не говори мы о физбазе правда.
907 1325101
Алсо предлагаю решение задачи нейронкой сделать.
908 1325104
>>25101
Придется прямо на собесе ее обучать, неловко выйдет. Да и все равно у нейронок 100% точности не бывает.
909 1325112
>>25104
Твоя задача написать нейронку на листочке, как ее будут запускать — не твоя забота
910 1325115
Пока в треде собралась куча погромистов разного уровня, спрошу: обучился самым самым основам по гайду ОПа. Дошёл до его задач. Решить их = знаний не хватает.
Собственно, сам вопрос - что делать теперь? Что учить/читать/смотреть?
911 1325118
>>25115
Каких именно задач?
912 1325119
>>25115

>Решить их = знаний не хватает.


Значит неуверенно себя чувствуешь - незватает знаний и что-то не усвоил.
Гайд ОПа отлично идёт если его использовать как дополнение. Укради где-нибудь нормальный курс лекций и пройди его, парралельно читая ОПа.
913 1325121
>>25119
Что посоветуешь в роли нормального курса лекций?
>>25118
Все те, что идут после курса: калькулятор, йодаспик, банкомат и т.д.
Частично я их могу решить, но не до конца.
914 1325122
>>25115
Выдумай себе проект, может даже были мысли что-то сделать - и въебывай.
915 1325126
>>25121

>Что посоветуешь в роли нормального курса лекций?


Я "Специалист" проходил. Правда не до конца - на третьем курсе сам полез уже копаться на хабре и гите, но это я уже умел немного в код ещё до этого.
Один курс - часов 12-13 по времени.
916 1325131
917 1325135
>>25121

>банкомат


То чувство, когда не зря прочитал всю книжку препода про дискретную комбинаторную оптимизацию.
Тут весь прикол как раз в том, что "в лоб" она нихуя не решается без продвинутой сложнее школьного курса математики.
918 1325147
>>25126
Что-то много всего по данному названию вылазит. Не вот этот ли? smart-torrent.org/viewtopic.php?t=117118
919 1325148
>>25147
Вроде то.
920 1325184
>>24894

>некоторые не могут написать даже fizz buzz, но успешно работают программистами


Как-то встречал таких когда вкатывался. Одно из их любимых выражений - "Нах ты вручную всё пишешь? Иди ларавель возьми, а то заебёшься."
Вот такие мартышки на низкоуровневых задачках и сыпятся - выучили только работу с фреймворком, не понимая принципов.
Фактически это уровень детишек с вордпресса, которые только темы накатывать могут из админки, суть та же. Зато все синьоры-помидоры в свои 23 года.
921 1325185
>>25135
Интуитивно догадался, что не имеет смысла перебирать всевозможные варианты.
922 1325214
>>25184
Вы оба говноеды, а использовать какой-нибудь популярный фреймворк при разработке 90% приложений нужно, потому что:
1) Он почти наверняка будет спроектирован и документирован лучше, чем твоя самописная архитектура.
2) Проект будет гораздо более понятен новым сторонним разработчикам.
3) Нехуй писать велосипеды в тех 90% проектов, где можно спокойно использовать уже написанные.
923 1325272
>>25214
А вот и маня-синьор с фреймворком наперевес.
Как и следовало ожидать может только в крайности и не понимает, что знание самого языка и понимание алгоримов со структурами данных - почётная обязанность каждого программиста.
Знание фреймворков тут не столь важно - в процессе научится т.к. там никакой фантастики.

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


Пиши как положено и всё понятно будет. А от говнокода даже ларавель не спасёт.

>Нехуй писать велосипеды в тех 90% проектов


А это уже не тебе решать где и что использовать, а разработчику. Нехуй советы давать.
924 1325282
подскажите куда копать, есть функция mysqli_connect(), при выполнение кода пишет такое: Uncaught Error: Call to undefined function mysqli_connect(). Версия пхп 7.2, в расширениях все включил. В гуглях искал и узнал что процедурной версий этой функций лучше не пользоваться, но тут простейшее исполнение, что может пойти не так?
925 1325297
>>25282
Что непонятного?
Пых говорит тебе, что не знает о существовании этой функции.
Посмотри в phpinfo или php -i включено ли расширение.
Возможно также ты вызываешь ее в своем неймспейсе, обращайся через обратный слеш.
Ну и почему ты не используешь PDO?
926 1325301
>>25297

>Посмотри в phpinfo или php -i включено ли расширение.


Возможно также ты вызываешь ее в своем неймспейсе, обращайся через обратный слеш.
все это смотрел

>Ну и почему ты не используешь PDO?


это учебный проект
858-926 927 1325349
858-926

Ой, нафлудили, пока меня не было...

>>25282

Возможно, не установлено расширение mysqli. Сделай phpinfo() и посмотри, есть ли оно там.

>>25301

Есть php -m, но я бы не советовал проверять через CLI, так как в некоторых дистрибутивах конфиги CLI и для веба разные.

>>25135

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

>>25115

Один из вариантов - вкинуть написанный код в тред и задать вопрос. Вполне возможно, что кто-то знает ответ и решение проще, чем тебе кажется.
928 1325350
>>24913

> Как из одной функции менять переменные другой? Они же закрытого типа.



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

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

Ты передаешь данные, нужные функции, как аргументы при вызове, и она возвращает результат с помощью 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 1325350
>>24913

> Как из одной функции менять переменные другой? Они же закрытого типа.



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

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

Ты передаешь данные, нужные функции, как аргументы при вызове, и она возвращает результат с помощью 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 1325351
>>24813

Лучше всего задать вопрос в треде в таком случае. Эта задача в простом случае решается "жадным алгоритмом", который выглядит так. Допустим, дана сумма 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могут помочь твоей будущей карьере.

>>24707

Справедливости ради, там не цикл, а желание получить большее быстродействие за счет увеличения расхода памяти, которое требуется для современных навороченных HTML5 страниц.
929 1325351
>>24813

Лучше всего задать вопрос в треде в таком случае. Эта задача в простом случае решается "жадным алгоритмом", который выглядит так. Допустим, дана сумма 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могут помочь твоей будущей карьере.

>>24707

Справедливости ради, там не цикл, а желание получить большее быстродействие за счет увеличения расхода памяти, которое требуется для современных навороченных HTML5 страниц.
https://github.com/asdasdasdasddasasdasdas/StudentList/ 930 1325352
>>24518
>>25131

> Нужно создать таблицу на основе дампа в 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 1325352
>>24518
>>25131

> Нужно создать таблицу на основе дампа в 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 1325425
932 1325532
Пытался внедрить дженерики в php, чтобы быстрее разрабатывать, в итоге сделал яву из пхп, теперь на каждый пук надо написать километр кода...
15458335242400.png169 Кб, 512x512
933 1325615
Сап
Хелпаните нюфагу
Поставил MAMP на макось. Хотел включить отображение ошибок на в php. Сделал по гайду. Поставил в файле php.ini error_reporting = E_ALL и display_errors = On. Перезапуская серв и все равно при наличии ошибок пустая страница. И так и сяк делал. Не монимаю, в чем косяк. Мудрый анон, помоги
934 1325634
>>05368 (OP)

>Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу.


А в 2019 году есть шанс без реакта стать верстальщиком? Зная только js и jquery без реакта? Хочу задрачивать html, css, а не реакт. Я прошел 2 курса по реакту, примерно представляю как верстать под реакт, но я не готов заниматься программированием на реакте. Хочу верстать. Реально ли стать верстальщиком в 2019? (Мухосрань 300 тыс. людей)
935 1325644
>>25615
Нашел в чем траблы.
Нужно сделать то же самое, еще раз, как и в Applications/MAMP/conf/php/, но в другом php.ini в Applications/MAMP/bin/php/
Вдруг кто-то такой же додик, как и я
Держу в курсе
936 1325664
>>25634
Хуле там учить этот ебаный реакт, какой-то жалкий говнофреймворк блять, это тебе не c++ же.
Хуйня на полторы недели учебы.
937 1325665
>>25634
Реально, но з.п. меньше, чем с реактом скорее всего.
938 1325666
>>25664
>>25665
Понял, принял, спасибо.
939 1325672
>>25664
Не скажи, если опыт прогинга есть - то конечно проще.
А вот если ноль - то прихуеет.

Аноны, я вкатываюсь в пхп. Знаю JS, SQL, питон все средненько естественно. С пхп по верхам разобрался.
У меня такая проблема - я решаю задачки, решаю задачки, решаю...
Но я нихуя не понимаю как написать полноценный сайт, пусть простой по сложности, но полноценный со стороны проектирования. Все что я писал - превращалось в кривую кучу говна, в которой я сам путался.
Что прошу - примеры структуры проектов, учебники по проектированию сайтов а не: "ребята - это функция, давайте познакомим ее с аргументами..." ,гайды на тему построения сайта не курильщика, может даже исходники какие нибудь.
Мне нужна основа что бы на ней закреплять свой говно код.

И еще - в JS подход когда страничка возвращается шаблоном - считается устаревшей хотя на Node я делал небольшой сервер с помощью шаблонов. Там модны SPA, изоморфные приложения, свитшоты, смузи и барбершопы, это понятно. Но вообще пхп хорошо дружит с реактом нахуя я его учил? или вью?
940 1325675
>>25672
Берешь фреймворк любой, ларавель, йии или че там щас модно и ебашишь.
Ну и да, 2к18 на дворе, фронт давно разросся больше жопы твоей мамки и является отдельным полноценным приложением.

В целом, на сервере генеришь жсон любым говном, хоть пхп, хоть жс, хоть c++, далее его жрет фронтендовый барбершоп и показывает пользователю
941 1325728
>>25675
А имеет смысл использовать

> фреймворк любой, ларавель, йии


если

> на сервере генеришь жсон


Как это выглядит? Вместо хтмла во вьюхи json ебашишь?
942 1325729
>>25672
борисов объясняет в курсах, у котерова есть в книге примеры по архитектуре приложений
943 1325760
>>25728
Ну как-то так, да
944 1325776
>>25644

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


В данном случае все правильно.
945 1325833
>>25634

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

Что-то ты слишком разборчивый, хочешь изучать только самое простое. Надо решать задачи клиента, если без реакта, то придумай какой-то другой способ.
946 1325834
>>25672

> Там модны SPA, изоморфные приложения



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

По проектированию - не хочешь почитать нашу задачу про студентов с комментариями и сделать её? Там много ценных советов: https://github.com/codedokode/pasta/blob/master/student-list.md

> Но вообще пхп хорошо дружит с реактом нахуя я его учил? или вью?



PHP работает на сервере, а реакт - на клиенте. Они напрямую никак не связаны.
947 1325853
>>25833
Понял, спасибо.
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]) возвращает старый результат, похоже.
949 1326004
>>05368 (OP)
ОП, проверь плиз мой вектор
https://github.com/php2ch/vector/blob/master/index.php
Каска.png565 Кб, 637x478
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/
951 1326026
>>26018
Это ж вёрстка - это во фронтенд-тред надо, а не бэкэнд.
952 1326043
>>24813
Я не осилил, но я еще учусь, ща верстку поделал, буду решать и банкомат параллельно. П.с. Что абу сделал с бордой? лагает и тупит все после обновы
953 1326116
>>26026
Это задачи опа
15473230881030.png105 Кб, 617x346
954 1326245
Не знаю, куда написать, вроде и не для /s вопрос, а для прогмикача, но и не совсем. Суть вопроса вот в чем:

есть установленная база данных MariaDB, есть установленный phpMyAdmin. Как мне связать базу и админа? В гугле ничего не нашел. Пытаюсь зайти с логином и паролем от базы - не заходит - не верные данные.
Ось debian 9.
955 1326339
>>26245

Попробуй залогиниться в БД с теми же логином и паролем из консоли на сервере, где стоит MariaDB (если у тебя есть ssh-доступ к серверу или если сервер это твой компьютер):

mysql -uusername -p

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

Увидеть пользователей можно, зайдя под админом и сделав запрос SHOW GRANTS.
956 1326360
>>26339
Все получилось. Я по недосыпу установил пароль 'password' вместо своего. Спасибо за помощь.
957 1326385
>>26018

> 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/


Всё правильно.

>>26026

Мы готовим полноценных разработчиков, а не просто писателей скриптов на PHP.
958 1326386
>>26004

Вообще, код производит хорошее впечатление: комментарии, типизация.

Я не уверен насчет передачи компании в конструктор. Нужно ли ее хранить там постоянно? Не лучше ли передавать компанию в конкретный метод? А то у тебя получается, для каждой компании надо создавать новый объект Кризисных Мер, а так одним объектом можно было бы обработать кучу компаний.

> $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 1326386
>>26004

Вообще, код производит хорошее впечатление: комментарии, типизация.

Я не уверен насчет передачи компании в конструктор. Нужно ли ее хранить там постоянно? Не лучше ли передавать компанию в конкретный метод? А то у тебя получается, для каждой компании надо создавать новый объект Кризисных Мер, а так одним объектом можно было бы обработать кучу компаний.

> $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.
959 1326387
>>25987

Я думаю, надо создать новый экземпляр 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 не годится). Опять же, это удобно делать на промисах. Тебе стоит их изучить.
960 1326392
Как много я потеряю спустя 2 года вкатывания в пхп без знания языков типа c++/c?
В смысле останусь ли я к тому моменту макакой с веб головного мозга без возможности перекатиться в нормальный язык, или полученные знания в сфере веб дадут хорошую базу для освоения других инструментов под другие задачи?
мне 26, вкатывался в пыху два раза за два же года. Хочется взять себя в руки и зафорсить за короткий промежуток времени уровень ковыряния пет проектов по фану.
961 1326413
Как можно объединить два запроса

DELETE FROM table1 WHERE id=1
DELETE FROM table2 WHERE id=1

в одну строчку?
962 1326458
>>26413
DELETE table1., table2.
FROM table1
LEFT JOIN table2
ON table1.id = table2.id
WHERE table1.id=1

А так лучше через ключи настроить каскадное удаление.
963 1326478
>>26004
ООП головного мозга. По другому такой код не назовешь.
964 1326479
>>26004
1000 строк, тысяча Карл! А что они делают? Подозреваю, что реальной логики там на 100 строчек, не больше. Все остальное тупой бойлерплейт aka ООП головного мозга.
965 1326496
>>25064

>без лишних if-ов


Ифы не нужны https://ideone.com/fwg3K6
А лаконично это вот
for($i = 1; $i <= 100 and print(($i % 15 ? $i % 5 ? $i % 3 ? $i : 'Fizz' : 'Buzz' : 'FizzBuzz') . "\n"); ++$i);
+.png4 Кб, 423x389
966 1326566
>>26387
Не понимаю, какое скачивание прерывается при sleep?

Где можно почитать про промисы на русском?
010101.jpg71 Кб, 640x480
967 1326602
Вопрос опытным людям.

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

Вопрос: для наискорейшего начала работы, мне стоит сконцентрироваться непосредственно на языке, фреймворках и инструментах или мне всё же критически необходимо изучить подобные книги - "Структура и интерпритация компьютерных программ", "Алгоритмы и структуры данных", "Архитектура компьютера"?
969 1326669
>>26602

>Вопрос: для наискорейшего начала работы, мне стоит сконцентрироваться непосредственно на языке, фреймворках и инструментах или мне всё же критически необходимо изучить подобные книги - "Структура и интерпритация компьютерных программ", "Алгоритмы и структуры данных", "Архитектура компьютера"?


Каждый работодатель выдаёт свои требования. Если я правильно понимаю, что твоя задача как можно скорей найти работу, то советую сначала ознакомиться с их требованиями, чтобы самому определиться на чем тебе стоит сконцентрироваться.
970 1326671
>>26392
Все языки следуют одним и тем же парадигмам программирования. То есть, если начать с веб разработки, то и в других сферах встретятся те же принципы.
971 1326678
>>26386
Благодарю за отзыв.

> 1) переименовать функцию, запретить ее использовать и сделать в департаменте правильную функцию для получения зарплаты



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

>сделать в департаменте правильную функцию


Что-то вроде этого?
private function getSalary(Employee $e): int;
private function getCoffeeVolume(Employee $e): int
private function getDocumentsCount(Employee $e): int

Получается, через объект сотрудника мы будем просто ретранслировать значения (ставка, кофе, документы) из объекта профессии или только объект профессии.
972 1326808
>>26602
Иди на Хекслет hexlet.io, там специализируются на устройстве на работу таких как ты.
973 1326827
Анончики, в вебе 1,5 землекопа, подскажите куда копать. Задача крайне проста: нужна cms, даже просто криптик, который имеет форму поиска по базе и отдает результаты, а какие столбцы - я сам решу.

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

Не встечали такое готовое? Чтобы мышкой накидал в админке, что будем выбирать и готово? За 5 минут.
974 1326945
>>26478

Решишь эту задачу без ООП и покажешь, как лучше сделать?

>>26413

А зачем? Это плохая идея. Если ты хочешь, чтобы они или оба выполнились, или не выполнились, заверни их в транзакцию.

>>26479

Тролли подъехали. Покажи, как это сделать без ООП. Задача из учебника в ОП-посте, глава про ООП, задача про "Вектор" и антикризисные меры.
975 1326946
>>26566

В 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 1326946
>>26566

В 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.
976 1326947
>>26665

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

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

var result1 = someAsyncFunc();
var result2 = result1.then(function () {
return someOtherAsyncFunc();
});

var result3 = result2.then(function () {
return someOtherAsyncFunc();
});

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

>>26678

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


Это один вариант. Другой - сделать, чтобы работник знал, босс он или нет.

> >сделать в департаменте правильную функцию


> Что-то вроде этого?


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

public function getEmployeeSalary(Employee $e): int
976 1326947
>>26665

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

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

var result1 = someAsyncFunc();
var result2 = result1.then(function () {
return someOtherAsyncFunc();
});

var result3 = result2.then(function () {
return someOtherAsyncFunc();
});

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

>>26678

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


Это один вариант. Другой - сделать, чтобы работник знал, босс он или нет.

> >сделать в департаменте правильную функцию


> Что-то вроде этого?


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

public function getEmployeeSalary(Employee $e): int
977 1327060
Почему нужно покупать сторонний хостинг? Разве нельзя разместить свой сервер на апаче или на никсе на ноуте и размещать там спокойно свой сайтец?
Про безопасность можно бесплатный хостинг на клауде взять чтобы не было проблем с досом итд.
Про сложность, можно же научиться скриптовать запросы итд?

Объясните нубу плз?
978 1327069
>>27060

>Разве нельзя разместить свой сервер на апаче или на никсе на ноуте и размещать там спокойно свой сайтец?


Можно, если у тебя белый ип, что очень врядли. И то домен ты все равно где-то покупать будешь.
979 1327106
>>27069
Домен то ясное дело. Почитал на стаке об этом, челу сказали что ему придется сервера защищать, настраивать и поддерживать в рабочем состояний, мол это сложно, но сервера будут работать быстро, то что мне надо.

> если у тебя белый ип


Не в курсе темы, можно поподробнее? Имеется ввиду то, что айпишник должен быть напрямую в сеть, а не через провайдерские порты?
980 1327108
>>27069
Я просто пробовал вывести свой сервер на публику, через особенный порт, перенаправил его внутри роутера на порт 80, вывело стартовую страницу Drupal спокойно в сеть, можно было войти на сайт, но пришлось отключить SELinux и поэтому я сайт положил, нехорошая практика, сейчас планирую сервер сделать на Debian, все хорошо пока что, но нужно все равно разбирать эту тему. Все будет локально как рекомендует сам дебиан и запросы будут брать данные с локальной базы данных. В общем пока разбираюсь.
981 1327110
>>27069
Щас проверил, провайдер говорит что у меня белый адрес.
Безымянный.png4 Кб, 504x288
982 1327121
>>26946

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


Так потому что multicurl, разве нет?

>Используя curl_multi_exec, мы можем выполнять все эти запросы параллельно, тем самым общее время запроса будет равно времени самого медленного из запросов.



>Если ты в своем коде вызовешь sleep() то все это время curl_multi_exec работать не будет и скачиваться ничего не будет.


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

В очередной раз спасибо за помощь. Постараюсь всё изучить. Хотя, конечно, хотелось бы сначала как-нибудь доделать свой недокод, но ладно.
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 закомментирована, то есть есть какой-то путь по умолчанию, о котором я не знаю. Как его найти?
984 1327273
>>27270

>upload_tmp_dir


Cлеш после этого разумеется поставил. С синтаксисом все ок.
985 1327289
>>26947

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


Так всё что можно разбить уже разбито. Валидация делается с помощью ORM библиотеки, на подобии того как это делается в Symfony. Работа с БД тоже выполнена с её помощью. Сравнение пароля с хешем и получение токена выполнены тоже с помощью сторонних библиотек. Остаётся только выдача ответа, которым должен заниматься сам контроллер.

Причина по которой я запостил свой код, это показать как асинхронный код становиться чище после применения async/await. Взгляните, ведь даже после рефакторинга во 2-ом примере, в котором вложенность стала чуть-чуть чище, в 3-ем примере код всё равно стал читаемей.

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


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

В моём коде пришлось бы писать

let validatePromise...
let findPromise...
let compareHashPromise...

Это же выглядит уродливо. В каких проектах вам довелось это видеть?
986 1327303
>>27289
Промисы для хипстеров.
987 1327328
>>27060

Можно, но тут есть несколько проблем.

1) если твой провайдер использует NAT, то снаружи нельзя подсоединиться к твоему компьютеру, так как у него нет видимого снаружи адреса (он виден только в локалке провайдера). Тебе нужно в этом случае приобрести "белый внешний IP" у провайдера, это может стоить денег. Если ты используешь роутер, вдобавок надо пробросить порт на роутере, так как роутер это тот же NAT.

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

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

4) за электричество от постоянно включенного ноутбука придется платить

5) если твой сайт станет очень популярен, и исчерпает лимит трафика, провайдер может потребовать перейти на тариф подороже

То есть получится неудобно и дорого. И VPS за 3 евро окажется дешевле. Но такая возможность есть, можешь попробовать. Плюсы тут тоже есть: в отличие от хостинга, никто не может залезть в твой компьютер и следить за твоими посетителями. Также, ты можешь поднять у себя свой джаббер-сервер и общаться приватно, не делясь ни с кем своими данными.
988 1327336
Правильно ли я понимаю, что эти ваши фреймворки всего лишь упрощают написание кода?
989 1327340
>>27121

Да, sleep останавливает твою программу на 2 с и в этом время ничего не делается, данные не принимаются и не передаются.

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

>>27270

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

$_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 уже хранится полный путь и дописывать ничего не надо.
990 1327344
>>27289

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

var result = async1().then(function () {
return async2();
}).then(function () {
return async3();
})

async/await удобнее, да.
991 1327347
>>26946
Где можно почитать о подобном? О принципах работы и внутреннем устройстве PHP? Разобраться, что под капотом и как работает? Что можешь посоветовать?
992 1327398
>>27340

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



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

>Сделай var_dump($_FILES); и смотри, что написано в tmp_name.



["tmp_name"]=> string(14) "/tmp/phpGQXuhf"
Я перепутал абсолютный каталог tmp в корне системы с относительным каталогом в корне сайта. Вот я дебич.
1547579676587.jpg384 Кб, 2002x1080
993 1327468
>>26827
Php my admin
994 1327479
>>26827
Что значит "спарсил"? Скачал себе на комп торрент-файлы? Залил ссылки на них в базу?
995 1327480
>>27479
Значит, да, залил. И в csv все есть. Могу переделать под любой формат для импорта в базу.

>>27468
Не, сайт нужен, для людей.
996 1327482
>>27480
Тащемта, если поиск простой, допустим, если пользователь ищет что-то по имени торрент файла gta 5, то тут можно обойтись простой подстановкой значения из поиска в mysql запрос. Умеешь в такое?
997 1327488
Хорошей ли практикой считается хранение каких-либо счетчиков не в базе, а в обычном файле на сервере?
998 1327510
>>27482
Хотелось мы с ajax-подсказками, конечно. Вопрос немного не в этом: может кто видел готовую cms, ориентированную на большие массивы данных и чтобы там была уже пагинация, карта сайта, категори и т.п.?

Шобы оно не падало на нескольких миллионах записей.

Мне по сути нужен поиск и вывести несколько значений типа: тайтл, деск, торент файл, магнет - для каждого найденного.
999 1327548
>>27510
Не, я с цмсками не связывался.
1000 1327549
>>27344

>Если переменные на каждый шаг писать неохота, можно писать цепочкой


Можно посмотреть в 1-ом примере к чему это привело - Promise Hell.

>но я не вижу проблем в переменных и это по моему чище, чем цепочка


Выходит переменные или цепочка, это дело вкуса. Но с async/await мы сходимся во мнениях, и значит нужно использовать это, чтобы это становилось общей рабочей практикой.
1001 1327565
>>27549

>1000


Пилите перекат, суки!
Какая блять разница как должно или положено? Одни блять стереотипы в кодировании. Сами ведь себе сложности хуярите. А ведь можно писать так, как реально удобно.
1002 1327574
>>27565
Кто-нибудь, допоможите! Даже у Котерова нет продробностей об этом. >>27347
1003 1327584
>>27565

>Какая блять разница как должно или положено?


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

Иными словами, код пишется чтобы другие люди его понимали.
1005 1327617
>>27336
Написание кода упрощает IDE и прочий вспоможательный софт.
Фреймворки уменьшают время разработки из-за того, что некоторые частоиспользуемые программные модули там уже реализованы, причём часто довольно хорошо.

>>27510

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


Вукомерц для вордпресса смотрел? Это плагин электронного магазина. Должен подходить под твои нужды. Только подкрутить под задачу.
Вообще, что понимать под "большими массивами"? Ты собираешься весь миллион торрентов пользователю показывать сразу? Зачем? Он их всё равно не прочитает, и даже не оценит. А простой поиск по базе сделать недолго на чистом пхп.
1006 1327618
>>27565

>Одни блять стереотипы в кодировании.


Это хорошо.
Вот говоришь ты человеку - говно, и он понимает, что это такое. А вот если один говорит - студёная коричневая масса с неприятным запахом, второй - органические выделения, а третий вообще - сладкий деревенский хлебушек.
Вот пойди и разбери что там каждый имеет ввиду. Поэтому отсебятина в программировании там, где есть уже ставшее стандартом решение - плохо.
1007 1327641
>>27328
Спасибо.
1008 1327672
>>26945
Попробуй думать не стереотипами, а своей головой. Можно использовать ООП, но писать при этом компактно. Можно не использовать ООП, и писать еще компактней. Но для этого нужно думать, а не тупо копировать то что Гради Буч придумал.
1009 1327675
>>26602
И то и другое.
1010 1327677
>>27617
Не, вордпресс оче хуево работает на овер 30к записях - из-за замудренной структуры бд. Плюс там этот wp api еще - я буду добавлять в базу несколько лет.
1011 1327678
>>26392
Отличия в знаниях будут не значительными. Ты будешь знать лучше работу веба. Те кто на C/C++ будут лучше знать работу процессора. Если опыт одинаковый, то нельзя сказать кто из них лучше или хуже. Бывают крутые и PHP разработчики, которые всесторонне развиваются, решают сложные задачи.
1012 1327681
>>27336
Фреймворк это просто некоторый заранее написанный код. Он должен предоставлять необходимые штуки для решения задачи. Если это веб-фреймворк, то он должен решать задачу маршрутизации запросов, шаблонизации, иметь механизм миграций, и тому подобное.
1013 1327739
Перекат скоро сделаем, погодите, людям работать еще надо.

>>27574

Я подозреваю, книги "Как делать асинхронные запросы с помощью 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 можно сделать блокирующим, хотя, если ты сможешь и это сделать асинхронно, это будет плюс.

Я могу проверить твой код и дать тебе советы и подсказки.
1014 1327754
Анчоусы, засиделся я в своей конторе, а в портфолио особо нечего вставить.
Буду писать что-то на laravel + vue.js специально для портфолио.
Может подкинете идей для проекта? Было бы неплохо, если бы он ещё и полезен был кому-то.
1015 1327763
>>27549

Не соглашусь полностью. Я написал, что промисы как раз позволяют избежать 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 1327763
>>27549

Не соглашусь полностью. Я написал, что промисы как раз позволяют избежать 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);
});
1016 1327765
>>27549

Ответ с нормальным форматированием кода: https://pastebin.com/FEY90cNY
1017 1327770
>>27565
>>27618

В программировании используется инженерный подход: сравниваются разные варианты, их плюсы и минусы и выбирается выгоднейший. Как при проектировании моста или здания. Потому от программиста требуется понимание этих самых плюсов и минусов. Например, нет смысла проектировать архитектуру для скрипта на 200 строчек, который будет выполнен 1 раз. А для приложения на 100К строк, которое будет писать команда в течение нескольких лет - это необходимо.

>>27754

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

Ленту новостей можно будет показать на собеседовании.
1018 1327809
>>27770
С лентой отличная идея, анончик. Спасибо, если ничего лучше не придумаю - запилю.
Ещё можно создать джобы по парсингу каких-то новостных ресурсов, или мемов.
А в идеале сделать, чтобы можно было выбрать источники информации. Но это уже новостной портал, а не проектик для портфолио.
0.jpg36 Кб, 480x360
1019 1327846
6
http://jsfiddle.net/4Ld60kht/ - думаю поля можно было через паддинг родителя, но я сделал так.
7
http://jsfiddle.net/avu90q3w/
8
http://jsfiddle.net/pvk2rf9a/ - не понял как тут применить отрицательный маргин и не уверен что * хорошо указывать
А так сделал эти задачи вроде.
Screenshot33.png11 Кб, 648x170
1020 1327963
Подскажите, у меня названий методов и переменных какой-то совершенно ебанутой длины, что делать?
Из-за этого код выглядит как говно и постоянно не вмещается в одну строку.
И если метод, принимающий несколько аргументов, еще можно красиво сформатировать, то принимающий 1 аргумент длинный метод всегда выглядит как говно.

Но я не могу называть переменные и методы короче, иначе потеряется понимание их смысла.
1021 1327992
>>27963

Я вижу метод sendTextMessageAndShowMenu

Во-первых, можно написать просто sendMessage.Во-вторых, а почему у тебя одна функция делает две задачи? Если они независимы, их можно сделать 2 функциями. Если же связаны, то объединить в одну функцию с названием просто sendMessage.
1022 1327993
>>27963

NOTES_SELECTED_CURRENT_MESSAGE_INDEX -> тут одно слово можно сократить, а при желании еще и INDEX убрать.
1023 1328012
>>27963
Лол, я такое встречал в реальной жизни, когда люди с джавы вкатывались в веб. Личный опыт. У джавистов приняты многосложные именования свойств и методов. Но есть в этом плюс, легко понимать, что человек написал. Правда если приходится парсить глазами длинную простыню, то это затянется надолго. Да и джава медленная, хоть и простая.
1024 1328015
>>27763

>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.


Спасибо за это замечание. Об этом я как раз и забыл.

Я думал, я уже достаточно сознателен чтобы писать код без ошибок, а всё таки совершил одну с логгированием.
1025 1328030
>>27739
Здоровья тебе, добрый человек
1026 1328039
Хочу задать вопрос знающим людям по проектированию SQL баз данных.

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

1. создать для каждой сущности отдельную базу с небольшим количеством таблиц, например, база "товары", таблицы "все товары", "товары в корзине", "товары в 'понравилось'" и т. д.
Получится несколько баз с несколькими таблицами. При большой нагруженности, скорее всего общение сервера с базами будет происходить быстрее.
2. создать одну единую базу магазина с большим количеством таблиц всех сущностей. База "магазин", таблицы "товары", "товары в корзине", ... "отзывы", "ответы на отзывы", ... и т. д.

Как лучше и почему?
Знаю, что у опенкарт, например, база устроена по второму принципу. Но что-то мне подсказывает, что первый вариант удобнее.
1027 1328051
>>28015

> 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 1328051
>>28015

> 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.

1028 1328052
>>28039

Не сталкивался с первым подходом. Есть такой принцип, как нормализация БД: https://github.com/codedokode/pasta/blob/master/db/normalization.md и он явно с ним не сочетается.

Да, есть еще такие вещи, как денормализация, шардинг, кеширование, итд., но начинают все равно с нормализованной схемы.
1029 1328055
>>27992

>почему у тебя одна функция делает две задачи? Если они независимы, их можно сделать 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 1328055
>>27992

>почему у тебя одна функция делает две задачи? Если они независимы, их можно сделать 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. Когнитивная нагрузка вырастает, мозгу надо парсить доп-аргумент, методы с показом меню и без показа меню слабо отличаются на вид.

Чет какой-то невротъебенный анализ тут привел, ну да ладно, а хуле поделать.
1030 1328056
>>27993
Ну можно подсократить немного, но один хуй в 2 раза короче мои идентификаторы от этого не станут.
>>28012
Ты прав, такое говно после java началось у меня, теперь ооп головного мозга и любой код превращается в ебаную простыню.
1031 1328059
>>28039
Читай про шардинг, репликацию, и прочие способы разработки высоконагруженных БД.
Но в 99.99% приложений, с которыми ты когда-либо столкнешься, тебе это нахуй не понадобится.
А как понадобится - так изучишь.

Преждевременные оптимизации - зло, не надо пытаться строить архитектуру как у гугла, кода у тебя сайт на полтора человека.
1032 1328085
>>28059
>>28052
Ох, спасибо за ответы и ссылки.
1033 1328089
>>05368 (OP)
https://github.com/asdasdasdasddasasdasdas/StudentList
Op я переделал свой список. Чкни.
1034 1328115
>>28056

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


А я думал, что я один такой, который раз за разом перекатывается на новую технологию, так и не устроившись на работу.
1035 1328181
Паханы, на чем щас проще найти работу: на симфонии или ларавеле? Или может есть еще актуальнее фреймы?
1036 1328205
>>28115
Да я и не перекатывался, прост немного знаю джаву.
В яве я узнал, что такое настоящий объектно-ориентированный код, строгая типизация, коллекции и многопоточность.
После нее пых кажется очень ограниченным.
1037 1328213
>>28205
Ну так ты вспомни, для каких проектов джава, а для каких похапэ.
1038 1328217
>>28205

>В яве я узнал, что такое настоящий объектно-ориентированный код



>>28056

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



Никакого ООП не существует. Были идеи, но их не поняли, и не реализовал на должном уровне. Никаких математических обоснований у ООП нет. Все что сейчас преподносится под видом ООП просто сектантство. Код ради кода. Полное отсутствие логики. Чем хуже тем лучше. Все это характеризует современное ООП.
1039 1328218
>>28217

>Никаких математических обоснований у ООП нет


Ооп нужен для упрощения написания программ
1040 1328222
>>28218

>Ооп нужен для упрощения написания программ



>>28056

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



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

Проблема объектно-ориентированных языков заключается во всей их неявной среде, которую они всегда тянут за собой. Вы хотели банан, а получили гориллу, держащую банан, вместе со всеми джунглями. (Джо Армстронг, создатель языка Эрланг).
1041 1328228
>>28222
Но больше никак не выходит, если бы люди придумали что-то лучше — все бы это и использовали.
Вот и пишем абстрактные фабрики медиаторов фасадов синглтонов.
1042 1328235
>>28228

>если бы люди придумали что-то лучше


Придумали еще в 30-е годы 20-го века, называется Лямбда-исчисление.
1043 1328241
>>28213
На любом Тьюринг-полном языке можно написать любую вычислимую программу. PHP естественно Тьюринг-полный, на нем можно написать компилятор к примеру.
1044 1328249
>>28235
Чувак, ты тредом ошибся. В этом треде никто не программирует. Веб 21 века это:
1. натягивание готовых шаблонов на cms
2. редактирование этих шаблонов под себя
3. подключение js-библиотек
4. php-шный/js-сный копипаст во фреймворках.
5. готовые решения sql/nosql
И все это тянется из проекта в проект на автомате. Не на автомате даже, а на пулемете. Как макаки-копирайтеры хуярят килознаки текста, так и веб-"программисты" копипастят свои сниппеты.
linustorvalds.jpg116 Кб, 800x575
1045 1328255
>>28241

>компилятор на пхп



> oтсутствие многопоточности


> неполная поддержка ООП


> помойка в стандартной библиотеке


> нестрогая типизация


> утечки памяти, как сквозь сито


> очень много жрет памяти (в 3 раза больше, чем руби)


> нет классов, привязанных к типам данных

1046 1328264
>>28255
Как там в 2005м?
1047 1328269
https://web.archive.org/web/20000511213919/http://www.rockstargames.com:80/front.html
ОНИ МОГЛИ ДЕЛАТЬ ТАКОЕ В 2000 ГОДУ!?! АХУЕТЬ Я ДАУН!!!!
1048 1328270
>>28269
Ааа ну да эпоха FP же была... Сук мода же делать все с помощью CSS&HTML&JS только сейчас началась.
1049 1328271
>>28255
Все уговорил иду учить РУБИ! Хотя пихуй Руби я бы и так изучил.
1050 1328275
В чем разница между kernel и core?
Как вот вы лично считаете, не гугля?
1051 1328276
>>28249
Но подожди можно же без копипаста делать все, использовать библиотеки и CMS без копирования, а как все это делают, даже опытные, подстраивают под себя зная что делает код. Просто если ты будешь свой фрейм писать на это уйдет время и если ты захочешь разработать свой, мало того, что ты потратишь ресурсы и время, так еще и потом будут говорить, что твоя копипаста нам не нужна. У тебя есть какие то другие варианты?
Про копирование и бесконечное использование стака если ты не учишься то это конечно же, позор. Но ведь не все идут под эту дудку, есть люди которые пишут и свои библиотеки и развиваются в другой манере, я не из них, ибо ничего не умею.
1052 1328277
>>28275
Kernel is a core.
1053 1328278
Хочу стать миллиардером, с чего начать, аноны?
1054 1328280
>>28278
С самопознания, найти себя и свое дело надо (Секрет: Заниматься хобби, например это тред PHP хоббитов).
1055 1328282
>>28280
Благодарю! Я задал вопрос для разбавления атмосферы, но ты дал верный ответ. Всем добра.
1056 1328297
>>28255
И как всё это мешает написать компилятор на php?
1057 1328307
>>28051
Спасибо! Это имеет больше смысла!
1058 1328332
>>28297
При помощи php можно распараллелить вычисления на каждое ядро процессора?
1059 1328334
Аноны если я свой проект по советам из шапки буду пилить вы код посмотрите, или надо строго файлообменник делать?
1060 1328342
>>28334
Лучше файлообменник, ибо найдешь ответы на вопросы после процесса и поддержку быстрее получишь. Сначала сделай уже известное, а потом и проект посмотрим.
1061 1328352
>>28269
Так это Flash.
1062 1328353
>>28249
Ты говоришь, что все используют готовые библиотеки. Но забываешь, что эти библиотеки кто-то пишет. Есть путь использовать библиотеки, а есть путь писать их для других. Точно также с языками, кто-то их использует, а кто-то их пишет.

Так что не нужно обобщать. Не все занимаются инфраструктурными вещами, подключением и стыковкой библиотек, и тому подобным.
1063 1328354
>>28332
>>28255

PHP может создавать процессы ОС. Для работы с потоками есть библиотеки.

И вообще, для компилятора не нужна многопоточность.
1064 1328355
>>28332
Многопоточность не равна параллелизму.
1065 1328363
>>28353

>Есть путь использовать библиотеки, а есть путь писать их для других.


Подозреваю, что путь тут только один - писать костыли, а как опыта прибудет - уже библиотеки, чтобы другие не писали костыли.
1066 1328387
>>28363
Само собой нужен опыт. Но если не начать это делать, то откуда опыт возьмется?! В 95% случаев все говорят, что СИКП не нужен из-за того, что сейчас все занимаются только состыковкой готовых библиотек. Если они сами себе поставили ограничение заниматься только состыковкой готовых либ, то опыта написания либ у них никогда не появится.
1067 1328397
>>28334

Можно пилить свой. Так даже интереснее. Но я советую почитать советы и примечания к задачам про студентов и файлообменник, так как они и к другим приложениям подойдут.
fv 1068 1328441
>>28342
>>28397
Спасибо. Я когда то давно делал студентов, их даже проверили.
Вопрос, а почему в студентах DataMapper заменили на TableDataGateway. Я честно говоря, не совсем улавливаю разницу.
1069 1328454
>>28352
Пожалуйста, давай возьмем во внимание то, что это 2000 год. Их сайт выйграл номинацию как самый лучший на то время и видимо не просто так.
1070 1328512
1071 1328552
Вкачусь с важным для меня вопросом
Анонче, чем использование laravel принципиально отличается от нативной пыхи
Нужно сделать задание для компании,а я уже третий день ебусь со всякими композерами, хомстедами и прочим долбоеб щито поделать и даже не начинал писать, хотелось бы узнать заранее как отличается код и процесс написания
1072 1328558
Хотел спросить тех, кто использовал MS SQL Server с PHP. Если мне нужно поквирить свою базу данных через PHP, который идёт с XAMPP, то мне нужно настроить конфигурацию самого PHP или SQL Server?
1073 1328563
>>28552
Погугли зачем вообще нужны фреймворки.
Вкратце:
1. Фреймворк задает тебе архитектуру приложения, у тебя гораздо меньше шансов написать откровенно хуевую архитектуру.
2. Фреймворк предоставляет тебе различные классы и библиотеки в добровольно-принудительном порядке, в итоге, опять же, у тебя меньше шансов использовать левые хуевые библиотеки для стандартных нужд.
3. Фреймворк знаешь не только ты, другим разработчиком написанное на фреймворке приложение гораздо ГОРАЗДО понятнее, чем самописный говнокод
1074 1328567
>>28563
Спасибо, понял
В плане разницы с нативным кодом пыха/ларавел можно сравнить с жс/jQuery?
Я про то что по сути это заранее запиленные за тебя классы/функции и тд
1075 1328574
>>28567
Скорее с реактом тогда.
Жс - просто набор хуйни, чтобы воротить хтмл-тегами.
Фреймворк это не какая-то сторонняя хуйня, которую ты используешь в своем приложении.

Ты пишешь приложение как бы ДЛЯ фреймворка.
Фреймворк есть база, на который на нанизываешь свое говно.
Он специально сделан умными людьми так, чтобы все это происходило легко и хорошо
1076 1328577
>>28574

>jquery - просто набор хуйни, чтобы воротить хтмл-тегами.

1077 1328603
>>28574
Грасиас, амиго
Composer 1078 1328618
Лень проверять. Ответьте.

Ставлю, через композер, например либу "a", которая зависит от либы "b" с версией 1.0.0, которую она очевидно подтягивает.

Но, также, необходимо поставить либу "b", но с версией 1.5.0.

Шо будет?
1079 1328625
>>28563

>у тебя гораздо меньше шансов написать откровенно хуевую архитектуру


Талантливых говнокодеров ничто не останавливает. Видел не раз использование фреймворков только для роутинга, мб еще какой-нибудь мелочи, и все остальное самописный пиздец. Зато кейвордик в резюме.
1080 1328696
>>28603
Оооооой пор пафор
1081 1328744
>>28618

Нельзя поставить 2 разных версии одной библиотеки. Если удовлетворить твои требования и требования библиотеки a одной версией b нельзя, будет выдана ошибка с разъяснением причин.
1082 1328749
>>28744
Хулеж они так криворуко сделали то
1083 1328751
>>28441

DataMapper - это по идее сложная система вроде Доктрины, которая мапит объекты на строки в БД. Там могут быть реализованы IdentityMap, UnitOfWork и прочие радости поклонников Фаулера. TableGateway - это просто класс, в котором собраны все операции с одной таблицей. Вообще, Gateway у Фаулера - это класс, который собирает в себе все действия с какой-то системой, например, внешней системой, БД и так далее и операции с этой системой нельзя делать в обход Gateway.

А так - можно использовать и другие паттерны, например, activeRecord.
1084 1328759
>>28552

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

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

Фреймворк - это каркас приложения, который избавляет от необходимости писать код, который есть в каждом приложении (роутинг, доступ к БД, валидация, шаблоны). Ты пишешь только то, что уникально для твоего приложения и экономишь время. Также, другим разработчикам проще разобраться в коде (проект на фреймворке с документацией понять проще, чем разбираться в полностью самописном коде без документации). Если ты сделал хотя бы 2-3 проекта, то наверняка прихоилось писать почти одинаковый код. Его и выносят во фреймворк.

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

Хотя мне лично больше нравятся библиотеки, как компоненты Симфони, из которых можно собрать свой фреймворк.

Хомстед (вирутальная машина с линуксом) наверно не обязателен, но под Windows придется настроить все нужные инструменты, и это потребует еще время.

Чтобы понять, как происходит процесс написания, открой любой туториал по созданию сайта на фреймворке и прочти: https://laravel.com/docs/5.1/quickstart#building-layouts-and-views (не понимаешь английский - нагугли перевод или статью на русском). Устанавливаешь фреймворк, выполняешь комнады, пишешь код.

Опять же, тут нужно время, чтобы разобраться.
1085 1328780
>>28759
Я так и понял, что завысил планку, кинув резюме
Делал все по гайдам, но не работает нихуя, хомстед не видит команд
Опыт в пыхе был на уровне зарегаться-залогиниться-выйти и сохранить какие нибудь данные пользователя, чтобы их потом вывести в лк
Ну и работа с почтой
Спасибо, анон, значит не буду трогать пока пхп не очень то хотел, просто вакансия очень вкусная и опыт какой никакой уже получить пришлось, поработаю во фронте или бекенде на ноде, а там уже посмотрим
kateesnameyarik1.png16 Кб, 517x529
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();

А теперь сам вопрос: если перед каждым классом писать его пространство имен, то выходит очень, очень много кода. Как современные фреймворки решают этот вопрос?
Сохраняют неймспейс в константу и подставляют, куда нужно?
1087 1329067
>>29066

>А теперь сам вопрос: если перед каждым классом писать его пространство имен, то выходит очень, очень много кода. Как современные фреймворки решают этот вопрос?


>Сохраняют неймспейс в константу и подставляют, куда нужно?


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

В твоём случае это выглядело бы так:
Вначале ипортируешь пространство имён use Huita1/Huita2
А потом просто обращаешься к своему синглтону просто по имени Huita::getHuita() где надо.

Только загрузчик правильно напиши - по ПИЭСАР, или юзай композеровский.
1088 1329082
>>29067
Ты вообще хуйню написал.

>Huita1/Huita2


Надо Huita1\Huita2

>Huita::getHuita()


Надо Huita2\Huita::getHuita()
Еле разобрался.

И нормальной практикой считается более одного use?
И еще, причем тут синглтон? Разве только в сингтоне может быть статический метод, лол?
1089 1329095
>>29066

Пожалуйста прочитай сначала урок про неймспейсы, может быть, там есть ответ на вопрос: https://github.com/codedokode/pasta/blob/master/php/autoload.md

Конструкция use позволяет избежать длинных имен в коде.
1090 1329097
>>29082

Нормальной практикой считается не писать 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
1091 1329098
Перекат будет ориентировочно вечером в пятницу или субботу. Посидим еще немного тут.
1092 1329100
>>29095
>>29097
Вот это помог. Ты офигенен, расписал все коротко и понятно. Прирожденный учитель.
1093 1329102
>>29082

>Ты вообще хуйню написал.


>Еле разобрался.


Ну извини.
Надо документацию читать, а не детские вопросы в треде задавать. Есть IDE и подсветка, а я в рот ебал пляску с этими долбанными палками во все стороны. Объявлять - в одну сторону, использовать - в другую, а ещё эта хуйня иногда экранирует. И винда с линуксом их по разному воспринимают.
Это не я хуйню написал, а они хуйню сделали.
1094 1329104
>>29102
Тащемта, если ты не знаешь, как что-то написать вручную, то ты не про.
1095 1329271
1096 1329289
>>27846
ОП, чекни плиз, что-то я запутался в следующих заданиях.
1097 1329318
>>05368 (OP)
Ребята, изучать php еще актуально.
Можно ли вкатиться в ДС, не имея опыт работы?
Node или python сильно жмут?
1098 1329364
>>28552
фреймворк предоставляет тебе готовые абстракции для создания приложения.
Тебе не придется занимаются таким количеством низкоуровнего говна.
Сравни - чтобы сделать пирог ты можешь взять коржи, сгуху, ягоды и запечь пирог.
А можешь пойти в лес, вырубить его, засеять пшеницей, вырастить её.. когда муку получишь, испекешь коржики, замутишь сгуху домашнюю.
Ну ты понял, короче. От низшего говна повыше поднимаемся.
image.png33 Кб, 785x391
1099 1329453
Что за ерунда с областью видимости? Почему переменная объявленная внутри второго цикла нормально работает в теле внешнего цикла?
1100 1329505
>>29453

>В большинстве случаев все переменные PHP имеют только одну область видимости. Эта единая область видимости охватывает также включаемые (include) и требуемые (require) файлы.

1101 1329506
>>29453
Короче, локальная область видимости генерируется только при объяве функции внутри ее тела.
А в твоем случае область видимости одна.
1102 1329507
>>29453

Локальная переменная видна внутри всей функции с момента создания. Блоки вроде if/while не ограничивают ее видимость.
ык3у.png81 Кб, 902x723
1103 1329516
Блин, аноны, почему не получается?
1104 1329535
>>29516
Посмотри, что у тебя в переменной $page.
1106 1329565
>>29505
Сука, вот какой сверхразум это придумал?
Что упарывал создатель php в этот момент?
1107 1329593
>>29535
>>29536
Там оказывается редактор был ебанутый, который не сохранял изменения. Открыл через другой и получилось.
ывапр.png92 Кб, 825x700
1108 1329595
1109 1329625
>>29565
Для разделения есть неймспейсы. Include и require ныне напрямую почти не используют.
1110 1329683
не понимаю как мне передать гет параметр через ссылку.
есть ссылка типа <a href="add2basket.php/?id=<?= $item['id']?>"> В корзину</a> где$item['id'] это номер товара, но на странице куда должно передаваться нихуя не передается, как правильно то?
1111 1329689
>>29683
сорян братья, заработало, почему то как только напишу в тред все сразу сам решаю, чудеса
1112 1329861
1-126

>>06284

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



Для старых браузеров (если хочется поизвращаться) есть такие возможности хранения данных:

- 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 1329862
>>06399

> Дизассемблированный код пихается в блок div у которого overflow-y: scroll


> Каждая строчка это div в котором ещё 5 дивов. Адрес, мнемоника и аргументы



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

> Это я нашёл. Но как вычислять чему этот scrollTop равен к примеру для 4 строчке.



Если высота одной строки известна, и нет переносов строк, то это не сложно.

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



Надо тестировать, но думаю, что не очень. Это будет отнимать больше времени, чем сама эмуляция. Перерисовка DOM - это ведь сложный процесс, там много тонкостей и сложностей. Тут можно было бы использовать канвас и самому вычислять, что надо перерисовать, но еще лучше будет снизить частоту обновления. Какой смысл обновлять код с такой скоростью, если человек не способен его читать? Я бы вообще отключил обновление кода во время выполнения.

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

Также, если ты пишешь на JS, обрати внимание на WebAssembly. Это позволяет писать програмы на ассемблере (естественно, не руками, а используя высокоуровневый язык и компилятор). Это позволит достичь максимально возможной скорости эмуляции, быстрее чем JS.
1114 1329863
>>07134

Вот тут описан довольно простой способ сделать REST API на Yii, не подойдет? http://developer.uz/blog/restful-api-in-yii2/

>>07386

Неплохо, но выражение $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);

>>07732

MariaDb - это форк (ответвление) от MySQL, на 99% там все одинаково. Чем отличается, написано в Гугле: https://mariadb.com/kb/ru/mariadb-vs-mysql-features/
1115 1329870
ПЕРЕКАТ
>>05368 (OP)
ПЕРЕКАТ
>>05368 (OP)
ПЕРЕКАТ
>>05368 (OP)
ПЕРЕКАТ
>>05368 (OP)
ПЕРЕКАТ
>>05368 (OP)
ПЕРЕКАТ
>>05368 (OP)
1116 1329885
Где можно посмотреть, сколько занимает памяти тот или иной скрипт в рантайме и как быстро он отрабатывает?
1117 1329928
Аноны, есть что-то типа CRM системы для владельцев магазов.
Туда барыжки загружают прайс листы, номенкалатуры,категори товаров, приходят чеки с онлаин касс и т.д
Нужно реализовать функционал СКИДОК на товар/категорию товаров/все товары. Но загвоздка вот в чем: СКИДКА ДОЛЖНА БЫТЬ ВРЕМЕННАЯ. Барыжка заходит в crm-> выбирает категорию пивко-> ставит скидку 5%-> Время валидности скидки 48 часов.
Цены хранятся в MySQL. Сделать доп. колонку time_sail и чекать каждый раз валидна ли скидка? Может есть более гибкое решение?
1118 1329935
>>29928
Сделай через куки со сроком годности 48 часов.
1119 1329942
>>29689
Для этого тред и создан
1120 1329946
>>29870
Рекурсивно
1121 1329948
>>29689
Двачую. Только я еще и на тостер свои говновопросы задаю, и почти сразу же, после того, как запощу и вдумчиво перечитаю свой вопрос, то в голову влетает идея, я ее пробую, и все начинает работать.
1122 1329954
>>29935
Очень плохое решение.
1124 1329959
Какой же пхп многословный, ебать, даже комментарии не влезают на ту же строчку с кодом
1125 1329969
>>29948

>и вдумчиво перечитаю свой вопрос


Я могу ебланиться несколько часов, а потом решусь где-то спросить. Начинаю писать вопрос и пока его составляю - обнаруживаю ошибку
1126 1330014
7.3 на прод кто-то уже обновлял?
1127 1330026
>>30014
Проекты, написанные до официального релиза 7.0 пока не решаются переходить на версии выше в силу сам понимаешь каких причин. Обратная совместимость и банальная лень - работает, и заебись. Поэтому 5.6 до сих пор обновляют и поддерживают.
Ну а если ты аццкий прогер на пхп, то юзай ту версию, какую хочешь. Большинству людей хватит 7.0. Если ты уже матерый прогмик, которому скучно писать на одной и той же версии каждый проект, то обновляйся, хули.
1128 1330032
>>30026

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


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



я не про это немного, а про фактическое обновление кем-либо из анонов. у нас на главноем проекте 7.1 и обновлять его на даже 7.2 никто просто так не даст.

я к тому что аноны писали, что 7.3 сегфолтится, интересуюсь поправили ли это. ну и захотелось попасть в прон-тред
1129 1330051
>>30026

>Поэтому 5.6 до сих пор обновляют и поддерживают


и кстати я тебя разочарую, бро
https://secure.php.net/supported-versions.php
5.6 уже два года не обновляют и с январая даже секьюрити апдейты не пилят. но ты не переживай, пхп-тред и создан для того, чтобы учиться новому
1130 1330057
>>30032

>проекте 7.1 и обновлять его на даже 7.2 никто просто так не даст


Почему? Он же стейбл. Я на следующей неделе буду древний кусок говна с 5.6 на 7.2 сразу переводить.
1131 1330073
>>30051
Не понял, а почему тогда я частенько вижу, когда захожу на php.net, наверху страницы, PHP 5.6.* Released!
1132 1330075
>>30057
К слову, если я пишу проект на пых-пых 7.0, а на серваке будет 7.3, код ведь будет работать?
1133 1330076
>>30075
Без понятия, 7.3 еще не пробовал. 7.2 у меня везде работал нормально, где был 7.0, но тоже не факт, что мне просто не повезло.
1134 1330108
Антошки, форма не передает данные в бд (сначала обрадовался, что получилось отправить половину данных (имя, ошибка была в отсутствии скобочек между условиями isset).

https://pastebin.com/xVatJU99 - форма и код.

Как исправить ошибку (или безграмотность, или и то, и другое)?
1135 1330125
>>30014
Пока нет, но собираюсь.
А так, юзаю 7.2 из-за pthreads.
1136 1330146
>>30108
У вас поебень в инсерте.

>`test` `user`


Что эта?
1137 1330149
>>30146
первое - выбор базы данных.
второе - выбор таблицы в базе данных.
1138 1330154
>>30057
зависит от количества кода и возраста проекта, у нас, например, тесты, написанные под 7.1 в некоторых местах падают на 7.2. то есть без переписывания не заапдейтишь.

>>30073
с 1 января больше не увидишь

>>30125
а какие задачи решаешь с прмощью pthreads?
1139 1330159
>>30154

>зависит от количества кода и возраста проекта


Ну, там проект 5+ лет на херовой технологии. Посмотрим, что получится. Если что отпишусь.
1140 1330160
>>30149
А точкой их разделять кто будет?
1141 1330172
>>30160
Точнее, соединять.
1142 1330173
>>30160
поставил, 0 эмоций.
INSERT INTO `test` . `user`(user_name, e_mail) VALUES ($name, $email);
В sql запрос проходит, только вместо переменных строчные данные, заключенные в кавычки ' ' .
С переменными кавычки не прокатывают.
1143 1330174
>>30173
Теперь убери пробелы между всем этим хозяйством.
1144 1330179
>>30173
Алсо вот атрибуты слились:
<p>Name: <input name="user_name"type="text"> </p>
1145 1330181
Нубовопрос:
Зачем мне создавать объекты если я всегда могу обращаться к ним статически?
1146 1330182
>>30181
К классам, в смысле
1147 1330183
>>29955
Щас представил как купил утку и начал с ней разговаривать и задавать ей вопросы, интересно что обо мне подумают другие лол?

У меня был знакомый который утку с собой таскал, теперь я понял что он имел ввиду под фразой Думай о желтой резиновой утке и он говорил это в критические ситуации когда нужно отвлечься.
Screenshot from 2019-01-19 17-30-50.png160 Кб, 1280x800
1148 1330185
>>30174
пробелы убрал, атрибуты разделил.
Результат такой же.
1149 1330186
>>30185
Проверь корректность настроек БД. Например, точно ли у тебя адрес БД test?
1150 1330194
>>30185
А зачем пробелы убирать? Это типа как в питоне работает?
1151 1330195
>>30185
Ты не правильно расположил аргументы в mysqli, лол.
Cначала идет хост, потом юзер с паролем, потом только база в конце.
1152 1330200
>>30195
Алсо, если у тебя в $user записано 'test', то и обращайся к тесту.
Или блять подставляй переменную вместо юзера.

А ОП пизданутый на всю башку идиот. Нахуя писать в ОП-посте, что пых простой? Вот поэтому у треда и репутация такая хуевая, и сидят тут одни вкатывальщики. Ну это блять анекдот натуральный. Собрал армию новичков, накидал для них задачек и сидит вечером после работы проверяет. Тебе делать нехуй? Найди себе девушку. Нормальным проггерам уже не продохнуть от количества людей, которые не могут прочесть матчасть или хотя бы установить IDE, которая все сделает за них.
1153 1330205
>>30185
Это у тебя стоит убунта?
1154 1330212
>>30186
да, адрес бд test (пик 1)
>>30195
исправил, нет эффекта (пик2)
>>30200
где обращаться к тесту, если это бд?
>>30205
да, убунта
1155 1330218
Пока тред не перекотился ответьте на вопрос.
На яркую жизнь php программистам хватает?
1156 1330222
>>30212

if (mysqli_connect_errno()) {
echo 'Что-то пошло не так... ' . 'Ошибка ' . mysqli_connect_errno() .
'. ' . mysqli_connect_error();
exit();
}

Вставь код после подключения к базе и посмотри, какую ошибку выводит.
1157 1330224
>>30218
Иди нахуй отсюда, сука.
1158 1330229
>>30222
\t только удали.
Screenshot from 2019-01-19 18-27-47.png155 Кб, 1280x800
1159 1330234
>>30229
вставил, не выдает ошибку.
1160 1330237
>>30218
Вполне. Если ты не обезьянка, то на хорошую зп тебя с руками отрывают.
1161 1330244
>>30234
Значит, подключился. У тебя неправильно сформировать SQL.
Надо так:
Insert into user (user_name, e_mail) values ($name, $email)
И точку с запятой убери после запроса перед закрывающей кавычкой, ее там не должно быть.
1162 1330246
>>30234
Test у тебя есть уже в первом аргументе, зачем его передавать снова через точку, ты вообще читал что-нибудь про этот метод, или от пизды пишешь?
Screenshot from 2019-01-19 18-44-50.png154 Кб, 1280x800
1163 1330256
>>30246 >>30244

исправил не работает.
1164 1330265
>>30256
Напиши значение VALUES руками.
1165 1330266
>>30265
работает
1166 1330268
>>30265
в чем может быть подстава с переменными?
1167 1330272
>>30266
>>30268
Да, собственно, проблема и не в них. Ты неверно обрабатываешь форму. Вот у тебя данные из поста и не подсасываются.
1168 1330279
>>30272
бля, зашел на стак и увидел такую конструкцию в запросе при желании вставить переменную.
Оказалась рабочей, лол.

VALUES (' ".$name." ', ' ".$email." ')
1169 1330303
>>30272
А, ну да, точняк. Переменные нельзя напрямую вставлять в запрос, их надо сначала привести к строке.
1170 1330304
1171 1330310
Ладно, ОП, беру свои слова обратно. Я теперь понял, что разбирать чужие ошибки это дополнительный опыт, который очень приятно получать. Как будто собственные проблемы решаешь.
1172 1330324
>>30310
Разбирать чужие ошибки сложнее чем просто самому учиться.
1173 1330355
>>30324
Когда у тебя самого возникают проблемы с кодом, не работает одно выражение, и ты сидишь и думаешь над ней 4-5 часов, то потом решение само появляется. И ты уже автоматически видишь эти косяки у других.
1174 1330418
>>30181
бамп вопросу
1175 1330422
>>30418
Понятие объекта и класса немного разные. Объект это то, чем можно оперировать - положить куда-то, потом вернуть. А статический класс он как памятник - хер что с ним сделаешь. По сути это просто глобальная функция.
1176 1330425
>>30181
Ой, забыл тебе ответить.
Лично я все системные функции в своей стандартной библиотеке делаю статическими. То есть все, что должно что-то принять, обработать и вернуть я всегда делаю статическим.
А вот если нужно сделать много экземпляров чего-то, к примеру, много постов, товаров, категорий сделать, которые в свою очередь наследуются от абстрактов и интерфейсов, то тут объекты лучше использовать.
Конечно, можно полностью весь сайт сделать со статическим кодом на счетчиках, но это уже не ООП подход, а что-то из разряда лямбда-исчислений, которые постепенно вытесняют ООП. Но это всего лишь мои философствования. В любом случае, каждый пишет так, как он хочет.
1177 1330426
>>30425

>из разряда лямбда-исчислений, которые постепенно вытесняют ООП


Много ты коммерческого софта на том же Хаскеле видел? А теперь с одним лишь пхп сравни масштабы. Обычная хипстерская болтовня короче.
1178 1330427
>>30422
Хуево ты ООП выучил. Памятник это абстрактный класс, методы которого нельзя вызывать динамически. И экземпляр которого создать тоже нельзя. Статический класс (это класс, в котором нет ни одного не статического метода и свойства) в пыхе можно заэкземплярить и вызывать его методы динамически.
Кстати, очень хуевая реализация ООП в пыхе уже не раз критиковалась многими людьми, писали письма с просьбами исправить эту хуйню, но пока они только попивают коктейли на очередных конференциях.
То есть статический класс в пыхе это нихуя не памятник, он может сохранять в своих свойствах значения. Это его и отличает от обычного класса со своими объектами.
1179 1330428
>>30426
Да причем тут блять твой Хаскель. Я тебе не про реализацию говорю на конкретном языке, а про сам подход. ООП и лямбда это два разных подхода к одной и той же задаче - писать программы.
1180 1330430
>>30427

>доебался до неудачного сравнения


>указал на мутный костыль, который сам же и обосрал


Ну ты и говно.
1181 1330432
>>30427

>Памятник это абстрактный класс


Абстрактный класс - проект памятника. За щекой проверь.
1182 1330433
>>30428
Список коммерческого софта в студию. Пока что я вижу, что одни фанатики с этой хуйнёй носятся, а выхлоп околонулевой.
1183 1330435
>>30430
Мутный только для тебя, макакушка.

>>30432
Проект памятника - интерфейс. За щекой у твоей мамки проверю.

>>30433
Сам ищи, если надо.
1184 1330438
>>30435
Типичный токсичный кукаретик. Пришёл и обосрался.
1185 1330439
>>30435

>Сам ищи, если надо


Так значит это всё в твоей больной голове, дружок.
1186 1330441
>>30439
>>30438
Идите нахуй оба из этого треда.
1187 1330442
>>30441
Или что?
1188 1330456
>>30442
Ну или оставайтесь. Сами же знаете правила.
1189 1330472
>>30154

>а какие задачи решаешь с прмощью pthreads?


Многопоточный постинг в несколько соц-сетей с нескольких аккаунтов
1190 1330482
>>30212

>да, убунта


Значки какие-то другие. Накатывал тему?
1191 1330527
>>30425
Честно говоря, не совсем тебя понял.

Просто я пишу платформу и пришел к тому, что у меня объектами являются только какие-нибудь йоба-интерфейсы во фронте, которые связывают все остальные классы. Большинство - статика, в которых классы больше служат для разделения по функциональным группам и понятного чтения кода проекта. По сути объектом у меня является только маршрутизатор и страница, которая уже обращается к статическим методам и генерирует себя в зависимости от запроса. И пока писал это все задался вопросом - а какой толк то, собственно, от этих объектов? Я код пытался строить таким образом, чтобы можно было модернизировать каждый модуль по отдельности (без некоторых он даже работать будет, просто ругаться начнет) и чтобы все это было максимально читаемо, и вроде это и есть принцип ооп. Не знаю. Извиняюсь за такой глупый вопрос, но рил хочтся знать. Просто какой толк от объекта, если в конце построения страницы пыха сама себя убьет?
1192 1330530
>>30527
А, и еще пару вопросов сразу, скажите плз где взять норм инфу по паттернам. А то я тока MVC освоил, а остальное не понимаю как применить в своем коде, но задачу себе поставил не по уровню и знаний временами явно не хватает. И когда можно на работу подаваться, а то заебался в магазине батрачить? Хочется сменить сферу
1193 1330536
>>21460
задавал этот вопрос пьяный, потом пил еще 2 недели, в процессе написал себе кучу полезного софта (работающего) по старым принципам "никто не увидит, хуячь все в один файл и нахуй форматирование, ООП тоже нахуй".

Итоги: говнософт работает, в офис меня не возьмут (потому что я тупой и не смогу переучиться), самооценка упала еще ниже.
Сейчас почитаю скудные ответы, приятно что их 5 штук (думал, будет ноль). Спасибо, ребята, хотя и подозреваю что там ничего хорошего в ответах нету.
1194 1330537
>>21483

>Ты не напишешь ни одного более-менее толкового приложения меньше 1к строк. С нуля в смысле - без васянских либ. Но для школоскриптиков в 100 строчек это и правда - нахуй не надо. Тут ты прав.


Толковое приложение - это инстаграм или вакаба? Какая мне нахуй разница, сколько в проекте строк и как оно запускается, если оно быстро работает, не падает и делает свою работу? Я же не хайлоад пишу в 100500 рпс (как остальные в этом треде).
1195 1330538
>>21698
Я так понимаю, ты ОП этих тредов.
Спасибо за твой титанический труд, ты охуенен.

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



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

Я ПОНИМАЮ, что ты работаешь в команде, очевидно, где все погромисты должны читать код друг друга и тд, но я ведь один! Зачем мне самому устраивать в своей инфраструктуре хаос?

>То есть ты должен в идеале каждую функцию так описать.


Зачем мне ее описывать, если никто ее не увидит? Хороший тон?

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


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

И без обид, но я осмелюсь предположить - вам там про алгоритмы думать не сильно надо, надо сидеть и хуячить код. Грубо звучит, но все мои знакомые программисты так и работают.
1196 1330539
>>21699

>Не хочешь исследовать причины проблемы и исправить её?


Разумеется не хочу. Что 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 и ничего не жрет!
1197 1330540
>>30539
и не хочу портить ОП-у тред, но как ты объяснишь это?
https://stackoverflow.com/questions/33299302/composer-update-failed-out-of-memory
1198 1330542
>>30537

> Какая мне нахуй разница, сколько в проекте строк и как оно запускается, если оно быстро работает


Хочу объяснить этот момент.
Все люди, кто рассказывал мне про правильный код, синтаксис и хуё-моё - были максимум разработчиками сайтов визиток или кривых магазинов где даже 1 rps нет, зато у них композер, грунт, докер и красивое форматирование.

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

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

ОПу респект, материалы хорошо написаны и читать интересно.
1199 1330553
>>30355
Или наоборот, когда ты уже решил для кого то проблему и она для тебя никогда не возникнет в будущем.
1200 1330623
>>30537

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


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

>>30538

>хуй потом разберешь что и где


>устраивать в своей инфраструктуре хаос


У тебя уровень проганья низковат для правильной оценки рекомендация PSR. Как начнёшь писать, как все нормальные кодеры пишут, так оценишь. Я тоже не сразу въехал во всё это, а теперь только так и делают. + ты начинаешь понимать что пишут другие, и другие тебя понимают. Но это уже промышленные стандарты.
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 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
1202 1330668
>>30530
По книжкам MVC осваивал? Посоветуешь что-нибудь интересное?
1203 1330696
>>30663

удалил расширения из /usr/local/etc/php
заработало, глючное расширение пока не нашёл, но думаю, что победил проблему
1204 1330726
>>30696

>удалил расширения


и действительно, зачем апачу кококонфиг, если можно ВЗЯТЬ И УДАЛИТЬ
1205 1330877
Дошёл до игры в кубики. Добавил туда три условия на случай, когда сумма очков меньше, больше или равна.

Работает всё, но меня смущает одно.

Смотрите.

echo "У анона выпало {$anonDice1} и {$anonDice2}\nУ компьютера {$compDice1} и {$compDice2}\n";

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

Просто в уроке о переменных, когда через echo они выводились, там скобок не ставили.
1206 1330895
Заметил, что повальное количество проектов крутых типа крупных интернет- и оффлайн-магазинов делают абы как, даже не при помощи паттерна MVC. Даже двачи написаны простым импортом в html файл.
То есть, если освоить MVC и делать проекты при помощи своего или стороннего фреймворка, то ты уже автоматически становишься лучше большинства?
1207 1330896
>>30877

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


Так не должно работать. У тебя какая версия пхп?
1208 1330900
>>30896
А, отбой вопроса, я спутал с другим языком. Просто ОП считает, что ставить вокруг переменной это правило хорошего тона.
Потому что если тебе нужно будет написать вот так:
"Хуй$pizdaджигурда ", то такая конструкция не отработает, потому что интерпретатор поймет, что есть некая переменная $pizdaджигурда, которой на самом деле нет.
1209 1330905
>>30895
Просто многие решения, особенно в e-commerce, растут еще из очень темных времен уровня php 4, а может и раньше. По инерции это легаси до сих пор существует, т.к. все еще остается рабочим. Есть подвижки к развитию, но это не слишком быстро движется. Ну а что-то новое нормальный разраб не станет делать по лет на 10 устаревшим подходам.
1210 1330917
>>30530
>>30527
бамп вопросам
1211 1330923
Нужен ли фреймворк, если не собираешься использовать БД?
1212 1330959
>>30917
Ты про синглтоны и прочую ахинею?
1213 1330976
>>30923
Фреймворки вообще не нужны, если ты не знаешь, как написать без них. Но с другой стороны, ты и не узнаешь, пока не поковыряешься с одним из них. Такое вот колесо сансары.
1214 1330979
>>30976
Я писал без них и с ними чуток для своих супер мелких проектов. Но на вопрос ответь плиз.
1215 1330986
1216 1331318
>>30986
Книги из шапки читал? Если нет - почитай.

>>30979
Удобная связка с бд это всего лишь одна из фич фреймворков. Хочешь - юзай, не хочешь - не юзай.
1217 1331325
Ни у кого случайно PHP: Объекты, шаблоны, методики программирования 5 издание не завалялось? Нашел только на инглише.
1218 1331333
Я понимаю, что вопрос не по сабжу, но я увы не смог найти треда по верстке. Я хотел бы уточнить правильно ли я понял как работает clearfix.

Шло время начали придумываться варианты для адаптивной верстки, так как разрешение экранов начало расти от 1024 до 1920 и все понимали, что прописывать маржины для каждого разрешения это не вариант и появился флоат, который дал возможность адаптивно верстать немного закрывая глаза на разрешение. И если ты входил в режим флоат, то добавляли в конце всех блоков ещё 1 с пустым содержанием, но с clear : both. Т.е. обнуление флоата. Затем прошло еще время. Страницы начали расти в объемах и кол-во этих пустых блоков тоже стало расти. И решили что можно сделать класс с ::after, который позволит избежать постоянного создания блока. И стали писать content : "." и там же следующей строчкой делать её невидимой. Ну и уже еще через какое-то время все пришло к пустой строке.
1219 1331357
>>30668
видосы зинченко. За два часа отлично поясняет как работает паттерн. Мозги на место становятся (при наличии оных). Лично я начал писать что то реально стоящее только после его объяснения.
1220 1331359
>>31318
Попробую, спасибо. А еще что то посоветуете? Кроме шапки? В свое время лучшим толчком мне были первые два видео зинченко и задачи из шапки. Причем это работало так, что основы я узнал из примерно половины текста шапки, после чего мне это все стало казаться ве глупым, и двух видео зинченко, после которых, опять же, мне все начало пахнуть говном. Просто подчерпнул свое и пиздец
1221 1331368
>>08417

> На вашем счету семьдесят миллионов_____восемь (70000008) рублей



Что-то пробелов дофига. Надо пропускать такие части числа, если они равны нулю.

> function getWordForm ($threeDigit, $selectName)


Можно было просто передавать сюда все формы слова и получилась бы универсальная функция, которая может выбирать любое слово. А то с номером получается, что это не отдельная функция, а продолжение функции spellNumber, в которой есть счетчик от 0 до 3.

Плюс, у тебюя слишком большая вложенность if. Вместо этого:

if (условие) {
много кода
} else {
return ...;
}

Лучше писать

if(!условие) {
return ...
}

много кода...

В остальном, сделано неплохо.

По калькулятору: сделано верно.

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



Нет, надо делать через if/elseif.

>>19485

> if($arrayRand == $arrayRand)



Ты сравниваешь переменную саму с собой. Естественно, значения будут равны. Чтобы выдавать предупреждение, надо либо сохранять в отдельной переменной предыдущее значение, либо вообще сделать массив и сохранять там все выпавшие ранее значения.
1221 1331368
>>08417

> На вашем счету семьдесят миллионов_____восемь (70000008) рублей



Что-то пробелов дофига. Надо пропускать такие части числа, если они равны нулю.

> function getWordForm ($threeDigit, $selectName)


Можно было просто передавать сюда все формы слова и получилась бы универсальная функция, которая может выбирать любое слово. А то с номером получается, что это не отдельная функция, а продолжение функции spellNumber, в которой есть счетчик от 0 до 3.

Плюс, у тебюя слишком большая вложенность if. Вместо этого:

if (условие) {
много кода
} else {
return ...;
}

Лучше писать

if(!условие) {
return ...
}

много кода...

В остальном, сделано неплохо.

По калькулятору: сделано верно.

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



Нет, надо делать через if/elseif.

>>19485

> if($arrayRand == $arrayRand)



Ты сравниваешь переменную саму с собой. Естественно, значения будут равны. Чтобы выдавать предупреждение, надо либо сохранять в отдельной переменной предыдущее значение, либо вообще сделать массив и сохранять там все выпавшие ранее значения.
1222 1331369
>>20458

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



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

>>20461

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

>>20625

> Как мне заставить регулярку искать только 10 цифр, а кол-во других символов не имеет значения?



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

А затем пишешь, что это повторяется 10 раз: (xxx){10} . Круглые скобки значат, что {10} применено ко всему выражению.
1223 1331370
>>21352

> Пиши верно 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 1331370
>>21352

> Пиши верно 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 1331371
>>24427

label нужно указать при создании формы (читай мануал). Если ты сам хочешь выводить label, то надо либо отключить встроенный, либо самому выводить весь виджет, кроме label (то есть свой label, потом form_widget, потом область ошибок).

>>27398

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

>>27488

Плохой. Так как ты не решаешь конфликты. Банальный пример: сейчас в файле цифра 100. Первый скрипт запускается, читает "100". Параллельно работающий скрипт тоже читает 100. Первый меняет на 101. второй тоже. Один просмотр потерян. Еще хуже, если файл большой и 2 параллельно работающих скрипта перезапишут его одновременно, так что получится смесь из 2 кусков.

Используй sqlite - она тоже хранит данные в файле, только правильно и с блокировками.

>>27846

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 1331371
>>24427

label нужно указать при создании формы (читай мануал). Если ты сам хочешь выводить label, то надо либо отключить встроенный, либо самому выводить весь виджет, кроме label (то есть свой label, потом form_widget, потом область ошибок).

>>27398

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

>>27488

Плохой. Так как ты не решаешь конфликты. Банальный пример: сейчас в файле цифра 100. Первый скрипт запускается, читает "100". Параллельно работающий скрипт тоже читает 100. Первый меняет на 101. второй тоже. Один просмотр потерян. Еще хуже, если файл большой и 2 параллельно работающих скрипта перезапишут его одновременно, так что получится смесь из 2 кусков.

Используй sqlite - она тоже хранит данные в файле, только правильно и с блокировками.

>>27846

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 1331372
>>28055

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

>>29885

Внешними утилитами, например в линуксе в командной строке скрипт можно запустить через time:

time php script.php

Также, есть функции microtime(true) и php_memory_get_usage(true) (или как-то так), которые позволяют мерять это внутри скрипта.

Также, можно с помощью Apache Benchmark или siege проверить, какую нагрузку выдерживает скрипт.

>>29928

Да, хранить дату окончания в БД.

>>30173

Ты данные экранируешь перед вставкой хоть?
1226 1331373
>>30212

Выучи сначала наизусть урок про 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

>>30181
>>30418

Ответный вопрос: зачем тебе нужны классы со статическими методами, если их можно заменить просто на набор функций? Зачем ты их вообще пишешь?

При статических методах у тебя появляется глобальное состояние, и вызываемые им побочные эффекты. То есть ты вызвал одну функцию, она поменяла какое-то статическое поле и это повлияет на результат вызова другой функции. Ты не можешь создать 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 1331373
>>30212

Выучи сначала наизусть урок про 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

>>30181
>>30418

Ответный вопрос: зачем тебе нужны классы со статическими методами, если их можно заменить просто на набор функций? Зачем ты их вообще пишешь?

При статических методах у тебя появляется глобальное состояние, и вызываемые им побочные эффекты. То есть ты вызвал одну функцию, она поменяла какое-то статическое поле и это повлияет на результат вызова другой функции. Ты не можешь создать 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 1331374
>>30530

Поизучай код Симфони, например Symfony Forms, там есть и примеры ООП, и паттерны.

>>30538

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

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



Если непонятно - значит, это как раз плохо сделано. Вот попробуй ООП-гостиницу или ООП-будильник без ООП решить - получится код хуже.

> вам там про алгоритмы думать не сильно надо



Если ты думаешь про алгоритмы 2 часа и 6 часов пишешь код, то как оформление кода тебе мешает думать?

> В последние дни я заметил что больше времени уделяю форматированию кода



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

>>30539

> Сначала мы создаем проблему, а затем героически ее решаем



И как можно "не создавать" проблему зависимостей? Изобретать велосипед и тратить на это лишнее время?

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



Ну вот выяснил бы.
1227 1331374
>>30530

Поизучай код Симфони, например Symfony Forms, там есть и примеры ООП, и паттерны.

>>30538

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

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



Если непонятно - значит, это как раз плохо сделано. Вот попробуй ООП-гостиницу или ООП-будильник без ООП решить - получится код хуже.

> вам там про алгоритмы думать не сильно надо



Если ты думаешь про алгоритмы 2 часа и 6 часов пишешь код, то как оформление кода тебе мешает думать?

> В последние дни я заметил что больше времени уделяю форматированию кода



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

>>30539

> Сначала мы создаем проблему, а затем героически ее решаем



И как можно "не создавать" проблему зависимостей? Изобретать велосипед и тратить на это лишнее время?

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



Ну вот выяснил бы.
1228 1331375
>>30542

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



Одно к другому отношения не имеет. Как grunt (уже webpack) влияет на производительность PHP кода?

> сайтов визиток или кривых магазинов где даже 1 rps нет



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

>>30663

> Анончики, милые помогите, не запускается apache24 с php72, как можно понять почему он не хочет работать с LoadModule



А там версии совместимые? Ты не пытаешься расширение к старой версии PHP загрузить? Вообще, Signal 11 = SIGSEGV - говорит о баге где-то в коде (не твоем), и может тебе стоит написать баг-репорт разработчикам дистрибутива. Только перед этим проверить, что у тебя актуальные и совместимые версии библиотек.

>>30877

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

>>31333

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

> Я хотел бы уточнить правильно ли я понял как работает clearfix.



clearfix заставляет контейнер растягиваться, чтобы вместить все флоаты. Свойство clear добавляет элементу margin сверху так, чтобы он оказался ниже всех флоатов в потоке. Спецификация: https://www.w3.org/TR/CSS2/visuren.html#floats
1228 1331375
>>30542

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



Одно к другому отношения не имеет. Как grunt (уже webpack) влияет на производительность PHP кода?

> сайтов визиток или кривых магазинов где даже 1 rps нет



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

>>30663

> Анончики, милые помогите, не запускается apache24 с php72, как можно понять почему он не хочет работать с LoadModule



А там версии совместимые? Ты не пытаешься расширение к старой версии PHP загрузить? Вообще, Signal 11 = SIGSEGV - говорит о баге где-то в коде (не твоем), и может тебе стоит написать баг-репорт разработчикам дистрибутива. Только перед этим проверить, что у тебя актуальные и совместимые версии библиотек.

>>30877

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

>>31333

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

> Я хотел бы уточнить правильно ли я понял как работает clearfix.



clearfix заставляет контейнер растягиваться, чтобы вместить все флоаты. Свойство clear добавляет элементу margin сверху так, чтобы он оказался ниже всех флоатов в потоке. Спецификация: https://www.w3.org/TR/CSS2/visuren.html#floats
1229 1331377
>>31374
>>31374

>Поизучай код Симфони, например Symfony Forms, там есть и примеры ООП, и паттерны.


ООП и паттерны - это антипаттерны, костыли чистой воды. Если разработчик о них говорит, изучает, то это показывает его низкую квалификацию.
Перекот 1230 1331381
Аноны, переходите в новый тред >>1331378 (OP) , этот тред закрыт. Если вас пропустили в этом или предыдущих тредах, напомните о себе в новом треде, а в этом требе больше писать ничего не надо.
Тред утонул или удален.
Это копия, сохраненная 22 января 2019 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски