Это копия, сохраненная 5 сентября 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
ОП в последнее время сильно занят и не гарантирует, что прочитает и ответит на все вопросы. Но ответы и решения задач можно поискать в архиве тредов.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>1630065 (OP) . Все старые треды есть в архиве: https://phpclub.tech/ (там есть поиск, так что можно легко найти обсуждение какой-то задачи или ответы на свой старый пост) или ищутся в гугле по словам "клуб изучающих php" и в архиваче.
Форматируй свой код, если хочешь, чтобы его читали (как, написано во втором посте).
Правила: ведем себя воспитанно, помогаем новичкам, читаем учебники, решаем задачки.
С чего начать
У нас есть свои уроки по основам 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? — Да, однозначно. Посмотри любую вакансию.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на рекомендации PSR, где все это описано подробнее и даны примеры оформления:
PSR-1 (рус.): https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2 (рус.): https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-2-coding-style-guide.md
PSR-12 (англ.): https://www.php-fig.org/psr/psr-12/
Включи в MySQL general_sql_log и увидишь сколько запросов и каких обрабатывает БД.
Про окно не написал. Надо было что-то в духе "за окном самоизоляция и весна, а мы продолжаем изучать ПХП".
Доки хороши только как справочник. Там рядом описаны и важные вещи, и то, что влеплено просто для полноты языка. Заучивать всё подряд довольно неэффективно.
Могу посоветовать только смотреть разные презентации на разных конференциях. Бывает лютое говно в стиле "10 СКРЫТЫХ возможностей ларавель", где чувак просто доки пересказывает и паблик апи, а бывает прям кулстори про реальной опыт и решение разных проблем, ну или просто хорошие практики опять же на основе реальных примеров. В книгах тебе может быть трудно понять тот уровень абстракции, о котором пишет автор, это если именно про дизайн и веб в целом.
Странный аргумент. Именно в книгах начинают с базовых понятий и постепенно проходят более сложные вещи, а спичи на конференциях как раз и бывают непонятными, автор говорит со своей колокольни.
Тут стоит уточнить о каких книгах и о чем вообще говорить. Я имел ввиду более "продвинутые" знания, которые, в основном, получаются с опытом. Если нет возможности его получить в боевых условиях, то можно попробовать перенять по маленьким кусочкам с тех же конференций, это будет не то, но общее представление даст в каком-то вопросе.
Ну и вообще читать книги про чистый пхп тоже такое себе занятие, язык то простой(в этом тоже своя красота есть). В учебнике опа как раз все базовые вещи проходятся, только намного быстрее, чем условную книгу прочитать.
Если не хочешь ебаться с джавасриптом то делаешь форму с одним скрытым полем куда записываешь айди. И кнопкой сабмита. Сотвественно в форме метод = get, action - url запроса.
Да, это ссылка называется
Мне нужно сделать личные страничке пользователей, когда в строке браузера вводишь би лайк index.php?name=Иван то тебе открывается страничка этого пользователя
Тип как в вк работает
Погугли routing, от банальных ифов до миддлваров, у ОПа кстати есть где-то статья на эту тему, поищи на гитхабе, вроде в задаче про студентов
Мне нужно "повторить php". Работу после карантина буду искать. И там обязательно будут спрашивать, чем абстрактный класс отличается от интерфейса и всё такое. Заучивать отдельные вопросы не хочу, лучше повторю всю тему не торопясь.
>>657225
Ну так и пиши форму. Что-то вроде
<form action="pers.php" method="get">
<input type="text" name="id" />
<input type="submit" />
</form>
При нажатии будет сформирован гет-запрос к файлу pers.php с параметром id, внутри которого будет значение из поля ввода.
А дальше уже этот скрипт обращается к базе (лучше не напрямую, а через PDO, вытягивает данные, и формирует страницу, которую увидит пользователь. Грубо говоря, pers.php - это и есть та страница. Просто внутри неё есть что-то вроде
echo "<h1> Добро пожаловать, $userName </h1>";
где $userName как раз и бертся из базы.
я каждый день сру кусками пхп, они такие твёрдые и красивые
пхпшеры очень любят свой язык (говно), срут им, едят его на завтрак
ОДИН ПХП НА ЗАВТРАК ОТВЛЕКАЕТ ОТ ВАС ДЕВУШЕК НАВСЕГДА
ваш шланг будет 1см максимум
не пишите на пхп
ПОЖАЛУЙСТА, АНОН, НЕ ПИШИ НА ПХП
Что почитать про работу с базами данных полному нулю?
А то вообще ничего не понятно. Вот я делаю запрос к БД через mysqli_query, получаю что-то в ответ и как с этим дальше работать?
Почему нельзя получить в ответ ассоциативный массив и дальше его вертеть как хочешь?
а че про них читать есть скл базы они более-менее одинаковые в скл запросах, есть носкл там уже надо доку читать по конкретной бд.
настройка самой бд те в помощь
да хоть на коболе пиши
В интернете, бротиш.
Я на codewars стараюсь каждый день задачки решать, помогает сильно + в ОП посте есть неплохой учебник, почитай лучше его.
Почему?
хирока есть
Пока что уже две недели прохожу CS50
Не такая уж и плевая значит
>две недели прохожу CS50
Это были потраченные впустую две недели. Тебе, если важна скорость, надо понимать, как функционирует твой фркймворк и как использовать инструменты одного конкретного языка для решения типовых бизнес-проблем, а не смотреть как долбоебы на сцене меняются местами под командами потного ведущего.
Почему он не запускается?
Пробовал сделать внутри функции return $a=5;, а на странице с логином над хтмл формой условие, типа: include (file.php); if ($a = 5) {header ...}. И публичную переменную тоже пробовал.
Но это ломало страницу и выдавало ошибку 500, лол.
Я в отчаянии. Помогите.
Алсо. Там выше ссылка на точно тот же путь и там все норм.
Хедыры нужно отправлять до любого вывода. никаких вардампов, принтов хтмла и пробелов.
Если при токен аутентификации мы грузим пользователя из бд на каждом запросе, это норм? Это не противоречит тому, ради чего придумана токен аутентификация? Если мы будем масштабировать наше приложение, и добавим серверов, то нужно будет продублировать таблицу с пользователями? Так вообще можно?
Вот тут посмотрел тутор, они грузят юзера из бд https://symfonycasts.com/screencast/symfony-rest4/jwt-guard-authenticator#play
> грузят юзера из бд
А как ты по другому собрался? ПеХаПе не сохраняет состояние. Токен нужен чтобы польхователь не воводил пароль при каждом запросу. Вся инфа тянется из бд(как вариант in-memory типа редукса), файлов, сесии и подобного.
так-то мы могли и сессию сохранить и передавать ее id, зачем тогда stateless и токен? Получается мы с каждым запросом передаем данные пользователь@пароль и сверяем их с таблицей.
Есть страница, на которой по нажатию кнопки добавляется либо удаляется такой-же select <slect class="inputdata" onchange="..." onchange="..." name="..." id="..">...</select>. У него меняется name и id соответственно, увеличиваясь на 1.
В массив "elems", созданный скриптом javascript записываются name всех элементов, которые содержат класс "inputdata". Необходимо создать переменные в php-обработчике он в отдельном файле, если это на что-то влияет, которые будут называться как элементы этого самого массива.
Т.е. содержание массива: name0, name1, name2.. и т.д.
Или можно как-то реализовать это по-дргуому?
Запичывает данные в бд
отправь ajax'ом
Так себе идея - каждый запрос слать данные пользователя. Они нигде не кешируются, плюс к этому - одного пользователя мало и нужно его отношения тянуть из БД. Получается, что надо каждый запрос например передавать пользователя, его посты, лайки и тд. и не факт что они нужны в конкретном запросе.
На практике часто встречается, загрузка 1 записи по id - это быстро. Скорее всего, там для вывода страницы еще куча данных из БД берется и на этом фоне 1 маленький запрос роли не играет. В крайнем случае (настанет хайлоад) можно будет добавить кеширование в том же redis.
Записал в отдельную переменную, все равно не передается, хотя при вызове внутри файла "db-req.php" отображается.
Перечитал документацию. Все норм теперь.
В чем дело? почему выползло пусто сообщение, если его БД нет даже?
Какого хуя код с добавлением поста в БД ломает наглухо, блять, авторизацию и регистрации?
Он, сука, никак не пересекается с теми функциями, ни именами переменных, ни названиями функций, ни запросами к БД.
Эта функция вообще вызывается на последней странице, где уже после страницы регистрации показываются посты, это абсолютно другой файл.
Это пиздец. Стоит его закоментить - все работает.
дебагером посмотри
Выдает это на странице с логином. Хз, какая скобка ему не зашла.
Не понимаю, что ему нужно. Какая неожиданная скобка, нахуй он ожидает фигурную скобку - не понимаю.
Да. Тут ты прав, не работает с кусочком комментария.
Надо не скрывать уведомления о проблеме, а решить проблему.
Конкретно это означает, что ты пытаешься получить из массива элемент, которого там нет.
Код с логином лень искать, он в том треде еще остался.
Ты о строках 21 и 22? Это он на пустые поля логина и пароля указывает, после заполнения все норм работает. Ну и сообщение о сессии тоже.
Можно это скрыть? А если будут обсеры, то снова раскомментить и посмотреть?
>Это он на пустые поля логина и пароля указывает
Так вот ты проверь, пустые они или нет, и если пустые то не совершай те же действия, как-будто они заполнены.
>Ну и сообщение о сессии тоже
Сессия у тебя стартует где-то раньше. Тут дейсвтительно не очень критично, он скорее всего у тебя нет никакой архитектуры, которая помогла бы тебе юзать сессию централизованно.
Так что тут для решения может быть вариант с проверкой каждый раз.
Вот есть такой метод например:
https://www.php.net/manual/ru/function.session-id.php
Впринципе я тебе и так достаточно подсказал, как именно это проверить можно, дальше сам пробуй.
>А если будут обсеры, то снова раскомментить и посмотреть?
Можно то можно, только это снежный ком. Их просто нужно не допускать и решать сразу. К счастью это почт ивсегда (в твоем случае тоже) проще простого.
ну же анон, помоги мне
Смотря чем пользуешься, если линукс, то apt install phpmyadmin, он установится для apache. Можешь композером установить composer create-project phpmyadmin/phpmyadmin в другую категорию и запускать через командную строку php (локальный сервер), или если у тебя xampp например, просто переходишь на localhost/phpmyadmin
ну так и есть линукс. собирал все по частям. в пред разы когда работал со всякими cms то просто качал проект, настраивал все в хостах и апаче, затем просто переходил по magazgovna.my/phpmyadmin то все пахало. а щас при http://127.0.0.1:8000/phpmyadmin он меня шлет куда подальше и возвращает что вот 404 и такой страницы нет при этом все это в дизайне ларавеля, если что
ну возможно.значитт мне его никак блять не прикрутить чтоли? или надо сидеть hosts редачить чтобы и там запахало?
Домашку к утру сдавать надо, поэтому срочно.
Новичек, пиши пхп в оупен сервере. Есть задание, там надо вывести пару строк, а конкретно часы и минуты просклонять, в стоответсвии со временем. Однако у меня хром заменяет русские буквы на знаки вопроса, на английском все работает. Понимаю что проблема в кодировке, в начале пишу метачарсте утф 8 и тд, не работает. Открываю модули оупен сервера, меняю дефолт с офф на утф 8. Тоже не помогло. Что посоветуешь?
университет Хофстра на лонг айланде. Никак не могу отделаться от привычки писать сначала на русском, а потом переделывать. Это проблема для себя была чисто. Хотел разузнать что не так пока к удаленке доступ не закрыли
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0
Во что-то типа "Win 10, Firefox 75" ?
Боюсь что если начну сам херачить, то придется самому городить велосипед на 1000 if под каждый возможный браузер/os, да еще и через год это устареет.
вчера заснул и не ответил, ты молодец, не возвращайся в парашу, но ты и без меня это знаешь
Братан, это вопросы вообще или что?
Для того что бы пользователям показывать "устройства" с которых залогинены и все такое.
просто особого практического значения расшифровка юзер агента не имеет в наши дни
https://habr.com/ru/company/dcmiran/news/t/494362/
Максимум что ты полезного можешь узнать это мобила или пека
Код: https://pastebin.com/z8CvzQFz
Вроде должно работать. Но она даже не объявляется. Типа, если я неправильно ввёл значение, то должно же быть null, не?
При чём даже если просто переменную в файле header.php объявить, то всё равно говорит, что переменной не существует. Как это блять работает?
А если я за юзерами следить хочу?
Мб через js можно напрямую делать? Мне на самом то деле не страшно если уже после логина от пользователя прилетит аякс-запрос на сервак с данными.
А в чём разница между интерфейсом и абстрактрым классом? Придумали 2 бесполезной хрени.
Лучше жиэс учи, для всякого петтинга более подходящая хуйня.
Пхп - это чтобы срать в продакшн тоннами кода
>как можно быстрее
Нужен ОПЫТ. Не в смысле коммерческий, а вообще.
Набить руку, так сказать. Короче надо постоянно высирать новый код, чтобы тебе отпечатывались в макушку все знания.
Только набив достаточно опыта и написав пару десятков мегабайт кода, тогда у тебя зазубрятся базовые принципы.
>быстрее
Для этого надо больше хуячить кода. Не читать, не учить, а писать код.
Соответственно, чем больше ты времени на это тратишь, тем БЫСТРЕЕ все это будет
>или просто обычное pdo подключение
Ну, тут ты точно соснешь.
Как только ты на шаг выйдешь за пределы стандарта SQL, ты уже не сможешь юзать PDO.
Да даже больше, sql в сфинксе крайне урезанный, ты даже блядский LIMIT можешь задать строго определенным образом.
В свое время я наебался и тупо стал слать запросы на json api сфинкса.
(Точнее хуй знает, есть ли оно в сфинксе, я юзал форк Manticore, там есть).
Нашел вот такую штуку: https://browscap.org/
Но не совсем понятно как с этим работать.
Я должен гигантский файл парсить или что каждый раз?
>Я их вообще не использую, потому что не могу понять зачем
В принципе правильно. Если не знаешь зачем что-то тебе нужно, значит тебе это сейчас не нужно. Но
Представь что у тебя на сайте куда-то загружается файл и сохраняется на локальном диске сервера. Всё ок, всё работает. Потом случается любая залупа, и тебе нужно этот файл заливать не на локальный диск, а на облако. У тебя до этого был класс Filesystem с каким-то методом вроде save(). Копируешь этот класс и делаешь из него LocalFilesystem, а из Filesystem делаешь интерфейс с методом save(). Теперь тебе достаточно сделать например YandexStorageFilesystem, в конфигураторе забиндить интерфейс Filesystem к YandexStorageFilesystem и не трогая вообще свой основной код у тебя программа внезапно начала работать по другому. Не всё так просто конечно, но суть понятная думаю. Важно чтобы у тебя нигде в коде не было $fs = new Filesystem(), или юзай контейнеры, или фабрики
Абстрактный это же типа базовый? Который не предполагает создания экземпляров? Если правильно понял, то юзаю как основной костяк. Тупа вваливаю туда основной фукнционал, а всё остальное выстраиваю вокруг него дабы не ебаться излишне с наследованиями и прочим.
'/\d[\d]\.\d\d\.\d\d\d\d \d\d:\d\d:\d\d/'
Нашёл багу, отбой.
бля, недопроверил после поправок. сча исправлю
вот, упустил один момент в регулярке просто. теперь все должно работать. https://ideone.com/ics46N
>Какой англоязычный учебник по современному php порекомендуете?
Нет таких. Ни учебника, ни php. Современный PHP - это сельские интернет магазины, копроративные сайты и блоги на вордпресс. Соответственно к ним и учебников нету.
>И там обязательно будут спрашивать, чем абстрактный класс отличается от интерфейса и всё такое.
https://www.apress.com/gp/book/9781430260325
>Хочу замутить крутой скрипт для чтения манги в онлайне.
Ну на ПХП у тебя будет сверх крутое чтение манги с полной перезагрузкой страницы после каждого перелистывания. Хуита это короче будет, а не манга. СПАшечку сразу делай на vue.js. Ну либо если тебе прям сильно хочется можешь скомбинировать, допустим какой-нибудь Yii2 + jQuery, если хочется стабильности, либо Laravel 6 + Vue.js, если ты стильный модный молодежный петушиный.
>Если при токен аутентификации мы грузим пользователя из бд на каждом запросе, это норм?
Ну грузить, наверное, я бы сказал не норм, а проверять - ну да. То есть, типа а как иначе? На каждом запросе спрашиваешь у него токен и чекаешь, кто это. Ну если у тебя реляционка обычная можно и грузить, это в принципе на скорость не повлияет.
>там уже 7-ой вышел =)
Ебаааааааааааааааать, ладно схожу посмотрю, че там высрал (нет). Причем, довольно давно похоже вышел, на ларакастс уже высер записали, what's new. Честно говоря, ПХП такая параша, что даже лень смотреть, чем там изменилось, как же я счастлив, что в жс переобулся.
Не как сейчас, когда картинка открывается в отдельной рамке, тут уже пахнет JS'ом.
А как раньше (к примеру, так до сих пор на Ычане, если без куклоскрипта): картинка открывается в полном размере и вместе с этим уродливо растягивает всю рамку с постом и зажимая текст к краю экрана.
Или это тоже только через JS сделать можно?
И на пхп остается только открывать картинки в отдельной вкладке, что и было до растягивания картинки в посте, лол.
Без жс никак.
>А как раньше (к примеру, так до сих пор на Ычане, если без куклоскрипта):
Открой инспектор, там это через жс сделано.
>А почему неосилил? ООП не даётся?
Я на типизированных джаваскриптах пишу, тамошняя система типов твоему ПХП без дженериков сосать дает. Просто заебало хуй сосать за 60к в говноконторе я решил двигаться к деньгам и нормальной разработке.
>тамошняя система типов
Она чем-то от ПХПшной отличается сильно, да?
>твоему ПХП без дженериков сосать дает
А в ПХП они есть?
>я решил двигаться к деньгам и нормальной разработке
Что в твоём понимании является нормальной разработкой и почему ты пхп неосилил?
У них есть API для обращения к базе, для обработки событий, для написания компонентов/плагинов/тем оформления, у WP есть REST API, у битрикса - push-уведомления и т. д. и т. п. Поэтому - фреймворки.
>Поэтому - фреймворки.
Это системы управления контентом. CMS.
Фактически это готовый сайт - только настрой и темок с плагинами накати.
Фреймворк это набор связанных воедино библиотек для разработки чего угодно на своей платформе. Обычно требует более глубоких знаний чем CMS.
Учи матчасть чтоб не быть баттхёртом.
>Это системы управления контентом.
Так их называют только пиздюки, которые толком этих фреймворков не знают. Голые Bitrix, WP, Shopify сейчас никому не нужны. Заказчикам (у которых уже стоит что-то из этого списка) нужна кастомизация, которую невозможно обеспечить в рамках "темок с плагинами". Говорю это как проработавший 4+ года на галере, которая занимается такой кастомизацией.
А теперь - марш под шконку, сосунок.
>Bitrix, WP, Shopify
>фреймворки
>называет кого-то сосунком и гонит под шконку
Кекнул с этого овоща.
>проработавший 4+ года на галере
Да всем насрать где ты там отработал.
Я вот недавно галеру видел где работают одни верстальщики, которые себя фуллстаками называют. Прямо как ты cms - фреймворками.
>Говорю это как проработавший 4+ года на галере, которая занимается такой кастомизацией.
А вот этот мужик https://wp-kama.ru/about занимается вордпрессом 10 лет и называет его именно CMS - почитай на странице, что умные люди говорят.
А пока что:
>марш под шконку, сосунок
>Она чем-то от ПХПшной отличается сильно, да?
Бля, вот мне не лень настолько конченному хуесосу что-то объяснять. Ок, поехали, из коробки:
1. Возможность типизировать любую переменную. В пыхопараше это появилось только 7.4, а я выкатился с этой хуиты в 7.2. Там только тайп хинты типизируются и возвратные значения.
2. Типизированные массивы.
let arr: string[] = ['ty', 'hyesos'];
3. Дженерик:
function gen<T>(el: T): T {
return el;
}
4. Кортежи.
5. Энумы.
6. Never.
Лень расписывать, ты хуесос короче, там можно писать код, который ты даже представить в своей лоускилльной башке не можешь. Например, ридонли и приватные поля с хэш синтаксисом: обобщенные классы и интерфейсы. Соснул хуйца?:
function getProperty<T, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
Гарды явления и включения, такое видел, хуесос? Пересечения типов и их объединения. Я, ктстати, уже говорил, что ты хуесос?
>А в ПХП они есть?
Нету блядь, в ПХП есть только хуй заказчика очередного интернет магазина на процедурной параше в твоем рту. Все, нету там больше ничего. Ни декораторов, ни врапперов, ни нормальной АОТ или ДЖИТ, нихуя там нету. Ты есть, долбоеб.
>Что в твоём понимании является нормальной разработкой
Энтерпрайз и качество, инновации, расширение границ.
>Она чем-то от ПХПшной отличается сильно, да?
Бля, вот мне не лень настолько конченному хуесосу что-то объяснять. Ок, поехали, из коробки:
1. Возможность типизировать любую переменную. В пыхопараше это появилось только 7.4, а я выкатился с этой хуиты в 7.2. Там только тайп хинты типизируются и возвратные значения.
2. Типизированные массивы.
let arr: string[] = ['ty', 'hyesos'];
3. Дженерик:
function gen<T>(el: T): T {
return el;
}
4. Кортежи.
5. Энумы.
6. Never.
Лень расписывать, ты хуесос короче, там можно писать код, который ты даже представить в своей лоускилльной башке не можешь. Например, ридонли и приватные поля с хэш синтаксисом: обобщенные классы и интерфейсы. Соснул хуйца?:
function getProperty<T, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
Гарды явления и включения, такое видел, хуесос? Пересечения типов и их объединения. Я, ктстати, уже говорил, что ты хуесос?
>А в ПХП они есть?
Нету блядь, в ПХП есть только хуй заказчика очередного интернет магазина на процедурной параше в твоем рту. Все, нету там больше ничего. Ни декораторов, ни врапперов, ни нормальной АОТ или ДЖИТ, нихуя там нету. Ты есть, долбоеб.
>Что в твоём понимании является нормальной разработкой
Энтерпрайз и качество, инновации, расширение границ.
>долбоёб путает js и TypeScript и называет кого-то тупым.
Ты и жавускрипт неосилил походу, токсичное шизло.
У тебя это все есть на том же уровне, на каком был ключик у джека воробья во второй части. Пиши сразу на шарпе, зачем подделку жрешь.
мимо-шарпист
Нет блять, высматривать, 4 раза или 5 ты там этот символ написал, вместо того, чтобы ПРОСТО увидеть это в скобочках - не нагляднее
>Ты и жавускрипт неосилил походу, токсичное шизло.
Эй, пиздюк читать научись, сын шлюхи.
>Я на типизированных джаваскриптах пишу
Понял хуесос?
>Пиши сразу на шарпе, зачем подделку жрешь.
Ты хуесос, на фронте я пишу, ебобо йибаба.
>на фронте я пишу
А в тред о беке ты зашел, чтобы в очередной раз дискредитировать всех фронтендщиков. Не первый ты у нас такой.
>А в тред о беке ты зашел, чтобы в очередной раз дискредитировать всех фронтендщиков
Ээээ петух, я фулстек!
Наглядная демонстрация, как фулстек разработка влияет на слабый разум. Таких тоже было у нас.
>Таких тоже было у нас.
Потому что вы петухи и не можете во фронт, я пришел вам напомнить об этом. Чем быстрее вы спрыгнете нахуй со своего ПХП, тем быстрее вы начнете учить джаваскрипт и обогащаться поняли?
https://www.youtube.com/watch?v=g992NR0c10E
Фронт важнее бека в современном мире.
На бек можно, в крайнем случае, каких-нибудь обезьян нанять, или даже сами фронтендщики что-нибудь высрут, чтобы апишка жсоны выдавала.
А вот приемлимый фронт пхп-дебичи никогда не родят.
Плюс есть ложное чувство простоты жс. Нет блять, он нихуя не прост. Он гибкий настолько, что способов отстрелить себе ногу и половину ебала там в 10 раз больше, чем было в пхп4.
И не только лишь все понимают язык на том уровне, чтобы интуитивно избегать всех этих мест и писать нормальный код.
>На бек можно, в крайнем случае, каких-нибудь обезьян нанять, или даже сами фронтендщики что-нибудь высрут, чтобы апишка жсоны выдавала.
А потом оно падает в самый разгар распродажи и твои обезьяны не ебут что с этим делать в течении пары-тройки дней.
Ты либо совсем дегенерат, либо толстяк каких ещё поискать.
Железо все стерпит. Ядер дохуя, накинуть еще 24 гига памяти дешевле и проще, чем что-то исправлять.
Если смотреть глобально, то случаев, когда требуется настолько сложный бек, с которым обезьяны не справятся, меньше, чем случаев, когда они могут на коленке написать апи на VasyanJS и все будет работать.
>Если смотреть глобально, то случаев, когда требуется настолько сложный бек, с которым обезьяны не справятся
Точно так же с фронтендом обстоят дела - куча прибыльных\топовых сервисов без всякого СПА и куч макак на поддержке живут себе и деньги делают.
Гугл показывает результаты с учётом истории поиска
Делаю задание из обучалки про кубики, и меня ебет синтакисческой ошибкой уже целый час я не знаю что делать уже просто я хочу погромировать за 300к\сек а не поваром рабоать за двести бачей в месяц
17, 21, и 25 строки соответсвенно
Кстати у тебя там есть мини ошибка ^
у тебя <= и >= , Лучше просто больше или меньше
типо если выпадет одинаковое число то это не победа, а выведет как ну ты понял
и наверное лучше все же не дважды if писать, а elseif
Ну я сам новенький и вкатываюсь, но мне кажется так лучше.
да, точняк, так вернее, спасибо!
Гуглишь любую самую дикую поебень вида "Laravel + анальный аттракцион для клоунов" и получаешь какой-нибудь специально созданный для этого пакет с парой тыщ звезд на гитхабе.
Блять, да даже для той же java меньше результатов по тем же темам бывает, я в ахуе.
(про жс и говорить не чего, там вообще нихуя нет)
Есть просто две таблицы, которые не соотносятся ни с какой моделью, так что отношения прописывать некуда.
В обучалке задачка: Некто кладет в банк 10000 р. Банк начисляет 10% годовых (то есть, каждый год на счету становится на 10% больше, чем в прошлом году). Напиши программу, считающую, через сколько лет в банке будет миллион? Сколько лет будет этому некто? Доживет ли некто до этого дня, если сегодня ему 16 лет?
Я вроде бы и домучал скрипт, чтобы он не только деньги считал, но и возраст, однако в результаты выкатывается каждое вычисление внизу скриншота. Как заставить скрипт отобразить только ответное значение?
Посоветуйте программу с возможностью просмотра результата. Ставил атом с гитхабом беда. Не в блокноте же писать.
вс код с плагинами, если места на диске не жалко то пыхошторм
У меня от скуки поехала кукуха и я решил сделать эту задачу в ООП. Так вот вопрос - нормально написано или шляпа?
забей, у меня получилось
однако проверку на то, жив некто или нет, я еще не сделал
эта задача заняла у меня около двух часов плак плак
>>16684>>668497
>>668497
Вау, у меня все получилось. Код: https://ideone.com/YCVfBf . Только у меня есть вопрос: почему до этого не работало без условия $i < strlen($example) ? я ведь принудительно завершал цикл командой break.
$op значило прошлый знак, $char знак, который я вынул из строки сейчас
к слову, скрипт выдает неправильные решения https://ideone.com/fhiGNM . для этого я и использовать переменную $op
>>166>>668504
Вот, запилил вроде как норм решение. По итогу проблема оказалась в приоритете условий. Исправил и теперь все идеально работает. Вот код https://ideone.com/HiWp87 .
Никак нет, просто я абсолютно впервые сел за код. Что не так?
>Начнем с того, что с хуев у тебя есть таблицы без моделей?
Пытаюсь поиск на сфинксе сделать. Через eloquent посылаю запросы к демону (не знаю насколько это хорошая идея, я нуб). Первая таблица индексы, вторая rt индексы.
А работают они тоже на чистой пыхе?
Нужно у тех хуил спрашивать подойдет или нет. Если нет возможности - смотри насколько упрощает код. Смысл такого ограничения - посмотреть как ты пишешь (а не на вызов одной функции из либы). Если остается довольно много - то можно и использовать скорее всего. Если у тебя там под сотню строк (исключая всякий бойлерплейт) и они начнут выебываться - можно слать нахуй. Если конечно финансы не поджимают.
Эдвенсед-задача про кредит мучала меня всю ночь и теперь еще сегодня.
Школьник решил купить айфон и для этой цели взял кредит. Сумма кредита — 40000 р., банк в начале каждого месяца (включая первый) начисляет 3% от остатка долга за пользование кредитом и 1000 р. комиссии (да, а ты думал, обойдешься процентами?). После этого, в конце каждого месяца, наш герой идет в банк и пытается выплатить долг, но он не может заплатить более 5000 р за раз (сэкономленных на школьных завтраках). Вопрос, когда он избавится от долга? Во сколько школьнику обошелся айфон? http://codepad.org/nm9jPcpd
Если исправить ошибку в условии, что $creditBalance <0 на ( $creditBalance * $percent ) + $servicePayment < $montlyPayment, то скрипт останавливается, не давая балансу уйти в отрицательное значение, что есть маленькая победа. А что делать дальше, я сломал себе мозг.
Я правильно понимаю, что мне нужно задать новое значение $monthlyPayment равное остатку по кредиту? Как мне это сделать?Куда бы я не вставил, например, $montlyPayment = $creditPayment скрипт сыпается.
https://ideone.com/gn5MGN
if (($creditBalance $percent + $servicePayment) < $monthlyPayment) {
$monthlyPayment = ($creditBalance $percent ) + $servicePayment;
уот так
https://paiza.io/projects/ZpENKSqRgSjjyZQomgeD8A?language=php
в общем, допиши дальше сам
мимо тоже дурашка-кун 2
Я и есть он.Я так же вечно туплю и тоже на этом калькуляторе тупил.Ты такой не один. главное продолжать идти вперёд Наверное
Эти спорные фишки нужны для более быстрой разработки. То есть за один-два месяца склепать работающую приложуху, и кое как её потом поддерживать иногда. Если проект охуеть какой крупный то там вообще стараются максимально от фреймворка абстрагироваться, ну и как бы для такого от ларки становится много меньше чем от симфони например. Тут смотри под задачи, если есть задача написать какую-то шляпу усатую по тз за 3 недели один раз, то, как бы это хуево не звучало, но можешь без проблем писать всю логику прямо в контроллерах. Так банально быстрее чем что-то пердолить и моделировать.
Как только доберешься до условий и лимитов, обнаружишь, что в сфинксе SQL уровня пук-кек и не поддерживает приблизительно нихуя.
Я тебе уже сказал выше по треду, используй json апи
А почему Mark Zuckerberg так сильно окуклил свой код? Типа чтобы "безопасно" было?
Я даже элементарно не могу найти в сурс коде названия профилей людей которые лайкнули этот пост:
https://www.facebook.com/mafiamd/photos/a.769452613108524/2848699558517142/
Допустим вы видите что поставил
Egor Smetansky
Но ни в каких .js файлах или .css файлах этого названия не найти, даже в html. Каким образом мой браузер тогда отображает текст: "Egor Smetansky" когда я мышкой навожу на иконку like?
Я сохранял эту страницу на локалку к себе, потом контенты всех файлов (.js и .css в основном), но нигде не было найдено совпадений с "Smetansky".
Вот как например мне, будучи не залогиненным в facebook, найти где в коде "Smetansky" спрятно и как раздобыть id этого чувака?
Лол, разумеется, это хранится в БД фейсбука и подтягивается при наведении.
При наведении на объект страница посылает ajax-запрос на /api/graphql и получает ответ.
Смотри активность браузера, нажми F12 и посмотри трафик. Ты всё сам увидишь.
Такое могли сделать чтобы нагрузку уменшить. Таких кнопок же много на странице может быть. Инфа подтягивается только если она действительно нужна (навели мышку). Плюс у него же SPA - акцент сдвинут на динамическое обновление содержимого страницы а не загрузку всего сразу.
Открываешь вкладку network, потом наводишь мышку - что-то из того что появилось и нужно. Просматриваешь где какая инфа. Когда находишь нужное, смотришь вкладку headers - там инфа которую нужно передавать чтобы твой запрос обработали. Смотришь что там можно менять. Там ебля еще та может быть, особенно если защита от XSS подрублена.
Так ты и на мидловые откликайся
Если руками хочется попробовать, то можно сделать из меню F12 "copy as curl" и с помощью curl воспроизвести запрос. Curl умеет через параметры и куки, и все методы, и все заголовки, конечно.
Можно попробовать какие-то запросы поменять, посмотреть, как сайт реагировать будет.
В принципе так можно сложные сессии какие-то воспроизводить.
thanks, то что мне нужно было
На картинке — часть программы, создающая философское настроение. Принцип работы таков: есть 5 наборов слов, из которых случайно выбираются слова, образуя такую структуру:
> слово1 слово2 слово3
> слово1 слово2 слово3
> Я слово4 слово5
Я снова категорически туплю, наработки пока выглядят так:
https://ideone.com/NCPhVd
Вопросы:
1) Как заставить код вместо ключей выдавать значения? В одной из предыдущих задач удавалось это сделать c помощью переменной типа $random[$word1], тут ничего не выходит
2)Почему первая и вторая строки выходят идентичными, хотя по идее должны браться рандомно из массива
3) как выглядит решение?((((
> Как заставить код вместо ключей выдавать значения?
С помощью ключа получаешь значение. У тебя не выходит потому что ты передаешь не ключ.
> Почему первая и вторая строки выходят идентичными
Пoтому что ты их составляешь из идентичных переменных - для второй строки их нужно заново генерировать.
Попробуй перечитать все (вообще все) заново. Ты путаешся в базовом синтаксисе. Если дальше так продолжишь то запутаешся еще больше. https://ideone.com/HHW3qK
фикшу сам себя. немного доработал, убрал повторяющиеся действия. Вот обновленная версия: https://ideone.com/5yI8fA
я так и думал, что есть решение проще. Пытался сделать так же, но
кажется у меня рили проблемы с элементарным синтаксисом, потому что как только я пытаюсь юзать подобные переменные $word2[array_rand($word2)], код сыпается.
А есть еще какие-нибудь пособия для самых маленьких? видео или статьи. Часто помогает восприятию изложение одних и тех же тем разными людьми.
Следующим моим шагом уже стало решение задачи про банкомат, следуя советам, сделал так: одна функция генерирует комбинации, по примеру как с числами, тут только вопрос правильно ли я это осуществил генерацию комбинаций купюр, с числами было попроще. Другая функция проверяет комбинацию, соответствует ли комбинацию тому количеству денег , которое требуется выдать. Сделал все это пока без оптимизации, хочется для начала узнать адекватно ли я вообще написал этот код , и есть ли тут грубые ошибки. Вот сам код https://ideone.com/6tgkDv . Далее уже буду делать оптимизацию.
Есть еще вопрос , можно же было бы осуществить все без генераторов запихнув функцию проверки в функцию генерации комбинации https://ideone.com/5L3qJh , или это ужасно выглядит ?
Находится все это в папке D:\Code\
Так вот, оно как-то странно работает, если запускать его из командной строки Windows.
Если перейти в папку (в консоли ввести D: cd code) и запустить скрипт (php script.php) - все работает отлично.
Если же попытаться запустить скрипт не переходя в папку, а задав абсолютный путь (php D:\code\script.php) то скрипт начинает выполняться, но выдает Warning что не может найти файл data.txt.
Почему так? Как это исправить?
>Почему так?
>'data.txt'
Это относительный путь. Он считается от точки запуска скрипта, а так как ты запускаешь его из другой директории, то он не может найти файл.
>Как это исправить?
__DIR__ . DIRECTORY_SEPARATOR . 'data.txt'
Пропиши вместо относительного пути.
Спасибо.
сам нашел
strstr - Находит первое вхождение подстроки. Как это можно перевести на человеческий язык?
Ну то есть "находит первое вхождение части строки" звучит не очень понятно.Или это я слишком тупой?
Хочу быть фронтендом. Хтмл и ксс с горе пополам знаю. Что дальше учить? JS или PHP?
https://paiza.io/projects/mNxIIUEXLbF6KWLdsx_NSQ?language=php
Он выводит будто все буквы в тексте гласные, так ещё и сверху накидывает выше нормы. При этом если использовать английские буквы, то всё нормально.
Дело конечно в локале, но mb_internal_encoding('utf-8') не помогает
Новые проекты на пыхе в 99.9% случаев представляют из себя вкидывания 300$ в индуса надеясь получить от него хоть немного юзабельный продукт
На западе даже самые прозженные любители поговнокодить массово перекатываются на питухон/руби как новую тулзу для шлёпанья монолитов
>На западе даже самые прозженные любители поговнокодить массово перекатываются на питухон/руби как новую тулзу для шлёпанья монолитов
жаль в роисии сука не так
Ебучая задача про палиндром: как блять это сделать, пользуясь только знаниями из обучалки?
https://ideone.com/NZXJOp вот я разбираю слово на символы, одним циклом с начала строки, другим циклом с конца строки. Как их сравнить и получить только итоговый результат по строке, а не по каждому символу?
Можно ли не делать два цикла, а как-то уместить это в один?
Если закидывать строку посимвольно в массив, как мне сравнить элементы из начала и конца массива? это вообще можно сделать?
Твои страдания в этом треде самый лучший пример почему не надо даже думать трогать это говно
решил в итоге вот так https://ideone.com/db801m
работает как часы, однако не так, как задумывал автор обучалки, очевидно
функции блять какие-то, непонятно нихуя
спасибо, вернусь к этому позже, как начну понимать хоть что-то
>На западе даже самые прозженные любители поговнокодить массово перекатываются на питухон/руби как новую тулзу для шлёпанья монолитов
Статистику перекатывания в студию. Я уже вскукареков наслушался.
>Делаю сейчас тестхаб из ОП-поста на ларавеле.
Нафига на эту херь время тратить? Лучше написать какой-то полезный сервис и захостить, набираясь реального опыта, а не разработки в вакууме.
Эта ересь кучу времени заберёт, ничего тольком не дав взамен кроме умения писать круды и накатывать миграции изучается за неделю.
С тех пор как выучил пхп и пошёл по фрилансу и заявкам, то стало очевидно, что местное дрочево никому не нужно - синьоры сами поговнокодить мастера.
Спасибо, попробую так
https://paiza.io/projects/RqqnXFOCfVQ46FimCGCCUQ?language=php
Мой говнокод Реальный говнокод, держи
Да, решил проверить и понял что обделался, строка побайтово сравнивается. Не подумал, что скриптовые языки в 2020 не могут нативно с юникодом работать.
>>672996
>Ну автор учебника не рекомендует тк не работает с русскими буквами
Учи питон, пока не поздно. Не будешь такой хуйнёй страдать, там всё намного лучше.
Звучит как начало пасты про dive into python.
А если без шуток, то где объективно синтаксис лучше : у питона или пхп?
У питона, однозначно. Его делали специально для того, чтобы синтаксис был стройным и лаконичным. Свои минусы у него есть, но в другой части.
Понял, спасибо.Даже если питон возможно лучше хотя мне кажется всё зависит от того на чем ты начал в начале, все дело в привычке, то все равно на пхп больше вакансий для джунов. К тому же принцип работы языков программирования очень схож и думаю в случае чего смогу перекатиться.
Питон однозначно хуже. И смешное "развитие" не помогает практически ничем. Вообще он выглядит как один из худших вариантов для бекенда. Даже голый жс получше. Лучше бы питонисты занимались более подходящими задачами, чем вот это вот.
Алсо, нужна не лаконичность, а выразительность. Лаконичностью доведенной до уродства студентота только меряется. И они, кстати, как раз дрочат на питон.
Ноудискасс, т.к. 3 года уже на питоне пишу бек и всей душой его ненавижу, с каждым днем все больше, переубедить не выйдет никак.
Ну как хочешь. Хотя проверил сейчас, на ХХ за неделю 1134 вакансий со словом питон и 470 на ПХП, это в Москве.
Языки вроде питона, ЖС и го на разные направления ориентированы, самая широкая область у питона, а ПХП только веб и только в одном стиле.
Что для бека в питоне хуже по сравнению с ПХП?
Я живу не в москве и у меня в городе одинаковое количество вакаский для пхп/питон`а.
Вот только вакансий без опыта для питона вообще нет.
Дерзай, есть все шансы. Мне 25, уже больше года не могу вкатиться в пыху, работа дворником не оставляет времени на саморазвитие.
Дворники вроде мало работают в день.Или ты полный день работаешь?
Если я не смогу за год-полтора научиться и найти работу джуном, то пополню твои ряды.
>>672922
https://paiza.io/projects/Src-bGvqCdab1Jqk6gfqKQ?language=php
переделал, теперь всё должно нормально работать.Если не использовать спец символы...Всё как задумывал автор Наверное
Ну ты все же не бросай попытку, даже если систематически по часу будешь в день учить, то через пару лет сможешь вкатиться.Там ещё от удачи всё зависит - видел вакансию в своём городе где вообще не слишком много нужно знать, мол главное желание учиться развиваться Оплата от 15 до 30к, но скорее всего на деле 15к
В пыхе по индексу ты читаешь не символ а байт, собсна мультибайтовая кириллица идет по пизде. Исторически сложилось что создатели пыхи ложили хуй на юникод, и поэтому сейчас у каждой функции, которая работает со строками, есть клон с приставком mb_ в виде экстеншена. Такие дела :'c
Моложе него только всякая хипстеркая хуита. Особенно если отсчитывать от появления zend engine. Из относительно мейнстримовых только шарп помоложе будет.
Кто его ненавидит? Как вообще можно ненавидеть инструмент?
Какие-то эмоции к нему, да и к прочим ЯП, испытывают только совсем уж ньюфаги в мире ИТ. Чем и палятся.
Схуяли непоспевает? Практически все есть, в 8 версии многопоточность подвезут (хотя она и никому не нужна).
>>673394
Откуда такая инфа? Ни того ни другого из коробки вроде не будет в 8. Там самое главное jit и синтаксис подтянут в очередной раз, как же без этого. Алсо, Стогов хипстерские запросы коробочной асинхронности уже неоднократно посылал нахуй, т.к. считает ее неважной. Похоже это в самую последнюю очередь будет сделано.
Асинхронность не для скорости языка в целом нужна, а для редких кейсов одновременной обработки блокирующих операций. Они реально редкие, поэтому особо не парятся с добавлением асинхронности в пых.
Со скоростью тоже уже давно хорошо, хотя апать есть куда. Все равно это не узкое место.
Критичное для пыхи - это повсеместная и легкая смена парадигмы исполнения на долгоживущие сервисы, т.к. узким местом теперь является повторяющаяся загрузка всякой мишуры одинаковой между запросами. Это, впрочем, уже многими реализовано. Из последнего нашумевшего - роадраннер. И того выходит асинхронность пхп нужна почти никак.
>ся повторяющаяся загрузка всякой мишуры одинаковой между запросами. Это, впрочем, уже многими реализовано. Из последнего нашумевшего - роадраннер. И того выходит асинхронность пхп нужна почти никак.
нихера не понял
>Критичное для пыхи - это повсеместная и легкая смена парадигмы исполнения на долгоживущие сервисы, т.к. узким местом теперь является повторяющаяся загрузка всякой мишуры одинаковой между запросами.
А как быть в ситуации, когда 10k клиентов, которые слушают вебсокет. Держать в памяти и крутить параллельно 10k машин, по одной на каждого клиента, и дальше синхронизировать обмен данных через внешние системы обмена сообщений?
Асинхронность или многопоточность нужны вот для таких вариантов. Один процесс обслуживает много клиентов, за счёт этого радикально снижаются некоторые накладные расходы. Не только память и какие-то вычисления, но и подключения к внешним сервисам и др.
Как правильно оформить регулярное выражение на определение правильности номера телефона?
" сначала идет +7 или 8, за ними ровно 10 цифр, между которыми может быть любое число скобок, минусов, пробелов"
непонятно, как дать "любое число скобок, минусов и пробелов" на любом участке текста, если символы в регулярке считаются по порядку, как я понимаю.
>>672995
По поводу функций для работы с русскими буквами - подробно описано тут: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
Тут так просто не решается. Можно перед регуляркой почистить от этого, можно так, например ([() -]\d[() -]){10}
Звездочки побились, ну ты понел.
отвечу сам себе:
все левые символы надо просто убрать с помощью
$number = str_replace([")","(","-"," "], "",$string);
До появления жс был самым конченым языком из популярных.
Сейчас место короля параши у js.
(Но по мне, C++ по уебищности никому уже не переплюнуть. Кто на C++ писал - тот в цирке не смеется.)
>все левые символы надо просто убрать с помощью
Ну охуеть, ав самой задачне нельзя ыбло написать что их убирать надо? Я тоже думал что надо в регулярке прописывать любой символ
Пых плох и ненавидим не столько сам по себе, сколько в плане того, кто и что на нем разрабатывает. На голом пыхе можно написать что угодно в интернет-мире, что приводит к тому, что есть куча "фрилансеров" 15летних с бирж и прочих начинающих, которые пишут роутинг в стиле switch($_SERVER['REQUEST_URI']) на 150 пунктов, свой класс DB, верстают шаблонами голого пыха куда прокидывают свой же класс DB, и так далее, и так далее. Все это можно делать и на джаве с питоном, но почему-то в основном такие перлы коммьюнити у пхп. Ну и процедурная лапша на глобалках в цмс или фрилансовые заказы шоб работало вчера без какого-либо ревью это тоже большая часть рынка у пхп, там могут быть матерые говнокодеры. Ну а если брать пхп мир симфони с ларой, то чего, нормальные вещи, ничего выделяющегося в плане хуевости на фоне других популярных языков, лара вообще стильная модная молодежная.
>15летних с бирж и прочих начинающих, которые пишут роутинг в стиле switch($_SERVER['REQUEST_URI']) на 150 пунктов
Такое кстати пишут не только 15-летние но и с 15-летним опытом без шуток. Когда за 15 лет варишься в этом чане с говном и не видишь как можно по другому написать. Знавал я одного разраба, говорил что все бугуртят от вордпресса просто потому что не знают как с ним правильно работать. Хотя он вроде понимал что в цикле делать запросы к бд это не очень правильно(скорее не очень быстро для него), но это по вордпрессовски и проще ебануть какой-то кеш программный чем пытаться по другому. Ну и конечно не признавал композер, установить сторонние либы это копипаст в локальный файл и подключение через include, в общем лучшие практики 2003 года.
>но почему-то в основном такие перлы коммьюнити у пхп
Ты ещё не видывал что пердоли на js лепят порой.
У тебя внизу ошибки пишутся в командной строке, балда.
1. Или ты должен знать в добавок к верстке php, sql и разные cms
2. Или ты должен иметь официальный опыт работы с js-фреймворками
Второй вариант в общем-то отпадает, ибо нельзя взять официальный опыт, если чтобы взять официальный опыт, надо иметь официальный опыт. Попал во фрактал. Значит интересует первый вариант. Это получается надо знать linux-администрирование что ли? Чтобы php на сервере настроить? А как считаете на stepic.org хорошие курсы по linux?
Видел, в одном месте работодатель любил ванилла жс без зависимостей, поэтому все писалось кошмарными велосипедами на кучах ифов и конечно же без какого-либо ES6+
\D
Такое в любом языке встречается. Я хз как сильно надо быть ёбнутым мешком чтобы увидев одного говнокодера составлять мнение вообще о всех пишущих на этом же языке.
А при создании объекта можно вызвать функцию в одну строку? по типу new CallClass()->create(); или мне все равно придется закинуть new CallClass() в переменную, и обратиться к методу через переменную?
Емаё, а где в мануале php это можно найти?
А все, нашел в основах классов и объектов. балдеж
Я больше люблю через статический метод создавать. Получается красивее: $result = ClassName::make(foo, bar)->handle(blabla);
Ты не въехал в это мнение. Можешь сам нахуй пройти.
Можно зайти сюда: https://github.com/codedokode/phpbook
Нажать "Clone or download", и там нажать Download ZIP.
Благодарю!
>У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://codedokode.github.io/phpbook
Так, ну а чего ссылка не работает?
Сап, аноны.
Сложно ли реализовать плату за услугу онлайн, например тура?
То есть, чтобы пользователь забронировал и оплатил тур онлайн?
Смотря как. Если ты хочешь сам принимать и хранить карточки (платежную информацию) то сложно. Нужно разные сертификации проходить и подобную ебанину. Если просто подключить сторонний сервис (яндекс-деньги, paypal или подобную парашу) то ничего особо сложного.
нет пробела после запятой, точки с запятой, восклицательного знака, вопросительного знака, двоеточия
«жи» или «ши» написано с буквой ы
в тексте есть слово «координально» или «сдесь», «зделал», «зделаю», «зделан»
в тексте есть слова «а» или «но» без запятой перед ними.
(можешь добавить еще несколько правил, если хорошо знаешь русский язык)
В случае обнаружения ошибки скрипт должен писать сообщение об этом и выводить кусок текста с ошибкой (чтобы было понятно, что не так).
>>выводить кусок текста с ошибкой
как?(
У меня пишет не удалось получить доступ к сайту, пробовал с впна и другого компа - ничего.
Ой, ошибся, там слеш на конце и https: https://codedokode.github.io/phpbook/ - так открывается.
>/test/NNN/question - страница вопроса теста. Показывается сколько осталось времени, текущий вопрос и дается возможность ответить на него. Можно возвращаться к предыдущим вопросам. Можно не отвечать на вопрос. Контроль времени должен вестись на сервере, чтобы его нельзя было обойти.
Я хочу сделать так: когда юзер начинает тест, то ему приходят сразу все вопросы, а дальше на клиенте джаваскрипт их пагинирует. Так ведь проще, чем каждый раз к серверу через аякс обращаться, чтобы получить следующий вопрос. Или есть какие-то подводные камни?
>Я хочу сделать так: когда юзер начинает тест, то ему приходят сразу все вопросы, а дальше на клиенте джаваскрипт их пагинирует. Так ведь проще, чем каждый раз к серверу через аякс обращаться, чтобы получить следующий вопрос. Или есть какие-то подводные камни?
Подводные камни зависят только от задач, которые ты пытаешься решить, но выбранным методом внезапно не можешь.
Например, ты хочешь трекать время ответа на каждый вопрос, можно это доверить клиенту и получать массив ответов с затраченным рядом временем на каждый вопрос. С одной стороны кулхацкер может туда что угодно написать, с другой стороны если это не сильно важная инфа в контексте то и хуй с ней.
ОП так предлагает, потому что так наверное проще с точки зрения вкатывальщика, ну и в целом интереснее даже. На жсе по-человечески для этого лучше сразу какой-то вью подрубать, а то охуеешь на жиквери это писать.
>Например, ты хочешь трекать время ответа на каждый вопрос, можно это доверить клиенту и получать массив ответов с затраченным рядом временем на каждый вопрос. С одной стороны кулхацкер может туда что угодно написать, с другой стороны если это не сильно важная инфа в контексте то и хуй с ней.
Да,про это думал. Но мне кажется, что бесполезно трекать время ответа на конкретный вопрос. Важен же общий результат и время выполнения целого теста.
> для этого лучше сразу какой-то вью подрубать
Я так и хотел. Добра за ответ! Пойду пилить.
О, открыло. Пасиб
<?php
$result = $i * $i;
for ($i = 1; $i <= 10; $i++) {
echo "($i)x($i)=($result)\n";
}
Должно вывестись
1x1=1
2x2=4
3x3=9
...
10x10=100
Все в общем работает, только ответы везде 0. В чем ошибка?
Это куколд какой-то не местный - забредают тут контуженные, иногда, со своим никому не интересным мнением.
Он херню пишет.
>Все в общем работает, только ответы везде 0. В чем ошибка?
>$result = $i * $i;
Вот это в цикл убрать надо. Перед echo.
Видимо что-то не углядел, сейчас заново попробую.
Все работает, спасибо
$i = "instructions and recipes";
if (strrpos(" $i ", " instr") == true) {print 1;}
Потому что у тебя возвращается 0, что неявно кастится в false. Хуярь явную проверку, и желательно строгую. В твоем случае !== false. Проблема дизайна в старых функциях стандартной либы есть такая.
Нужно было найти фразы, в которых содержатся определенные участки текста в корнях (в начале слов)
Эта функция
if (strrpos($url_3, '@') == true) {print 1;} # Эта хуита не работает для начальных строк
не подводила, разве что не возвращала true если искобый обьект не находится между другими обьектами, отчего ставлю пробел
>если искобый обьект не находится между другими обьектами, отчего ставлю пробел
trim, чтобы от ненужных пробелов и прочего по краям избавляться.
Если не будет пробела во фразе, как я определю именно начальные фрагменты слов?
Для удаления пробелов и сносок у меня отдельная функция
К примеру мы ищем
if (strrpos("Божество всенародное", ' всена') == true)
найден фрагмент. а
if (strrpos("Божество всенародное", ' Бож') == true)
не найдет
if (strrpos("Божество всенародное", 'Бож') == true)
тем более не найдет. поэтому правильный запрос
if (strrpos(" Божество всенародное", ' Бож') == true)
т.е. 2 пробела во фразе где мы ищем и один пробел в ищущемся фрагменте
Можно разбить на слова еще до проверки. Или использовать регулярки, с их помощью легко проверить начальные фрагменты слов.
Даже если ты этого не сделаешь, все равно правильно херачить через !== false. Вторым пробелом ты избегаешь возврата функции 0, и получаешь 1. 0 неявно кастится в false. 1 и выше неявно кастится в true, и только из-за этого неявного кастинга ты вставляешь два пробела в начало, вместо одного. Но это как был костыль, так и есть.
>==
От нестрогих сравнений нужно дисциплинированно отказаться навсегда кстати. Одна из причин, почему такие ситуации возникают. Сравнивается жопа с пальцем, кое как кастинги происходят, а тут вдруг вместо пальца хуй, и вроде ведь похож, да что-то кастинг срет под себя. Ты понял.
я решил зайти на решение через массив, но как БЛЯТЬ вывести сами "ошибки" значения массива [0] через echo?
https://ideone.com/f9l7uj
разобрался, проходите мимо
Отлично, причмокивая!
Это неправильный код. Согласно мануалу, strrpos возвращает либо число, либо FALSE. TRUE она не возвращает не при каких условиях, и сравнение некорректное.
>>678271
Попробуй в ссылке заменить http на https: https://codedokode.github.io/phpbook/
>Это какая-то защита
Защита от случайного написания = вместо сравнения. В других языках тоже так пишут. Если в левой части что-то типа true, то попытка присвоения сразу же приведет к ошибке. Обратная ситуация могла бы стать трудноуловимым багом.
Это значение по умолчанию - херочка не указала по невнимательности. Не надо пиздеть.
Объясни положняк этого треда. Тут cms зашкваром считается или нет? Типа cms зашквар и надо уметь в фреймворки?
Битрикс норм
Тут такое спрашивать зашкваром считается и теперь тебя негласно в петушиный угол определили.
Ну может ОП тебе чего ответит. Он любит петухов всяких няньчить.
>Тут такое спрашивать зашкваром считается и теперь тебя негласно в петушиный угол определили.
Я интересуюсь, а не спрашиваю. Выбирай выражения. И вообще ты кто такой чтобы запрещать мне интересоваться? Базаришь мне тут. Ты не авторитет для меня, ты меня понял? Все, базар окончен.
>Я интересуюсь
Зашкварные интересы - иди парашу чистить. Пацанам западло с тобой за дело тереть.
Будешь базарить много за CMS - в обиженку переведём.
А я авторитет?
СMS от 1С. Пилят ее еще с какого-то 1999 года, пользуется спросом за счет интеграции с 1С.
>пользуется спросом за счет интеграции с 1С
Не, у них просто бизнес-модель на маркетинг завязана. Они бабло вливают не в разработку, а в продвижение. В результате внутри она - параша, но про неё каждому кабанчику расскажут в презентации - какая она распиздатая.
Кодер на битрксопарашу стоит довольно дорого потому, что она полна страданий и мало кто любит с ней работать.
>она полна страданий
Ужас какой, это же пизнес, а зачем вы говорите, что это самая лучшая CMS? Вы что тролли что ли? Вы злодеи? Занимаетесь обманом? Занимаетесь ложью?
<?php
for ($a=10000;$a>=1000000;$a/0.1) {
???
}
echo "$x лет";
Не понял твоего поста. Что тебе не нравится? Программисты не любят Битрикс и есть за что.
Да - поддержка 1С у тебя будет отличная, но всё остальное будет парашей. А так как Битрикс это для веб, то работа с 1С это только 10% от задач, и остальные 90% - боль и говнокод.
Ладно, понял, спасибо.
Русский православный гречневый программист должен уметь три вещи: разобраться с Битриксом, разобраться с 1С-кой и кодить на русских православных микроконтроллерах.
Потом пришлось заниматься Вордпрессом. Уже вначале оказалось, что с ним не всё просто и там, где фреймворк предлагает простое и очевидное решение, на CMS это сделано наиболее ебанутым и неудобным способом.
Достаточно попробовать написать на фреймворке тот же блог, как всё станет очевидно.
Единственное, почему CMS ещё живы - они позволяют навасянить себе сайтик мышкой или нанять школьника для этого за копейки. Такое с фреймворком не прокатит - ему подай отдельный фронтенд где свои фреймворки есть, отдельный бекенд. Т.е. разработка несколько дороже выходит и професиональней.
На пике каратист Юрий Кормушин? Который в Военной тайне на Рен-ТВ самооборону, удары показывал?
Макака.
<?php
$a=10000;
$x=0;
while ($a<=1000000) {
$a = ($a/100)*10 + $a;
$x++;
}
echo "$x лет"."\n";
echo "некто будет ".($x+16)." лет"."\n";
echo ($x+16)<=100 ? "доживёт" : "обмяк";
Аноны, нужна ваша помощь.
Пишу магистерскую диссертацию на тему разработки сайта для турагенства да-да, такое тоже бывает.
Могли бы ответить на вопросы:
1) Можете подсказать CMS, который легок в обучении и есть адекватные уроки по нему? И чтобы уроки были не по готовому шаблону или конструктору, а чтобы объясняли как использовать CMS со своей версткой?
2)По идее можно или нужно реализовать возможность покупки специальных туров, которые предоставляет фирма онлайн. Как это реализовать максимально легко и безопасно, если это возможно? Получается нужна база данных, если да, то что она должна хранить?
3) Допустим все же воспользоваться готовым шаблоном. Можно ли его натянуть на CMS и сделать для него оплату онлайн?
4) Можете дать советы по разработке сайта для турагенства? Как что реализовать, может быть кто-то сталкивался с подобным.
мимо пхп кодер с недовольным заказчиком
Это не тот, который кнопки сабмита верстает как ссылки, а когда их переделываешь в кнопки то все стили слетают?
>1) Можете подсказать CMS, кот
Очевидный вордпресс
>2)По идее можно или нужно реализовать возможность покупки специальных туров, которые предоставляет фирма онлайн. Как это реализовать максимально легко и безопасно, если это возможно? Получается нужна база данных, если да, то что она должна хранить?
Очевидный вукомерс
>3) Допустим все же воспользоваться готовым шаблоном. Можно ли его натянуть на CMS и сделать для него оплату онлайн?
Можно конечно и без особого труда
>4) Можете дать советы по разработке сайта для турагенства? Как что реализовать, может быть кто-то сталкивался с подобным.
Могу дать жизненный совет. Скорее всего ты на магистре по погромированию, судя по всему тебе это нахуй не надо, не еби себе мозг, купи готовый диплом, потрать лучше время с пользой.
Если тебе это реально интересно стало, то попробуй для опыта на фреймворке такое сделать, хотя бы будет о чем в записке написать. Если твой максимум это laba2.java, то понадобится время, которого может не хватить, в общем тут уж думай сам.
Ну и совет по теме, на бумаге нарисуй сущности своей предметной области, туры, агенты мб какие-то, я сам хз что там в этих турагенствах происходит. Набросай потом какие у них есть свойства, у тура например есть как минимум цена и перечень стран, входящих в этот тур, даты какие-то туда сюда. Нарисуй потом бизнес процессы. Если не можешь понять что тебе нужно, то позаходи на разные сайты турагенств и сразу увидишь какие у них есть фичи и вот это всё, хз надо или это для работы, сам решишь.
>проеб на проебе и затягивание сроков в 10 раз
Изначальные сроки какие были? В норме на 1 страницу требуется 1-2 дня, от сложности. Может он тебе целый магаз за полдня сверстать взялся? Разумеется, что сильно затянет. Частая нубская тема.
Просто найми меня
>Если твой максимум это laba2.java, то понадобится время, которого может не хватить, в общем тут уж думай сам.
У него в запасе меньше месяца, не думаю, что он вообще может в программирование как таковое. Поэтому да, поддержу только ВП.
>Как это правильно реализовать (и вообще правильно ли так делать в принципе)?
Гугли ActiveRecord
Каждый класс создаётся под одну задачу, а ты целый слой задумал в один положить. Вангую, что у тебя так получится портянка на 100500 строк, с методами по 100500 строк, что является говной во всех смыслах.
Один класс - работа с БД, один - логирование сюда вобщем-то можно и время выполнения положить, один - всё это объединяетвроде как фасад который инициализирует загрузку и передаёт конфигурацию классам.
Глобальные переменный - удоляй. С данным подходом они не нужны никогда не нужны - класс БД получает от фасада данные, логгер тоже из фасада, ну и тд. И работают с ними на своём уровне.
Да я образно все это в один класс объединил. Понятно, что под каждую задачу нужен свой отдельный класс. Вопрос в том, как создать единый экземпляр класса, чтобы он был доступен другим. И как правильно все это связывать
>как создать единый экземпляр класса, чтобы он был доступен другим
Положи классы в контейнер при загрузке. Можно тот же php pimple использовать, с гитхаба, для хранения. Это такой класс для хранения других классов зависимостей, с дополнительными плюшками.
Ну и почитай по инъекциям зависимостей, хотя бы доку с примерами по этому Пимплу - там не сложно.
Можно попробовать скачать отсюда: https://github.com/codedokode/phpbook - выбрать Clone or Download, и нажать Download as ZIP. ZIP распаковать в любую папку и дважды щелкнуть на html-файл для открытия.
Если для работы одного класса нужен объект другого класса, то для этого придумано Dependency Injection: https://github.com/codedokode/pasta/blob/master/arch/di.md
Каждый класс делается для своей задачи. Это типичная ошибка - пытаться все засунуть в один класс (и наследоваться от него). Например, у тебя может быть класс, отвечающий за работу с таблицей пользователей, с методами вроде добавить пользователя, удалить пользователя. И другой класс, который использует этот класс для регистрации нового пользователя.
Также, тебе стоит почитать про MVC: https://github.com/codedokode/pasta/blob/master/arch/mvc.md
>Верстальщик ужасно лажает, проеб на проебе и затягивание сроков в 10 раз. Какую программу ему можно поставить, чтобы она делала скриншоты раз в минуту и отсылала мне?
Зачем какая-то программа? Гит юзайте и все, потом смотришь, если каждые 3 часа нет коммита, значит какие-то проблемы.
>чтобы она делала скриншоты раз в минуту и отсылала мне?
Я б не стал работать в таких условиях - нездоровая вахтёрская хрень у тебя в голове.
Не нравится как он работает - решай вопрос с ним напрямую, а не подглядывай, ебло.
>>679723
>нездоровая вахтёрская хрень у тебя в голове
this.
Алсо, я не юрист, но мне что-то подсказывает, что поставить такое на личную машину сотрудника - риск быть набутыленным этим же сотрудником в любой момент, когда это вредоносное по заскринит или спиздит любые персональные данные. А машина скорее всего личная сейчас на удаленке.
На рабочую машину разве что можно, твое право, но от такого шизоидного вахтерства уйдет любой адекватный человек сразу же.
>На рабочую машину разве что можно, твое право, но от такого шизоидного вахтерства уйдет любой адекватный человек сразу же.
Что шизоидное вахтерство поддержу, но такая ебала есть очень много где, и много людей вынуждены так работать, особенно те, кто изначально до ковида сидели на удаленке. Реальное есть много компаний, которыми рулят люди из 80-х.
И люди не уходят, ибо смена рабочего места всегда стресс, это потеря заработка на месяц минимум, плюс многие люди понимают, что по скиллам не потянут, а еще на самом деле есть примерно процентов 50 омежных куколдов, которым это норм. Как и постоянные переработки и т.д., они даже не считают это чем-то таким.
Всё это подглядывание по факту - бесполезная хрень. Нужно нанимать человека, чтобы он смотрел. Да не простого вахтёра, а который бы понимал, что там происходит - лишние траты, лишний геморрой. Или самому время тратить, что для двигающегося кабанчика - бред и ненужное занятие.
Блэт, это только извращенец и мог придумать - чтобы людей в напряжении держать и то первое время, а потом привыкают.
А ещё если учесть, что тут не машинистки работают и порой надо почилить-позалипать в думах, то чё как вообще? Та же помидорка-стайл требует регулярного отдыха. И что? Потом это сотруднику предъявлять - типа он в ютуб смотрел на работе? Ну охуеть теперь.
>Всё это подглядывание по факту - бесполезная хрень.
Согласен полностью, но я охуел, когда узнал, сколько фирм пользуются такой хуйней. Как мне объяснил кабанчик, это нужно не для того, чтобы смотреть, чем там реально гребцы занимаются, а чтобы когда нужно будет человека выкинуть на мороз без выходного пособия, был аргумент. Который легко создать имея вот эти самые записи.
>а потом привыкают.
Чисто создание атмосферы страха. Бывает, правда, что и за гит предъявляют. Как вон на хабре чел писал, что его привели к боссу и сказали от руки (!) на бумажке номера коммитов записать (sic!).
>чтобы когда нужно будет человека выкинуть на мороз без выходного пособия, был аргумент
Как-то не уверен, что суд этот аргумент примет в случае чего. В ТК вроде нет таких требований, чтобы разработчки без остановки код писал.
>В ТК вроде нет таких требований, чтобы разработчки без остановки код писал.
Нету, верно. А вот если ты на полчаса допустим, вк или ютуб открыл - это вроде как вполне основания для выговора. А там как, выговор, строгий выговор, увольнение. Типа спалил пацана пару раз по скриншотам - он у тебя на удочке, уже бунтовать не станет, когда ты ему скажешь в пятницу перед релизом до 12 ночи сидеть.
Знаю парней, гребут на околомусарской конторе, занимаются дактилоскопией. Склад характера собственника и руководителя конторы соответствующий сфере деятельности. Там не то, что скриншоты, там над каждым рабочим местом установлены камеры, фиксирующие сотрудников. На фирме установлены штрафы. Например, один пацан уснул рабочим месте, хуяк - штраф 5,000 рублей, ну а че ФОТ оптимизировать как-то надо? Новая яхта сама себе не купит.
Пацаны вынуждены из толчка капчевать, это единственное место, где камер нет. Так вот и живут.
А если они попробуют уволиться - их в лесу закопают? Или у них такая ничтожная квалификация, что после этой работы разве что в дворники идти?
>А если они попробуют уволиться - их в лесу закопают?
Почему, з/п рассчитают и до свидания. Там очередь новых стоит.
>Или у них такая ничтожная квалификация, что после этой работы разве что в дворники идти?
Высокой квалификации там не требуется, плюс есть технические вузы да и специалистов полно еще со времен союза.
>Почему, з/п рассчитают и до свидания.
И нахуя в такой помойке сидеть? Все что угодно будет лучше этого.
>Там очередь новых стоит.
Эта очередь из продавцов пылесосов, которые получили справку о прохождении курса за 100500 шекелей и теперь всем рассказывают, что уж они то программисты? Из тобою описанного никакой человек туда не пойдет при наличии выбора, а выбор в этой сфере пока еще есть и очень большой.
Не верю я, что такие существуют, тем более целыми очередями.
>И нахуя в такой помойке сидеть? Все что угодно будет лучше этого.
Потому что там платят немного больше, чем в соседних конторах и намного больше, чем на заводе. А работа там - это электроника + лоу левел стафф на с/с++ и асме. Если не там, то на завод за 40к станки настраивать. А тут все-таки в теплом офисе с кофе-машиной и за компом, а не в цеху с выбитыми окнами в грязной робе поверх рубахи. Согласись, есть разница.
>Эта очередь из продавцов пылесосов, которые получили справку о прохождении
из студентов, только что окончивших технический вузик регионального миллионника, которые ниче кроме сишки и паскаля не знаю, а мамка с папкой оплачивать съемную квартиру и еду как-то не горят желанием. Понимаешь? Дети богатых родителей в ИТ не идут. А если родыки не богатые, то долго держать тебя на шее они не будут.
>Не верю я, что такие существуют, тем более целыми очередями.
Существуют. А еще существуют люди, которые живут в кризисе с 14 года и просто-напросто панически боятся потерять работу: у них очень узкая специальность, понимаешь? Таких контор всего-то несколько штук на всю Россию, это не ПХП, где потеряв работу, ты за неделю найдешь новую, похуй корона, не корона, ты завтра будешь снова гребсти, даже в условиях анальной оккупации, пока есть интернет, ты свои $5/h заработаешь. Тут немного по-другому.
Работаю на силовиков в ИТ, ничего такого нету, получаю джуном 100к.
мимо бывший продавец пылесосов
Я прошел там курсы и стал программистом. До этого собирал теплицы и мебель 10 лет
Ты подороже курсы купил, судя по всему.
В докере. На удивление, вроде без пердолинга встал и даже работает, я в шоке
А что в нём такого? Как-то ставил, но ничего кроме красивого вардампа не использовал.
Есть у него какие-то наиболее полезные фичи, а то ради вардампа влом конфиги пхп ковырять.
Хех, помню я еще где-то в 7-8 классе сюда пробрался, наполненный уверенностью что скоро стану погромистом и буду загребать бабло лопатой. Прошел двачерский учебник похоже что он совсем не изменился с того времени, после чего меня угораздило посмотреть на настоящий php код какого-то сайта, я охуел, обосрался и больше в программирование не возвращался, при всем при этом поступил в айти шарагу и думал что когда-то начну изучать прогерство, лол. 6 лет выходит прошло, а ощущение что даже шапка почти не изменилась. Шарагу уже заканчиваю, через неделю сдача диплома, одногруппники уже миддлы, а я 4 года занимался хуй пойми чем и так и не начал ничего изучать. Подумал я на днях что не очень то хорошо будет всю жизнь мешки грузить, а с моим дипломом особо других вариантов нету, буду начинать заново походу, пожелайте удачи долбоебу, земля пухом.
Ну в редких случаях пользуюсь - когда странное поведение присутствует.
Когда сам чёто пишу - вообще не приходится пользоваться. Оно либо ошибку синтаксиса выдаст, либо работает сразу.
Сейчас на каждый пук бросается исключение и стектрейс выводится. Толку от вардампа?
Если до сих пор не вкатился, скорей всего тебе это и не надо, что за двухбитное мышление - или программист сверхразум 300к\наносек попивающий смузи в офисе или говночист и обслуживатель, видимо поэтому толпы зумеров и идут в ит - методички не поменялись, в свое время бумерам вдалбивали мысль стать офисными работниками всех мастей.
Включил на пять секунд, и уже услышал "не ебу" "блять"
Смотря на каком уровне работать собираешься. Если писать под неё и поддерживать, то надо учить и пхп, и жс, и саму архитектуру жумлы. Если просто сайтики делать из того, что есть, не не надо - это ж CMS, тут мышкой можно. Правда таких мышевозов - по 30 школьников на копеечный заказ.
мне нужна регистрация,личный кабинет для каждого юзера в котором нужно совершить действие(думаю придеться допилить).из коробки там есть простой конструктор,я смотрел темы-все они перегруженное говно
мож друпал?
Если какой-то уникальный функционал делать собрался, то придётся. CMSки хорошо идут только под определённые задачи и никак под оригинальные.
мне импонирует,что в ЦМС не так много дрочева с фронтом,а я полный ноль в этом,пхп я хоть имею представление о языке.
мне всего то надо пару блоков для описания и картинки,вверху пару менюшек и кнопка авторизации и регистрации.
все шаблоны в магазине для меня избыточны,но мож я хреново искал
От сложности зависит же - чего закажешь.
Пчел, если тебе надо для дела и побыстрее, то учить всякую срань - не вариант вообще. Либо сразу садишься и васянишь - лишь бы работало, либо нанимаешь человека. Третьего не дано.
Дебаггер позволяет гораздо быстрее отлаживать.
Тебе не надо писать все эти вардампы, логи на каждый пук.
Ты просто ставишь точку останова, запускаешь код и тут же видишь все состояние программы реалтайм.
Особенно полезно, когда тебе надо посмотреть потроха какого-то объекта, куда без смазки так просто не залезть.
> level 1: неделю разбираешься, почему программа не работает. Понимаешь: syntax error.
> level 2: отличаешь ошибку синтаксиса от других типов ошибок.
> level 3: видишь ошибки синтаксиса ДО запуска программы.
> level 4: освоил var_dump().
> level 5: впервые написал программу длиннее 1 килобайта так, чтобы там не было ошибок.
> level 6: обнаружил, что ошибки выводятся не только на экран, но и в логи и даже хранятся там.
> level 7: впервые нашел сложную ошибку путем последовательных var_dump'ов через каждую строку.
> level 80: прогал 2 часа, написал 50 классов, впервые запустил проект, охуел от того, что все идеально работает без каких-либо ошибок.
> level 90: исправляешь ошибки в фреймворках и либах.
> level 100: коммитишь в ядро php.
> прогал 2 часа, написал 50 классов, впервые запустил проект, охуел от того, что все идеально работает без каких-либо ошибок.
Жиза. Постоянно себе пеняю за то, что сперва много пишу и только потом проверяю. При каждом запуске очко сжимается в ожидании часов отладки, но как-то жидко проносит.
>исправляешь ошибки в фреймворках и либах
Придирчивый стал до внутренностей всяких либ, что пиздос. Если код не по мне - не ставлю звезду.
>> level 80: прогал 2 часа, написал 50 классов, впервые запустил проект, охуел от того, что все идеально работает без каких-либо ошибок.
Это так и должно работать когда ты максимально описываешь всё типами, структуры у тебя это не неймлес массивы а классы, остаются только логические ошибки, для них тесты пишешь. И внезапно пропадает тот страх, когда боишься поменять одну строчку в коде потому что думаешь что всё сломается.
>Если до сих пор не вкатился, скорей всего тебе это и не надо, что за двухбитное мышление - или программист сверхразум 300к\наносек попивающий смузи в офисе или говночист и обслуживатель
Это не двухбитное мышление, для меня это суровая реальность. Образование уже не поменяю, даже каким-то продажником стать не смогу из-за дефектов речи и охуенных коммуникативных навыков, тут либо IT либо говночист. За деньгами не гоняюсь, это вообще последнее дело для меня
Не слушай его, мне вообще было похуй на погромирование, после универа начал вкатываться только ради денег, а потом со временем всё больше и больше начало нравится, я настолько аутистом стал что вместо анимы смотрю разные доклады и презентации
Дисциплина бро, нужны конкретные сроки и конкрентые цели, сделай пару проектов для портфолио и ищи работку джуном, висеть в вакууме дома и что-то учить очень сложно дольше 3-5 месяцев, ну примерно.
Не понял вопрос. Ты бы описал, что у тебя за задача.
>>677315
Ты тоже не описал задачу, для чего тебе понадобилась CMS.
>>676926
Можно сделать и так, и так, оба варианта годятся. Аякс не обязателен, можно делать и с перезагрузкой страницы при переходе к следующему вопросу.
>>677442
Там лучше использовать foreach ($errors as $error) { echo "{$error[0]}"; }
Выводить кусок текста рядом с ошибкой можно несколькими способами:
- можно при поиске получать позицию найденного фрагмента текста, для этого надо смотреть мануал по preg_match_all. Имея позицию символа с ошибкой, мы можем вывести часть строки вокруг этого места
- можно делать замену так, чтобы ошибочное место было окружено скобками или какими-то символами. Например, "жы" заменяем на "[жы]" и выводим текст
- можно доработать регулярку, чтобы она искала не только место с ошибкой ("жы") но и несколько любых символов до и после. Тогда при нахождении будет выводиться как раз кусок строки вокруг ошибки.
>>673544
Можно сделать регулярку, которая ищет ровно 1 цифру, и любое число минусов, скобок, пробелов после нее. А затем взять эту регулярку в скобки и указать повторение 10 раз: (одна цифра и символы){10}
>>673426
Для работы с вебсокетом можно либо использовать сторонний готовый демон, либо делать свое решение с использованием библиотек вроде ReactPHP.
>Для работы с вебсокетом можно либо использовать сторонний готовый демон, либо делать свое решение с использованием библиотек вроде ReactPHP.
лучше не надо
Если тебе нравится Яваскрипт, то что ты забыл в этом треде? Переубеждать тебя никто не будет. PHP вполне решает задачу разработки бекенда веб-приложений. Также, есть статья и про твой яваскрипт с питоном: https://habr.com/ru/post/315152/
В Jest'е пытаюсь затестить свою обертку над axios. Ничего не получается. В тестировании новичок, как и что мокать непонятно, особенно axios.create() и axios.interceptors.
https://codesandbox.io/s/jest-axios-testing-kx8gu — вот ссылка, пытаюсь написать тест на функции модуля client.js.
Буду очень рад вашей помощи, советам и подсказкам.
Серго, ты? Нашел уже свой секуре контроллер или тебя таки пидорнули?
Точки с запятой ставь после выражений.
https://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=aa478b703d477e236919ab951b938f60
с виду симфони какой то более сложный,конфиги и пр...
Какие там основы, заебали уже. Ларавель сам по себе. От симфони только http foundation использует вместо psr 7 15
Конвеншион овер конфигурэйшион - это ларавель, но ты должен придерживаться правил, что в какой папочке должно находиться. Симфони - все настраевается, но настроек охулиард и легко поломать: у тебя может падать сервис потому что зависимость через зависимость через зависимость через зависимость отсутствует или не настроена и хер поймешь.
Есть у меня объект user, у него есть роли и разрешения. И допустим я хочу что бы кнопка "загрузить" была доступна только пользователю с ролью "admin". Дайте инфы или код - как принято делать такие вещи правильно и опрятно.
А то у меня естественно мозгов на большее чем допустим такое в контроллере -
if(! isset( user->permission->download)){
//доступ к кнопочке запрещен
return/редирект / и т.п.
}
не хватает
Как првоерять по феншую?
1 год "вкатывался" во фронт JS пинал хуи на остоебеневшей говноработе. Уволился слава Будде, жаль не лет на пять раньше, походил по мухосрани и понял что со своим JS/react уровня около ноль я могу идти на хуй,и вкатился в другую ламповую работку гос-шарага где ультра-лайтовые условия. Там уже освоил пистон кое как, sql, пхп и ноду. На пхп запилил приложуху для шараги и несколько скриптов которые регулярно исполняются в базе. На ноде пишу всякие невнятные парсеры авито с сохранением данных в базу,в штаны, к Аллаху за пазуху.
Но все это у меня уровня хобби. Фактически я не вкотился. Код - говнокод. Коммерческой разработки нет. Ответственности тоже нет особой.
И блядь никакой предпринимательской жилки, уже года полтора как, имея такую хорошую работку, я должен был копротивляться на дно-фрилансе, набивая опыт - шишки.
Но сейчас уходить с нынешней работы - вообще не хочу. Если бы не оклад в 40 косарей - прям идеальная работа.да и эту зп могли бы поднять, если бы я активнее писал на пхп - задачи есть.
Короче годы прошли в битвах с прокрастинацией, инертностью и зоной комфорта. И не смотря на то что я таки что то научился пилить, считаю что я пример как раз тех вечно-вкатывающихся.
Аноны , все таки сосредоточьте ваши усилия на дисциплине и целеустремленности.
И дайте совет как мне поступить, что делать? Это с учетом того что увольняться сейчас точно не хочу, а времени свободного на работе много.
Фрилансить? Удаленку для джуна типа меня искать? Или вкатываться в какое то сообщество где что то пилят, и где код-ревью сделают, чем то помогут? Такие вообще существуют?
Да потерпи еще лет нцать, жизнь не такая долгая штука, как кажется на первый взгляд.
Можно как в Симфони: сделать сервис для провекрки наличия прав, в который ты передаешь юзера и константу действия. А в базовом контроллере или трейте сделать метод isGranted(действие), которое берет текущего юзера и через сервис проверяет права. Еще можно сделать метод denyAccessUnlessGranted(действие).
Почитай про Симфони: https://symfony.com/doc/current/security.html#security-securing-controller
>>684022
Справедливости ради, можно сделать cache:warmup, если я не путаю, это заставит Симфони попытаться скомпилировать контейнер и как минимум проверить, что конфигурация правильная. Это конечно не исключает ошибки уже в самом сервисе, но сообщения об ошибках обычно понятные и сразу ясно, в чем проблема.
>>684134
Не знаю. Можешь попробовать фреймворк еще освоить какой-нибудь. Если ты будешь разбирать код компонентов Симфони, то может быть, чему-то научишься. Если не знаешь ООП, то в учебнике из шапки есть глава по ООП, а тут https://github.com/codedokode/pasta/ есть всякие статьи про паттерны и архитектуру.
Тут ты прав. Нужно выползать из зоны комфорта. А то сейчас у меня прогинг - хобби просто, ответственности никакой.
>>684270
>>Можешь попробовать фреймворк еще освоить какой-нибудь
Я плотно использую slim, eloquent, sentinel и всякую бороду из либ. Буду в ларочку въезжать. ООП знаю, "знаю" громко конечно звучит. Пишу на классах.
Зона комфорта короче.
Пизда ей суке.
Ссылка: https://github.com/codedokode/pasta/blob/master/php/templates.md#умник
>Тут недавно интервью было с SamDark-ом
С пробуждением. Именно из-за того, что приходится явно говорить такие очевидные вещи AR считается антипаттерном уже многие годы. Ну а толстые контроллеры это даже не антипаттерн, а роспись в профнепригодности.
>Где их размещать тогда?
В сервисном слое.
Просто посмотри как работает популярный шаблонизатор https://twig.symfony.com/doc/2.x/internals.html
Такие вопросы у тебя из-за того, что ты получил следствие без причины.
"Модель" в юии это не "модель" из MVC, это просто неудачное название, по факту это интерфейс для работы с записью в базе данных. И для этого юии, собственно, и нужен - для максимально быстрого и удобного протаскивания этого интерфейса работы с записью в базе данных до конечного пользователя. Если это именно то, чем должно заниматься твое приложение, то бинго, юии идеально выполнит твои задачи.
Но бывают ситуации, когда получение и сохранение данных это лишь начало сложного и запутанного процесса вычислений. И тут юии, который все это время вел маленького программиста за ручку, бросает его. С одной стороны все логично, в документации описано как работают фичи фреймворка, и нахуя описывать то, что он не делает, это ведь не курс по программированию. С другой стороны дока юии это именно способ написания приложений, и наш маленький программист именно по ней научился их писать. Соответственно он использует то, что видит. А видит он контроллеры, формы и "модели". Туда и попадает весь код, который покаким-то причинам не вписывается в концепцию юии. Надо ли понимать, что через некоторое время этот проект ждет смэрть, а разработчиков юии гневные посты на форуме.
Вот вкратце причина. Собственно это все обсосано по сто раз на форумах юии. Хороший пример Елисеев, который постепенно эволюционировал от курсов "как генерить формы на юии" к курсам по созданию самописного фреймворка, использованию DDD и PSR. Рекомендую именно его почитать, чтобы немного проветрить мозги.
Охиутельный совет про "сервисный слой" конечно поможет больше. С тем же успехом посоветовал бы писать "не в модели и не в контроллере".
Как разбить юии приложение на слои? Сколько должно быть слоев? Как слои между собой взаимодействуют? Что к какому слою относится? Что называть сервисом? Чем сервис отличается от модели? И, самое главное, нахуя вообще слои и сервисы нужны? Это тема блядь на несколько хороших книг.
Я не просто посоветовал кого читать. Я объяснил почему нужно читать, показал первопричину. Объяснил что необходима эволюция взгляда на код и фреймворк, которым пользуешься. И рассказал, что автор, которого цитировал анон, SamDark, через это тоже прошел. Рассказал что есть куча обсуждений подобных проблем с разработчиками фреймворка на офф форумах. И только в самом конце рассказал что есть блог, в котором расписано это все от и до.
По моему это гораздо лучший совет, чем "ну в классе код пиши, хуе мое".
Посоветую тебе меньше читать и больше писать - по ходу разберёшься.
>ModelNameService
Сервис это элемент функционала приложения. К модели он имеет посредственное отношение и называть его так не стоит.
Соль - рандомная строка.
Как потом проверяется при аутентификации пароль пользователя, если соль с которой он регестрировался - рандомно-уникальная?
>>Соль вытаскиваеться из бд.
Большая часть алгоритмов вроде как с рандомной солью.
Я правильно понимаю что выглядит это так.
$randomSalt = "rsalt";
$password = 'пароль';
$hash = hash($randomSalt . $password );
А в базу пишется уже такая строка - $randomSalt . $hash ;
Я правильно понимаю?
Типа того. Соль генерится случайно, записывается в бд и в последующих проверках используется записаная в бд.
"Сервисом" часто называют класс, объект которого существует в одном экземпляре и не представляет какую-то сущность, а предоставляет методы для решения каких-то задач.
Например, User - это сущность (со свойствами email, pass_hash, blocked итд), а RegistrationService - это сервис, решающий задачу регистрации пользователей. У него могут быть такие методы:
- createUser($email, $pass): User
- deleteUser(User $user)
- validateLogin($email, $pass): bool
- blockUser(User $user, bool $blocked)
Заметь, что сервис не имеет дела с Request/Response/куками/сессией/HTTP-заголовками - это задача контроллера. Благодаря этому сервис можно вызывать даже из CLI скриптов, где нет никаких реквестов.
Также, я не советую называть сервисы по имени модели. Лучше по задаче, которую они решают. Иначе у тебя будет гигантский UserService, который один решает кучу задач.
Также, "сервисный слой" описан в книге Фаулера про паттерны: https://martinfowler.com/eaaCatalog/serviceLayer.html
При регистрации:
- генерируем соль
- берем хеш от (пароль + соль)
- записываем в БД соль:хеш
При логине:
- вытаскиваем из БД соль
- берем хеш от (пароль + соль)
Зачастую соль и хеш для удобства объединяются в одну строку, хранятся в одной ячейке таблицы и разделяются каким-нибудь спецсимволом.
Пишу себе пет: сделал минимальную маршуртизацию на админку, на главное приложение, определил моделей штук 5 реально доделана только 1, под них миграции, начал работать с шаблонами и вконец запутался.
Т.е. у меня почти никакого функционала не готово, кроме вывода категорий, куча наработок на и я в них уже тону. Всё сделано на 20-50% и приходится прыгать по файлам всего проекта, дописывая то тут, то там понемногу.
Есть подозрение, что дальше я так совсем зароюсь.
Что в первую очередь надо писать админку или публичную, какие этапы? У гугла чёто ничего толком не нашёл.
Тупо ебашь дальше. Тебе просто опыта не хватает. Через полгода будешь смеятся как ты в 5 моделях запутался. Как добъешь проект может быть смысл просмотреть какую-то книгу по ларавелю - тут идея в том чтобы столкнуть твое сложившееся представление о фрейморке с каким-то другим и на конфликтах можно неплохо прокачаться.
Щитаю, что такая характеристика неприменима к сайту. Такое максимум лендосу пойдёт, но не функциональному сайту.
Лучший дизай - тот, который не видно. (с)
Дизайн не должен отвлекать от функционала. Сам посмотри на наиболее посещаемые ресурсы 2ch - минимализм везде. Разве только с цветами играются.
А вот где наворотов фронтендовских куча, так это посадочные всякие, авторские блогите же лендинги по сути, какие-то тематические сайты. А вот форумы, социалки, админки, прочие сервисы - с минимальным оформлением.
Бля, ну это тот случай когда простота хуже воровства. Ты насоветовал полной хуйни, еще и Фаулера вырвал из контекста.
>"Сервисом" часто называют класс, объект которого существует в одном экземпляре
Это определение хорошее, но из него не следует почему должен существовать сервисный слой. Сервисы, подходящие под это определение, могут быть и в доменной модели, и в обработке http запроса.
>Например, User - это сущность (со свойствами email, pass_hash, blocked итд), а RegistrationService - это сервис, решающий задачу регистрации
А вот это опреление хуевое. Наличие свойств никак не говорит, что объект стал сущностью. У сервиса точно так же могут быть свойства, определяющие как он будет работать.
>У него могут быть такие методы:
Тут полный треш. С какого-то хуя сервис регистрации не регистрирует пользователя, а создает и удаляет. До кучи еще и блокирует, и его можно использовать для валидации логина. А хуй подрочить и кофе заварить сервис регистрации может?
>Заметь, что сервис не имеет дела с Request/Response/куками/сессией/HTTP-заголовками
Это утверждение никак не следует из предыдущих. Схуяли он не имеет с ними дела? Для логина пользователя, например, нужно создать и прочитать куку. Кароч надуманная хуйня.
>Также, я не советую называть сервисы по имени модели.
А я не советую писать ебанутую приписку Service везде. А то ты ведь забудешь что это сервис не дай бог. UserRegistration или RegisterUser гораздо лучше выглядит.
>Также, "сервисный слой" описан в книге Фаулера про паттерны:
И вот тут самый жесткий обсер. Ты и сам обосрался и человеку жизнь основательно подпортил. Всю дорогу твой тейк в том, что бизнес логику нужно хранить в сервисном слое, и вот ты показал откуда этот бред вычитал. Фаулер конечно человек авторитетный и хуйни не напишет. А дело все в том что по ссылке только начало главы про сервисный слой. Там не написано что же блядь делает доменная модель если вся бизнес логика в сервисах. Просвещайся, вот тебе полная глава из книги https://www.informit.com/articles/article.aspx?p=1398617&seqNum=4
Если вкратце, то сервисный слой это всего лишь обертка над бизнес логикой доменной модели. Транзакции, уведомления, workflow - вот что находится в сервисном слое. Если взять твой пример с регистрацией пользователя, то в сервисном слое будет открытие и закрытие транзакции в бд, логи для графаны и отправка сообщения в рэббит. А в доменной модели будет собственно процесс регистрации. Все по Фаулеру.
Бля, ну это тот случай когда простота хуже воровства. Ты насоветовал полной хуйни, еще и Фаулера вырвал из контекста.
>"Сервисом" часто называют класс, объект которого существует в одном экземпляре
Это определение хорошее, но из него не следует почему должен существовать сервисный слой. Сервисы, подходящие под это определение, могут быть и в доменной модели, и в обработке http запроса.
>Например, User - это сущность (со свойствами email, pass_hash, blocked итд), а RegistrationService - это сервис, решающий задачу регистрации
А вот это опреление хуевое. Наличие свойств никак не говорит, что объект стал сущностью. У сервиса точно так же могут быть свойства, определяющие как он будет работать.
>У него могут быть такие методы:
Тут полный треш. С какого-то хуя сервис регистрации не регистрирует пользователя, а создает и удаляет. До кучи еще и блокирует, и его можно использовать для валидации логина. А хуй подрочить и кофе заварить сервис регистрации может?
>Заметь, что сервис не имеет дела с Request/Response/куками/сессией/HTTP-заголовками
Это утверждение никак не следует из предыдущих. Схуяли он не имеет с ними дела? Для логина пользователя, например, нужно создать и прочитать куку. Кароч надуманная хуйня.
>Также, я не советую называть сервисы по имени модели.
А я не советую писать ебанутую приписку Service везде. А то ты ведь забудешь что это сервис не дай бог. UserRegistration или RegisterUser гораздо лучше выглядит.
>Также, "сервисный слой" описан в книге Фаулера про паттерны:
И вот тут самый жесткий обсер. Ты и сам обосрался и человеку жизнь основательно подпортил. Всю дорогу твой тейк в том, что бизнес логику нужно хранить в сервисном слое, и вот ты показал откуда этот бред вычитал. Фаулер конечно человек авторитетный и хуйни не напишет. А дело все в том что по ссылке только начало главы про сервисный слой. Там не написано что же блядь делает доменная модель если вся бизнес логика в сервисах. Просвещайся, вот тебе полная глава из книги https://www.informit.com/articles/article.aspx?p=1398617&seqNum=4
Если вкратце, то сервисный слой это всего лишь обертка над бизнес логикой доменной модели. Транзакции, уведомления, workflow - вот что находится в сервисном слое. Если взять твой пример с регистрацией пользователя, то в сервисном слое будет открытие и закрытие транзакции в бд, логи для графаны и отправка сообщения в рэббит. А в доменной модели будет собственно процесс регистрации. Все по Фаулеру.
ну хуй знает, думаешь если изменили интерфейс 2ча - онлайн упадет?
В шапке:
> Здесь мы изучаем язык PHP (а также JS/CSS/HTML/SQL)
Что учить вначале? Знаю азы html, css, js.
Короче разобрался. Все упирается в ошибку 'Error: Too many connections' - слишком много соединений с базой.
Использую mysql2, с пулом коннектов равным 10.
И теперь объясните пожалуйсто мне дауну как правильно работать с базой данных?
Очевидно что нормальные приложения не зависают к хуям после 10 запросов к базе данных. Приложения поддерживают тысячи пользователей одномоментно, и от этих пользователей идет множество запросов к базе данных. И все это работает.
Означает ли пул в 10 коннектов то что в не более 10 запросов одномоментно в sql базе может исполняться? И что остальные запросы ждут пока эти 10 исполнятся где ждут? самому очередь формировать??
У меня ошибку 'Error: Too many connections' выдает даже если я просто рефрешу страницу - там простой код который несколько статей из базы достает. Неужели я где то так обосрался что эти мои простенькие sql запросы где то в базе залипают? Я вроде соединение освободжаю в коде.
Очевидно я дебил , но объясните как это должно нормально работать?
Ощущение у меня что я люто обосрался по фундаментальному пониманию. На пхп тоже есть пет проект. В нем я с данной ошибкой не сталкивался. Но возможно просто потому что и не нагрузил его нормально. PDO само освобождает соединение по выполнению скрипта. Но логика таже? Не более, допустим 10 коннектов к базе?
Где почитать как пхп взаимодействует с базой под нагрузкой, и как база под нагрузкой работает?
В СУБД есть ограничение на число одновременно сделанных соединений. Либо у тебя этот лимит очень маленький (меньше, чем размер пула), либо ты неправильно реализовал пул, он создает постоянно новые соединения, не закрывая, и упирается в лимит.
Пул (правильно реализованный) нужен для 2 целей:
- не тратить время на установку соединения, а взять готовое из пула
- защитить БД от перегрузки, притормозив бекенд, если все соединения в пуле заняты
Есть у пула и недостатки. Если кто-то вернет в пул соединение в неправильном состоянии (например, с открытой транзакцией), то будут баги.
В PHP пул обычно не исопльзуют и создают новое соединение при старте скрипта и закрывают по завершении.
Тут дело не столько в самом пуле, сколько именно в работе ноды. Пхп однопоточный, и когда ты делаешь запросы через PDO ты всегда будешь использовать одно соединение, даже если есть пул.
А вот нода асинхронная и многопоточная, так что когда ты вызываешь запросы в цикле они выполняются параллельно, используя все доступные соединения из пула.
Например пул на десять соединений, ты делаешь двадцать запросов в пхп. Берется одно соединение и запросы выстраиваются в очередь на использование этого соединения. Ты делаешь двадцать запросов в ноде. На каждый запрос берется соединение, а кому не досталось становятся в очередь и ждут, когда соединение освободится.
Но это не объясняет откуда у тебя ошибка 'Error: Too many connections'. Возникнуть она может если твой пул больше доступного в MySQL количества соединений. Выполни запрос SHOW VARIABLES LIKE 'max_connections'; и посмотри че там по количеству. Дальше сам решай уменьшить пул или увеличить значение в MySQL.
И еще. Выполнение запросов в цикле это хуевая тема, хоть нода и делает их параллельно. Если тебе нужен список, то получай его одним запросом, а не по одной записи.
>>686919
Спасибо большое за ответы. Я по итогу разобрался. Я накосячил с реализацией пула в ноде- на каждый обработчик роута я создавал по пулу в десять коннектов, естественно спамя страничку через f5 я все лимиты превышал.
>>SHOW VARIABLES LIKE 'max_connections'
Это проверял.
>>Выполнение запросов в цикле это хуевая тема
Нет, sql запросы конечно не в цикле.
Либо я не понял написанное, либо тут ошибка:
> Например пул на десять соединений, ты делаешь двадцать запросов в пхп. Берется одно соединение и запросы выстраиваются в очередь на использование этого соединения.
В PHP (без пулов), если сделать 20 запросов к серверу, запустится параллельно 20 копий скрипта, они откроют 20 соединений и будут выполнять SQL запросы по очереди каждый в своем соединении. Защитить БД можно ограничением числа воркеров PHP (либо ограничить число передаваемых запросов на nginx), тогда лишние HTTP-запросы будут вставить в очередь.
> Ты делаешь двадцать запросов в ноде. На каждый запрос берется соединение, а кому не досталось становятся в очередь и ждут, когда соединение освободится.
Это очень странный паттерн, я думаю, лучше выполнять запросы по очереди в одном соединении.
прохожу мимо
Первый вариант - запустить несколько в одном окне (ы)
Второй вариант - использовать брокер сообщений (напр., rabbitmq)
если конечно я правильно понял то, что ты хочешь сделать
что нибудь простое,там имя,логин,дата
я вообще другой анон,просто увидел тему про клонирования,вообще не в курсе такой фичи.
я что то подобное давно слышал в ньюфаге,но там сказали что для этого есть Эрланг
>>Это очень странный паттерн
В ноде судя по всему обычное дело. Что бы экономить время на открытие/закрытие коннекта к базе, и что бы не создавать очередей.
В сбалансированном состоянии в соответствии нагрузка/открытые коннекты видимо выигрыш имеет место быть. Нода нужна в сущности для в некоторой степени специфических задач.
п.с.
судя по доке коннекты не висят открытые без дела долго. Через какие то секунды они закрываются.
>В PHP (без пулов), если сделать 20 запросов к серверу
Я имел ввиду работу именно одного скрипта.
>Это очень странный паттерн, я думаю, лучше выполнять запросы по очереди в одном соединении.
Смотря для чего. Представь, что тебе нужно перебрать таблицу на десять миллионов записей. В десять потоков это все выполнится гораздо быстрее.
ДАлее выполнил команду - vagrant box add laravel/homestead
Полтора часа что то качалось, и наконец залилось. Но где мне найти то что залилось?
Далее по иструкции идет следующее:
Installing Homestead
You may install Homestead by cloning the repository onto your host machine.......
Нужно скоприровать с гита пакет
git clone https://github.com/laravel/homestead.git ~/Homestead
Это все это альтернативный вариант установки? Типа могу командой vagrant box add laravel/homestead, а могу сам качть с гитхаба?
Чет я торможу.
разговор про чистый эрланг
мне нужно править конфиги в Homestead.yaml
Но я не могу понять куда установилась эта чертова коробка. Где это сраный файл?
> Представь, что тебе нужно перебрать таблицу на десять миллионов записей. В десять потоков это все выполнится гораздо быстрее.
В общем случае это плохая идея. Как правило, полный обход таблицы СУБД делает так: читает файл с данными таблицы с диска последовательно и отбирает нужные строки. То есть она упирается в скорость чтения с жесткого диска. Распараллеливание тут никак не поможет: несколько параллельных процессов СУБД будут конкурировать за доступ к диску, больше ждать и в итоге все станет медленннее.
Распараллеливание запросов может иметь смысл, если мы упираемся в CPU (чтобы нагрузить не одно ядро, а несколько), либо если мы шлем запросы параллельно на разные сервера.
Плюс, делать в вебе запросы, требующие обхода миллионов записей, плохая идея сама по себе.
Да, в PHP SQL запросы выполняются последовательно, но это вполне работающий подход, так как эти запросы обычно простые и выполняются быстро, и сам PHP скрипт работает короткое время.
>>687504
По идее, ты должен изучить хотя бы в общих чертах, что такое Homestead, а также освоить основы командной строки в Линуксе.
> Это все это альтернативный вариант установки?
Похоже, что так.
> Но где мне найти то что залилось?
Можно попробовать открыть настройки Виртуалбокса, и посмотреть, добавилась ли там виртуальная машина. В ее настройках посмотреть, где хранится образ жесткого диска. Чтобы увидеть его содержимое, надо зайти по ssh в виртуальную машину (либо залогиниться через окно машины в виртуалбоксе).
В крайнем случае, найти файл Homestead можно командой линукса find / -name 'Homestead.yaml'
Через боль, страдания, слезы и гайд с ютуба я таки все это дело запустил, установил лару и все это завелось.
Не очень понимаю как это все в кучу работает, и зачем там вагрант, буду читать
это к слову.
Вообще я о ларавел и о хомстед.
До этого просто пробовал развернуть ларавел, как допустим приложуху на слим.
Но чет не разернулось нихуя нормально или развернулось но что то постоянно глючило, я забыл уже.
Тут хоть работает.
п.с. буду вкатываться в ларочку.
Скажите ларакаст - это платные курсы? Или бесплатные ? На ютубе нашел канал Laracasts -
https://www.youtube.com/channel/UC3s5g0_lyZYOu8Jjo27udAQ/featured
Это оно?
>
>Мы должны сконцентрироваться на улучшении поддержки долгоживущей (long-running), асинхронной модели исполнения, ориентированной на микросервисы. Вероятно, не секрет, что одной из главных причин популярности Node.js является его умение очень эффективно обрабатывать огромное количество одновременных подключений, генерирующих относительно лёгкие запросы. Это хорошо соответствует особенностям современных микросервисных архитектур. Есть уже несколько проектов, которые реализуют в PHP аналогичную функциональность, например, ReactPHP и более свежий Swoole.
Но главная проблема в том, что большинство операций ввода-вывода в PHP не поддерживают асинхронное исполнение. Я считаю, нам нужно добавить как можно больше поддержки асинхронного ввода-вывода в различных расширениях и потоках, чтобы расширить круг задач, где имеет смысл применять инструменты типа Swoole. Точнее, нужно предложить авторам расширений механизмы, которые те могли бы использовать для реализации опциональной асинхронности своих расширений/функций, не делая всю работу самостоятельно. Мы уже провели некоторые исследования в этом направлении, и нужно сделать гораздо больше, но я оптимистично настроен. Возможно, для решения этой задачи мы возьмем libuv, и, возможно, перепишем или отрефакторим некоторые части системы PHP-потоков.
Например по ид поста - отдавать редирект в тред, в соответствующем контроллере. Вообще есть ли с ним подводные камни которые стоит знать?
Я на винде не смог руками собрать даравел. Поэтому пришлось хомстед ставить.
https://stackoverflow.com/questions/61760338/how-to-test-a-custom-laravel-console-command-without-of-installing-full-framewor
Как тестировать консольную команду Laravel, если я ее разрабатываю как пакет, то есть, фреймворк у меня не установлен и есть только в зависимости composer?
Да и вообще, вопрос не только про консольную команду. Как тестировать любую хуйню в ларавеле без инициализации самого ларавеля?
Покажи как у тебя происходит запись в $item. Судя по тому что в скрине, ты пытаешься вложить массив под определённым ключём, и если у тебя массив $item добавляет что то новое в конец массива, а не в начало, то будет как у тебя. Варианта решения два:
Первый, в массив $item записывать данные в начало массива, что бы при этом в нём же изменялась нумерация. Второй с помощью for постоянно перебирать массив $item.
Вот при таком конфиге:
const express = require('express');
const passport = require('passport'); //если закомментить - будет ошибка req.logout is not a function, а console.log(req.logout); вернет undefined
const app = express();
app.get('/', (req,res)=>{
_console.log(req.logout); //возвращает [Function]
_req.logout(); //откуда это блядство? Откуда этот метод. И как он тянется из passport
_res.end('end');
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
Аноны, разверните у себя такой конфиг, проверьте пожалуйста, кому не лень. req.logout - метод не стандартный, его нет в дефолтном объекте req. Как он тянется?
>Через прототип, не?
Ну технически то его можно подтянуть. Но как то странно что фремворк express захардкоден получается на либу passport. И по идее все что меняет объект запроса req должно подключаться в мидлвэйрах.
Может я ошибаюсь конечно. Но мне эта тема мозг вынесла.
>фремворк express захардкоден получается на либу passport
Так-то наоборот, это passport зависит от express. Он отдельно никому не сдался без экспресса.
>все что меняет объект запроса req должно подключаться в мидлвэйрах
Не должно - у мидлвари другая задача.
>>Так-то наоборот, это passport зависит от express.
Тут ты прав конечно, но я не о том.
>>Не должно - у мидлвари другая задача.
Дока;
Функции промежуточной обработки (middleware) - это функции, имеющие доступ к объекту запроса (req), объекту ответа (res) и к следующей функции промежуточной обработки в цикле “запрос-ответ” приложения. Следующая функция промежуточной обработки, как правило, обозначается переменной next.
Ну в контекте экспресс работа с req, res - одна из основных задач. Впрочем это не суть. Видимо это не я пизданулся, что у меня объекты методами просто так обрастают. Это express зачем то слегка отступил от своей парадигмы. Пасспорт меняет объект запроса без мидлвэйра, а сами фактом своего подключения к странице.
Эта сомнительная "техника" называется Monkey-patching. В Руби он рейлс, по моему, тоже такое применялось, когда ты подключаешь одну библиотеку, то она меняет или добавляет что-то в другую. Это плохой подход, так как сильно запутывает восприятие кода и добавляет побочные эффекты.
Знаю что работает коряво, но я про принцип выделения ошибки...
Копай в сторону HTTP Live Streaming и его аналогов
Не слушай этого >>667623
Современный PHP - это Laravel и Symfony - в них собраны лучшие практики программирования на этом языке. Laravel по подходам ближе к Ruby on Rails, Symfony к Spring из Java. Берешь почти любой учебник по этим фреймворкам за последние 2-3 года и пролистываешь.
Насчет собесов. Сам искал работу миддлом в апреле в разгар коронавирусной истерии - не было ни одного вопроса по тонкостям ПХП, зато, например, почти везде и много спрашивали по СУБД (оптимизация запросов, индексы, объектно-реляционные СУБД, шардирование таблиц и т.д.). Так что налегать надо на фундаментальные знания в первую очередь, а не на ПХП как таковой.
Ты просто пишешь знак, а IDE тебе сразу предлагает все местные переменные в списке. Удобно.
Что у тебя с пальцами? До всех скобочек (круглых, фигурных и квадратных) тянуться можешь, а до доллара, который прямо под уркой нет?
Раньше просто поле пустое при вставке оставалось. Какого хуя на одних серверах вставляется нормально, а на других нет?
Ладно, х с ним. Сделал по умолчанию Null. При клике в поле там ниче нет, но так выводится Null серым цветом, пик.
Теперь вторая проблема - я не могу сделать выборку по колонкам, содержащим Null.
= 0 не работает
='' тоже
= 'Null' тоже
Что делать и как выборку сделать?
Используй IS NULL. Опережая твой будущий вопрос IS NOT NULL.
mb_internal_encoding("UTF-8");
function mb_ucfirst($text) {
return mb_strtoupper(mb_substr($text, 0, 1)) . mb_substr($text, 1);
}
echo mb_ucfirst("тест\n");?
Двачую, я циклы for после С-подобных всё еще с первого раза правильно ввести не могу, всегда перед одним из трех $i забуду поставить доллар.
Окей, сорри за тупой вопрос, не отвечайте, в глаза ебусь. Посмотрел на первый пост, всё нормально у меня с форматом пока что. И приношу свои извинения PHPStorm, автоформат у него оказывается есть. И что бы я без двачей делал?
Скачал я с сервера папку с одним шаблоном сайта и это пиздец, но сейчас не об этом внезапно понял, что могу просто поисковиком винды находить код в файлах, а не просто файлы и папки, как обычно. Не так то проста эта функция, как кажется.
Искал я определённый кусок кода и не нашёл, хотя как выяснилось, код этот был. Был он в папке с пхп файлами, тип которых - исходный пхп файл. А вне этой папки были пхп файлы с типом пхп файл и в них можно было найти нужный код.
Что это за исходный пхп файл и что за нюансы с поиском его внутренностей? Это что-то с доступом связанное? Я
Целый рабочий день проебал в том числе из-за этого.
Что за шизофазия, блядь? Поставь себе норм ide, git и не еби мозгу с файлами и их содержимым. Поисковик винды для поиска кода, охуеть вообще.
Мне нужно сделать подачу заявления на сайте. Заявление сложное (заполняется на двух листах А4 мелким почерком)
Окно для заполнения я сделал. Все работает.
Но теперь возникла проблема - мне нужно чтобы оно распечатывалось в таком же виде как будто человек заполнял бумажную копию - то есть все форматирование должно быть идентично бумажному носителю (чтобы можно было электронную заявку распечатать и приколоть к делу)
Я конечно решил делать эту задачу через генерацию pdf (потому что pdf тоже нужен чтобы его в архиве хранить). юзаю fpsf
Но проблема с форматированием:
1) в итоге код - полное говно
2) приходится чуть ли не пипеткой отмерять координаты
3) все расползается по форме если вводится более длинные или наоборот более короткие данные
Есть какое-то решение? Блин просто это какой-то зашквар во времена адаптивных версток сидеть и руками набивать координаты для pdfки
(сразу, работаю в мухосрани за жалкие копейки, поэтому не придерайтесь к тому что не умею, вы за такую зп даже работать не будете)
а еще самый зашквар что мне там еще и пробелами приходится отступы набивать.
Ну так юзай другую либу. Есть либы, которые для форматирования CSS используют, типа https://github.com/dompdf/dompdf .
нашел баг в телеге с секретными чатами, написал им. Баг пофиксят, а мне 500 евро за находку. Таки дела.
В интернетах читал, что они кладут хуй на баг репорты, но мой баг имеет некое отношение к приватности/безопасности. Наверное поэтому так срегагировали
Моё увожение
хм, попробую
Есть простой вариант - использовать Knp snappy https://github.com/KnpLabs/snappy. Это библиотека, использующая утилиту wkhtmltopdf, которая (как очевидно из названия) конвертирует HTML в PDF.
Если бы этой библиотеки не было, то я бы посоветовал не копипастить одинаковый код, а сделать шаблон, например, в XML, в котором указываются размеры блоков, и свою систему расстановки этих блоков на странице. Но тут проще использовать wkhtmltopdf.
Смотря что понимать под перспективами. Есть перспектива клепать онлайн магазины всю жизнь. Пхп это дорога в один конец. Да на хлеб с маслом и даже икрой хватит, но чем дальше, тем меньше шанс перепрыгнуть на другой язык.
Че думаешь все пхп макаки вдруг резко подорвались на го? В го треде спросишь, так вакансий с гулькин хуй, а когда я ходил по пхп собесам, на каждом сука заходила речь про го. Это как последняя соломинка, если тебе тридцать, начать писать реальный софт, а не формы верстать.
Тут даже похуй на развитие языка какое-то. Асинхронность, многопоточность, дженерики, ридонли поля, функциональщина, пока это все введут пройдет еще пять лет. А в это время можно хуярить на ссаной джаве, делая плюс минус то же что и на пхп, но с комфортом и реальными перспективами.
>Асинхронность
есть
>многопоточность
не нужна, когда есть php-fpm
>дженерики
почти не нужны, но скорее всего будут в 8
>ридонли поля
по большей части не нужны, но может и добавят в 8
>функциональщина
в пыхе функциональщины больше, чем в gовне
>есть
Костыльная хуйня, пока восьмая версия не выйдет ничего серьезного без анальной боли не сделать.
>не нужна, когда есть php-fpm
Для вывода HTML конечно не нужна, мистер формошлеп
>дженерики почти не нужны
>ридонли поля по большей части не нужны
Ну тут все ясно. Нахуй я распинаюсь перед долбаебом. >>696994 вот твоя перспектива если выберешь пыху
А я например вообще питонист. И все эти тухлые претензии к пыхе не то что плесенью поросли, а уже просто говном. Годы идут, а банальные вбросы не мегяются. У того же питона при этом насущных проблем, а особенно в вебе, куда больше.
Ебанутые совершенно стандарты и пережиток прошлого - раз пыха значит плохо, а не пыха - хорошо.
Так пиши на пыхе, хули ты за питон свой схватился. Щас за недельку синтаксис подучишь и будешь сайты делать. Увлекательнейшее занятие, скажу вам, хуярить сайты на пхп. Бросай свой тухлый питон и давай к нам, как раз нужно капчу в поле регистрации добавить.
На Го писать сомнительное удовольствие. Симфони нет, Доктрины нет, не знаю, есть ли IDE с автодополнением и визуальный отладчик. Нет сотен библиотек на все случаи жизни.
Я и не говорил, что писать на нем заебись, го кал тот еще. Просто рассказал про тренд. В ВСЕХ конторах, в которых я был пытаются уйти от пыхи на го.
Ну ок, отвечу. До питона я 4 года работал на пхп. На питоне 2 года пока что. Чем дальше, тем больше разочаровываюсь. По этой же причине кажется развитие пхп более правильным.
Притом я не говорю, что питон сам по себе говно, только что он хуже для бека по сравнению с пхп. Но, справдлевости ради, хуже пыхи по беку вообще многие. Все таки пых именно по беку развивается без отвлечения на что-либо еще пока что.
Хотя кто я такой, чтобы с маэстро на дваче спорить.
>>697887
Го пиздато закрывает узкие места, чувствительные к производительности. Сама же бизнес-логика на го будет куда сложнее писаться, чем на пхп. Кроме того логика не сильно чувствительна к производительности, а значит часто пыху оставляют в роли монолита с бизнес логикой.
какое прикольное погоняло
>Увлекательнейшее занятие, скажу вам, хуярить сайты на пхп
Тебе не за развлечение платят, а за то, что ты кабанчиковы хотелки исполняешь.
Если бы ты хоть раз в жизни работал, то знал бы это, борщехлёб. Вас по этим постам на раз выкупают, дебилов необучаемых.
>Го пиздато закрывает узкие места, чувствительные к производительности. Сама же бизнес-логика на го будет куда сложнее писаться, чем на пхп. Кроме того логика не сильно чувствительна к производительности, а значит часто пыху оставляют в роли монолита с бизнес логикой.
Все так.
Никто не уходит с пыхи на го, как сказал анон выше - на го переписывают логику, к которой есть высокие требования по производительности. Писать онли на го бизнес-логику - это много гемора, там ведь даже нормальной ОРМ нет.
С пыхи уходят программисты, а не компании. Легаси говно на пыхе остается конечно, и остается пара додиков на поддержке. Те кто тему с го в компании продавал быстренько перескакивают на него полностью и на пхп болше не пишут ни строчки.
Да пиши бек к чему захочешь на пыхе, хоть к шутерам. Но работ много именно на говномагазины, исторически так сложилось.
>пик
Не забывай что пыхорынок это чаще всего два стула, сидеть в студии 10 человек и на цмсоговне собирать сайты за неделю(зп 500-700 баксов), или в средней-большой компании делать то, что обычно делают на жаве, но походу в своё время только пыхомакакены были. Есть еще прослойка между этими двумя стульями, это сидеть в студии 10 человек, только у вас клиенты не гали с улицы а джоны из Австралии, которым ты пилишь говно на ларавеле уже не за неделю, а хотя бы пару месяцев а то и год, по мне это самый удачный стул. Люблю просто говно на ларке писать, приятное с полезным так сказать
еще на рельсах для Сев Америки
Современные проекты на пыхе да при знающих тему руках получаются хорошими прям. Ну а легаси оно и в африке легаси, на то время все это было нормой, а расплачиваться иногда приходится сейчас.
Опять теплое с мягким путаешь. Я дома пишу вообще на эликсире, но работу с ним не найду, да и не хочу, меня и на пыхе неплохо кормят. Потому что проганье для себя и проганье для компании за деньги - это как бы блять совсем разные вещи. Пыха отлично подходит там, где джава оверхед, и никто с нее не уйдет, язык активно развивается, Ларка - лучший веб-фреймвок на данный момент, придется просто это принять.
Симфони - это корпоративный уровень для больших проектов с длительной поддержкой аля Спринг на Джаве, не всем он нужен.
Был на всех трех видах работ, самый спокойный имхо второй, т.е. продуктовая компания с отлаженных рабочим процессом, скрамами, митингам и всем этим говном. Хоть я щас и зарабатываю немного меньше, чем на аутсорсе, зато больше нет задач, которые надо было сделать вчера, жестких дедлайнов, текучки в команде и просто сильно долбоебистых коллег-говнокодеров, которых никто палкой не гонит, потому что они таски быстрее всех закрывают. Ищите продакт-компани короч.
>или в средней-большой компании делать то, что обычно делают на жаве, но походу в своё время только пыхомакакены были
Это как? Типо поддерживать и допиливать фичами существующие сайты?
>Есть еще прослойка между этими двумя стульями, это сидеть в студии 10 человек, только у вас клиенты не гали с улицы а джоны из Австралии, которым ты пилишь говно на ларавеле
Возможно большинство просмотренных мною вакансий - именно такие. Ну или второго типа. Практически везде аутсорс, просят инглиш на высоком уровне, СУБД и ларавел. Symphony только разок видел в требованиях, про html-css-javascript для джуна всегда пишут только что will be a plus. Ну а если на цмсговне собирать то вакансия чаще всего так и зовется - менеджер по работе с wordpress вордпресс-разработчик, я их и не просматривал. Кстати можешь за этот ларавель рассказать? А то похоже в шапке о нем ни слова, а я еще особо не интересовался. Конечно могу нагуглить информацию что это охуенный фреймворк с пиздатыми функциями, но мне кажется что ты можешь рассказать что-то более интересное, даже в одном предложении.
Нихуя ты подорвался. Ебать ты меня выкупил, никогда я не работал. Хотя подожди, это ведь ты конч прикован к уебищной работе и кабанчикам с их хотелками. Где родился там и пригодился, да?
>прикован к уебищной работе
А, ты ты идейный РНН-бич. Так-то я мог бы и догадаться по твоим высерам-постам. Такую хрень только такие бичи и пишут: про сайтики, про вкат за 3 месяца на одном синтаксисе.
Вангую, что ты даже не программист, а залётное быдло из /б.
Нихуя предьявы. Ну тогда испытай меня. Спроси то, что знать может только пхп макака.
В гугл каждый бич нынче умеет, а у пхп довольно активное коммьюнити и загуглить проще простого.
Ты себя выдал вскукареками про вкат за 3 месяца. Пиздеть - не мешки ворочать и от знания синтаксиса до сносно работающего приложения ещё минимум полгода. Хотя тебе и все 2 года будет мало.
Бля, ну не сливайся ток. Можешь на гитхабе че-нить написать, а я ревью сделаю или пул реквест.
Хуй знает где ты прочитал про три месяца, я советовал питухонисту недельку синтаксис подучить и хуярить сайты.
Ну хочешь я че-нить напишу, а ты поревьюишь. Че ты, нормально же общались.
rails
<?php
error_reporting(-1);
$word1 = array('Чудесных', 'Суровых', 'Занятных', 'Внезапных');
$word2 = array('слов', 'зим', 'глаз', 'дней', 'лет', 'мир', 'взор');
$word3 = array('прикосновений', 'поползновений', 'судьбы явлений',
'сухие листья', 'морщины смерти', 'долины края', 'замены нету',
'сухая юность', 'навек исчезнув');
$word4 = array('обретаю', 'понимаю', 'начертаю', 'закрываю', 'оставляю',
'вынимаю', 'умираю', 'замерзаю', 'выделяю');
$word5 = array('очертания', 'безысходность', 'начертанья', 'смысл жизни',
'вирус смерти', 'радость мира');
Ты работаешь? Как начать фрилансить на PHP? На биржах или CMSки пилить предлагают или овердохуя разных фреймворков. Как лучше поступить, изучить 1 популярную цмску и 1 фрейморк, и где брать заказы?
Вообще, фриланс не всем подходит. Ты много времени будешь тратить на поиск заказов, общение с клиентами. Это время не оплачивается. Есть риск нарваться на неадеквата или не желающего платить.
Многим проще искать удаленную работу, или долговременные проекты, а не разовые заказы.
Если у тебя ноль опыта, тебе надо быть менее придирчивым и изучать не "одну CMS-ку", а посмотреть, что востребовано и изучать все это. CMS, как правило, проще фреймворков.
>>699632
"array" пишется, если ты пытаешься вывести массив с помощью echo. Она выводит только строки и числа. но ты можешь вывести массив с помощью var_dump() или print_r().
Если ты используешь array_rand, то она возвращает ключ случайного элемента. Получить значение по ключу можно с помощью квадратных скобок:
$value = $array[$key];
Если ты не понимаешь, что такое ключ и значение, перечитай начало урока, где это поясняется.
>Если у тебя ноль опыта, тебе надо быть менее придирчивым и изучать не "одну CMS-ку", а посмотреть, что востребовано и изучать все это. CMS, как правило, проще фреймворков.
Ты толком не ответил. За двумя зайцами погонишься... Это я про CMS. Их же много популярных. В каждую сильно не углубишься. Думаю лучше одну популярную хорошо знать, чем все, но поверхностно. Я понимаю все минусы и риски фриланса. Но мне нужно начать зарабатывать еще вчера. Работа в офисе мне не подходит. На удаленку без опыта не очень берут. Поэтому остается фриланс.
У тебя есть опыт фриланса? Меня интересует какой стек для фриланса прокачивать. Фреймворки, если да то какие. Или CMS. Мне не важно что изучать, главное чтобы был наименьший порог входа. Чтобы начать что-то зарабатывать, и попутно стремиться уже к работе в компании. Жрать извини хочется каждый день.
У меня нет времени искать постоянную работу. Это нужно хорошее резюме, нормальные проекты чтобы не стыдно показать было, проходить овердохуя собеседований. Боюсь что моей мотивации на это не хватит. Если бы я хоть что-то уже зарабатывал, это бы мотивировало. А так руки опускаются. Хер знает когда я смогу в компанию устроится. Как то так в общем.
>главное чтобы был наименьший порог входа
Даже не так. Что не порог входа был низкий, а чтобы можно было без проблем заработать копейку не выходя из дома в любой момент. Будут деньги тогда я смогу нанять профи ментора для прокачки.
Лучше синица в руках чем журавль в небе. Лучше начать зарабатывать прямо сейчас и попутно прокачиваться до следующего левела, чем сидеть нищуком в надежде на светлое будущее. Я знаю что CMS это путь бесперспективный, но мне нужны деньги прямо сейчас. Чтобы прокачаться нужны деньги, нужно же кушать хотя бы пару раз в день, покупать что нужно, например новый комп по мощнее, чтобы нанять ментора тоже нужны деньги, понаехать в ДС в конце концов, для это нужно дохера денег.
$sql = "INSERT INTO Clients (SURNAME, NAME, PATRONYMIC, PHONE_NUMBER) VALUES ('$surname', '$name', '$patronymic', '$phone_number')";
$result = mysql_query("SELECT 'Id_client' FROM Clients WHERE 'Phone_number' = '$phone_number'");
if (mysqli_query($conn, $sql)) {
echo "<h1><center>Заказ добавлен. N ". mysql_result ($result) . "!</h1></center> " ;
}
else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
mysqli_close($conn);
Выводится пикрил, то есть результат запроса по получению номера заказа где-то проебался.
Хелп плиз
Ты взял 'Id_Client' в кавычки, и MySQL понимает это буквально, как строку, а не название поля.
Также, у тебя в коде SQL инъекция, почитай это https://github.com/codedokode/pasta/blob/master/security/sql-injection.md
Также, почитай рекомендации по поводу того, как выбирать названия таблиц и колонок: https://www.sqlstyle.guide/ru/
Не стоит смешивать логику получения данных и логику вывода данных в HTML. Почитай про шаблонизацию: https://github.com/codedokode/pasta/blob/master/php/templates.md
Код ломается скорее всего оттого, что в нем происходит ошибка. Посмотри логи ошибок или включи отображение ошибок, поставив display_errors=on в php.ini.
>>693910
Во всех нормальных редакторах и IDE есть "поиск по файлам". Он гораздо удобнее.
>>693099
Нету, надо писать свою функцию.
NULL обозначает "неизвестно". Потому эти сравнения возвращают тоже NULL, а не TRUE:
0 = NULL - мы сравниваем 0 с неизвестным числом и не знаем, что в итоге получим, потому получается NULL
'' = NULL - тоже самое
NULL = NULL - мы сравниваем 2 неизвестных значения и не знаем, равны они или нет, потому сравнение вернет NULL
Ты можешь увидеть, что вернет сравнение, выполнив запрос SELECT без FROM, например:
SELECT NULL = NULL
Тебе нужен IS NULL. SELECT NULL IS NULL вернет 1.
Здесь есть недостаток, что ты ищешь только латинские буквы в русских словах, а хорошо бы еще искать английские слова с русскими буквами. Для этого можно либо написать более хитрую регулярку (которая ищет и русские, и английские слова), либо разбить текст на слова и проверять каждое слово отдельно.
>>688969
Ютуб скачивает видео кусочками определенной длины и их воспроизводит. Это дает ему такие плюсы:
- возможность вставлять рекламу в видеопоток
- возможность явно управлять скачиванием кусочков, в случае с одним большим видеофайлом его скачивает браузер и нельзя никак этим процессом управлять
- возможность менять качество видео в зависимости от скорости соединения. Если соединение ухудшается ,можно следующий кусочек качать в пониженном качестве
- возможность делать живые трансляции, когда целого видеофайла еще нету
Можешь почитать про Media Source Extensions, начиная отсюда: https://developer.mozilla.org/en-US/docs/Web/Guide/Audio_and_video_delivery#Media_Source_Extensions_MSE
Я не знаю про Ларавель, но команды там напоминают Симфониевские команды. Ты не можешь в тесте просто создать объект команды, создать объекты Input и Output, вызвать run или execute, и проверить что то, что ты хотел сделать, сделано?
>>687996
Редирект обычно делают, когда какой-то раздел переехал на новый адрес. Или для реализации коротких ссылок. В случае с тредами и постами - не логичнее ли сразу формировать правильную ссылку на нужный тред, а не заставлять клиента делать лишние запросы?
Корпоративные/энтерпрайзные приложения - это приложения, которые развиваются в течение долгого времени большой командой и обладают высокой сложностью.
>Ты взял 'Id_Client' в кавычки, и MySQL понимает это буквально, как строку, а не название поля.
убрал кавычки, но ничего не поменялось
C инъекцией и неймингом постараюсь разобраться, но сначала хотелось бы с этим решить. Пикрил тоже не работает, сука ((
Ты обосрался когда намешал все в кучу.
Во первых сначала подготовь запросы, убедись что все в них работает. https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=556ec70420cf4a7b466236ffe6aa0dbf
Во вторых чекай актуальность своих инструментов. Какой-то блядь mysql_result замшелый, пиздец вобщем. Используй либо напрямую PDO, либо какую нибудь ORM, желательно доктрину, но можно и попроще. Версию пхп минимум 7.1, а лучше 7.4
В третьих не экономь на переменных и функциях и давай человекочитаемые названия. Хуй проссышь где у тебя какой запрос и результат. Помести результат запроса в переменную, а вывод делай отдельной функцией. Примерно так должен выглядеть твой код https://3v4l.org/EFcTC, в идеале это должно быть ООП.
В четвертых спизди уже себе пхпшторм, он сильно облегчит работу и многие ошибки сразу подсветит.
Ну и проделав все это станет понятно, что ты блядь сначала делаешь запрос на получение данных $result = mysql_query("SELECT 'Id_client', а потом на вставку if (mysqli_query($conn, $sql)) {.
спасибо, братик. я скрафтил какую-то залупу, она вроде пока работает. если все сломается опять, то воспользуюсь твоим кодом я слишком тупой, а он кажется сложным на первый взгляд
дай бог здоровья тебе
Как это развидеть? До этого все задачи решал в хард моде достаточно быстро и без заглядываний под спойлера, но сейчас уже полчаса втыкаю по сути в готовое решение и понимаю что ничего не понимаю.
https://github.com/deadj/uppu
Вышло ли что-то годное, чтобы пилить гуишные проги на пхп. Либо в крайнем случае - "консольные".
Помню в 2013 можно было через .bat запускать *.php файлы без сервера. Было удобно, что не нужно изучать новый язык программирования, когда тебе просто нужно порезать текстовый файл на куски, или сделать перестановку строк.
А что сейчас?
Спасибо за ответы.
Кто-нибудь может оценить задачу на переворачивания текста?
https://paiza.io/projects/s8B0SyRLZ982NbIPTtdUEQ?language=php
Это не так сложно. Динамическое программирование - это подход, когда мы сложную задачу раскладываем на набор простых. То есть, чтобы определить, как выдать сумму в N рублей, мы определяем, как выдать сумму в N-k рублей, и добавляем банкноту номиналом k, чтобы получилось ровно N рублей. Чтобы найти, как выдать сумму в N-k рублей, мы добавляем банкноту номиналом l к сумме в N - k - l рублей. И так, пока не дойдем до нуля, когда мы получим результат.
Если посмотреть внимательно, то нам придется сделать не более N * M действий, где N - требуемая сумма, M - число номиналов банкнот.
Ну например, у нас есть банкноты номиналом 10 р, 6 р (много) и 1 р (только 1 штука). Нам надо выдать 12 р. Жадный алгоритм тут не сработает - он возьмет 10 р и запнется, так как не хватает однорублевых купюр. Используя динамический алгоритм, мы можем сделать это 3 способами:
- добавить 1 р к комбинации на 11 р
- добавить 6 р к комбинации на 6 р
- добавить 10 р к комбинации в 2 р
В свою очередь, получить 11 р тоже можно тремя способами:
- добавить 1 р к 10 р
- добавить 6 р к 5 р
- добавить 10 р к 1 р
И так далее, пока мы не дойдем до нуля. Так мы получим комбинации вида 10 + 1 + 1 (невозможна, так как не хватает однорублевых купюр), 6 + 6 (возможна), 6 + 1 + 1 + 1 + 1 + 1 + 1 (невозможна) и так далее.
Если рисовать на бумаге возможные варианты решения, то мы получим "дерево": от суммы в 12 р отходят 3 ветки (к суммам в 11, 6 и 2 р), от каждой из них тоже отходит по несколько веток. Попробуй это нарисовать, так, чтобы между вершинами дерева суммы менялись на одну купюру.
У меня получился такой рисунок (он нарисован только частично): https://dreampuf.github.io/GraphvizOnline/#digraph G { 11 -> 12 [label="+1"] 6 -> 12 [label="+6"] 2 -> 12 [label="+10"] 10 -> 11 [label="+1"] 5 -> 11 [label="+6"] 1 -> 11 [label="+10"] 5 -> 6 [label="+1"] 0 -> 6 [label="+6"] 1 -> 2 [label="+1"] 0 -> 1 [label="+1"]}
Если идти от 12 к 0, против стрелок, рано или поздно мы дойдем до нуля, и получим ответ. Либо поймем, что ответа нету. Вершин не более N, в каждую вершину ведет не более M стрелок, значит нам надо сделать максимум N * M шагов.
Чтобы реализовать это в программе, мы можем использовать рекурсию.
Рекуррентная последовательность - это последовательность, где следующий член вычисляется из предыдущего, вроде x(n) = x(n-1) + 1, x(0) = 0.
Попробуй перечитать решение внимательно. Там, кстати, не выдается итоговая комбинация, а лишь считается количество купюр. И там нет ограничения на количество купюр каждого номинала.
Вообще, динамическое программирование - не единственный способ. Еще можно решать задачу "в лоб" - перебором всех возможных комбинаций банкнот, пока не получим нужную сумму. Тут, правда, количество действий может оказаться большим: a * b * c * d ... , где a, b, c, d, ... - количества банкнот каждого номинала.
Если что-то непонятно в решении, задавай уточняющие вопросы.
Это не так сложно. Динамическое программирование - это подход, когда мы сложную задачу раскладываем на набор простых. То есть, чтобы определить, как выдать сумму в N рублей, мы определяем, как выдать сумму в N-k рублей, и добавляем банкноту номиналом k, чтобы получилось ровно N рублей. Чтобы найти, как выдать сумму в N-k рублей, мы добавляем банкноту номиналом l к сумме в N - k - l рублей. И так, пока не дойдем до нуля, когда мы получим результат.
Если посмотреть внимательно, то нам придется сделать не более N * M действий, где N - требуемая сумма, M - число номиналов банкнот.
Ну например, у нас есть банкноты номиналом 10 р, 6 р (много) и 1 р (только 1 штука). Нам надо выдать 12 р. Жадный алгоритм тут не сработает - он возьмет 10 р и запнется, так как не хватает однорублевых купюр. Используя динамический алгоритм, мы можем сделать это 3 способами:
- добавить 1 р к комбинации на 11 р
- добавить 6 р к комбинации на 6 р
- добавить 10 р к комбинации в 2 р
В свою очередь, получить 11 р тоже можно тремя способами:
- добавить 1 р к 10 р
- добавить 6 р к 5 р
- добавить 10 р к 1 р
И так далее, пока мы не дойдем до нуля. Так мы получим комбинации вида 10 + 1 + 1 (невозможна, так как не хватает однорублевых купюр), 6 + 6 (возможна), 6 + 1 + 1 + 1 + 1 + 1 + 1 (невозможна) и так далее.
Если рисовать на бумаге возможные варианты решения, то мы получим "дерево": от суммы в 12 р отходят 3 ветки (к суммам в 11, 6 и 2 р), от каждой из них тоже отходит по несколько веток. Попробуй это нарисовать, так, чтобы между вершинами дерева суммы менялись на одну купюру.
У меня получился такой рисунок (он нарисован только частично): https://dreampuf.github.io/GraphvizOnline/#digraph G { 11 -> 12 [label="+1"] 6 -> 12 [label="+6"] 2 -> 12 [label="+10"] 10 -> 11 [label="+1"] 5 -> 11 [label="+6"] 1 -> 11 [label="+10"] 5 -> 6 [label="+1"] 0 -> 6 [label="+6"] 1 -> 2 [label="+1"] 0 -> 1 [label="+1"]}
Если идти от 12 к 0, против стрелок, рано или поздно мы дойдем до нуля, и получим ответ. Либо поймем, что ответа нету. Вершин не более N, в каждую вершину ведет не более M стрелок, значит нам надо сделать максимум N * M шагов.
Чтобы реализовать это в программе, мы можем использовать рекурсию.
Рекуррентная последовательность - это последовательность, где следующий член вычисляется из предыдущего, вроде x(n) = x(n-1) + 1, x(0) = 0.
Попробуй перечитать решение внимательно. Там, кстати, не выдается итоговая комбинация, а лишь считается количество купюр. И там нет ограничения на количество купюр каждого номинала.
Вообще, динамическое программирование - не единственный способ. Еще можно решать задачу "в лоб" - перебором всех возможных комбинаций банкнот, пока не получим нужную сумму. Тут, правда, количество действий может оказаться большим: a * b * c * d ... , где a, b, c, d, ... - количества банкнот каждого номинала.
Если что-то непонятно в решении, задавай уточняющие вопросы.
Ты пишешь код контроллера и в коллбеках в index.php, и в отдельных классах. На мой взгляд, это не имеет смысла и надо сразу ставить твои контроллеры как обработчики. У контроллеров есть зависимости (которые ты передаешь в конструктор), потому логичнее всего сделать так:
- зарегистрировать контроллеры как сервисы в контейнере Slim
- указать их в качестве обработчиков. Это описано тут: http://www.slimframework.com/docs/v3/objects/router.html#container-resolution
Сейчас модно в качестве имени сервиса использовать имя класса. То есть твой код будет выглядеть как:
$container[MainCtrl::class] = ....;
$app->get('/', MainCtrl::class . ':indexAction');
Либо же ты можешь использовать тот факт, что Слим может сам создать объект, передав контейнер в конструктор, и тебе остается написать лишь:
$app->get('/', MainCtrl::class . ':indexAction');
А если в твоем контроллере всего одно действие, ты можешь использовать "invokable class" отсюда http://www.slimframework.com/docs/v3/objects/router.html#using-an-invokable-class и писать просто:
$app->get('/', MainCtrl::class);
Также, перечитай урок по Dependency Injection, если забыл, что это такое.
> $app->get('/{nameId}'
Это не очень удачный URL, так как он конфликтует с другими URL.
dbConnect.php можно ликвидировать и перенести его в коллбек контейнера.
Конвертировать видео лучше бы в фоне, так как это может занять время. Для того, чтобы это сделать, нужна очередь задач. Ты лишь постишь задачу в очередь, а фоновый процесс подхватывает ее и обрабатывает видео. Попробуй с этим разобраться. Для начала можно взять библиотеку вроде https://github.com/anorgan/QuTee с бекендом на MySQL, а для высоконагруженных систем используют очереди в Redis или RabbitMQ.
В README надо написать про ffmpeg.
Ошибку конвертации можно записывать в информацию о файле, и просто не показывать видеоплеер в случае ошибки.
> preg_replace('/.*[.]/', '', $uploadedFile->getClientFilename(
Это лучше вынести в функцию с понятным названием.
> if (preg_match('/[.]php$/', $link)) {
Еще могут подсунуть какой-нибудь phtml, он в некоторых конфигурациях исполняется тоже. Безопаснее давать какое-то свое расширение.
> (trim($_POST['name']))
Надо использовать объект request.
https://github.com/deadj/uppu/blob/master/src/Models/MediaInfo.php
Здесь вместо массивов можно было бы попробовать сделать классы, для разных видов файлов, вроде VideoParams, AudioParams итд.
Размер файла можно определить встроенной функцией PHP, не прибегая к id3.
Сохранение файла с переименованиями стоило бы вынести в сервис. Сейчас у тебя нельзя программно из скрипта, вызовом функции, сохранить файл. Это помешает тебе, например, добавить консольную команду для загрузки файла или метод API.
> $statement = $this->pdo->prepare("SELECT id FROM files WHERE nameId = :nameId");
Используй lastInsertId().
> foreach ($filesId as $id) {
> $filesArray[] = $this->filesTable->getFileThroughId(intval($id));
Запросы в цикле - неэффективно, лучше использовать 1 запрос с WHERE id IN (...).
> private function convertCommentsObjectToArray
Вообще, для преобразования объекта в массив (и обратно) есть библиотеки вроде JSMSerializer. Может, она тебе тут пригодилась бы?
Сохранение ошибок конвертации в лог можно сделать функцией error_log().
> <script type="text/x-template" id="templateReplyComment">
Кстати, для новых браузеров доступен тег <template>. Но script, конечно, лучше поддерживается.
Для ограничения текста в поле есть атрибут maxlength.
> <a href="/"><h1>
Логичнее вкладывать строчный тег в блочный, хотя новый стандарт уже позволяет вкладывать блоки внутрь <a>.
> var date = document.createElement('h5');
> date.innerHTML = commentsList.date;
Тут нужно использовать шаблоны. Как тут править верстку?
Ты пишешь код контроллера и в коллбеках в index.php, и в отдельных классах. На мой взгляд, это не имеет смысла и надо сразу ставить твои контроллеры как обработчики. У контроллеров есть зависимости (которые ты передаешь в конструктор), потому логичнее всего сделать так:
- зарегистрировать контроллеры как сервисы в контейнере Slim
- указать их в качестве обработчиков. Это описано тут: http://www.slimframework.com/docs/v3/objects/router.html#container-resolution
Сейчас модно в качестве имени сервиса использовать имя класса. То есть твой код будет выглядеть как:
$container[MainCtrl::class] = ....;
$app->get('/', MainCtrl::class . ':indexAction');
Либо же ты можешь использовать тот факт, что Слим может сам создать объект, передав контейнер в конструктор, и тебе остается написать лишь:
$app->get('/', MainCtrl::class . ':indexAction');
А если в твоем контроллере всего одно действие, ты можешь использовать "invokable class" отсюда http://www.slimframework.com/docs/v3/objects/router.html#using-an-invokable-class и писать просто:
$app->get('/', MainCtrl::class);
Также, перечитай урок по Dependency Injection, если забыл, что это такое.
> $app->get('/{nameId}'
Это не очень удачный URL, так как он конфликтует с другими URL.
dbConnect.php можно ликвидировать и перенести его в коллбек контейнера.
Конвертировать видео лучше бы в фоне, так как это может занять время. Для того, чтобы это сделать, нужна очередь задач. Ты лишь постишь задачу в очередь, а фоновый процесс подхватывает ее и обрабатывает видео. Попробуй с этим разобраться. Для начала можно взять библиотеку вроде https://github.com/anorgan/QuTee с бекендом на MySQL, а для высоконагруженных систем используют очереди в Redis или RabbitMQ.
В README надо написать про ffmpeg.
Ошибку конвертации можно записывать в информацию о файле, и просто не показывать видеоплеер в случае ошибки.
> preg_replace('/.*[.]/', '', $uploadedFile->getClientFilename(
Это лучше вынести в функцию с понятным названием.
> if (preg_match('/[.]php$/', $link)) {
Еще могут подсунуть какой-нибудь phtml, он в некоторых конфигурациях исполняется тоже. Безопаснее давать какое-то свое расширение.
> (trim($_POST['name']))
Надо использовать объект request.
https://github.com/deadj/uppu/blob/master/src/Models/MediaInfo.php
Здесь вместо массивов можно было бы попробовать сделать классы, для разных видов файлов, вроде VideoParams, AudioParams итд.
Размер файла можно определить встроенной функцией PHP, не прибегая к id3.
Сохранение файла с переименованиями стоило бы вынести в сервис. Сейчас у тебя нельзя программно из скрипта, вызовом функции, сохранить файл. Это помешает тебе, например, добавить консольную команду для загрузки файла или метод API.
> $statement = $this->pdo->prepare("SELECT id FROM files WHERE nameId = :nameId");
Используй lastInsertId().
> foreach ($filesId as $id) {
> $filesArray[] = $this->filesTable->getFileThroughId(intval($id));
Запросы в цикле - неэффективно, лучше использовать 1 запрос с WHERE id IN (...).
> private function convertCommentsObjectToArray
Вообще, для преобразования объекта в массив (и обратно) есть библиотеки вроде JSMSerializer. Может, она тебе тут пригодилась бы?
Сохранение ошибок конвертации в лог можно сделать функцией error_log().
> <script type="text/x-template" id="templateReplyComment">
Кстати, для новых браузеров доступен тег <template>. Но script, конечно, лучше поддерживается.
Для ограничения текста в поле есть атрибут maxlength.
> <a href="/"><h1>
Логичнее вкладывать строчный тег в блочный, хотя новый стандарт уже позволяет вкладывать блоки внутрь <a>.
> var date = document.createElement('h5');
> date.innerHTML = commentsList.date;
Тут нужно использовать шаблоны. Как тут править верстку?
опыт работы: 8 лет
ОПчик ты же опчик?, ты охуенен даже если не опчик, то ты охуенен, на таких людях мир держится. Большое спасибо за развернутый ответ, прочитал я часа 4 назад и с того времени пытаюсь осознать этот алгоритм. Еще вчера с момента когда я задал вопрос я часа три читал за динамическое программирование, рекуррентные функции, множество страниц перерыл насчет конкретно этой задачи и других похожих. Ничего сложнее чем Фибоначчи я тогда так и не понял. Нагуглил в архиве решение, пытался в нем разобраться, не получилось. Заметил что в архиве на любой вопрос об этой задаче нету ответов ни от кого кроме ОПа, понял что 98% треда пропустили её усложненный вариант, сделал так же и перешел к Лиличке, сделал её минут за 10 и пошел спать. После того как увидел твой пост понял, что он окажется зря написанным если забью на эту задачку, начал дальше углубляться во всё это. Поигрался с этим твоим digraph, потом наконец-то перевел код решения из си на пыху, после чего оказалось что если придать переменным осмысленные названия а не $a $b $c $k $m то код легко читается. Забавно, я нашел первый плюс того, что перед переменными в пыхе пишется знак $. Без него нельзя было бы менять названия переменных через автозамену одним кликом. Написал для каждой строчки комментарии, по комментариям заново воссоздал код. Теперь хочу еще раз заново воссоздать код без комментариев с нуля из головы, после чего попробую ввести туда ограниченное количество купюр. Теперь вопрос: конечно код решения методом динамического программирования намного меньше, чем если бы я решал "в лоб - перебором всех возможных комбинаций банкнот". Но неужели это нормально, что например при необходимой для выдачи сумме 350000 рублей, в массив F будет записано 350000 элементов? Еще и не пустых, так как в итоге каждое значение (value) будет отвечать минимальному количеству купюр для ключа, см. пикрил
Анончик, расскажи пожалуйста, что это у тебя за сайт с задачками. Ты выполняешь их все на php, таким образом изучая его? Или именно прокачиваешь знание алгоритмов?
Ты за этот? https://informatics.mccme.ru/mod/book/view.php?id=815
Это ссылка, которую разместил ОП на этой странице http://phpbook.ga/l1/mou-ikkai.html, задачу пикрил видишь сам, она самая первая на этой странице. По ссылке размещено решение усложненного варианта этой задачи, когда номиналы купюр не каноничны и их количество ограничено.
Ключевые слова: банкомат сдача рюкзак
Полезное сообщение от ОПа: >>701952
Сам код: https://ideone.com/FBhunR
А ты не тупо читай, а код пиши.
Да, на первый взгляд задача сложная, но если разбираться постепенно, то мне кажется, можно понять код.
> Заметил что в архиве на любой вопрос об этой задаче нету ответов ни от кого кроме ОПа,
По моему, кто-то все же решил ее методом перебора всех возможных комбинаций купюр.
Мне кажется, тут стоит порисовать графы. Ведь если мы нарисуем граф, где вершины (кружочки) обозначают сумму, а ребра (стрелочки) - добавление купюр, то задача сводится к поиску пути на графе из 0 в N или наоборот, из N в 0. С учетом запаса имеющихся купюр.
Программа, которая дана там, по сути обходит граф, в каждый узел записывая мин.число купюр, которыми можно собрать сумму.
> Но неужели это нормально, что например при необходимой для выдачи сумме 350000 рублей, в массив F будет записано 350000 элементов?
Это зависит от ситуации. Здесь расход памяти - это плата за скорость алгоритма. Ты можешь использовать метод перебора, который потребует в разы меньше памяти, но в разы больше времени в неудачном случае (а в удачном сведется к быстрому жадному алгоритму). Выбирай ~~стул~~ вариант по вкусу. Хороший инженер должен уметь сравнивать варианты решения и понимать их плюсы и минусы.
Если ты будешь искать путь на графе рекурсивной функцией (функцией, которая вызывает сама себя), то ты можешь такое же количество памяти выделить на стеке (стек - это место, где хранится информация о вызовах функций, внутри которых ты находишься).
Ты только слово "флаг" неправильно использовал. Обычно флагом называют переменнную, которая принимает значения true/false (да/нет).
Также, в коде повторяется $bills[$j] много раз, от копипасты лучше избавиться, например написав $bill = $bills[$j]. А еще лучше, вместо for применить foreach:
foreach ($bills as $bill) { .... }
$i можно заменить на $sum.
>По моему, кто-то все же решил ее методом перебора всех возможных комбинаций купюр.
Вот дерьмо, это же тот самый код, в который я долго втыкал, пытался разобраться, дебажил и не мог понять как он связан с этим реккурентным алгоритмом. Только сейчас понял что никак он и не связан. Вот это я тупой конечно, никак не мог понять зачем там нужен генератор и прочие вещи, почему-то я даже не допустил возможности что этот анон решал совсем другим методом.
>Мне кажется, тут стоит порисовать графы.
>Программа, которая дана там, по сути обходит граф, в каждый узел записывая мин.число купюр, которыми можно собрать сумму.
Да, я с ними поигрался. По этим графам работает метод перебора комбинаций, насколько я понял Если это не так, то выходит ты мне предлагаешь третий вариант решения этой задачи?
>Это зависит от ситуации. Здесь расход памяти - это плата за скорость алгоритма. Ты можешь использовать метод перебора, который потребует в разы меньше памяти, но в разы больше времени в неудачном случае (а в удачном сведется к быстрому жадному алгоритму). Выбирай ~~стул~~ вариант по вкусу. Хороший инженер должен уметь сравнивать варианты решения и понимать их плюсы и минусы.
Давно думаю что надо бы подтянуть свое понимание в этих вещах, так как никогда бы не подумал что сначала задать значение для 350001 клеток памяти, после чего проверить для каждой из них по 7 условий окажется менее тяжело ( времязатратность это ведь следствие большой нагрузки? ), чем обычный перебор. Хотя возможно я просто не совсем понимаю что такое этот обычный перебор, но всё равно надо бы в этом подтянуться. Однажды написал калькулятор на мк с памятью 14 кБ, на другом мк с меньшей памятью он уже не работал. Так и не понял что нужно было оптимизировать чтобы уменьшить объем занимаемой памяти. А вообще нужно ли с этими вещами заморачиваться на пхп? Я почему то очень дорожу памятью, лишний раз новую переменную не ввожу. Есть ли в этом вообще смысл?. У банкомата понятное дело что памяти не терабайт, но ведь в случае с пыхой все эти дела будут храниться на сервере.
>>702649
>Ты только слово "флаг" неправильно использовал. Обычно флагом называют переменнную, которая принимает значения true/false (да/нет).
Да, я знаю, просто ведь писал для себя, не думал что выкладывать буду, так исторически сложилось что мне удобно такое название. На счёт остального, это просто транслитерированный на пхп код с сайта, оптимизировать буду потом.
>По моему, кто-то все же решил ее методом перебора всех возможных комбинаций купюр.
Вот дерьмо, это же тот самый код, в который я долго втыкал, пытался разобраться, дебажил и не мог понять как он связан с этим реккурентным алгоритмом. Только сейчас понял что никак он и не связан. Вот это я тупой конечно, никак не мог понять зачем там нужен генератор и прочие вещи, почему-то я даже не допустил возможности что этот анон решал совсем другим методом.
>Мне кажется, тут стоит порисовать графы.
>Программа, которая дана там, по сути обходит граф, в каждый узел записывая мин.число купюр, которыми можно собрать сумму.
Да, я с ними поигрался. По этим графам работает метод перебора комбинаций, насколько я понял Если это не так, то выходит ты мне предлагаешь третий вариант решения этой задачи?
>Это зависит от ситуации. Здесь расход памяти - это плата за скорость алгоритма. Ты можешь использовать метод перебора, который потребует в разы меньше памяти, но в разы больше времени в неудачном случае (а в удачном сведется к быстрому жадному алгоритму). Выбирай ~~стул~~ вариант по вкусу. Хороший инженер должен уметь сравнивать варианты решения и понимать их плюсы и минусы.
Давно думаю что надо бы подтянуть свое понимание в этих вещах, так как никогда бы не подумал что сначала задать значение для 350001 клеток памяти, после чего проверить для каждой из них по 7 условий окажется менее тяжело ( времязатратность это ведь следствие большой нагрузки? ), чем обычный перебор. Хотя возможно я просто не совсем понимаю что такое этот обычный перебор, но всё равно надо бы в этом подтянуться. Однажды написал калькулятор на мк с памятью 14 кБ, на другом мк с меньшей памятью он уже не работал. Так и не понял что нужно было оптимизировать чтобы уменьшить объем занимаемой памяти. А вообще нужно ли с этими вещами заморачиваться на пхп? Я почему то очень дорожу памятью, лишний раз новую переменную не ввожу. Есть ли в этом вообще смысл?. У банкомата понятное дело что памяти не терабайт, но ведь в случае с пыхой все эти дела будут храниться на сервере.
>>702649
>Ты только слово "флаг" неправильно использовал. Обычно флагом называют переменнную, которая принимает значения true/false (да/нет).
Да, я знаю, просто ведь писал для себя, не думал что выкладывать буду, так исторически сложилось что мне удобно такое название. На счёт остального, это просто транслитерированный на пхп код с сайта, оптимизировать буду потом.
Код скинь. Если форма сохранила прошлый твой ввод, значит ты сам подрубил это себе через value
Опять логику и шаблон мешаете в кучу
>граф, где вершины (кружочки) обозначают сумму, а ребра (стрелочки) - добавление купюр
Так вот, после осознания алгоритма переписал код быстренько с нуля чтобы закрепить знания, вот код кстати: https://ideone.com/nOtKLT, уже пол дня пытаюсь прикрутить туда ограниченность количества банкнот, почти безрезультатно. Похоже что это не так и легко. Есть догадка что для этого необходимо ввести еще один массив массивов, подобный массиву $F, где каждый элемент будет включать еще один массив, в котором хранятся комбинации купюр. Это конечно можно хоть сейчас сделать правда расход памяти увеличится в семь раз, но что тогда делать дальше я даже представлять не хочу, мозги закипают. Всё таки мне кажется что не может здесь решение быть таким сложным, я себе хрень какую-то мудрую, наверняка есть более простой способ. Если это так, то посоветуй как это дело реализовать.
Джуны уже пять лет на хуй никому не нужны, если только дико повезет за бесплатно пол года поработаешь на испыталке, и не факт что возьмут за еду даже
фасад:
<?php
namespace app\customFasades;
use Illuminate\Support\Facades\Facade;
class customFasade extends Facade{
protected static function getFacadeAccessor() { return 'facade1'; }
}
файл app.php:
aliases = [
...
'Custom1'=> App\customFasades\customFasade::class,
]
//контроллер где должен использоваться фасад
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
//зависимость
use App\customService\customService;
//фасад - вроде как нужно
use Illuminate\Support\Facades\Custom1;
class mainController extends Controller
{
public function __construct(customService $myService){
$this->myService = $myService;
}
public function main(){
//Custom1::test(); -- не определяется, где я торможу?
}
}
фасад:
<?php
namespace app\customFasades;
use Illuminate\Support\Facades\Facade;
class customFasade extends Facade{
protected static function getFacadeAccessor() { return 'facade1'; }
}
файл app.php:
aliases = [
...
'Custom1'=> App\customFasades\customFasade::class,
]
//контроллер где должен использоваться фасад
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
//зависимость
use App\customService\customService;
//фасад - вроде как нужно
use Illuminate\Support\Facades\Custom1;
class mainController extends Controller
{
public function __construct(customService $myService){
$this->myService = $myService;
}
public function main(){
//Custom1::test(); -- не определяется, где я торможу?
}
}
Срань какая то, вроде по инструкции. Но кастомный фасад недоступен по:
use Illuminate\Support\Facades\Custom1;
1. Появляется новый конструктор сайтов, все начинают кукарекать что программисты больше не нужны.
2. Программистов убирают, приходят бабы Сраки накидывающие блоки.
3. Для того, что бы удовлетворить потребностям клиентов, конструктор начинает обрастать настройками, параметрами, исполняемыми высокоуровневыми скриптами, хуками и тд.
4. Бабы Сраки перестают с ним справляться, их убирают и берут программистов умеющих работать с этим конструктором.
А мб ты просто не осилил ООП, СОЛИД и паттерны?
Наверное чтобы скинуть с себя какую-то ответственность, оповестить неуверенного пользователя ПК что дальше они за его безопасность не отвечают и по ссылке может быть фишинг, гуро с детьми или даже, не дай Б-г, критика действий власти.
Может, но она и дороже в разработке и поддержке
Там может быть уютно, если найдешь лохов, которые будут кучу денег тебе платить за якобы "поддержку" этих поделий. Есть такие люди, хитрожопые и неприятные. Ну и да, кодить для этого практически не надо уметь.
Но само по себе это не тема этой доски и треда.
концепцию то я понимаю, но как это в ларе реализованой - нихуя не ясно. В ларакасте как то хуево для меня объясняется.
класс:
class Bar{}
типа свзяываем в контейнер класс:
App::bind('tormoz', function(){
return new Bar();
});
в маршруте роутера:
//через ревлексию достанет мне Bar
Route::get('/', function(Bar $bar){
dd($bar);
});
//но если так- мой контейнер называется tormoz:
Route::get('/', function(tormoz $bar){
dd($bar);
});
то хуита
Я не пойму когда ларавел через ревлексию дергает класс, а когда дергает контейнер. Контейнер называется tormoz, но как тайпхинт это не проходит.
концепцию то я понимаю, но как это в ларе реализованой - нихуя не ясно. В ларакасте как то хуево для меня объясняется.
класс:
class Bar{}
типа свзяываем в контейнер класс:
App::bind('tormoz', function(){
return new Bar();
});
в маршруте роутера:
//через ревлексию достанет мне Bar
Route::get('/', function(Bar $bar){
dd($bar);
});
//но если так- мой контейнер называется tormoz:
Route::get('/', function(tormoz $bar){
dd($bar);
});
то хуита
Я не пойму когда ларавел через ревлексию дергает класс, а когда дергает контейнер. Контейнер называется tormoz, но как тайпхинт это не проходит.
Странно как то, вроде все норм, а в деталях у меня с контейнером этим какой то треш. В данном случае - если не орпределена в конструкторе инъекция с классом - то у меня фасад App::make() возвращает ошибку.
Я такой боли вообще еще не испытывал, как от ларавел.
https://ideone.com/Hs7hh1
<?php
$connect = mysqli_connect("localhost","root","", "sad");
mysqli_set_charset($connect, "utf8");
$query = "SELECT *
FROM `квитанция `";
$result = mysqli_query($connect, $query);
if($result){
$rows = mysqli_num_rows($result);
echo "<form method=\"post\" action=\"\">";
echo "<table>";
for ($i = 0 ; $i < $rows ; ++$i)
{
$row = mysqli_fetch_row($result);
echo "<tr>";
for ($j = 0 ; $j < 5 ; ++$j)
echo "<td>$row[$j]</td>";
echo "<td><a href='TableDeti.php?id=";
echo $row[2];
echo "'>Информация о детях</a></td>" ;
echo "<td><input type='checkbox' name='box[]' value=$код ></td>'";
echo "</tr>";
}
echo "</table>";
echo "<input type=\"submit\">";
print_r($_POST);
echo "</form>";
}
<?php
$connect = mysqli_connect("localhost","root","", "sad");
mysqli_set_charset($connect, "utf8");
$query = "SELECT *
FROM `квитанция `";
$result = mysqli_query($connect, $query);
if($result){
$rows = mysqli_num_rows($result);
echo "<form method=\"post\" action=\"\">";
echo "<table>";
for ($i = 0 ; $i < $rows ; ++$i)
{
$row = mysqli_fetch_row($result);
echo "<tr>";
for ($j = 0 ; $j < 5 ; ++$j)
echo "<td>$row[$j]</td>";
echo "<td><a href='TableDeti.php?id=";
echo $row[2];
echo "'>Информация о детях</a></td>" ;
echo "<td><input type='checkbox' name='box[]' value=$код ></td>'";
echo "</tr>";
}
echo "</table>";
echo "<input type=\"submit\">";
print_r($_POST);
echo "</form>";
}
Ты просто какую-то хуйню делаешь. Перечитай еще раз доки.
Если тебе нужен сервис Bar, и все его зависимости с тайпхинтом то тебе вообще ничего не нужно делать. Если сервис Bar принимает какой-то конфиг или скалярные значения, то юзай bind и кложу фабрику, которая возвращает объект. Если тебе нужна более тонкая настройка то там вообще есть when(Classname::class)->needs(ServiceInterface::class)->give(Concrete::class) или не ебись и уровнем выше бинди реализацию объекта. Еще ты биндишь не к имени класса, а к какой-то рандомной строке. В контейнере есть алиасы, но это другая вещь. Например, $app->alias(Bar::class, 'tormoz'); $app->make('tormoz'); отработает как нужно.
Дергает через API google translate, потом с помощью движка V8 код компилируется в машинный и исполняется в браузере.
До браузера пхп код не доходит
Нынче за цп квитанции выдают?
Браузер не понимает PHP код. Когда ты открываешь страницу в браузере, браузер шлет запрос к веб-серверу, где работает PHP. PHP выполняет PHP скрипт, и то, что скрипт выводит (HTML-код), отправляется браузеру в ответ на запрос. Браузер отображает полученный HTML.
Это называется "протокол HTTP". Браузеру не важно, какой язык используется на сервере, он шлет запрос, как описано в протоколе, и получает в ответ HTML.
Здесь это подробнее описано: https://github.com/codedokode/pasta/blob/master/network/http.md
Я не точно выразился. То, что выведет скрипт, браузер будет воспринимать как текст с разметкой HTML. Если просто написать echo "hello", то браузер все равно будет воспринимать это как текст с разметкой HTML, и выведет слово hello.
Тип содержимого можно задать явно, отдав браузеру заголовок Content-Type. Например, Content-Type: text/plain; charset=utf-8 говорит, что у тебя просто обычный текст без разметки HTML.
я в мск без опыта начинал в 2017 на 28к в одной обосранной продуктовой компании, мне тогда было 30
сейчас 180к зарплата, уже в другой конторе естественно.
свалить на другую галеру я не могу, щас в своем зажопье из за вируса с работой пиздец. но не со всеми конечно, знаю например что довольно таки успешная контора к се берет людей всех мастей, на там стек это полностью битрикс
>свалить на другую галеру я не могу, щас в своем зажопье из за вируса с работой пиздец
Сам же ответил на свой вопрос
Ищи удаленку на ларе или yii2 если не брезгуешь мертвечиной. Как найдешь - вали
Смотря что за ядра. Могут быть слабые 8 ядер 2010 года и мощнейшие 2 ядра нового поколения.
Зависит от приложения также, от архитектуры и режима работы PHP. В режиме умирающего приложения 2 скорее всего будут быстрее. Это все чепуха, не об этом надо думать. Вот сделаешь 10 высоконагруженных проектов, тогда и будешь про оптимизации думать.
Вот создай приложение, сделай нагрузку на него, и тестируй.
Кроме самого PHP, есть еще запросы в базу данных. Обычно это самое узкое место.
Запили бенчмарки, че спрашиваешь?
На 8 ядрах может параллельно обрабатываться 8 запросов, не мешая друг другу. Но если посещаемость низкая, или вообще на сайт заходишь ты один, то разницы не будет.
>На 8 ядрах может параллельно обрабатываться 8 запросов
Не совсем верно, это вообще тема очень заковыристая. Вот если бы это был Эрланг, можно было бы с уверенностью сказать, что все будет скейлиться на все имеющиеся ядра. С PHP такого сказать нельзя. Он работает в разных режимах. И вообще хер знает как он скейлится. Возможно при большой нагрузке много ядер будут мешать, если код не оптимизован для них, ОС будет постоянно переключаться с ядра на ядро, а это затратно по времени.
PHP не скейлится. Вообще. Один процесс на ядро, точка. Ни PHP-FPM, никакие режимы этого не меняют. Хочешь обслуживать восемь клиентов одновременно - покупай восемь ядер. Хочешь обслуживать клиентов быстрее - покупай большую герцовку.
Так речь про ядра вообще то
>Хочешь обслуживать восемь клиентов одновременно - покупай восемь ядер.
А это разве не касается вообще всех языков по понятным причинам?
Эр Эн Эр
VK API
Меня триггерит от пи эйч пи, что-то на уровне пайтон и ява/яваскрипто
>Поставь себе норм ide, git
Мерзавец такой мерзавец: https://translate.google.com/#view=home&op=translate&sl=en&tl=ru&text=git
Мне кажется, что ты ошибаешься.
> Он работает в разных режимах. И вообще хер знает как он скейлится.
В каких еще режимах?
> Вот если бы это был Эрланг, можно было бы с уверенностью сказать, что все будет скейлиться на все имеющиеся ядра
Чем для ОС отличаются процессы или треды Эрланга от процессов PHP? Планировщик ОС в обоих случаях один и тот же.
> Возможно при большой нагрузке много ядер будут мешать, если код не оптимизован для них, ОС будет постоянно переключаться с ядра на ядро, а это затратно по времени.
Чем больше ядер, тем больше процессов будет работать параллельно. Даже с учетом затрат на переключение.
>>707303
PHP благодаря stateless модели как раз прекрасно масштабируется - можно добавлять ядра, можно добавлять сервера. На практике все это прекрасно работает. Такое ощущение, что тебе просто чем-то не нравится PHP и ты судорожны пытаешься найти недостатки. Давай я тебе помогу, есть целая статья про недостатки языков: https://habr.com/ru/post/315152/
>В каких еще режимах?
CGI, FastCGI, PHP-FPM, + ассинхронные сервера есть.
>Чем для ОС отличаются процессы или треды Эрланга от процессов PHP?
Всем. В Эрланге потоки существуют внутри виртуальной машины.
>Планировщик ОС в обоих случаях один и тот же.
В Эрланге потоки реализованы внутри виртуальной машины, как все это ложится на ядра не знаю.
>Чем больше ядер, тем больше процессов будет работать параллельно. Даже с учетом затрат на переключение.
Только небольшое количество процессов будет нормально существовать. Потому что когда их станет существенно больше чем ядер, переключение начнет отнимать больше времени чем вычисление. В Эрланге можно держать миллионы процессов/потоков (не помню там процессы или потоки, в общем не так важно) на одной машине.
CGI никто не использует уже давно. PHP-FPM использует FastCGI. Ты толком ничего про PHP не знаешь, но пришел сюда зачем-то рекламировать Эрланг. Хотя я не слышал, чтобы кто-то писал сайты на Эрланге. Все-таки PHP больше для этого подходит, как не крути.
> В Эрланге можно держать миллионы процессов/потоков (не помню там процессы или потоки, в общем не так важно) на одной машине.
Только при условии, что эти потоки ничего не делают и не тратят процессорное время. Что на практике не бывает.
Аноны, есть у кого-нибудь решение задачки из шапки с таблицей работников ООО Вектор? Чет я нихуя не понимаю, как там правильно все сделать. Типа, нужен новый класс, который будет выводить таблицу?
>CGI никто не использует уже давно.
Первый признак дауна, говорит за всех. Откуда тебе знать кто что использует, дебил. Большая часть сайтов это легаси.
>PHP-FPM использует FastCGI.
Да, но это не одно и то же.
>Хотя я не слышал, чтобы кто-то писал сайты на Эрланге.
Снова даун проецирует свое скудное мышление на других. На Эрланге пишут, и даже в СНГ.
>Только при условии, что эти потоки ничего не делают и не тратят процессорное время. Что на практике не бывает.
Не умничай, ты нихуя не знаешь, а пиздишь. Держит миллион вебсокет соединений спокойно, каждое соединение обрабатывает отдельный поток. И это не предел.
>как пхп использует ядра,сразу все,или как нода только одно?
Кто сказал, что нода использует одно ядро?
>PHP благодаря stateless модели
Ты бы хоть почитал, что такое приложение без состояния. Это блядь вообще не характеристика языка. Твой код может вполне быть statefull, просто php будет твое состояние каждый раз заново собирать и каждый раз выкидывать. Пиздец, так этот недостаток пхп еще никто на моей памяти с ног на голову не переворачивал.
>как раз прекрасно масштабируется
Еще раз. Ты написал консольное приложение на симфони, запустил его. И в процессе выполнения оно не масштабируется. Никак. Если тебе нужно быстрее, то придется запустить симфони N раз, а еще придумать как распределить нагрузку и как согласовать результаты выполнения вне кода. Понимаешь? ВНЕ твоего кода блядь, потому что в пхп таких инструментов нет. В эрланге есть, в ноде есть, в джаве есть, в го есть, в си шарпе есть, а в пхп нет.
И начинаются танцы с базой, блокировки, очереди, процедуры. И на всех собесах по пхп на сеньора только вопросики: А вы CTE используете? А процедуры писали? А мап редьюс на SQL сбацаете? А с го знакомы? Спросишь их: а пхп? А что пхп? Пхп рожден чтобы html отдавать и умирать, а настоящую работу нужно же где-то делать.
С чего вдруг?
Сделал задачку из гайда, хочу чтоб обоссали
ссылку на гитхаб репу
Задание из главы про ООП. Хотелось бы сразу понять, что я делаю не так, дабы в будущем не делать хуйни. Погромирование начал изучать сегодня.
<?php
abstract class AbstractQuestion {
public $text;
public $answerUser;
abstract function CheckAnswer($answer);
}
class ChoiceQuestion extends AbstractQuestion {
public $options;
public $checkOptions;
public function CheckAnswer($answer)
{
// TODO: Implement CheckAnswer() method.
if ($answer == $this->checkOptions) {
echo "Right!\n";
} else {
echo "Miss\n";
}
}
}
class NumericQuestion extends AbstractQuestion {
public $answer;
public $deviation;
public function CheckAnswer($answer)
{
// TODO: Implement CheckAnswer() method.
if ($answer == $this->answer || $answer + $this->deviation == $this->answer
|| $answer + $this->deviation == $this->answer) {
echo "True";
} else {
echo "False";
}
}
}
$a = new ChoiceQuestion();
$a->text = "
what's 2+2?";
$a->options = "
a) 4
b) 2
c) 3\n";
$a->checkOptions = "a";
$b = new NumericQuestion();
$b->text = "what's 2+2?\n";
$b->answer = 4;
$b->deviation = 0.01;
$questions = [$a, $b];
echo "{$a->text}";
echo "{$a->options}";
$a->answerUser = readline('Ur answer: ');
$a->CheckAnswer($a->answerUser);
echo "{$b->text}";
$b->answerUser = readline('Ur answer');
$b->CheckAnswer($b->answerUser);
Задание из главы про ООП. Хотелось бы сразу понять, что я делаю не так, дабы в будущем не делать хуйни. Погромирование начал изучать сегодня.
<?php
abstract class AbstractQuestion {
public $text;
public $answerUser;
abstract function CheckAnswer($answer);
}
class ChoiceQuestion extends AbstractQuestion {
public $options;
public $checkOptions;
public function CheckAnswer($answer)
{
// TODO: Implement CheckAnswer() method.
if ($answer == $this->checkOptions) {
echo "Right!\n";
} else {
echo "Miss\n";
}
}
}
class NumericQuestion extends AbstractQuestion {
public $answer;
public $deviation;
public function CheckAnswer($answer)
{
// TODO: Implement CheckAnswer() method.
if ($answer == $this->answer || $answer + $this->deviation == $this->answer
|| $answer + $this->deviation == $this->answer) {
echo "True";
} else {
echo "False";
}
}
}
$a = new ChoiceQuestion();
$a->text = "
what's 2+2?";
$a->options = "
a) 4
b) 2
c) 3\n";
$a->checkOptions = "a";
$b = new NumericQuestion();
$b->text = "what's 2+2?\n";
$b->answer = 4;
$b->deviation = 0.01;
$questions = [$a, $b];
echo "{$a->text}";
echo "{$a->options}";
$a->answerUser = readline('Ur answer: ');
$a->CheckAnswer($a->answerUser);
echo "{$b->text}";
$b->answerUser = readline('Ur answer');
$b->CheckAnswer($b->answerUser);
Делать больше чем делал вчера. Делать лучше чем делал вчера. Каждый новый день быть лучше во всех чем вчера, хотя бы на чуть чуть.
Двачую. Синтаксис php сложнее чем синтаксис русского языка.
Чую ты пиздишь, невозможно за день без опыта в программировании до ООП в ОП-гайде дойти. Или ты все задачки что тебе не нравятся пропускал? Давай свой банкомат в хардмоде или хотя бы навигатор продемонстрируй.
>Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо.
Это как? Ну ладно, зарплата понимаю что вычисляется из ставки и множителя. Но ведь потребление кофе никак не вычисляется особо, зависит лишь от профессии ( а значит и класса ) сотрудника. Ну ладно, еще зарплата и потребление кофе зависит от того, является ли сотрудник боссом. Но количество отчетов в месяц тоже от этого зависит, так почему бы и их не записать в этот список? Хотя я все еще не понимаю почему бы все это не записать в свойства, после чего множить по всяким факторам.
Идея в том, чтобы хранить в свойствах минимальный набор данных, а то, что можно вычислить - не хранить, а вычислять в методе при необходимости.
Если ты будешь сохранять результаты вычислений, то тебе надо будет обновлять их, когда исходные данные меняются, а это усложняет код.
Соответственно, можно хранить базовые вещи, вроде базовой ставки или базового потребления кофе, а итоговые числа (зависящие от зарплаты, статуса босса итд) вычислять.
Так как они зависят от профессии, то теоретически можно и их не хранить, можешь попробовать это реализовать.
> $answer == $this->answer || $answer + $this->deviation == $this->answer
|| $answer + $this->deviation == $this->answer
Тут ошибка. Тут нужно проверять не строгое равенство, а что абсолютная разница между ответом и правильным ответом меньше или равна отклонению.
Функция checkAnswer спроектирована неудачно. Она выводит результат, а не возвращает через return. Из-за этого мы не можем в программе никак использовать этот результат, например, для подсчета баллов. Будет лучше, если функция будет возвращать результат, а не выводить на экран. Ведь ее задача - только проверить ответ, а вывод - это уже задача другого кода.
Варианты ответа лучше хранить не большим куском текста, а массивом.
Не очень логично, что у тебя в классе "вопрос" есть свойство "ответ пользователя". Ведь ответ и вопрос - это разные сущности. Например, если 2 пользователя проходят тест, то они могут дать 2 разных ответа на один вопрос, и твой код это не поддерживает. Лучше не хранить ответ внутри объекта-вопроса, а хранить отдельно.
Код лучше не копипастить, а запостить на сайт вроде ideone, а сюда скинуть ссылку.
Запости код на сайт вроде ideone, а сюда скинь ссылку.
>>708385
Ты пишешь полную ерунду. Модель PHP как раз очень удачная, так как позволяет избежать проблем вроде утечек памяти, которые часто бывают на той же ноде. Очищать состояние интерпретатора после обработки запроса довольно удачная идея. И веб-скрипты прекрасно масштабируются, чему доказательство сайты вроде Вконтакте или Баду.
И вообще, ты какой-то недадекватный, если тебе не нравится PHP, просто не используй его, решай свои задачи на эрланге с мап-редьюсом, если конечно, они у тебя есть.
>>708310
Вывод таблицы можно сделать и без классов, на функциях. А можно и классом, конечно. Также, нужны классы для представления работников, департаментов, компании.
Поискать решения можно в архиве на phpclub.tech.
>>708287
Реальный код будет куда сложнее этой задачи. Лучше остановиться и не спеша разобраться, разложить задачу на более простые части или попросить подсказки.
Например, попробуй сделать функцию, которая умеет склонять суммы от 0 до 9 рублей, а потом расширь ее до 99 и 999 рублей.
Боюсь, что использовать тот алгоритм не получится при ограничениях. Там создается массив F[n], где n - сумма, а F[n] - количество купюр.
У нас же возможность выдачи зависит от суммы n и остатка купюр amount: y = F(n, amount). Построить простой массив, перебирая n тут не выйдет.
У нас есть 2 подхода:
1) полный перебор комбинаций всех купюр
2) обход графа из 0 к N или из N к 0 с помощью рекурсивной функции
Второй вариант может выглядеть так. Пишем функцию
$y = canPay($sum, $amount)
Где $sum = сколько надо выдать, $amount - количество оставшихся купюр, $y = можно ли выдать сумму или нет.
Функция может работать так. Если сумма строго равна номиналу купюры, и такая купюра есть в наличии, то ответ - да. В противном случае мы берем каждую купюру по очереди, уменьшаем сумму и остаток купюр и вызываем себя рекурсивно, чтобы узнать, можно ли выдать меньшую сумму.
То есть, если у нас есть купюры 1x100, 3x60 и сумма = 60, то функция сразу вернет "да". Если же сумма = 160, то функция должна проверить 2 варианта:
- используем банкноту на 100, и вызываем себя с параметрами 60, (3x60)
- используем банкноту на 60, и вызываем себя с параметрами 100, (1x100, 2x60)
То есть мы обходим граф, пробуя все возможные варианты выдачи.
>так как позволяет избежать проблем вроде утечек памяти
Толсто. Пхп это синоним утечки памяти. До седьмой версии демоны вообще не было смысла писать, а после седьмой писать можно, но утечки все равно периодически ебут.
>Очищать состояние интерпретатора после обработки запроса довольно удачная идея
Нихуя себе! Очень полезная фишка, расскажешь чем? А то мы с пацанами хуй поймем зачем все данные на каждый запрос из базы грузить.
>И веб-скрипты прекрасно масштабируются, чему доказательство сайты вроде Вконтакте или Баду
Facebook забыл. Помимо этого есть много крупных компаний, в которых используют пхп, я сам работал в нескольких компаниях с миллиардными оборотами и тысячами сотрудников. Все они использовали пхп потому что очень легко начать. Дешево и быстро, программистов опять же много очень. И заканчивали все одинаково - пхп слишком медленный, устаревший, а программисты на нем 90% долбоебы, которые код писать учились на двачах.
Badoo прямо показательный пример. У людей 300 серверов, которые работают на пределе, и как они только не извращаются и fpm сделали, и фреймворк прелоадят, и го пытаются юзать. HHVM, KPHP, FPM все, чтобы хоть как-то ускорить это говно. Только вот огромная кодовая база на пхп уже живет своей жизнью, и плодит новые вакансии.
>И вообще, ты какой-то недадекватный, если тебе не нравится PHP, просто не используй его
Так это не для тебя написано. Ты то совсем конченый, со stateless php и без утечек памяти. Это написано для тех кто пытается вкатиться в эту помойку. Не лезь блядь, она тебя сожрет.
Ты мыслишь очень ограниченно. Чтобы не "грузить данные из БД", есть множество кешей от APC до redis, но это создает проблему устаревания данных, (о которой ты кстати не упомянул). То есть PHP позволяет держать данные в памяти, при этом избегая проблем вроде утечек памяти, свойственных для кода на Node.JS, Ruby, Python. Модель работы PHP очень хорошо подходит для веба.
И, как мы видим по Баду, прекрасно масштабируется. С их числом пользователей 300 серверов это не много. И я уверен, что радикально ты число серверов сменой языка бы не сократил. И не забывай про скорость разработки, новые фичи надо добавлять быстро, а не по полгода пилить.
Также, важна скорость разработки, для PHP есть фреймворки, инструменты (IDE с автодополнением и рефакторингом, визуальной отладкой), куча библиотек. И действительно, много разработчиков, что облегчает выбор. Разработчики, кстати, разного уровня.
В Эрланге я не разбираюсь, но отмечу недостатки Node.JS, Python и Руби в сравнении с PHP:
- нет тайп-хинтов, труднее анализировать код статически, труднее автодополнять код в IDE
- трудно обнаружимые утечки памяти. Есть ли визуальный профайлер памяти для твоего языка?
- у Python и Ruby ниже производительность
А твои миллион коннектов не очень-то и нужны. Когда производительности PHP не хватает, просто пишут микросервис на Го или Си++, в который ходят скрипты из PHP.
>но это создает проблему устаревания данных
А как кстати разбивать кеш когда очень много серверов с пхп? Понимаю что может быть много разных способов и всё зависит от архитектуры но если можно так сказать некое дефолтное решение c:
Можно использовать распределенный кеш вроде redis, который хорошо масштабируется (разные ключи разносятся на разные сервера).
Если мы через пхп инвалидируем то у редиса по идее есть какая-то единая точка входа, некий сервис который знает где какие ключа валяются?
Большое спасибо за ответ. Сначала не понял, потом поразмыслил над ним, всё осознал. Посмотрел на следующую задачу и понял что если бы я все поля вычислял в методе-конструкторе и классах профессий, то функции для изменения значений были бы намного длиннее и сложнее, а в предложенном тобой варианте необходимо будет просто сделать альтернативные функции вывода.
Спасибо что расписал, ОПчик, отличный вариант, очень похоже на алгоритм поиска пути это он и есть. Я даже задумывался об этом когда делал навигатор, но что-то не зацепился за эту идею, т.к. ты написал в гайде что есть лишь два варианта решения.
>Чтобы не "грузить данные из БД", есть множество кешей от APC
Пиздец. Нахуя ты приплел APC, когда opcache уже сто лет как включен в пхп и работает по умолчанию? Но самое главное это кеш кода блядь, не данных, а кода, и нужен он чтобы не парсить исходники по сто раз.
>до redis
А редис это что по твоему блядь, не база?
>То есть PHP позволяет держать данные в памяти, при этом избегая проблем вроде утечек памяти
Ты бредишь? Ты в предыдущей строчке написал про редис и кеш, каким хуем пхп стал данные в памяти держать? И как из этого следует отсутствие утечек памяти?
>И, как мы видим по Баду, прекрасно масштабируется
Любой код на любом языке можно бесконечное количество раз запускать на бесконечном количестве серверов. Каким хуем это стало преимуществом пхп? И откуда ты взял что в badoo все прекрасно? Я вижу судорожные попытки хоть как-то соптимизировать этого монстра, fpm, RoadRunner, Preload из 7.4 все это прямо противоречит твоей охуенной модели.
>И я уверен, что радикально ты число серверов сменой языка бы не сократил
Возможно дело в том что ты просто некомпетентный еблан. Вот тебе видео про badoo "Как 200 строк на Go помогли нам освободить 15 серверов" https://www.youtube.com/watch?v=uO268voCGwA
>В Эрланге я не разбираюсь, но отмечу недостатки Node.JS, Python и Руби в сравнении с PHP:
>нет тайп-хинтов, труднее анализировать код статически
Просто не позорься. Зайди в руби тред, там тебе мигом хуев в глотку наебенят за "отсуствие аннотаций".
>трудно обнаружимые утечки памяти
И тут я проиграл. Ты понимаешь, что когда речь идет об "утечках памяти" имеется ввиду не твой код? Утечки в твоем коде это проблема долбеба в кресле программиста. Когда я говорил об утечках я имел ввиду сам язык. Когда сама виртуальная машина пхп течет, даже если ты нихуя и не делал. Да хули говорить, одной из задач PHP-FPM является отслеживание утечек памяти.
>А твои миллион коннектов не очень-то и нужны
Ты совсем ебанулся, таблетки прими. Я вообще ничего не писал про миллион коннектов.
>Чтобы не "грузить данные из БД", есть множество кешей от APC
Пиздец. Нахуя ты приплел APC, когда opcache уже сто лет как включен в пхп и работает по умолчанию? Но самое главное это кеш кода блядь, не данных, а кода, и нужен он чтобы не парсить исходники по сто раз.
>до redis
А редис это что по твоему блядь, не база?
>То есть PHP позволяет держать данные в памяти, при этом избегая проблем вроде утечек памяти
Ты бредишь? Ты в предыдущей строчке написал про редис и кеш, каким хуем пхп стал данные в памяти держать? И как из этого следует отсутствие утечек памяти?
>И, как мы видим по Баду, прекрасно масштабируется
Любой код на любом языке можно бесконечное количество раз запускать на бесконечном количестве серверов. Каким хуем это стало преимуществом пхп? И откуда ты взял что в badoo все прекрасно? Я вижу судорожные попытки хоть как-то соптимизировать этого монстра, fpm, RoadRunner, Preload из 7.4 все это прямо противоречит твоей охуенной модели.
>И я уверен, что радикально ты число серверов сменой языка бы не сократил
Возможно дело в том что ты просто некомпетентный еблан. Вот тебе видео про badoo "Как 200 строк на Go помогли нам освободить 15 серверов" https://www.youtube.com/watch?v=uO268voCGwA
>В Эрланге я не разбираюсь, но отмечу недостатки Node.JS, Python и Руби в сравнении с PHP:
>нет тайп-хинтов, труднее анализировать код статически
Просто не позорься. Зайди в руби тред, там тебе мигом хуев в глотку наебенят за "отсуствие аннотаций".
>трудно обнаружимые утечки памяти
И тут я проиграл. Ты понимаешь, что когда речь идет об "утечках памяти" имеется ввиду не твой код? Утечки в твоем коде это проблема долбеба в кресле программиста. Когда я говорил об утечках я имел ввиду сам язык. Когда сама виртуальная машина пхп течет, даже если ты нихуя и не делал. Да хули говорить, одной из задач PHP-FPM является отслеживание утечек памяти.
>А твои миллион коннектов не очень-то и нужны
Ты совсем ебанулся, таблетки прими. Я вообще ничего не писал про миллион коннектов.
Пиши на чем умеешь, пхп тоже сойдет. Если не взлетит, то все равно похуй, а если взлетит наймешь макак задешево.
Но если собрался зарабатывать на жизнь программированием держись от пхп подальше.
стоит ли после базы городить свой велосипед на голом пхп(допустим простой бложик),или поставить ларавел?
Бля, ну как тут ответить. Нужно и велосипеды городить и с устройством фреймворков ознакомиться.
Я бы выделил три этапа становления пхп программиста:
1) Пишешь как пишется, велосипедишь, набиваешь шишки. Такой код обычно выкидывается, за него потом стыдно.
2) Программируешь на фреймворке. Фреймворк может быть любой, ты просто пишешь код по его доке. В треде мог заметить фразы типа "пишу на ларавель", "симфони для энтерпрайза" вот это оно. Такой код обычно устаревает вместе с фреймворком, как говорится легаси по прибытии.
3) Понимаешь что ты используешь не фремворк, а инструменты, которые он предоставляет. И начинаешь выбирать себе инструменты сам. Не нравится роутинг в симфони? Пожалуйста, используешь более быструю библиотеку. Не нравится актив рекорд? Не вопрос, ставишь доктрину или автомаппер.
Звучит легко, но третий этап самый сложный. Для того чтобы делать осознанный выбор инструментов нужно знать как они работают. А для того чтобы понять что фреймворк это обуза нужно похоронить пару проектов. Ну и всегда есть вариант оказаться в первом пункте. Так что с первого и рекомендую начать.
>Такой код обычно устаревает вместе с фреймворком
Если прямо по доке херачить без задней мысли, то устаревает в момент написания. Почти все фреймы задрочены под здесь и сейчас, а завтра пусть потоп нахуй. Так и делают в 9 из 10 случаев, за возможность так сделать фреймы и берут.
>фреймворк это обуза
Это правда. Хотя большинство на подобное у виска покрутит. Разработчик на фреймворке - рак современно пхп (и не только). И это притом, что еще от старого рака в виде вебмастеров не избавились. В конфе каждого фрейма и дня не проходит, чтобы очередной сениор-фреймворк-девелопер 300к не бзднул незнанием даже банальных вещей в синтаксисе/окружении/вебе/базе, слезно прося ему помочь и прикладывая скрины где все красным по белому, а сверхразуму все равно нихуя не понятно. Потому что пропускают все этапы и сразу к методичке "высрать блог за два копипаста" обращаются. Дешево, сердито, скорбно за профессию. Иногда даже скромные потуги местных в решение оповских задачек кажутся более интеллектуальными, чем эта идиократия на фреймах.
Так что по виду чаще этапы следуют как 2, 3, 1 (по желанию).
>>709751
Попробуй нагородить небольшой, но качественный(самое важное, если будет не качественно - зря время потратил, вероятно даже с вредом для себя) велик похожий на ларавел и работающий на демке как ларавел (или другой фрейм, похуй). Для меня загадка почему эту простую задачу ныне даже мидлы часто не могут осилить, которые не мало знаний имеют. А можно сделать с виду даже приятнее ларки.
Если сможешь, то вопрос завязки на фрейм для тебя отпадет навсегда. Не выйдет - фрейм в процессе тоже поковырял получается, профит.
> качественный
откуда я узнаю,если в процессе изучения с большой вероятностью я буду смотреть и копипастить чужой код и часто с разным подходом?
Ну конечно никак. Более того статьи и книги, которые ты будешь читать уже устарели. А еще хуже что сам язык отстает на десять лет от мейнстрима. И сообщество соответственно тоже.
Ну во первых код действительно будет отличаться, держать в голове кучу вариантов написания это полная хуйня.
А во вторых разница с кодом времен пятой версии будет в самом подходе к написанию. Я даже в 2014 году слышал: да кто ето такой ваш солид? Про него ниче в доке не написано.
Интересно, почему когда кто-то хает PHP, то обычно выясняется что это node.js/python петух?
Вообще, редис очень быстрый и одного сервера с редисом вполне может хватить для нескольких PHP-серверов. Если этого мало, то придется делать шардинг (partitioning) - разделение данных в кеше на несколько серверов. Самый простой способ это сделать - на клиенте брать хеш от ключа, затем делить хеш на число серверов и по остатку от деления понять, куда нам коннектиться:
server_number= hash(key) % server_count
Но этот способ обладает недостатком. Если мы убавим или добавим один сервер, то большая часть ключей "переедет" на другой сервер, так как цифра server_count изменится. Чтобы этого избежать, используют:
либо а) консистентное хеширование, которое меньше этому подвержено
либо б) делают большое число шардов (намного больше, чем серверов) и хранят на каждом сервере, допустим, 100 шардов. Соответствие шардов серверам хранят в конфиге. При изменении числа серверов часть шардов "переезжает" на новый за счет изменения конфига.
Еще есть такая штука, как мастер-слейв репликация. Мы пишем в мастер, а читаем со слейвов. Слейвы подхватывают изменения с мастера. Это еще используют для отказоуcтойчивости как hot backup.
Также, можно почитать документацию по теме: https://redis.io/topics/partitioning
Если бы ты поменьше ругался и побольше читал документацию, ты бы таких ошибок не делал. Redis - это in-memory key-value хранилище, он держит данные в RAM, хотя у него есть возможность сохранять их на диск через снапшоты и WAL. Он хорошо работает как кеш для снятия нагрузки с реляционной БД.
Заметь, что у редиса есть плюс в сравнении с твоей идеей держать данные в RAM процесса на Эрланге или ноде:
- он позволяет иметь один общий кеш, в отличие от in-process кеша, одновременно его перестраивать или очищать. А как ты будешь очищать in-process кеш кучи процессов на ноде, это отдельный вопрос
- он не замедляет сборщик мусора (скорость которого зависит от размера RAM), в отличие от in-process кеша
А вот APC позволяет кешировать не только код, но и данные в shared memory.
> И откуда ты взял что в badoo все прекрасно?
Оттуда, что они не терпят убытки и не закрываются, что вполне было бы возможно при использовании менее быстрых и удобных для разработки языков.
> Зайди в руби тред,
Зачем мне идти в какой-то там тред, я же не как ты, который пришел в PHP тред, где люди учатся, просто пофлудить. У меня нет такой потребности. И если понадобится, я могу прочесть документацию, хотя сейчас мне это не нужно.
> сама виртуальная машина пхп течет
Ссылки на issue?
Ох, бля ну и пиздец твой код.
Режешь предложение по пробелам и кладешь в массив. Удаляешь точку, затем array_rand, ну капс там заменить и точку доставить. Всё, анончик.
>кому-то нечем заняться
Кто-то уже выполнил свою задачу на node.js/python и надсмехается над пыхтящим выбравшим PHP недопрограммистом?
Куки - просто строки ключ-значение. Вот смотри:
https://www.php.net/manual/ru/function.setcookie.php
Ты просто при помощи этой функции вначале передаешь скрипту куки (копируй их из отладчика браузера), а затем выполняешь скрипт.
setcookie() задает cookie, которое будет передано клиенту вместе с другими HTTP-заголовками. Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта (это ограничение протокола). Это значит, что в скрипте вызовы этой функции должны располагаться до остального вывода, включая вывод тегов <html> и <head>, а также пустые строки и пробельные символы.
>>710478
тут хуйня, долго искать, не то я скинул
>копипастить чужой код
Ну как бы на этом уже и фейл, толку будет 0, копипастер ты наш.
>откуда я узнаю
Для начала можешь начать с правила - все по псрам.
В процессе читаешь/смотришь всякую хероту по ооп и архитектуре. Ее очень много, то, что тут у опа даже не верхушка айзберга. И стараешься применить.
Результат закидываешь сюда (или в пыхоконфу для джунов в телеге) и узнаешь, вышло у тебя или нет. По желанию правишь, пока пиздато не выйдет.
>в пыхоконфу для джунов в телеге
Это та мертвая конфа на 15 тел?
Или какая-то другая? Кинешь ссыль?
Я про эту, а не местную.
Слышал она именно для таких вещей существует, из остальных каналов с глупыми джуновскими вопросами по пхп гонят.
@phpGeeksJunior - новичкам
А, я там тоже есть
Допустим, у меня есть php-страничка. И на ней плеер с mp4-файлом, вот только не_на_моей_сервере, а на удаленном.
Как мне при помощи php или php+js зашифровать его url, чтобы хитрый юзер или парсер, не выкупил, что я пирачу по лайту?
>Если бы ты поменьше ругался и побольше читал документацию
Если бы ты читал что я пишу, то понимал бы что у меня хватает компетенций отличиить redis от mysql. Расположение данных и способ их хранения не отменяет того факта что это все еще внешнее по отношению к пхп хранилище. И время на получение из него данных на каждый запрос все еще тратится. Ну и чтобы закрыть тему с определениями вот тебе цитата с офф сайта редиса Redis is an open source (BSD licensed), in-memory data structure store, used as a database
>в сравнении с твоей идеей держать данные в RAM процесса на Эрланге или ноде:
Во первых это не моя идея. Все нормальные языки работают в режиме серверного приложения. Во вторых прими таблетки, это не я сравнивал пхп с эрлангом.
>А вот APC позволяет кешировать не только код, но и данные в shared memory.
А пхп позволяет использовать goto, но это не значит что так нужно делать. APC это устаревшая забагованая параша https://bugs.php.net/bug.php?id=57825 нахуй ты вообще её приплел.
>Ссылки на issue?
Две секунды в гугле https://bugs.php.net/bug.php?id=76982 критический баг с утечкой памяти внутри самого пхп. Подтвержден и висит джва года.
Проксируй через свой сервер. Делай запрос к своему серверу, который будет делать запрос на удаленный.
>скомпилировать
Ну ты явно какой-то хуйней занимаешься. Сделай скрины или расскажи как ты код свой разбивал.
Ну вот например, куда тут вставлять эти куки? Я так понимаю вот эта ответственна за 18+? И хватит ли только key - value или всю инфу запихивать?
Ты заходишь не с того края. Учиться надо не как делать "регистрацию", а базовым вещам. Как работать с формами, с базой данных, с куками. Сначала можно без фреймворка, а потом узнать, как то же самое делается на фреймворке (чтобы ускорить разработку).
Твоя "регистрация" - это всего лишь форма с проверкой данных и сохранением в БД. Логин - это проверка логина-пароля и выдача авторизационной куки.
Про куки и про фреймворки урока нет, но по остальным темам кое-что есть тут: https://github.com/codedokode/pasta/
Там комментарии есть. А вообще, что-то почитал в интернетах на эту тему, похоже мне еще рано делить код для обосраной задачки по основам основ ООП. Но с другой стороны интересно, почему это у анона вышло, а у меня нет.
Ты придираешься к мелочам, называть редис БД или нет. Главное то, что и Redis и APC решают проблему "как хранить данные в памяти при умирающем PHP". Производительность у редиса огромная, несмотря на его однопоточность. А также важен момент, что во многих случаях хранить данные в разделяемом редисе удобнее, чем в памяти одного Node.JS воркера.
Насколько я знаю, приложения на Руби, Питоне или JS точно так же используют редис. Twitter, например, использовал memcache и redis ( https://www.insight-it.ru/highload/2011/arkhitektura-twitter-dva-goda-spustya/ ). Что интересно, они еще использовали Руби (который медленнее PHP).
Ты пытался выдать это (хранение данных в памяти воркера) как преимущество других языков, но оно преимуществом не является. Хотя у этих языков и есть другие плюсы, но ты их назвать не можешь, потому что ты просто обычный флудер.
Ну и наконец один из самых нагруженных российских сайтов - VK - использует PHP на фронтенде и не пытается что-то поменять. Так что PHP вполне пригоден для разработки веб-приложений.
Гугли php autoload, psr-4, composer (в последнем смотришь автолоадер по psr-4, если хочешь).
В один файл тоже может сработать при, но я что-то не вижу, что бы ты код показал, а мы тут не телепаты.
Тебе лучше всего сделать так:
- класть каждый класс в отдельный файл, названный как этот класс
- сделать файл-загрузчик index.php, который будет подключать эти файлы через require, создавать нужные объекты и вызывать функции вывода на экран
- запускать index.php
По поводу именования файлов - можешь попробовать почитать про PSR-4, если это не слишком сложно (неймспейсы пока можешь не использовать, для проекта из 4 классов они не требуются): https://github.com/codedokode/pasta/blob/master/php/autoload.md
>Ты придираешься к мелочам, называть редис БД или нет.
Но это я назвал редис бд, а ты доебался, еще и с какого-то хуя решил что я им не пользовался и не знаю доку. А когда я тебе тыкнул в нос цитатой с офф сайта ты пернул жидким и обмяк.
>Главное то, что и Redis и APC решают проблему "как хранить данные в памяти при умирающем PHP"
Об этом я и говорю уже третий раз подряд. Умирающий пхп это проблема. А ты начал высирать про то какая это охуенная фича.
>Производительность у редиса огромная, несмотря на его однопоточность
И что это поменяло? А memcached быстрее редиса и хули? А знаешь что быстрее memcached? Прямой доступ к памяти.
>Насколько я знаю, приложения на Руби, Питоне или JS точно так же используют редис
Да ну нахуй! Так они и реляционные базы еще наверное используют?
>Ты пытался выдать это (хранение данных в памяти воркера) как преимущество других языков, но оно преимуществом не является.
Ваше преимущество не преимущество, пруфов не будет. А грузить на каждый запрос данные это быстрее чем грузить их один раз. Ясно понятно.
>Хотя у этих языков и есть другие плюсы, но ты их назвать не можешь, потому что ты просто обычный флудер.
Я дал тебе ссылку на видео от самих badoo как пара функций на го сэкономила пятнадцать серверов, ты его конечно не смотрел.
Каждый свой довод я подтверждаю пруфами. Ты просил пруфы утечек - ты их получил, но ловко проигнорил и назвал меня флудером. Я сказал что APC параша, я дал ссылку на багтрекер, где написано почему.
>Ну и наконец один из самых нагруженных российских сайтов - VK - использует PHP
Ну это вообще пушка. Во первых они используют KPHP, он компилируемый и СТРОГО ТИПИЗИРОВАННЫЙ блядь. Там от оригинального пхп только синтаксис. Пиздец, ты этим примером сам себе в штаны серешь.
Спасибо.Знал что можно куда лучше сделать, буду исправлять!
Есть windows (извините, линуксы не умею).
как поставить WAMP знаю, не проблема. А как все остальное настроить?
Например чтобы нормально работал Composer? чтобы VSCode сразу находил php а не через говнокостыли путем указания пути к вампу (обновив который я ломаю этот vscode)
и т.д. вообщем по современному и чтобы удобно
В идеале используй сразу докер. Гайдов как настроить дохуя, за ручку проведут и объяснят.
На втором месте просто линух. Не умеешь, так учись, все равно код на линухе будет работать. Нужно уметь поднять всю эту хуйню там.
На третьем месте шиндовс, но ставить все самому. Нихуя сложного там нет, а разобраться что нужно для запуска кода стоит.
На четвертом месте опен сервер.
На пятом вамп.
Я хуй знаю какие там у тебя проблемы с VSCode, но в пхпшторме ты просто явно указываешь исполняемый файл пхп, и похуй в вампе он или в китайской стене.
Я не хочу гнать траф (mp4) через свой сервер - там его очень много. В этом и смысл пиратства =)
Есть не неумирающий php deamon, о чем спор вообще?
Ну через браузер тебе все равно придется обращаться к реальной ссылке. Как бы ты не прятал ссылку в своем JS коде браузер показывает список запросов. Грамотный человек увидит всю хуйню на раз два.
Есть же всякие обфускаторы-хуяторы. Что браузер и js понимал ссылку, а юзер нет. Не видел таких?
Братан, ты в своем коде со ссылкой можешь делать что угодно. Но скачивать по ней видос будет браузер. А браузер не скрывает откуда он качает видос.
Надо такую херню попробовать
https://javascriptobfuscator.com/Javascript-Obfuscator.aspx
только найти фри-аналог.
>>710599
Попробовал провернуть это дело тремя способами. Через require_once и spl_autoload_register получилось, а через композер, хоть и дрочился с ним полтора часа, ничего не вышло. Я вот думаю, не в слешах ли кроется проблема. Просто у меня винда, а во всех autoload файлах, созданных композером, пути идут через прямые слеши, а из __DIR__ слеши обратные ведь получаются. Или я дурачек и нету разницы?
Прямые слеши работают везде. Не забыл ли ты сделать composer dum-autoload после того, как правил composer.json? Не сделал ли ты ошибок в самом composer.json?
Работаю пару месяцев из обязанностей доработка срм под нужды клиентов. Она странная, нихуя не задокументированная, официальная буржуйская недодока датируется годом 13-15 пару мажорных версий назад, с тех пор поменяли прилично
Допиливаю там, реализовываю здесь, и в общем то всё. Так и выглядят будни погромиста? Или надо будет после пандемии съябывать оттуда? Работа муторная (в основном из-за попыток понять, хуле тут не так), но нихуя не сложная, у меня лабы были заковыристее. Из плюсов только навык чтения кода бустнул, раньше вообще со страхом на чужой код смотрел
В общем по-всякому пытался. И setcookie() и CURLOPT_COOKIE, и полную инфу и неполную, все куки какие есть, даже от яндекса и гугла. Не работает, я огорчен, братик.
Значит, какая-то защита есть еще - там уже миллион вариантов, нужно браузером парсить, наверное.
Вопрос по Laravel и в целом правильной архитектуре приложения.
В ларавеле есть модели Eloquent.
Наследники класса Model - это сложные хуйни с множеством всяких потрохов и прочей залупы. Они могут и рыбку съесть, и нахуй сесть, и в json обратиться.
С одной стороны хорошо, а с другой - как-то не очень, особенно когда у моделей есть связи друг с другом.
Так вот, в моем приложении требуется постоянно гонять объекты из БД в json и обратно, с полной конвертацией.
То есть, мне нужно точно знать, что в методе репозитария создается в точности то, что будет выдано контроллером в json'е.
Например, при конвертации в жсон модель может скрыть некоторые свои поля или наоборот высрать слишком много лишней информации о связях с другими моделями.
Так вот, нужно ли мне делать промежуточный слой сущностей данных? То есть, сущности - это ПРОСТЫЕ data-value объекты, которые делают только то, что содержат некую инфу и, что важно, способны полностью без потерь конвертится в json и обратно хоть по 100 раз.
Короче говоря, нужна полная сериализация объектов моделей, чего не могут дать стандартные модели Laravel.
Еще, в ларавеле завезли resource providers, по сути тот самый слой между моделью и жсон, но только вот беда блять: опять вышло какое-то монстроузное говно, которое не обладает полной сериализацией.
На удивление на десятый раз заработало. Я просто не зная зачем точь в точь повторил то же, что делал до этого 10 раз. Dump autoload всегда делал 100%, composer.json такой же, как и все предыдущие разы. Чертовщина какая-то, хотя возможно что-то с инициализацией, т.к. первые разы просто начинал с создания composer.json, после чего IDE все остальное подхватывал, потом узнал что для этого есть специальный пункт меню. Хотя предыдущие несколько раз у меня и через этот пункт не выходило.
Тебе не приходило в голову получать из базы сразу JSON. Модели нужны для хранения логики приложения, active record нужен для crud операций. Получение json'а это отдельная песня.
Банкомат и лиличка:http://phpbook.ga/l1/mou-ikkai.html
А deserialisation где?
Госпаде, с кем приходится сидеть в одном треде.
>получать из базы сразу JSON
Существует миллион причин, почему это полная хуйня.
Навскидку: ты лишаешься всех возможностей сортировки, джоинов, индексов, реляционных отношений, короче всего, ради чего используют СУБД.
>active record
В ларавеле нет active record.
>В ларавеле нет active record.
ActiveRecord это паттерн, а не название классов в рельсах и ии. Элоквент реализует актив рекорд.
мимо
>Существует миллион причин, почему это полная хуйня.
Навскидку: ты лишаешься всех возможностей сортировки, джоинов, индексов, реляционных отношений, короче всего, ради чего используют СУБД.
Не думал что у него там метаинформация может храниться без определенной схемы, по которой он никогда не будет сортировать и запросы строить?
>В ларавеле нет active record.
И как эта залупа там называется по твоему?
Ты еблан или да? Индексируй свои отношения как хочешь. Я не предлагаю хранить в JSON'е, хотя если пользуешься постгресом тоже было бы нехуйно. Я говорю результат запроса возвращать сразу в нужном формате https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=27572491663fa2b463f3bdd6a105e9df . С кем приходится сидеть в одном треде.
Ты вообще жопой читал?
Основное, что мне нужно — чтобы сущности данных могли полностью сериализоваться и десериализоваться в жсон/массив и обратно без потери данных.
Нет, смысл не в том, чтобы конвертнуть выпук из базы в нужный формат.
Нужен отдельный промежуточный слой сущностей данных, которые могут полностью сериализоваться и десериализоваться и чтобы им было вообще похуй, оттуда их создали — из базы, из жсона или из аллаха.
Стандартные модели ларавел, похоже, не могут дать этих возможностей, потому что не обладают полной се/десериализацией и объект модели, созданной из бд и объект модели, созданный из массива — это не идентичные объекты.
Ну ладно, ты победил.
Чтобы было лучше понятно, нахуя оно мне надо:
Разрабатывается сложное приложение с разделением на сильно независимые сервисы.
Общее у них — только данные.
И надо, чтобы можно было в одном месте сделать
>return (new User (name, email, password))->toJson();
А в другом
>$user = User::fromJson ($json);
И ты точно знал, какие поля есть в объекте юзер, при их изменении и добавлении новых об этом автоматически знал весь код.
Обычные модели ларавел, во-первых, вообще не обладают способностью к полной конвертации туда-сюда, во-вторых, содержат много лишней хуйни, а в третьих, мне кажется вообще хуевой идеей строить приложение вокруг объектов active record, когда добрым 80% кода вообще похуй оттуда объект высрали и какая СУБД на проекте, им нужны только данные в удобном надёжном ооп-виде.
Я тебе попытался объяснить что то, что ты делаешь не имеет никакого отношения к сущностям. Это чистые данные. Сущности и AR не предназначены для этого. Если тебе нужно просто отдать данные в форме JSON'а, то самый быстрый и эффективный способ избежать конвертации вообще, именно его я тебе и показал.
Если тебе нужно пока какой-то причине сериализовать данные туда сюда, то для этого придумали хуеву гору сериалайзеров
https://github.com/symfony/serializer
https://github.com/nilportugues/php-serializer
https://github.com/liip/serializer
Похоже на два магических метода, которые реализуются как два пальца при желание. Ну ок, не твой вариант.
>независимые сервисы
Схема является внешней зависимостью к сервису значит? Посмотри протобаф, мб это как раз то, что ты хочешь.
>вообще не обладают способностью к полной конвертации туда-сюда
Чуть дописать то реально.
>содержат много лишней хуйни
Ты ее не сериализуй.
>хуевой идеей строить приложение вокруг объектов active record
Это тебе правильно кажется, и дело даже не в ар.
>нужны только данные в удобном надёжном ооп-виде
Гугли домены.
мимо
Во, тебе тоже спасибо. Это уже нужная информация.
Все равно у меня ощущение что ты занимаешься хуйней. Если ты между червисами данные передаешь через апи, то все эти танцы нахуй не нужны. А если это происходит внутри одного приложения, то совсем пиздец.
Я не ОП а дерьмо, но насчет банкомата ищи в этом треде по ctrl+f, ОП отлично расписал, это если ты уже изи мод сделал по жадному алгоритму. На счет лилички там же все в подсказке написано. Разбиваем на строки регуляркой по \n помню что у меня сразу воспринимать перенос энтером как \n не хотело, не помню что с этим сделал, но нашел ответ за 30 секунд на стакероверфлове. Впрочем можно и просто подобавлять до концов строки \n, это вроде не чит., и разбиваем эти строки на символы по "". Теперь циклом выводим в первой строке через | все первые символы, во второй все вторые и т.д. Сразу оно красиво выглядеть не будет, думаю догадаешься что с этим делать. А на будущее, всё это уже сотню раз обсосано в архиве с шапки, там есть поиск по всем тредам.
Спасибо большое, анон, порылся в архиве и нашел ответы на все свои вопросы
Сап. Помогите с Wordpress(ом). Есть форма. Клиент должен иметь возможность запросить информацию о том, какие есть магазины, рестораны, отели в определенном городе. Получается нужна база данных? Как это реализовать? В Wordpress есть специальные плагины или как это делается? Или нужно это реализовать самостоятельно при помощи mysql? Но нужно обязательно дать возможность владельцу сайта добавлять новые данные в магазин. Хелп
Можно ли сделать так, чтобы в модели datatime поле было в виде Unix Timestamp?
> должен иметь возможность запросить информацию
> Получается нужна база данных?
Ну типа как бы да...
> В Wordpress есть специальные плагины или как это делается?
Плагины для работы с базой данных?)))
Да она и без плагинов это делает, по сути это основная функция wp.
>Или нужно это реализовать самостоятельно при помощи mysql?
Чивоооооооо блять?
Анончик, ставь vscode + там плагин phphence и xdebug накатывай - избежишь таких косяков в будущем.
Не знаю хороший ли совет, но можешь ещё пройти https://ru.code-basics.com/languages/php .
Там базовые вещи объяснены.Вроде как.
>>712424
>Клиент должен иметь возможность запросить информацию о том, какие есть магазины, рестораны, отели в определенном городе. Получается нужна база данных?
Нужна, там эта вся инфа будет храниться. Магазы, рестораны и отели это одна сущность,они относятся к какому-то городу, город тоже сущность.
>В Wordpress есть специальные плагины или как это делается? Или нужно это реализовать самостоятельно при помощи mysql?
Почитай как через вордпресс добавлять новые сущности и задавать им какие-то аттрибуты, раз на вордпрессе магазы делают то думаю и такое можно без проблем.
Тут другой вопрос, такое ощущение что тебе поручили это сделать но ты сам не знаешь, вот и спрашивается нахуя. Если ты никогда ничего не делал подобного то у тебя вряд ли получится. Не думаю что тебе тут подскажут именно решение уровня копипаст, тут уж сам должен.
Начитаются своих вротпрессов, потом не могут 2+2 сложить...
Советую тебе потратить время на изучение основ mysql в том числе и не задавать таких идиотских вопросов
В данном контексте совет неверный.
В wordpress есть удобный класс wpdb
https://wp-kama.ru/function/wpdb
Его и нужно курить.
Гугли Date Mutators
<?php
error_reporting(-1);
$anonDice1 = mt_rand(1,6);
$anonDice2 = mt_rand(1,6);
$compDice1 = mt_rand(1,6);
$compDice2 = mt_rand(1,6);
echo "У анона выпало ($anonDice1) и ($anonDice2)\nУ компьютера выпало ($compDice1) и ($compDice2)\n";
$anonSum = (anonDice1 + anonDice2);
$compSum = (compDice1 + compDice2);
if (($anonDice1 == $anonDice2) && ($compDice == $compDice2)) {
echo "2 дабла\n";
exit();
}
elseif (($anonDice1 + $anonDice2) > ($compDice1 + $compDice2)) {
echo "Победил Анон";
exit();
}
elseif (($anonDice1 + $anonDice2) < ($compDice1 + $compDice2)) {
echo "Победил компьютер";
exit();
}
<?php
error_reporting(-1);
$anonDice1 = mt_rand(1,6);
$anonDice2 = mt_rand(1,6);
$compDice1 = mt_rand(1,6);
$compDice2 = mt_rand(1,6);
echo "У анона выпало ($anonDice1) и ($anonDice2)\nУ компьютера выпало ($compDice1) и ($compDice2)\n";
$anonSum = (anonDice1 + anonDice2);
$compSum = (compDice1 + compDice2);
if (($anonDice1 == $anonDice2) && ($compDice == $compDice2)) {
echo "2 дабла\n";
exit();
}
elseif (($anonDice1 + $anonDice2) > ($compDice1 + $compDice2)) {
echo "Победил Анон";
exit();
}
elseif (($anonDice1 + $anonDice2) < ($compDice1 + $compDice2)) {
echo "Победил компьютер";
exit();
}
Вроде разобрался
> брать платные курсы?
а лучше с гарантированным трудоустройством, но такие курсы стоят бешенны бабок, не меньше 100 тыс в месяц. в моем случае - 120
мимо
$num = 5;
$word = 'banana';
$query = 'SELECT * FROM _table WHERE id=%d AND name="%s"';
$query = sprintf($query, $num, $word);
Типа такого?
я хз,у вас спрашиваю
Ты, блядь, ебанулся или оговорился, и хотел сказать "в год", пидорасина?
Если бы я делал флеш месседжы то я бы делал так:
При инициализации проверял есть ли в $_SESSION по какому-то своему ключу флеш сообщения. Если есть то я бы их копировал в глобальный объект флеш сообщений на уровне пхп, который очистится после завершения запроса, и сразу после копирования удалял бы их из сессии.
Оператор clone применим только к объектам. У тебя же "скалярные" значения - строки, числа. Их копируют просто путем присваивания:
$x->isBoss = $y->isBoss;
В твоем случае это делать вообще нет смысла, так как при клонировании объекта его поля копируются (не клонируются) автоматически.
Волшебный метод __clone нужно писать только если у тебя в полях объекта хранятся ссылки на другие объекты. clone не создаст копии для этих внутренних объектов (а просто скопирует в клон ссылку на тот же обьъект), и это надо делать вручную.
Просто в сессию пишут значение, а при загрузке следующей страницы достают значение из сессии, выводят на экран и удаляют его из сессии.
Есть же исходный код Симфони: https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Controller/AbstractController.php#L195
>>713032
Не очень понятный вопрос. В твоем примере кода
ниже есть SQL инъекция, так как параметры при подстановке не экранируются.
>>712773
Почти верно, но в условиях лучше было не писать сумму, а писать что-то вроде $anonSum > $compSum. Также, exit тут не требуется. Также, не предусмотрено, что выводить при
ничьей.
В Wordpress нет такого функционала, это движок для блогов. Тебе надо либо найти плагин, либо написать его самому.
> В твоем примере кода
это не мой пример кода.
суть вопроса,чтобы кусок кода PDO по записи(или удаления)засунуть в одну функцию с параметром
как и че мне тут править чтобы запахало? уже по разному тыкался - но толку нихуя
движок опенкарта если че
wpcd по сути есть pdo, но допиленный под cms . С учетом того, что в wp принято писать все на функциях без объектов.
Короче в API всё уже есть, не городите велосипеды.
https://ideone.com/Ujnv0l
вебсайты, сервисы. тупая или нет, зависит от идеи и реализации
Психологические особенности или комплексы, попытка повысить свою самооценку за счет принижения других. Вот статья, которая содержит аналогичные претензии к другим языкам программирования: https://habr.com/post/315152/
Ты ввод ошибок то php-то сделай. На open server под видной по умолчанию есть. На opencart достаточно сменить данные домена и БД в конфиге и все должно работать. так было
Я вот чета не увидел у тебя рерайтов на https, может в глаза ебуся.
Да я сверху написал что понял уже, прошу прощения за дэбильный вопрос. Запутался в официальной документации, думал что даже на обычные поля идет ссылка, а не копия.
Мне одному кажется что там множество наведенных минусов php - это его достоинства?
Да хз. Наверное потому что избыточно и не нужно.
https://ru.wikipedia.org/wiki/KISS_(принцип)
> На opencart достаточно сменить данные домена и БД в конфиге и все должно работать
и щас так есть. но проблема в том что я как раз до того как на сайт то зайти их настроил, и доступ к базе предоставил, через пма там накатил дамп бд и все ок встало. пма норм пашет, админка тоже, а вот основной сайт почему то мозги ебет. в логах апача ниче нет естессно.
Через обычные обменники конские комиссии
Вот нашел https://exchanger.money для вебмани - 130-200р экономии с каждый 100$
на рельсах
>Symfony
this
>Как с доходом вообще?
Как везде. Можно за 200к+ найти, можно за гроши вкалывать.
Куда выкатился?
не, все норм пашет. хуй знает в чем проблема
>Наверное потому что избыточно и не нужно.
Если проекты небольшие уровня лендинга, то мб. Но есть же всякие вукомерсы, где ооп всяко лучше, чем горы функций
>На чем пишете в 2020-м? Symfony, Laravel или может ждете Yii3?
Laravel в основном, хочу на Symfony прод пописать, но без опыта этого самого симфони не берут пидарасы.
В прошлом писал на Yii2. Могу сказать, что Yii3 ждать не стоит, это мертвый фреймворк.
>Как с доходом вообще?
Очень грустно, если не в дс живешь. Второй месяц ищу удаленку на 100к+. До этого чуть меньше на удаленке получал (лара).
Посмотри кардпэй.
После ухода китайского мейнтейнера на голенг разработка yii2 буквально встала. Макаров едва с поддержкой справляется. И сейчас он соло уже лет 5 пилит yii3.
Надо ли говорить, каким устаревшим говно yii3 будет на релизе?
Пока белые люди выкатывают апдейты новейших версий Симфони и Лары чуть ли не каждую неделю.
Есть один самопальный блог чисто на ПХП, нужно сделать к постам комментарии.
Но у меня затуп: Как сделать, чтоб комментарий привязывался именно к тому посту, к которому он будет написан?
Как бы, получится, посты лежат в одной таблице, комментарии - в другой. А как их свести вместе?
Мой вопрос не о том, как таблицы объединять, а в том, как привязать новое сообщение к уже опубликованному посту, который на странице в виде чистого текста.
При чем тут SQL вообще?
Foreign key-ем привязать
https://www.booking.com/searchresults.ru.html?ss=Киев,+Украина&checkin_year=2020&checkin_month=9&checkin_monthday=25&checkout_year=2020&checkout_month=10&checkout_monthday=20&group_adults=2&group_children=1
curl ошибок нет, хеадер не возвращается, тело не возвращается. Модуль curl загружен
по file_get_contents все работает
При этом куки от сайта высылаются
все ясно, требовало Accept-Encoding: gzip, deflate, br
Видимо, ты - это я через год, только я инженегр. Почему вкатиться не можешь? Не зовут на собесы? Или скилы надрочить не можешь? Получается планка входа в пхп не такая уж и низкая как все говорят. И кстати почему не пробуешь вкат на CMS?
Держи в курсе
Есть парсер. Открываем страницу парсера, парсер отрабатывает 20 секунд, затем выдает рефреш и заново отрабатывает 20 секунд, и так до бесконечности, тоесть автоперезагрузка страница после завершения.
Необходимо это реализовать без участия браузера. И желательно без расширений для линукса (хотя если есть хорошие, я бы посмотрел). Парсер нельзя запускать одновременно в более чем 1 копии, и парсер должен заново запуститься, как только он завершит свою работу. Спасибо
Тебе нужен скрипт для командной строки (и по-хорошему, надо бы изучать это до работы через браузер). Вот урок по командной строке: https://github.com/codedokode/pasta/blob/master/soft/cli.md
>>714314
Ты плохо сформулировал задачу. Тебе надо с нуля написать это систему, сделать отправку в уже готовой системе или что-то еще? Если тебе надо создать систему обмена сообщениями с нуля на MySQL, то можно сделать ее на основе таблицы пользователей и таблицы сообщений в MySQL.
>>714196
Используй связь один-ко-многим (один пост привязан ко многим комментариям).
>>713293
Ты можешь закомментировать RewritwRule, который отвечает за редирект. Если не знаком с реврайтами, можешь почитать статьи вроде этой, хотя документацию от Апача они не заменят: https://habr.com/ru/company/sprinthost/blog/129560/
Из недостатков самому сразу приходит в голову то, что при изменении базовых свойств профессии я по сути просто меняю свойства уже существующих работников, а при создании нового работника этой профессии свойства будут предыдущими. Не придумал как это нормально сделать. Еще очень не нравятся функции padLeft и padRight. По всей логике для каждого столбца нужно задавать одинаковое значение отступа, но на практике выходит херня, и пришлось для каждой строчки отступы подбирать.
Также интересно выяснить несколько моментов с константами класса. Не придумал куда их поместить, поместил в Employee, но это плохо, родитель знает о ребенке, нельзя будет полноценно создать новую профессию без добавления новой константы в родителя. Было бы идеально помещать эти константы в сами классы профессий, типо Engineer::ENGINEER, Manager::MANAGER и т.д., я сначала хотел так и сделать, но меня со всех сторон закидало ошибками, уже забыл почему. И можно ли в тайпхинте для функции указать, что её аргументом должна быть константа класса?
Я уверен что ты несомненно найдешь намного больше дерьма и подводных камней в этом коде, и буду очень этому рад. Раньше ничего на проверку не кидал, но думаю что в этом случае важно сразу отучить меня от каких-то вредных привычек и приучить к хорошим в этой парадигме ООП. Алсо, приступать к кошкам-мышкам или к будильнику и гостиннице?
Я на работе пердолюсь с ларавел, там поставил homstead на виртуалке, все работает.
Дома почему то виртуалка не встала, и я развернул на опенсервер.
Опен сервер требует как папку домена - каталог myproject/public;
Я всегда думал что папка домена - это корень сайта, и апач/нгикс не имеет возможности идти ниже. А ту фактически vendor и все барахло мое находится ниже паблик.
Опять же автозагрузка классов должна понимать от какого корня считать нэймспэйсы (только вот задумался)
Подскажите, или дайте ссыль что почитать
Веб-сервер не должен вылезать за корневую папку, это верно. А вот PHP скрипты могут лезть куда угодно. Потому мы кладем index.php в папку веб-сервера, а он дальше уже лезет куда хочет (куда мы пропишем).
Корневая папка веб-сервера специально выделяется отдельно, чтобы нельзя было снаруже скачивать или запускать произвольные файлы.
Композер (и его автозагрузчик) считает корневой ту папку, где расположен composer.json.
Во-первых, есть (см ReactPHP), во-вторых, если тебе больше нравится Питон, то просто пиши на нем.
>Получается планка входа в пхп не такая уж и низкая как все говорят
Если не из дса, то да, вход не из легких
Бля, долбоебы, котрые пишут про эту залупу, вы хоть один проект на этой хуйне видели вообще? Вы блядь еще про корутины в пхп вспомните.
Вся асинхронная залупа на пхп до выхода восьмой версии это просто мысленный эксперимент, подрочить судьбу, посмареть как оно вообще может работать. Это нихуя не продакшен реди блядь.
>вы хоть один проект на этой хуйне видели вообще?
В гугле забанили?
Из известных - телеграм бот апи на реактпхп
Сразу открываешь issues, а там пацаны внезапно выясняют что Guzzle не асинхронный. И такой хуйни ты глотнешь ведро, причем дырявой ложкой.
В гугле можно что угодно найти. Хоть дрочащих карликов, хоть фото пизды чьей-то мамаши. То что ты у себя дома пишешь для души тоже мало кого ебет.
Ты проект на этой залупе в продакшене видел? Реальный фидбек у тебя есть?
Таблетки пил сегодня?
Такая же, как между линуксом и виндой. Совершенно разные вещи, решающие одну задачу.
Что на 2? На энжинксе? Да, он шустрее, гораздо. Потому в него так и вцепились сейчас компании. Но у апача тоже 1.5 плюса есть. Тебе эти знания никак не мешают юзать то или иное сейчас.
Закачивать файл с одного сервера и сразу отдавать в браузер без выкачки полностью перед отдачей, дабы задержек не было
Что ты так нервничаешь? Есть куча задач, которые спокойно решаются без асинхронности. И, кстати, я когда-то давно для себя еще на curl писал парсер, качающий во много потоков, когда про ReactPHP никто и не слышал.
>>715732
Приведение (изменение) типа переменных. Например, преобразование string в int или обратно.
>>715747
Потому что ivan это не число.
>>715826
ReactPHP
>>715827
Это преобразование типа переменной.
Что нужно: в тестах брать реквесты из файла.
дошло
Пиздец, поставь open server, там включи xdebug и накати плагин на свой блокнот. Как ты будешь переменные смотреть с массивами и точки остановки? echo и var_dump каждый раз?
xdebug включай и вывод переменных и всего в редактор, по нормальному, потом смотри точки остановки.
бамп вопросу
Когда скрипты будут сложнее, увидишь зачем.
а как в вс коде очистить терминал не убивая его?
|| - это логическое "или". a || b дает true, если справа или слева выражение равно true, и false в противном случае.
xor - это логическое "исключающее или". a xor b дает true, если с одной стороны true, а с другой false.
Почитай про булевы выражения:
https://www.php.net/manual/ru/language.types.boolean.php
https://www.php.net/manual/ru/language.operators.logical.php
>>716002
Вообще, пока у него программы из 3 строчек, var_dump хорошо работает.
>>715896
$$name - это обращение к переменной, имя которой хранится в $name.
>>716508
добавлять echo "\n"; - это сделает перевод строки.
(1==1) || (2==2) = true
(1==1) xor (2==2) = false
(1==2) || (2==2) = true
(1==2) xor (2==2) = true
(1==2) || (2==1) = false
(1==2) xor (2==1) = false
это типа отложенное увеличение и уменьшение?
те сначала переменная не меняется а появляется позже?
Если использовать инкремент в выражении, например:
$a = $b++;
$a = ++$b;
То в одной строчке переменная $a получит старое значение до инкремента, а в другой - уже увеличенное значение. Вот и вся разница.
Во-первых, можно попробовать Mockery - им подменять Guzzle на мок, который вернет нужный результат. Во-вторых, в самом Guzzle есть это: http://docs.guzzlephp.org/en/stable/testing.html
> $isBoss = isset($worker[3]) ? true : false;
isset() уже возвращает true/false, потому тернарный оператор не нужен.
> $newDepartment->setEmployee($employee);
Лучше назвать метод addEmployee().
> strlen($string)
Надо использовать mb_strlen, чтобы корректно работало с кирилицей.
При создании профессии ты переопределяешь свойства вроде salary. Но во-первых, это никак не документировано, во-вторых, никак не проверяется. Если бы ты вместо этого сделал в Employee абстрактные методы вроде getBaseSalary(), то эти 2 проблемы были бы решены.
> const ANALYST = Analyst::class;
Можно было не определять эти константы, а сразу использовать в коде Analyst::class.
То, что относится к антикризисным мерам, у тебя размазано по нескольким классам (департамент, работник), а лучше было сделать это в виде класса или нескольких классов (по классу на меру), метод в которых принимает компанию и применяет к ней меры. Тогда у каждого класса будет своя четко очерченная зона ответственности. При твоем же подходе, нет класса, отвечающего за антикризисные меры, и наоборот, в классах вроде компании или департамента засунуты методы для решения отдельной задачи, а не универсальные методы, которые можно использовать и для других задач.
Методы вроде добавить/уволить/найти работника, назначить босса - универсальные, а вот методы вроде cmpForRemoving() относятся к задаче антикризисных мер и делать им в классе Employee нечего.
> $this->salary = ($salary != 0) ? $salary : $this->salary;
Тут можно было просто сделать 3 отдельных метода, и название вроде changeSalary() читалось бы лучше.
> private array $employeesOfDepartment;
Лучше просто $employees.
Конструктор обычно пишут в начале класса, а не в середине.
> getCountOfEmployees
Лучше countEmployees().
Вывод таблицы тоже лучше делать отдельными функциями/классами и не помещать в Company.
> Алсо, приступать к кошкам-мышкам или к будильнику и гостиннице?
Наверно, лучше делать гостиницу и двигаться к задаче про список студентов.
> Из недостатков самому сразу приходит в голову то, что при изменении базовых свойств профессии я по сути просто меняю свойства уже существующих работников, а при создании нового работника этой профессии свойства будут предыдущими. Не придумал как это нормально сделать.
Если такая потребность есть, можно сделать объект Профессия и в нем хранить и менять числа. В работников передавать один и тот же экземпляр объекта и тогда можно будет разом для всех что-то поменять.
> но на практике выходит херня, и пришлось для каждой строчки отступы подбирать.
Надо использовать mb-функции.
> Не придумал куда их поместить, поместил в Employee, но это плохо, родитель знает о ребенке, нельзя будет полноценно создать новую профессию без добавления новой константы в родителя.
Лучше использовать названия классов как константы. А так, вариант с Engineer::PROFESSION тоже рабочий.
> И можно ли в тайпхинте для функции указать, что её аргументом должна быть константа класса?
Увы, нет. В других языках для этого есть enum (перечисления, выбор из нескольких опций), а в PHP они пока только есть решения вроде такого: https://stitcher.io/blog/php-enums
> $isBoss = isset($worker[3]) ? true : false;
isset() уже возвращает true/false, потому тернарный оператор не нужен.
> $newDepartment->setEmployee($employee);
Лучше назвать метод addEmployee().
> strlen($string)
Надо использовать mb_strlen, чтобы корректно работало с кирилицей.
При создании профессии ты переопределяешь свойства вроде salary. Но во-первых, это никак не документировано, во-вторых, никак не проверяется. Если бы ты вместо этого сделал в Employee абстрактные методы вроде getBaseSalary(), то эти 2 проблемы были бы решены.
> const ANALYST = Analyst::class;
Можно было не определять эти константы, а сразу использовать в коде Analyst::class.
То, что относится к антикризисным мерам, у тебя размазано по нескольким классам (департамент, работник), а лучше было сделать это в виде класса или нескольких классов (по классу на меру), метод в которых принимает компанию и применяет к ней меры. Тогда у каждого класса будет своя четко очерченная зона ответственности. При твоем же подходе, нет класса, отвечающего за антикризисные меры, и наоборот, в классах вроде компании или департамента засунуты методы для решения отдельной задачи, а не универсальные методы, которые можно использовать и для других задач.
Методы вроде добавить/уволить/найти работника, назначить босса - универсальные, а вот методы вроде cmpForRemoving() относятся к задаче антикризисных мер и делать им в классе Employee нечего.
> $this->salary = ($salary != 0) ? $salary : $this->salary;
Тут можно было просто сделать 3 отдельных метода, и название вроде changeSalary() читалось бы лучше.
> private array $employeesOfDepartment;
Лучше просто $employees.
Конструктор обычно пишут в начале класса, а не в середине.
> getCountOfEmployees
Лучше countEmployees().
Вывод таблицы тоже лучше делать отдельными функциями/классами и не помещать в Company.
> Алсо, приступать к кошкам-мышкам или к будильнику и гостиннице?
Наверно, лучше делать гостиницу и двигаться к задаче про список студентов.
> Из недостатков самому сразу приходит в голову то, что при изменении базовых свойств профессии я по сути просто меняю свойства уже существующих работников, а при создании нового работника этой профессии свойства будут предыдущими. Не придумал как это нормально сделать.
Если такая потребность есть, можно сделать объект Профессия и в нем хранить и менять числа. В работников передавать один и тот же экземпляр объекта и тогда можно будет разом для всех что-то поменять.
> но на практике выходит херня, и пришлось для каждой строчки отступы подбирать.
Надо использовать mb-функции.
> Не придумал куда их поместить, поместил в Employee, но это плохо, родитель знает о ребенке, нельзя будет полноценно создать новую профессию без добавления новой константы в родителя.
Лучше использовать названия классов как константы. А так, вариант с Engineer::PROFESSION тоже рабочий.
> И можно ли в тайпхинте для функции указать, что её аргументом должна быть константа класса?
Увы, нет. В других языках для этого есть enum (перечисления, выбор из нескольких опций), а в PHP они пока только есть решения вроде такого: https://stitcher.io/blog/php-enums
Скажем, я владелец домена otherdomain.ru. Мне необходимо отловить значение параметра "y" и не его основе выдать соответствующую модификацию скрипта.
У меня пока примерно так (я юзаю yii2)
actionScript($y) {
header('Content-Type: application/javascript');
return "alert($y)";
}
Но тут скрипт маленький, а если мне надо выдать js код длинной в 200 строк? Я же задолбаюсь его писать как строку.
ps более того, в выдданом скрипте должны быть использованы некоторые констаны из моего сервера, то есть
actionScript($y) {
header('Content-Type: application/javascript');
return "alert($y)".SomeModel::TYPE;
}
Используй шаблонизацию ( https://github.com/codedokode/pasta/blob/master/php/templates.md ). Если вариантов скрипта немного, то можно еще ускорить отдачу, если сгенерировать все возможные варианты и отдавать готовый файл.
Поясни, что неудобного для новичка? Вот прям по пунктам. Он же основы учит, ему как раз автокомплит на данном этапе не нужен. А так он функцию написал, если ошибку допустил, то увидит сообщение. Будет наука писать код думая, а не просто на клавиши давить.
>>717769
Ты учишь основы — это не про скрипты. Тем более у тебя интерактивные сейчас сурипты, за каким ты их хуем в вскоде пишешь? Стильно, модно, молодёжно? Тебе сейчас понять синтаксис надо, набить руку набирая некий код. IDE/редактор с подсветкой, когда ты знаешь, что ты пишешь. Ты же сейчас выдумываешь сфер чесуого коня в вакууме.
Интерактивный режим удобен, если нужно попробовать буквально пару строк. Иначе начинаются траблы в работе с блоками кода. Нет банальной копипасты, не вынесешь блок кода в функцию + иде подсветит тебе синтаксические ошибки
Ну ты видимо не стал себя утруждать прочитать мой пост. Ты описал те моменты, с которыми связаны программисты, а не ученики.
Проверь, пожалуйста.
http://sandbox.onlinephpfunctions.com/code/71f694bdf48900a09b25ad3d635f28cacd338a49
Делать ли мне кошки-мышки? Ее просто критиковали в прошлых тредах.
2 года в офисе, 1 на удаленке
bitrix
там ассоциативный как ,а здесь обычный двумерный
этот способ я знаю-по строке и колонке.
я спрашивал про вывод содержимого строки полностью,например 3 строка где лада с ценами
<?php
$regexp= "/^(\+7\8)\d{10}$/ui";
$subject = '8-911-404-44-11';
preg_replace('/[^+\d]/','',$subject);
if (preg_match ($regexp, $subject)) {
echo 'ваш номер: {$subject}';
} else {
echo "Введите номер ввиде: в начале 8 или +7, потом идут 10 цифр";
}
Это по сути реализация toString() для твоего кода
Так-то там любая херня может быть, превращающая твои данные в строку
надо почекать мне всякие фичи для массивов
В implode нужно указывать разделитель, например implode(', ', $array).
>>719634
У тебя указано \d{10} - "ровно 10 цифр идут подряд". А в номере между цифрами минусы.
Советую написать выражение вида "ровно 1 цифра, за ней любое число минусов и пробелов", затем взять его в круглые скобки и добавить повторение 10 раз:
(выражение){10}
Круглые скобки нужны, чтобы {10} применялось ко всему выражению, без них оно применяется только к последнему куску выражения.
У меня есть таблица users, у неё есть таблица orders, ордеров может быть много, у каждого order есть FK users
Нормально ли когда модель User напрямую работает с ордерами? Ну например как тут:
https://pastebin.com/CHNP3yeq
Или модель должна исключительно работать сама с собой?
>Нормально ли когда модель User напрямую работает с ордерами?
Не нормально. У тебя один класс зачем-то лезет в кишки другого.
Ну и елоквент модель != модель М из MVC
Тебе и другим анонам на винде и ноуте советую накатить Windows Terminal и wsl. Экщпириенс разработки сразу повысится
Нашел вот такое решение, зачем в этих местах двойное экранирование?
ты не правильно запускаешь
а сам понял.
Можно в квадратных скобках с помощью ^ указать, что нужен любой символ, кроме указанных: [^0-9] значит "любой символ, кроме цифры".
Смотри подробнее в мануале: https://www.php.net/manual/ru/regexp.reference.character-classes.php
Бизнес логика пишется отдельно от контроллеров и моделек бд.
Да как вас Земля держит?
Прокинь в path путь до php.exe и запускай через php tvoi_php_file.php
где start это номер индекса или считается как просто номер элемента (1 2 3 и тд) после которого идет срез?
https://ideone.com/Pll6kM
Ещё не доделал, но хотел бы спросить движусь ли я в правильном направлении
Спасибо большое что посмотрел. Понял-принял. Сейчас наконец-то появилось немного свободного времени, сделал гостиницу, пол дня пытаюсь запилить нормальный алгоритм для вот этой функции:
>то же самое, но при отсутствии одного подходящего номера для Гостей разрешается заселить их в несколько номеров, опять же, начиная с самых дешевых. Например, приехало 3 Гостя, но все 3-местные номера заняты и мы выделяем 2 2-местных, или 3 1-местных или 1-местный + 2-местный.
Пока что сделал по-жадному, к примеру: группа из 6 гостей, есть номер на четырех и два номера на трех человек, она сначала всегда выберет номер на четырех, не смотря на стоимость, после чего для двух оставшихся гостей уже выберет номер на трех. Что-то уже исчерпал мысли как это нормально реализировать, по идее это поиск пути на графе? Если так, то просто все варианты перебирать нельзя, так как там огромнейшие факториалы будут выходить при большом количестве комнат.
А на счет других функций, вроде бы все хорошо, буду рад если глянешь https://github.com/kydva/HotelOOP
Все функции я протестировал в самых разных ситуациях дебаггером, но к сожалению почти ничего вывести вардампами чтобы показать нельзя, так как Комнаты в истории имеют ссылки на Гостей, которые в них побывали, а Гости в истории имеют ссылки на Комнаты, в которых они были. Выходит бесконечная рекурсия. Насколько я понимаю, программу это грузить не должно, так как это обычные ссылки, но вардампы и прочее пытаются максимально вывести все ветки. Алсо, начитался про хлеб, решил классы особо не плодить.
https://www.php.net/manual/en/function.array-slice
Note:
The offset parameter denotes the position in the array, not the key.
Не срабатывает часть условия.
Не вижу очевидных ошибок, мне возвращается вардамп переменных и тишина.
Тот же самый запрос в sql работает корректно, но при попытке внести данные через ПДО чот не выходит.
На синтаксис не ругается, данные в переменных корректные.
В чем дело?
https://www.php.net/manual/ru/pdostatement.bindparam.php
Посмотри как оно работает. Чтобы не заходил - надо писать не символ вопроса, а привязать к псевдопеременной - например, :colour. А в bindparam указываешь bindParam(':colour', $value)
Элементы в масссиве содержат ключ и значение и упорядочены, то есть массив "помнит", в каком порядке в него вставлялись значения. Элементы в массиве хранятся в порядке вставки, и например, можно сделать массив, где ключи идут не подряд: $x = [1 => 100, 0 => 200];
start это номер элемента, начиная с 0. То есть если start = 0, то берутся элементы, начиная с самого первого.
Добавь кавычки к вопросам, отличные от тех, где они находятся. в этом случае одинарные
1. Dependency Injection - это все лишь о том, что в функцию-конструктор передается объект сервиса?
2. Dependency Injection Container - это просто класс, который в себе имеет массив, в который через сетеры/гетеры можно записывать сервисы?
3. Контейнер нужен для того, чтобы в провайдеры просто передавать несколько зависимостей, так?
Может есть какой нибудь хороший ресурс, или книга, в которой это хорошо разжевано. Потому что я сколько читаю про эти DI, но в итоге только путаюсь.
Ставь докер
В перспективе - да. Учиться легко без него, а когда понадобится- поймешь сам.
В пхп есть функция mail, на сколько знаю она дергает линуксовую "mail" функцию которая отправляет почту.
В винде такой нет. Значит я должен поставить что то Типа phpMailer.
Но что в винде по итогу отправляет почту? Должен быть какой то почтовый клиент же.
Я отправлял почту через smtp гугла на свой ящик, но немного плыву в цепочке необходимых этапов.
Я бы где-то в Run Configuration или Edit Configuration заглянул
Ни ошибок, ни варнингов, но скрипт работает не правильно.
Чтоб тебе так же таски давали на работе.
Какая нахрен фото экрана?
Что значит работает неправильно? Что ты ожидаешь и что происходит?
как не правильно?
код в кучу с разметкой, не PDO.
Ну как что не так? Гавнокод лютейший, я пару минут честно пытался вчитаться. что ты хотел написать в конце 15й и 16й строки? Точно оператор верный?
Там примеры на 5ой пыхе вроде, да и в целом подход устарел.
Сейчас же всё на фреймворках, вся эта низкоуровневая ебля зарыта под капотом.
Ну и голый жс на фронте - сейчас везде реакты
Знание фреймворка или реакта не отменяет необходимости знать основы (работа с БД, формами, шаблоны).
>>724642
Когда-то я смотрел эту книгу 2011 года и код там был плохой, особенно код соцсети в конце. Не знаю, как в более новых изданиях.
>>724415
Напиши, что именно не так. Также, у тебя время для кук задано в прошлом.
В мануале по функции mail() написано ( https://www.php.net/manual/en/function.mail.php ):
> The Windows implementation of mail() differs in many ways from the Unix implementation. First, it doesn't use a local binary for composing messages but only operates on direct sockets which means a MTA is needed listening on a network socket (which can either on the localhost or a remote machine).
На Линуксе, да, команда mail() просто запускает программу sendmail и передает ей письмо. На Windows она соединяется с почтовым сервером по протоколу SMTP с параметрами из php.ini. Почтовый сервер (наверно) может быть установлен и локально.
На практике, эту функцию обычно не используют напрямую, а используют библиотеки вроде Swiftmailer, у котррых есть поддержка разных протоколов, вложений, HTML писем итд.
>>723802
Возвращает значение из функции и завершает ее выполнение. Если ты напишешь вызов функции так:
$x = some_func();
...
То будет вызвана функция some_func(), и когда в ней встретится оператор return, например return 5; то функция "вернет" значение 5 (то есть, оно попадет в $x) и далее будет выполняться код, который идет после $x = ....
DI - это идея, что "зависимости" (объекты и параметры, которые нужны данному объекту для работы) должны передаваться в объект снаружи, а не объект сам должен их как-то создавать или получать. Если что, у меня есть урок по теме https://github.com/codedokode/pasta/blob/master/arch/di.md
Передавать зависимости можно в конструктор (обязательные зависимости) или в метод (используется для необязательных зависимостей, без которых объект может работать, например, логгер).
Dependency Injection Container - это штука, которая знает, кто от кого зависит и умеет создавать объекты и их зависимости, избавляя от создания всех объектов-зависимостей вручную. То есть ты просто просишь "дай мне сервис X" и не думаешь о том, что ему надо передать - контейнер сделает это сам. Есть контейнеры, где зависимости описываются вручную в конфиге, есть контейнеры с autowiring, когда контейнер по тайп-хинтам в конструкторе сам "догадывается", что надо передать.
Контейнер нужен, чтобы не запоминать, кто от кого зависит и вручную не создавать десятки объектов. Чтобы можно было просто написать:
$logger = $container->get('logger');
или
$logger = $container->get(Logger::class);
>Знание фреймворка или реакта не отменяет необходимости знать основы (работа с БД, формами, шаблоны).
Я это не отрицал.
Но тот подход, что в книге, где мы пилим приложуху из говна и палок, остался только в дремучем легаси.
Так что приучаем себя сразу писать на современном стеке
>Так что приучаем себя сразу писать на современном стеке
а что,на чистом пхп это будет выглядеть иначе или уже зашквар?
>$a = 3;
$b = &$a;
$a = 4;
print "$b";
пример с СО или пример с офф сайта
>$a = 3;
$b = &$a; // $b - это ссылка на $a
print "$a\n"; // печатает 3
print "$b\n"; // печатает 3
$a = 4; // меняем $a
print "$a\n"; // печатает 4
print "$b\n"; // также печатает 4, так как $b является ссылкой на $a,
// а значение переменной $a успело измениться
?>
>а что,на чистом пхп это будет выглядеть иначе или уже зашквар?
Это будет 1 из 2:
1. Пишем одноразовый говнокод, потом выкидываем
2. Пишем свой фреймворк, потом пишем само приложение
>В моей мухосрани вроде без фрейморков пишут
удачи распутывать древнюю легаси лапшу, вручную обновлять зависимости и заливать по фтп
>и какой-то цмс еще применяют
тут без комментариев
Когда мы копируем ссылку:
$b = &$a;
То $a и $b указывают на одну и ту же область памяти. Это значит, что если мы в любую из этих переменных запишем число, то оно попадет в эту общую область памяти и команды
echo $a;
echo $b;
Выведут одно и то же. Так как они выводят содержимое этой области памяти.
Для сравнения, при копировании (без &) значения:
$a = $b;
$a и $b указывают на две разные области памяти и значение копируется из одной в другую.
Ты путаешь обучение и работу. На работе, конечно, пишут на фреймворке, своем или готовом. А в процессе обучения лучше идти постепенно. Сначала освоить, как вообще обслуживать запросы, а только потом делаеть это с помощью абстракций фреймворка.
А то люди берутся сразу за сложное, а потом жалуются, что ничего не понять или бросают вообще обучение. Какой смысл копировать из туториала код, не понимая, что он делает?
Получается, ты предлагаешь, не изучив сложение и умножение, браться сразу за решение уравнений. Так же и фреймворк, вроде Симфони, его будет очень тяжело осваивать без базовых знаний.
Кушать-то надо что-то.
Только классика не стареет
В той книге реально устаревший подход. Часть кода оттуда просто не запуститься, либо будет ругаться депрекейтедами.
В добавок после этой книги придется почти с нуля переучиваться на современный инструментарий разработки.
Хотите основ - возьмите свежую php 7.4, туториал по ней и играйтесь на здоровье. Зачем сразу в легаси лезть?
$a = 3; - записывает 3 в область памяти, выделенную под $a
$b = &a; - $b теперь указывает на ту же область памяти, что и $a, где хранится 3
$a = 4; - в эту область памяти записывается 4
print $b; - выводит содержимое этой области памяти на экран
$a =3;
$b = $a;
$a = 4;
echo $b;
будет 3 тк значение $a поменялось уже после выполнения $b = $a; и $b было УЖЕ присвоено 3
а в функциях что бы поменять переданную переменную и вернуть новый результат в код снаружи.
я правильно понял?
Ну давай разберем по частям тобой написанное.
>Вот пример передачи зависимостей классу-валидатору
public function __construct(UserTableGateway $userTableGateway) { ... }
public function setLogger(Logger $logger) { ... }
setLogger() это пиздец отвратительная практика. Это по сути и есть использование объекта как глобальной переменной. Я на такую хуйню насмотрелся. Где-то в коде используется логгер, а как он попал в объект и когда загадка. Через гидратор или через конфиг наебенили. Так потом еще и меняют этот логгер ебаный во время выполнения. Был такой, а стал сякой иди ищи где и нахуя, и не накроется ли все пиздой когда ты туда засунешь новый логгер.
>Registry и чем он плох
>Чем плох ServiceLocator
>Чем хорош DI container
А вот тут пиздежь чистой воды. Твой DI контейнер и есть и регистр, и сервис локатор. Твой пример с Pimple полностью повторяет предыдущие два. И тут все правильно, потому что DI контенер - это объект, способный находить или создавать другие объекты, который хранит в себе другие объекты.
Мы просто решаем, что на определенном уровне мы к нему не обращаемся. Обычно это где-то около контроллеров. Например контроллер мы получаем из DI контейнера, используя DI контейнер как сервис локатор, а все объекты, которые используются дальше должны быть заинжекчены в контроллер.
Возвращаясь к примеру выше. При использовании DI подхода логгер в принципе может попасть в наш контроллер только через конструктор, потому что для использования сеттера нужно сначала объект логгера где-то взять, а это либо DI контейнер и тогда мы превращаем его в сервис локатор, либо создать его на месте и тогда мы нарушаем принцип инверсии зависимостей.
Насчет инжекта декораторов очень мутная тема. В симфони это есть, но хоть немного сложный конфиг разбирать это пизда, получается код в коде, максимально уебанское использование метапрограммирования. Лучше фабрики использовать.
По поводу написания своего контейнера. Есть PSR-11, который описывает интерфейс. Ну а в целом это самый последний велосипед для джуна, что угодно будет проще накостылить чем вменяемый контейнер. Лучше взять готовое, как написано, симфони или пимпл и мозгу не ебать.
Ну давай разберем по частям тобой написанное.
>Вот пример передачи зависимостей классу-валидатору
public function __construct(UserTableGateway $userTableGateway) { ... }
public function setLogger(Logger $logger) { ... }
setLogger() это пиздец отвратительная практика. Это по сути и есть использование объекта как глобальной переменной. Я на такую хуйню насмотрелся. Где-то в коде используется логгер, а как он попал в объект и когда загадка. Через гидратор или через конфиг наебенили. Так потом еще и меняют этот логгер ебаный во время выполнения. Был такой, а стал сякой иди ищи где и нахуя, и не накроется ли все пиздой когда ты туда засунешь новый логгер.
>Registry и чем он плох
>Чем плох ServiceLocator
>Чем хорош DI container
А вот тут пиздежь чистой воды. Твой DI контейнер и есть и регистр, и сервис локатор. Твой пример с Pimple полностью повторяет предыдущие два. И тут все правильно, потому что DI контенер - это объект, способный находить или создавать другие объекты, который хранит в себе другие объекты.
Мы просто решаем, что на определенном уровне мы к нему не обращаемся. Обычно это где-то около контроллеров. Например контроллер мы получаем из DI контейнера, используя DI контейнер как сервис локатор, а все объекты, которые используются дальше должны быть заинжекчены в контроллер.
Возвращаясь к примеру выше. При использовании DI подхода логгер в принципе может попасть в наш контроллер только через конструктор, потому что для использования сеттера нужно сначала объект логгера где-то взять, а это либо DI контейнер и тогда мы превращаем его в сервис локатор, либо создать его на месте и тогда мы нарушаем принцип инверсии зависимостей.
Насчет инжекта декораторов очень мутная тема. В симфони это есть, но хоть немного сложный конфиг разбирать это пизда, получается код в коде, максимально уебанское использование метапрограммирования. Лучше фабрики использовать.
По поводу написания своего контейнера. Есть PSR-11, который описывает интерфейс. Ну а в целом это самый последний велосипед для джуна, что угодно будет проще накостылить чем вменяемый контейнер. Лучше взять готовое, как написано, симфони или пимпл и мозгу не ебать.
Нагибает все живое. Но работать с ним так себе удовольствие пока что.
Но , где-то у меня получается , а где-то нет , вот где не получилось внутрь зайти с помощью step into , там получилось с помощью force step into
В чем разница между ними ?
Можно подробнее пример, что именно не дополняет?
Ну и можешь настроить сам себе снипет дополнения, шторм достаточно гибок в настройке
но это мелкая придирка
Тут в любом случае будут кейсы, когда тебе нужен снипет под себя, а его нет ни в иде, ни в каких-то плагинах
Есть сайт на Опенкарте. Нужно переделать его под Вордпресс с Вукоммерсом. Сохранив полностью дизайн. Сколько это может стоить и сколько по времени займёт? Хотя бы примерно.
от 0 до бесконечности
> Где-то в коде используется логгер, а как он попал в объект и когда загадка.
Обычно использование инъекции через метод используется для необязательных зависимостей, которые могут отсутствовать. Поэтому тебе не важно, как он туда попал, главное, что он может быть, а может не быть. Но если хочется понять, как он туда попал, то можно воспользоваться функцией вроде "Find Usages" в IDE. Или поставить брейкпойнт и посмотреть стектрейс.
Соглашусь, впрочем, что работать с зависимостями, которые могут быть, а могут не быть, не очень-то удобно.
> Твой DI контейнер и есть и регистр, и сервис локатор.
Принципиальное отличие DI в том, что класс ничего не знает про контейнер, в то время как при использовании ServiceLocator класс знает о нем.
> При использовании DI подхода логгер в принципе может попасть в наш контроллер только через конструктор,
Нет, инъекция возможна не только через конструктор, но и через методы.
>>725255
Если ты используешь встроенный в PHP сервер, то просто указывается имя файла-роутера в командной строке. Если Апач, то через mod_rewrite запросы направляются на единственный скрипт, в php-fpm + nginx имя скрипта прописывается в конфиге Nginx.
>>725206
Да, для модификации параметров из функции, но такое использование лучше избегать, так как оно усложняет чтение кода. Вообще, ссылки лучше избегать.
>>723257
В качестве абстрактных методов, возможно, лучше было сделать методы вроде getBaseRate(). Так как твой код обязывает реализовать метод setDefaults(), но не обязывает задавать в нем значения базовых величин.
Кстати, в 7.4 разрешили ставить типы у свойств классов, стоит это использовать.
> public function addEmployees(string $className, int $rank, bool $isBoss, int $count): void
Это не очень удачная конструкция, так как она не позволяет добавить произвольного работника. Представим, что мы завтра создали новый класс профессии, с конструктором с 4 аргументами. Твоя функция не умеет передавать в конструктор 4 аргумента, и не позволит создать такого работника. Логичнее делать метод вида addEmployee(AbstractEmployee $e), которая позволяет добавить любого работника, если он унаследован от базового класса.
Да и не задача Департамента создавать работников, он может нанимать уже созданных.
> //Возвращает сотрудников c переданным рангом из переданного массива
> public function getEmployeesByRank(int $rank, array $employees): array
Эта функция странная. Если она получает список работников снаружи и не использует свойства департамента, то что она в нем делает? Она же не относится к нему никак. Надо поместить ее куда-нибудь в другое место, например, класс EmployeeUtil или CompanyUtil (вспомогательные методы для работы с сотрудниками). Создавать работников или департаменты лучше отдельно.
> //Повышает ранг сотрудников из переданного массива на единицу
> public function increaseEmployeesByRank(array $employees, float $percent): void
Эта функция очень специфичная и заточенная под антикризисные меры. Все, что к ним относится, логичнее поместить в отдельный класс АнтикризисныйКомитет. У каждого класса должна быть своя зона ответсвенности, а у тебя код для антикризисных мер размазан по разным классам. Плюс, если ты для каждой новой задачи будешь добавлять методы в Департамент, он превратится в монстра - God Object, а это плохо.
Лушче сделать зоной ответственности Департамента управление списком сотрудников, без антикризисных мер или создания сотрудников.
В Департамент можно добавлять методы, но они должны быть в его зоне ответственности. Например, метод "отобрать Работников по фильтру" или "назначить босса" или "уволить сотрудника" - это подходит. Это универсальные методы. А "уволить часть инженеров из-за кризиса" - явно нет.
> public function applyMeasure1(Company $company): Company
Тут слишком большая глубина отступов. Тяжело такое читать. Также, тут проще исключить босса из кандидатов на увольнение с помощью array_filter + анонимная функция, и отобрать 40% с помощью array_slice.
Вообще, можно было сделать примерно так:
- отбираем кандидатов на увольнение по условию вроде fn($e) => $e instanceof Engineer && !$e->isBoss(). Удобно использовать анонимные стрелочные функции как критерий отбора.
- сортируем по рангам
- берем 40% с помощью array_slice
- увольняем
Код будет более линейный и простой.
Для замены босса логично было бы добавить метод в Департамент (setBoss()), а не менять статусы вручную.
Так, для начала неплохо, но надо бы разобраться с зонами ответственности классов и четко понимать, какой метод куда надо добавить. На этой задаче как раз можно этому учиться.
Дальше стоит делать ООП-Гостиницу, наверно.
>>723257
В качестве абстрактных методов, возможно, лучше было сделать методы вроде getBaseRate(). Так как твой код обязывает реализовать метод setDefaults(), но не обязывает задавать в нем значения базовых величин.
Кстати, в 7.4 разрешили ставить типы у свойств классов, стоит это использовать.
> public function addEmployees(string $className, int $rank, bool $isBoss, int $count): void
Это не очень удачная конструкция, так как она не позволяет добавить произвольного работника. Представим, что мы завтра создали новый класс профессии, с конструктором с 4 аргументами. Твоя функция не умеет передавать в конструктор 4 аргумента, и не позволит создать такого работника. Логичнее делать метод вида addEmployee(AbstractEmployee $e), которая позволяет добавить любого работника, если он унаследован от базового класса.
Да и не задача Департамента создавать работников, он может нанимать уже созданных.
> //Возвращает сотрудников c переданным рангом из переданного массива
> public function getEmployeesByRank(int $rank, array $employees): array
Эта функция странная. Если она получает список работников снаружи и не использует свойства департамента, то что она в нем делает? Она же не относится к нему никак. Надо поместить ее куда-нибудь в другое место, например, класс EmployeeUtil или CompanyUtil (вспомогательные методы для работы с сотрудниками). Создавать работников или департаменты лучше отдельно.
> //Повышает ранг сотрудников из переданного массива на единицу
> public function increaseEmployeesByRank(array $employees, float $percent): void
Эта функция очень специфичная и заточенная под антикризисные меры. Все, что к ним относится, логичнее поместить в отдельный класс АнтикризисныйКомитет. У каждого класса должна быть своя зона ответсвенности, а у тебя код для антикризисных мер размазан по разным классам. Плюс, если ты для каждой новой задачи будешь добавлять методы в Департамент, он превратится в монстра - God Object, а это плохо.
Лушче сделать зоной ответственности Департамента управление списком сотрудников, без антикризисных мер или создания сотрудников.
В Департамент можно добавлять методы, но они должны быть в его зоне ответственности. Например, метод "отобрать Работников по фильтру" или "назначить босса" или "уволить сотрудника" - это подходит. Это универсальные методы. А "уволить часть инженеров из-за кризиса" - явно нет.
> public function applyMeasure1(Company $company): Company
Тут слишком большая глубина отступов. Тяжело такое читать. Также, тут проще исключить босса из кандидатов на увольнение с помощью array_filter + анонимная функция, и отобрать 40% с помощью array_slice.
Вообще, можно было сделать примерно так:
- отбираем кандидатов на увольнение по условию вроде fn($e) => $e instanceof Engineer && !$e->isBoss(). Удобно использовать анонимные стрелочные функции как критерий отбора.
- сортируем по рангам
- берем 40% с помощью array_slice
- увольняем
Код будет более линейный и простой.
Для замены босса логично было бы добавить метод в Департамент (setBoss()), а не менять статусы вручную.
Так, для начала неплохо, но надо бы разобраться с зонами ответственности классов и четко понимать, какой метод куда надо добавить. На этой задаче как раз можно этому учиться.
Дальше стоит делать ООП-Гостиницу, наверно.
>Если ты используешь встроенный в PHP сервер, то просто указывается имя файла-роутера в командной строке. Если Апач, то через mod_rewrite запросы направляются на единственный скрипт, в php-fpm + nginx имя скрипта прописывается в конфиге Nginx.
Спасибо. Я вообще в правильно направлении иду? Во фреймворках также все сделано?
>Но если хочется понять, как он туда попал, то можно воспользоваться функцией вроде "Find Usages" в IDE. Или поставить брейкпойнт и посмотреть стектрейс.
Нихуя ты простой. Нашел ты использования. В трех местах в коде через setLogger() устанавливается логгер ЯВНО. А есть такая тема как гидрация. Когда специальный сервис дергает сеттеры и передает туда что нужно НЕ ЯВНО, например из конфига.
Я говорю о ситуации когда тебе нужно передать в метод setLogger() свой логгер. Ты не знаешь есть ли там уже логгер и не знаешь что будет если ты его заменишь. Не бывает "не обязательных зависимостей" зависимость либо есть, либо её нет. Еще пиздецовее все становится, когда есть еще и геттер. Тут уж вообще хуй поймешь куда этот логгер попадет в итоге. А решается это именно инекцией через конструктор.
Если ты так пишешь, то земля те пухом, но не надо рассказывать что это нормально. Это прямой антипример использования DI контейнера.
>Принципиальное отличие DI в том, что класс ничего не знает про контейнер
Это не отличие самого DI контейнера. Для того чтобы заинжектить зависимости тебе нужно получить исходный объект из контейнера. Используя его как сервис локатор. Ты тут вообще противоречий не видишь?
>Нет, инъекция возможна не только через конструктор, но и через методы.
Кек. А где ты возьмешь объект логгера чтобы передать его в метод контроллера? Ведь "класс ничего не знает про контейнер".
<script src="https://ideone.com/e.js/LmgZhF" type="text/javascript" ></script>
Он выводит список всех таблиц sql и пытаюсь сделать, чтобы рядом с каждым результатом была кнопка,которая будет выполнять открывать необходимую таблицу подробно. Соответственно кнопка должна быть внутри цикла, но конструкция выше разумеется работать не будет. Оно понятно почему, я для наглядности. А вот как сделать правильно?
Решено
Не очень понимаю как по дефолту инъекция зависимостей в контроллере работает
вопрос тут :
https://ideone.com/ym1SKh
Когда научусь обходиться без)) Я в php нубяра (как в прочем и везде) и поэтому возникает много вопросов) А код ужасен до безобразия))) Как будто кто то просто охапку дров кинул и крикнул "Работай!"
Поверь, тебе не зря советуют не мешать пхп и хтмл, гугли MVC.
А вообще троллей полон тред, это наверное змееебы, пэха их выдавливает из вэба.
>пэха их выдавливает из вэба
Он в целом пыхе в вебе не угрожал никогда и не угрожает пока что. Кое что делается, но слишком мало, чтобы о какой-то конкуренции вообще говорить.
Ах да, я змееб.
Ну не для моих задач. Мои задачи просты и не требуется городить огород. Хотя, думаю, к этому я приду самостоятельно, через какое то время)
Этот самый огород в виде разделения слоев приложения сократит число проблем при разработке и отладке.
Даже в рамках одного файла можно это сделать, выделить часть под работу с бд, часть под шаблон, часть под логику
>нужно передать в метод setLogger() свой логгер. Ты не знаешь есть ли там уже логгер и не знаешь что будет если ты его заменишь.
А что даже в теории может быть? Логгер логгирует, ну перестанет в одно место логгировать, начнет в другое.
>Не бывает "не обязательных зависимостей" зависимость либо есть, либо её нет.
Хуя, ты скозал? Логгер как раз один из немногих примеров не обязательных зависимостей, если он никак не влияет на работу класса, то он может быть, а может и не быть, похуй вообще. То что в самом классе может не быть проверок на null, это уже не ко мне вопросы
> тебе нужно получить исходный объект из контейнера. Используя его как сервис локатор.
Скажи мне что плохого в том чтобы дергать из контейнера объекты прямо в контроллере?
>А что даже в теории может быть? Логгер логгирует, ну перестанет в одно место логгировать, начнет в другое.
Речь о подходе. Когда у тебя весь код так написан пиздец полный. А я такое видел не раз. Ирония в том, что инъекция зависимостей для того и нужна что бы с этими проблемами бороться. А чел начал статью про DI, и тут же наебенил говна.
>Хуя, ты скозал? Логгер как раз один из немногих примеров не обязательных зависимостей
Кароч открываешь свой класс, там в самом начале блок namespace и use. Так вот все что в блоке use это зависимости. Если любого из классов прописанных в use не будет, то твой код просто не будет работать.
>Скажи мне что плохого в том чтобы дергать из контейнера объекты прямо в контроллере?
Нахуй ты меня спрашиваешь? Ты спроси типа, который написал что "класс ничего не знает про контейнер, в отличие от сервис локатора". Я то как раз пишу что это отличие именно в том где мы перестаем дергать контейнер. Договорились в контроллере, значит ок, только в контроллере. Договорились на унылый секс в два ночи, значит дергаем в домене.
Такая задачка.
Есть таблица sql "table1" В ней есть поля id, name, code, normal.
Как оформить поисковой запрос sql, чтобы он дал мне значение из поля 'name' соответствующее известному значению и записаному в переменную $det из поля 'code'. Полученное значение я должен так же записать в переменную, чтобы использовать в следующем sql запросе. Сейчас запросы выглядят так и дают фатал, mysqli_result не может конвертировать запрос тот, что с переменной $add.
$link и $link2 соответствуют подключением к разным базам. Да, эти таблицы в разных бд.
Переменные $det и $score абсолютно рабочие и проверены, sql запрос к table2 с ними нормально работает.
https://pastebin.com/HpHPDMm9
Сам решил))
сразу скажу что движок - битрикс
Продолжение вот этого.
Все здорово, скрипт аккуратно в табличку выводит список таблиц, рядом с каждым есть кнопочки важные.
А теперь я пытаюсь записать что то в эти таблицы, но как мне идентифицировать нужную таблицу при вызове INSERT INTO?
Взяв {$row[0]}\n из этого скрипта https://ideone.com/e.js/LmgZhF я получил INSERT INTO {$row[0]}\n SET... и так далее. Такая конструкция работает только для первой таблицы. В какую сторону копать? Как сделать имя таблицы из переменной имея только вывод всех таблиц через цикл while?
Спасибо большое что проверил, у меня еще есть несколько вопросов:
> В качестве абстрактных методов, возможно, лучше было сделать методы вроде getBaseRate(). Так как твой код обязывает реализовать метод setDefaults(), но не обязывает задавать в нем значения базовых величин.
Как понимаю он должен так выглядеть:
public function getBaseRate(): float{
return 800;
}
Меня смущает то, как потом менять значение ставки. Просто изменять этот метод?
> Да и не задача Департамента создавать работников, он может нанимать уже созданных.
А разве там не требуется применять принцип композиции, у нас же работники не могут существовать отдельно от Департамента?
> Также, тут проще исключить босса из кандидатов на увольнение с помощью array_filter + анонимная функция, и отобрать 40% с помощью array_slice.
>Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
Как я понял из условия 40% мы берем от всех инженеров в не зависимости от того является он боссом или нет. Например, у нас 11 инженеров в департаменте и 1 из них босс, тогда ceil(11 0.4) = 5 инженеров на увольнение, а если перед этим убираем босса, тогда ceil(10 0.4) = 4 инженера на увольнение. Или я не правильно понял условие?
Хуйню пишешь.
Без своих велосипедов - ты даже не "оператор" фреймворка, ты дно.
Вот тебе и лицо современного вкатывания в ойти. Можно разве что порадоваться тому что если большая часть вкатывальщиков так мыслят как ты излагаешь - то все у людей которые стараются глубже понимать то на чем работают - все будет хорошо.
Зачем писать свой фреймворк, когда у тебя перед галазами исходники современного фреймворка. Бери, да ковыряйся, было бы желание
Я хуею с таких программистов.
А учиться программировать ты как будешь? Конкретно код писать, думать, искать решение?
Если ты думаешь что до маня-сеньора ты вырастешь когда прочтешь все исходники Симфони?
Программист растет только когда код пишет. Он думать учиться в нужном русле.
> Symfony 3/Doctrine 2
уже 5.1
В каждой фирме на работе свой фреймворк пишут? Или другой опенсорс?
Бизнес задачи и так дают подумать, если это что-то сложнее круда, нужен какой-то фоновый процессинг, свои модули писать, микросервисы. По структуре задачи схожи с написанием фреймворка, по сути - другая предметная область.
Так мб стоит учиться более релевантному программированию, а не изобретать очередной велосипед?
>>В каждой фирме на работе свой фреймворк пишут? Или другой опенсорс?
В некоторых пишут. Твое "релевантное программирование" это какой то маня мирок. Ты и на фреймворке нихуя толкового не сможешь написать с таким подходом.
Твое дела конечно, но ты меня успокаиваешь - конкуренции от таких как ты не будет явно.
п.с.
в одной конторе было тестовое задание - простой блог, MVC, классы, роутер, контейнер, пагинация и валидация - все самостоятельно необходимо было написать на чистом пхп.
>Твое дела конечно, но ты меня успокаиваешь - конкуренции от таких как ты не будет явно.
Наверно уже 10ый фреймворк на работе пишешь.
Никак вы блядь не научитесь. Фреймворк это просто набор сервисов. Конфигурация, роутинг, DI контейнер, event loop, HTTP, ORM, кэш итд. Пиздец у тебя понимание работы приложения. Берешь symfony/config , eloquent, pimple, guzzle, FastRouter и вот у тебя уже получился твой собственный фреймворк.
Ебать ты тупой конечно.
Вместо очередного роутера, ди контейнера или ивентлупа, можно написать какой-нибудь полезный сервис к своему пету, на работе пригодится.
Зачем велосипедить компоненты фреймворка, если это максимум полезно для понимания его кишков?
Ну серьезно, это очень узкая ниша и идут туда явно не те, кто начинал своё знакомство с разработкой с php.
Ты в моем посте где вычитал слово "велосипед", еблан? Это блядь что-то из разряда где родился, там и пригодился. Есть во фрейме ОРМ, значит её и используем.
Потом одни ебланы ищут программистов на ларавель, а другие руками разводят если в доке их фреймворка не написано как что делать.
Так ты успокойся, прими свои таблетки, дыши ровно.
Да, берем ОРМ, которая во фрейме, потому что нужно ВЧЕРА таску закрыть, и с ней проще макакам в цикле запросы делать.
Ебланы ищут программистов на ларавел, чтобы других ебланов не учить им пользоваться месяцами, а дать таску и ждать результата.
Ты какого-то странного мнения о php сообществе. Туда идут потому что легко войти и даже в 30+ можно заработать миску риса.
Тот ли ты стек выбрал?
>Да, берем ОРМ, которая во фрейме, потому что нужно ВЧЕРА таску закрыть
Ну так сиди на рисе и воде, формошлепь и не отсвечивай, пока умные дяди за тебя решают что и как в проекте использовать.
Так с апачем и не работает никто.
nginx берут, либо встроенный пыхосервер для локальной разработки
У тебя ярлыки по признаку инструмента.
Есть такое, большинство пхпшников дегенераты, спасибо куче инструментов, позволяющих писать рабочий код пуская слюни. Этот тред и выходцы с него подтверждают этот тезис в 9 из 10 случаев, хотя казалось бы тут обучиться довольно просто. Но немало встречается и умных опытных разрабов. Собственно почти все опытные, кто активно на пхп сидит, берут его осознанно ради буста к скорости разработки и поддержки. Привычка и контроль, на чем больше всего писал - на том чуть лучше и выходит. Мелочь, а приятно. При этом у всех когда-то были или есть проекты и на других стеках, с которыми они свободно работают (самому на питоне, жсе, руби, шарпе, джаве, го и эликсире довелось поработать, а ведь я всего 8 лет в теме).
Пришлось написать несколько мелких фреймов, один из которых на питоне. Вынужденно, такой пиздец на проектах попадался, что туда готовое не взять без полной переписки, а только аккуратными мелкими фичами апать код. Помогает во вполне обычных рабочих задачах, как видишь.
Тоже попадалось тестовое с написанием своего фрейма на пхп без зависимостей. Да, делается за вечер. Можно по гайду накопипастить, можно не по гайду, скорее всего на плагиат чекать не будут. Я делал сам в тот раз, так всегда пользы больше.
После всего этого любой вебфрейм для меня открытая книга. Очень помогает, со стыдом вспоминаю те времена, когда воевал с фреймворками из-за собственного невежества (и как водится был дохуища выебистым первые годы). Код фреймов читал офк, как и всю доку, но без собственных велосипедов это давало только ложное ощущение понимания.
Считаю, что по хорошему надо брать слим, а не эти ваши ларки, особенно новичку, и подтягивать что сам хочешь к нему, выстраивая по быстрому именно то, что нужно и не больше. Контроль - это хорошо. Когда позволительно - лучше так делать.
Так я вот к чему - если ты не хочешь выполнять учебную задачу, то зачем других то отговаривать? Для обучения это прекрасный опыт (в современных реалиях вообще возвышающий тебя над толпой фреймворкнейм-кнопокдавов), даже если выкинешь все на помойку. Можно работать и без этого, да, как многие и делают, особенно в первый раз.
Ничем велосипедирование своего учебного фрейма не отличается в худшую сторону от прочих учебных задач, так что с этим так же как и с остальным - пропускать можно ценой пробела в знаниях.
Ну и напоследок - из всех самых прошаренных знакомых разрабов нет ни одного, кто бы не мог набросать неплохой микрофрейм из головы за вечер-два. Да впринципе многие из них и небольшой язык/бд/подобие ос могут набросать. Развитие не заканчивается с получением работы, а чтобы получить понимание темы, которое уже никогда не выветрится, надо тему повелосипедить самому, никак иначе.
У тебя ярлыки по признаку инструмента.
Есть такое, большинство пхпшников дегенераты, спасибо куче инструментов, позволяющих писать рабочий код пуская слюни. Этот тред и выходцы с него подтверждают этот тезис в 9 из 10 случаев, хотя казалось бы тут обучиться довольно просто. Но немало встречается и умных опытных разрабов. Собственно почти все опытные, кто активно на пхп сидит, берут его осознанно ради буста к скорости разработки и поддержки. Привычка и контроль, на чем больше всего писал - на том чуть лучше и выходит. Мелочь, а приятно. При этом у всех когда-то были или есть проекты и на других стеках, с которыми они свободно работают (самому на питоне, жсе, руби, шарпе, джаве, го и эликсире довелось поработать, а ведь я всего 8 лет в теме).
Пришлось написать несколько мелких фреймов, один из которых на питоне. Вынужденно, такой пиздец на проектах попадался, что туда готовое не взять без полной переписки, а только аккуратными мелкими фичами апать код. Помогает во вполне обычных рабочих задачах, как видишь.
Тоже попадалось тестовое с написанием своего фрейма на пхп без зависимостей. Да, делается за вечер. Можно по гайду накопипастить, можно не по гайду, скорее всего на плагиат чекать не будут. Я делал сам в тот раз, так всегда пользы больше.
После всего этого любой вебфрейм для меня открытая книга. Очень помогает, со стыдом вспоминаю те времена, когда воевал с фреймворками из-за собственного невежества (и как водится был дохуища выебистым первые годы). Код фреймов читал офк, как и всю доку, но без собственных велосипедов это давало только ложное ощущение понимания.
Считаю, что по хорошему надо брать слим, а не эти ваши ларки, особенно новичку, и подтягивать что сам хочешь к нему, выстраивая по быстрому именно то, что нужно и не больше. Контроль - это хорошо. Когда позволительно - лучше так делать.
Так я вот к чему - если ты не хочешь выполнять учебную задачу, то зачем других то отговаривать? Для обучения это прекрасный опыт (в современных реалиях вообще возвышающий тебя над толпой фреймворкнейм-кнопокдавов), даже если выкинешь все на помойку. Можно работать и без этого, да, как многие и делают, особенно в первый раз.
Ничем велосипедирование своего учебного фрейма не отличается в худшую сторону от прочих учебных задач, так что с этим так же как и с остальным - пропускать можно ценой пробела в знаниях.
Ну и напоследок - из всех самых прошаренных знакомых разрабов нет ни одного, кто бы не мог набросать неплохой микрофрейм из головы за вечер-два. Да впринципе многие из них и небольшой язык/бд/подобие ос могут набросать. Развитие не заканчивается с получением работы, а чтобы получить понимание темы, которое уже никогда не выветрится, надо тему повелосипедить самому, никак иначе.
>У тебя ярлыки по признаку инструмента
Из всех знакомых, кто пишет на пхп, большая часть макаки крудоклепатели, боятся лишнюю папку или файл создать без указки тимлида, пихают код в контроллеры и т.д. и т.п.
Даже не представляю, где сидят те умные дяди, которые осознанно выбрали пхп среди альтернатив и пишут на нем хорошие поддерживаемые вещи. Наверное таких 1 на 10000 макак.
>берут его осознанно ради буста к скорости разработки и поддержки
>по хорошему надо брать слим, а не эти ваши ларки
Сначала ты говоришь про буст скорости разработки на пхп. Потом предлагаешь брать слим... Ты уж определись.
>Так я вот к чему - если ты не хочешь выполнять учебную задачу, то зачем других то отговаривать?
Пусть пишут свой фреймворк, мб додумаются стек сменить, пока не поздно.
>Для обучения это прекрасный опыт (в современных реалиях вообще возвышающий тебя над толпой фреймворкнейм-кнопокдавов
Херочке будет очень интересно послушать, какой ты фреймворк написал на коленке за вечер. А на вопросе про коммерческий опыт с фреймворк-нейм пук-перезвоним.
Порофлить с дегенератов, которые вместо развития скила планируют формы писать до старости.
Иди развивайся, пиши свои фреймворки, вон драйверы на пхп попиши. Что ты тут забыл?
Ты в прошлом посте спрашивал уже, а я тебе уже ответил. Ты давай обтекай, да смари мозги не перетруди. Тебе в понедельник шаблон на вордпресс натягивать.
Да, да, мне шаблон натягивать, а тебе в очередной раз врать мамке, как ты вот щас щас найдешь работу хаскелистом, уплетая её борщец.
Так-то борщец вкуснее чашки риса. А любящая мать лучше формошлепов собутыльников без перспектив.
не понимаю иронии? В больших компаниях, к примеру, с микросервисной инфраструктурой, даже проще и лучше, компетентно написать ядро фреймворка, но на это надо чуть больше времени и денег. За то в результате будет работать все очевидно и понятно, а не так как ваш всратый рад ларавел, у которого везде магия и в случае пиздеца, только в трейсе дебага можно что-то понять.
>с микросервисной инфраструктурой
Лол, ну ты точно из 2017. Именно тогда все писали свои микросервисные фреймворки и обещли 9000% прироста всего подряд, как только раздолбают проклятый монолит.
ну же, аноны, никто не подскажетт в каком направлении двигаться чтоли?))
Бля, я конечно понимаю что на пхп пишут не гении далеко, сам такой. Но блядь таких вырожденцев и дегенератов я больше нигде не видел. https://www.php.net/manual/en/language.oop5.decon.php
я это уже читал и всегда читаю.
но объяснение там часто сухое или сильно сжатое и я не всегда врубаюсь
Кароч я поржал и понял что был груб. Сорян если обидел, но бля чтец ты пиздец конечно. В качестве извинений могу рассказать тебе про ооп в приватной обстановке. Если конечно осилишь попасть в канал https://дискорд.gg/3aVySY6
я просто сегодня много читал про конструктор на английском
Наверно, ты забыл фигурные скобки: echo "city: {$this->city}";
Также, ты можешь вывести содержимое объекта с помощью var_dump($this);
про фигурные скобки я не знаю
1 это когда параметр в скобочках(но там внутри класса дохера писать функций на каждую переменную)
2 который я в основном видел через знак присвоения
и какой из них популярный?
и так работает
Ну конечно можно. Но если ты не можешь догадаться подставить d i s c o r d вместо дискорд, то у меня для тебя плохие новости.
Любой может ошибиться и не так написать название функции. Это не повод самоутверждаться в треде для начинающих, и это лишь показывает твою токсичность.
Вот скрипт выдал мне все нужные значения из таблицы. А как теперь эти значения запихивать в переменную?
Если я беру просто $row, то в переменной лежит только первое значение, а как мне перезаписать переменную, чтобы там оказалось второе значение? А четвертое значение?
Существует такая библиотека на просторах PHPExcel.php, но она может загрузить excel только в пустую таблицу, а надо в готовую. Это вообще возможно?
Аннотации как часть кода используются давно (Доктрина, Symfony Validator, Serializer), но сейчас их пишут в комментариях (в стиле @ORM\Table). То есть для интерпретатора это просто строка, которую он игнорирует, и код использует специальные парсеры для их извлечения из исходного текста.
Логично сделать их частью языка, чтобы PHP их читал и проверял, а также IDE и статические анализаторам было проще с ними работать.
Ну это прогиб под них какой то, тот же eloquent не пользует их и живёт спокойно. Ну лучше ли оставить доктирну самой разбираться с этими атрибутами.
Есть какое то применение не связанное с этими библиотеками?
так а нахуй ты переменные public делаешь и затем их через констракт меняешь? делай их private/protected и пиши констракт. это называется инкапсуляция вроде
создаешь пустой массив, циклом проходишься for с шагом в 2 и добавляешь через array_push туда свое значение. если я тебя правильно понял
То, что ты сказал, называется хуйня.
Бамп.
Сложный вопрос. Обычно их применяют, чтобы контролировать доступ к свойству в одном месте. Например, при наличии сеттера мы можем делать проверку и запрещать присваивать свойству некорректные значения. Но, возможно, где-то можно обойтись и без этого.
>>727419
Не очень хорошо, что у тебя указывается в 2 местах запас банкнот - неудобно будет его менять.
$arrayValues - неудачное название, лучше $combination.
В общем, решено верно. Можно, конечно, было бы еще пооптимизировать код - например, не выдавать такие комбинации купюр, которые заведомо больше суммы. То есть при сумме 1000 не выдавать комбинации, где есть 2000-е купюры и не выдавать более 4 500-х купюр. Дальше можно еще больше оптимизировать код и выдавать сначала наиболее вероятные комбинации. Например, для суммы 6600 и 2000-х купюр сначала выдавать 3x2000, потом 2x2000 ... 0x2000
В общем, ты движешься в правильном направлении, но многое надо улучшить.
Ты зря прямо в функцию вписал варианты слова - рубль/рублей. Лучше их передавать снаружи, чтобы функция могла работать с любыми словами. Также, условие выбора слова переусложнено, там не нужен цикл. Числа делятся всего на несколько групп: заканчивающиеся на 11-19, на 1, на 2-3 или на 5-0.
Также, текст надо нормально выровнять, тяжело читать.
>>728174
> Меня смущает то, как потом менять значение ставки. Просто изменять этот метод?
Можно в конструкторе Employee вызвать функцию getBasePay() и записать значение в свойство $basePay, например. И его менять.
Вообще, делать сотрудников разных классов не самая лучшая идея. Ведь они не могут тогда менять должность. Логичнее было бы сделать один класс для сотрудника, и несколько разных классов-должностей.
> А разве там не требуется применять принцип композиции, у нас же работники не могут существовать отдельно от Департамента?
Можно бы и так, но неудобно будет добавлять новые классы работников, у которых, например, конструктор принимает другие аргументы.
> Как я понял из условия 40% мы берем от всех инженеров в не зависимости от того является он боссом или нет.
Можно вычислить число увольняемых, исключить из массива босса, и после этого делать array_slice(). Но можно конечно и обычным циклом идти, пока не наберется нужное количество.
>>717786
Ты можешь открыть мануал и сам сравнить.
>>671057
Аноны, написал тут функцию для подсчета количества купюр, из предлагаемой суммы. Оцените, насколько сильно это говнокод.. Можно добавлять новые купюры, очко не ломается.
https://ideone.com/pEESRH
Это копия, сохраненная 5 сентября 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.