Это копия, сохраненная 11 марта 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Да, в нашем треде отвечают почти на все вопросы, только бампайте каждые 5 дней. И не разводите флуд, если вам скучно, лучше сходите померзните на улице, например.
Это тред для начинающих. Не способен сам переустановить Windows и имеешь тройку по математике? Ты наш человек.
Предыдущий тред был тут: >>1305368 (OP) . Остальные треды есть в архиве: https://phpclub.tech/ (там есть поиск, так что можно легко найти обсуждение какой-то задачи или ответы на свой старый пост) или ищутся в гугле по словам "клуб изучающих php" и в архиваче.
Мейлач лежит, модератор зверствует? Есть запасной тред на доброчане: /s/res/23225.xhtml#i46467
Форматируй свой код, если хочешь, чтобы его читали (как, написано во втором посте).
Правила: ведем себя воспитанно, помогаем новичкам, читаем учебники, решаем задачки, постим ссылки на решения, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 2-3 дня, у него мало времени, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время. Но в треде немало анонимных экспертов разного уровня, так что вряд ли вопрос останется без ответа.
С чего начать
У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не читайте, не сохраняйте, не запоминайте его, он временный). Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то можно начать с него. Он простой и понятный. Там есть задачи, их нужно решать (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению. С другой стороны, если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Visual Studio Code, Netbeans PHP или PhpStorm (с ним будет удобнее).
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.
Надо переходить к более серьезным задачкам, которые научат тебя всему этому.
- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony 3/Doctrine 2
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md
Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра. Также можно начинать смотреть фильмы и видео на английском.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
- Новости IT на англ. https://news.ycombinator.com/
- какой-то древний, устаревший, но большой и на русском справочник по веб-разработке, посоветованный аноном: https://starcat.dp.ua/doc/wdh/
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.
Платиновые вопросы
- Почему PHP? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу.
- Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-2-coding-style-guide.md
Кроме этого, я в прошлом треде ответил на все вопросы, проверил все задачки. Зайдите и посмотрите, если вы что-то спрашивали: >>1305368 (OP)
Если вас пропустили, напомните о себе в этом треде.
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
АЛЛИЛУЙЯ
Хочешь сказать, что ООП и паттерны это самое важное в программировании, верх мастерства разработчика?
В том виде, в котором это существует сейчас - да, антипаттерн, дешевый понт, не являющийся чем-то выдающимся, хотя адепты поют об обратном. Современное ООП и паттерны - не более чем лозунги, а кто им следует - не более чем сектанты. Потому что оно ничего выдающегося из себя не представляет, с точки зрения грамотного инженера, но хайп такой огромный, как будто это лучшее изобретение человечества.
Так никто и не говорит про современное оопэ, где пишут процедурный код в классах. Я лично читаю старые книжки 20 века и черпаю идеи оопэ оттуда. Вот это действительно годнота, вот тогда реально умели люди программировать.
>>31396
КАКАЯ НАХУЙ РАЗНИЦА, КТО КАК ПИШЕТ???
Люди, программисты, составляют договоренности по написанию кода. Так рождаются конвенции. Им нравится так писать, здесь нет правильного или неправильного подхода, как у врачей, здесь царит полная свобода действий.
А всякие сектанты, как вы, навязываете людям, которым удобно писать в стиле ООП, свою маниакальную идею отказа от современного ООП в угоду хуй пойми чему. Что вы забыли в треде языка, который может писать любыми способами? Идите в джаву и сисярп навязывайте свое мнение этим лохам, у которых в основе языка уже ООП-подход.
Ну попробуй откажись от активрекорда или датамапера или или адаптеров в любой dbal или фасадов в ларавеле, от декораторов которые используются повсюду, от эвентлисенеров.
По-русски можно? Ненавижу проггеров за то, что они смешивают инглиш и русиш. Учись, блять, разговаривать на русском, а не на неологизмах.
Идея ООП изначально была глупой. Алан Кей же был биологом, и еще очень любил громкие высказывания, якобы он все понимает лучше других. В математике насколько мне известно он ничего не открыл. Из этого следует, что у него была прочная профессиональная деформация в сторону биологии. Биология имеет мало общего с техническими науками, и инженерией. Но Кей все равно решил скрестить бульдога с носорогом. И насколько мне известно не реализовал свои громкие заявления. Его модель ООП так и осталась никому не известной, но из-за него появились другие модели, которые еще более провальны.
Поэтому книги по ООП, старые или новые, априори содержат в себе чепуху. Так как сама идея чепуха, а реализация еще хуже. И не стоит забывать, что ООП на классах не единственная модель. Есть еще прототипное ООП из языка Self, и якобы тру-модель из языка Smalltalk, которая потом (в Smalltalk-80 и далее, а может чуть раньше) тоже была сильно извращена.
Разница в том, что грамотного инженера сразу видно по темам, которые его интересуют. Если интересуется паттернами и ООП, значит априори кодер без знаний математики, без желания осваивать науки, без способности отличать хорошее от плохого. Человек вроде тебя, громкие истерики с матами, нежелание учиться, и т.д. и т.п.
Что ты сказать хотел? То что есть некий activerecord не означает, что ООП и паттерны это центр вселенной. Подходы могут быть и другие, не основанные на ООП, на объектах, и т.д. Ты цепляешься за слова, не понимая их сути. Ведь что такое объект? Вопрос не простой. Кто сказал, что объект это экземпляр класса? В ФП языках функции - объекты.
То есть, пересматривая ООП, нужно пересматривать и все термины. Потому что они уже как паразиты.
То что ты пишешь, можно назвать "Гради Буч головного мозга". Красивые термины, много слов, а смысла под ними никакого. Просто заучил и все. Это глупость, антинаучно, не может инженер быть таким, как обезьяна повторять одно и тоже. Он должен уметь мыслить.
Да давайте в пхп треде филиал рентв устроим! Идея ООП глупая. Альберт Эйнштейн мошенник. Древние гиперборейцы умели летать в стратосфере. Как лечить геморрой огурцами...
Обезвоженный вариант твоего поста: "мне не нравится ООП".
А почему, знаешь? Ты не привел еще ни одного доказательства того, что ООП это говно. Нет никаких тру в программировании и проектировании. Для компьютера это всего лишь единицы и нули. А проекты пишут люди так, чтобы им было удобно. Если бы идея ооп была говном, она бы уже давно провалилась, как ты выразился.
>>31411
Я вообще считаю, что программа (любая) должна иметь одну точку входа и одну точку выхода. Программа должна выполняться построково, линейно, без гото и прочей мешанины классов. Программа, которая находится в одном файле и каждая строчка выполяется последовательно - это идеальная программа. А то, как разрабатывают современные разрабы это спагетти ебаное, в котором разбираться придется не один месяц.
Да ладно его кормить. Он тут уже черт знает сколько времени подвывает круглосуточно.
>Если бы идея ооп была говном, она бы уже давно провалилась, как ты выразился.
Все наоборот. Глупые идеи всегда выстреливают, потому что умных людей, хорошо понимающих науку и инженерию единицы. Кто отвергнет ООП? Школьники, кодеры без образования? Только тот кто понимает математику, науку, и инженерию. Таких очень мало. Кто использует ООП? Все кому не лень. Но у них у всех есть общая черта, они не знают и не понимают математику. Так как не понимают математику, то не понимают и науку с инженерией в целом.
В математике никогда не бывает лишних абстракций. Поэтому она служит маркером для инженеров, показывая их уровень, и вообще предрасположенность к профессии. ООП полностью построено на идее множества абстракций, которые не решают никаких задач.
Математики и инженеры начала, середины, и немного конца 20-го века, были последними кто мог создавать шедевры. Делать вещи простые, компактные, функциональные, но без лишнего. Как пример Лямбда-исчисление Чёрча, и комбинаторная логика Шейнфинкеля-Карри. Кто из современных кодеров додумался до подобной идеи? Никто. Все только плодят бездумно лишние абстракции. Да еще и гордятся этим, задирают нос, думая что они умные.
>Я вообще считаю, что программа (любая) должна иметь одну точку входа и одну точку выхода. Программа должна выполняться построково, линейно, без гото и прочей мешанины классов. Программа, которая находится в одном файле и каждая строчка выполяется последовательно - это идеальная программа.
Не идеальная. Как тогда быть с параллельностью, если все линейно и построчно? В математических вычислениях нет течения времени, нет хранимого изменяемого состояния. А ты предлагаешь подход противополжный, где состояние будет постепенно изменяться, моделируя ход времени. Такие программы трудно параллелить, они ограничены по возможностям.
>Лямбда-исчисление Чёрча, и комбинаторная логика Шейнфинкеля-Карри
бесполезная хуета как впрочем и вся маняматика.
В математике нет параллельности. Соответственно, нет времени, которое бы эту параллельность имитировала.
>нет хранимого изменяемого состояния
Для этого и была придумана динамическая память.
>>31431
Глупые идеи выстреливают не потому что все люди долбоебы, а потому что эта идея этим долбоебам подходит. Ведь почему сейчас все пользуются ООП? Потому что эти паттерны решают задачи большинства людей. А непонятые гении, как ты, сидят на задворках науки и пытаются что-то кукарекать. Но нуда им до голоса со стороны параши.
>В математике никогда не бывает лишних абстракций.
>Все только плодят бездумно лишние абстракции.
Ну это вообще ПУШКА. Ты похоже не выспался совсем.
Вот так определяются быдло-кодеры.
Любое математическое вычисление можно распараллелить. Так как нет течения времени. Время не имитирует параллельность. Время течет едино, как оно может быть параллельным? Наоборот, когда есть течение времени как в императивных и ООП программах, становится сложно выполнять параллельные вычисления. А так как архитектура компьютера без параллельного выполнения не может уже выдать больше мощности, программы приходится параллелить.
>Для этого и была придумана динамическая память.
Что? О какой памяти идет речь? Я говорил о том, что изменяемое состояние не позволяет параллелить, и приносит много других ограничений. Это решается очень просто, декларативными языками программирования, а все манипуляции с состоянием происходят на уровне уже процессора, после трансляции кода из декларативного языка.
>Глупые идеи выстреливают не потому что все люди долбоебы, а потому что эта идея этим долбоебам подходит. Ведь почему сейчас все пользуются ООП? Потому что эти паттерны решают задачи большинства людей.
Вот именно, большинство это просто пользователи. Они пользуются не задумываясь. Создать свое они не могут, они не умеют этого делать. А других создателей уже нет. За последние годы ничего не создано нового. Все основы Computer Science были заложены в 20-ом веке. Те кто формировал CS уже умерли, либо уже не у дел.
>Ну это вообще ПУШКА. Ты похоже не выспался совсем.
Покажи что в математике является лишним. Это та сфера, где все создано и используется для решения задач. Ничего лишнего. В отличие от программирования.
Ты понимаешь принцип параллелизма? Это значит, что программа начала выполняться в одной точке, из которой вызвались еще две программы, например, подключение к двум базам данных, а может и не из этой, а из другой программы, и пока эти процессы не завершатся, программа не продолжит выполнение. Это два процесса, которые могут зависеть друг от друга, а могут и не зависеть. И вторая программа может ждать первую, когда она завершится. Вопрос времени налицо.
>>31449
> говорил о том, что изменяемое состояние не позволяет параллелить
Зачем по-твоему процессору кэш? Он ведь так же распараллеливает задачи и хранит временные данные, которые изменяются.
>бесполезная хуета как впрочем и вся маняматика.
Если бы не было математики, не было бы и программирования. Не было бы Лямда-исчисления, скорее всего не было бы и работ Тьюринга. Несколько математиков (Тьюринг, Чёрч, и другие) конкурировали между собой, поэтому родилось несколько фундаментальных основ программирования и вычислительной техники. Не будь конкуренции, у нас бы не было компьютеров.
Ты все запутываешь. Изменяемое состояние на уровне кода программы не позволяет просто и эффективно распараллелить. Потому что данные нужно как то синхронизировать. Если состояния нет, то и синхронизировать ничего не нужно. Поэтому ФП сейчас пошло в мейнстрим. Все ФП языки позволяют легко параллелить программы.
Причем тут кэш процессора? Кэш не параллелит, и не для этого вообще создан и используется.
Еще один быдло-кодер определился. С чего ты взял что я пишу на PHP? Это для начала, второй вопрос, чем PHP хуже других языков? Язык это инструмент. Грамотный инженер может писать код с помощью любого инструмента. Быдло-кодеру дай даже самый лучший инструмент, все равно он будет быдлокодить.
Не инструменты красят инженера, а инженер инструменты. Вот дадут тебе самый лучший язык, что изменится? Ты же так и будешь чепуху писать, называть всех дибилами, и писать говнокод.
Еще один порвался. Измельчал нынче программист. Даже позицию свою отстоять не может.
>Изменяемое состояние на уровне кода программы не позволяет просто и эффективно распараллелить.
Я тебе об этом и пишу. Есть два состояния: до распараллеливания и после него. В первом случае данные рассекаются на потоки и обрабатываются программой, во втором - данные синхронизируются и образуют единое целое. Такой принцип работает в видеокартах, например, и в ЦП.
А кэш нужен для того, чтобы эти переходные значения хранить. Я и не говорил, что кэш параллелил что-то.
Я могу писать почти на любом языке. Когда я был таким как ты, мне тоже не нравился PHP. В основном потому что такие как ты его поливают грязью. С опытом, увидев много других языков, я понял что язык это инструмент, и можно писать и на PHP в том числе. Все зависит не от инструмента, а от того кто его использует.
Назови 3-5 хороших языков по твоему мнению.
Ты говоришь об императивной модели, а я о декларативной. В ней все под другому. Посмотри на математические вычисления. В них в принципе нет состояния, а значит и синхронизации. Можно распараллелить любой кусов вычисления.
Вали нахуй отсюда, если бы ты знал что-то кроме жиквери и фреймворка пыховского, то ты бы тоже умел писать на всех языках. Ибо все языки, как бабы - одинаковые.
Зачем вообще смотреть на процессор? Есть ОС, которая дает абстракции процессов и прочего, есть язык программирования, который дает языковые абстракции. На этих уровнях нужно решать задачи. А на уровне процессора пусть решает ОС и компилятор.
Напрямую ты, конечно, не повлияешь на работу процессора, но сможешь сильно упростить ему жизнь, если оптимизируешь свой код. Компилятор - машинка простая, она все переведет в инструкции для проца, а ебстись с утечками какими-нибудь тебе. Поэтому важно знать работу проца, ящитаю.
>>31474
Я тебя понял. Мне как раз декларативная и не нравится тем, что там нельзя снаскоку понять, что происходит и сколько памяти затребует программа. При кажущейся краткости кода, куча неоптимизированных рекурсий может запросто засрать всю память. Собственно, как и циклы в импере, поэтому циклы - зло. Но зато более изящно решаются некоторые задачи, матан твой тот же самый.
Вот есть к примеру Haskell. На нем легко писать параллельные программы. И не нужно ни о чем заботиться, потому что всю грязную работу делает компилятор.
Писать функциональный код можно на любом языке.
Как сказано - "программист на Фортране может написать программу на Фортране на любом языке программирования".
Первый язык определяет все. Поэтому ты мне тут и доказываешь, что функциональщина лучше ООП, с чего и начался наш спор, собственно.
Ничего ты не угадал. Это пример декларативного языка с возможностью легко писать параллельный код. Еще один пример Erlang.
На Фортране нельзя. В нем нет даже рекурсии (раньше не было, сейчас может и есть). Писать можно, если в языке есть ФВП хотя бы. Только этот код все равно будет сложно параллелить. Так как транслятор языка не ориентирован на это.
ООП создавали люди далекие от науки. Поэтому имеем то что имеем. Сравнивать его с ФП глупо, потому что ФП имеет математический базис, и очень долгую историю, фактически почти 100 лет. По сравнению с этим ООП детская поделка.
Хаскелл - прекрасный язык и полезен для расширения кругозора любому программисту. Непонятно только, зачем ты тут разводишь флуд вместо того, чтобы писать на нем свои прекрасные программы.
Не нравится PHP - не пишите. А вы разводите тут флуд на полтреда, что намекает на то, что вы в последнее время ничего не пишете, раз у вас так много свободного времени. Это тред для изучающих веб-программирование, так что выкатывайтесь обратно.
Алсо, https://habr.com/ru/post/315152/
Ты же понимаешь, что делать интернет-магазин на ФП это все равно что ездить на работу на ламборгини? Не тот это язык, чтобы пилить программы с простыми вычислениями %%и даже без оных%. Людям, далеким от науки, нужен был подход, который бы решал их задачи бизнеса. Вот они и придумали классовый подход для решения этой задачи. Они не были математиками, они высрали все, что смогли. И ты, инженер, сравниваешь себя с ними. Не стыдно?
Ах, ты оказывается даже не знал, что ФП основано на математических моделях. Конечно, откуда быдло-кодер может это узнать.
Об этом я и говорил. Что в программную инженерию поналезли все кому не лень, и лепят кривые поделия с умным видом. А потом школьники, и прочие битарды, с не менее умным видом рассуждают об ООП, и пишут что математика не нужна, Лямбда-исчисление говно, и тому подобное. Смешно на это смотреть.
>>31510
Не нравится не читай. Причем тут Haskell? У некоторых как будто мозг деревянный. Им про фундаментальные основы говоришь, они не понимают без примеров. Приводишь в пример какой то язык, начинают беситься что язык не тот. Ты вообще хоть что нибудь понял из того что прочитал? Haskell пример умного транслятора. Просто пишешь параллельный декларативный код, а транслятор его переводит в императивный.
Прекрасно, пишите декларативный код на любом языке, с или без ооп, только без флуда на 50 постов.
Сам ньюфаг в вордпрессе, взял задание на JS, а заказчик не сказал, что у него сайт на ЦМС.
С меня няши :з
С одной стороны это так, но с другой это выглядит чепухой. Если есть более совершенный подход, то его нужно использовать. Чем лучше решение тем лучше для всех. Если кто-то говорит, что нужно использовать более кривой подход, то он кто вообще? Получается уже наоборот, чем хуже тем лучше. Как я уже писал в одном из тредов, что подход ООП именно такой, чем хуже тем лучше. И вы все ему следуете, при этом пишите глупые детские шуточки про математику, Лямбда-исчисление, ФП языки.
>Об этом я и говорил. Что в программную инженерию поналезли все кому не лень, и лепят кривые поделия с умным видом.
Я понимаю, что ООП говно, и что между точкой входа и точкой выхода у этой программы мешанина из разных сортов спагетти, которая вдобавок еще и разложена по разным кастрюлям. И пока соориентируешься во всем этом дерьме, уже ничего не хочется делать.
ООП все еще на плаву, потому что в проекты, написанные по этой технологии, вливаются тонны бабла. И будет вливаться дальше, потому что макаки дрочат ООП и делают на них свои сайтики, которые потом поддерживают другие макаки и так длаее.
>>31541
>Как я уже писал в одном из тредов, что подход ООП именно такой, чем хуже тем лучше
Я помню тебя.
> И вы все ему следуете, при этом пишите глупые детские шуточки про математику, Лямбда-исчисление, ФП языки.
Ты ебаный фанатик, который везде насаждает ФП. Оно может и лучше во многом, но точно не для клепания сайтиков с их ебучей вариативностью. Иначе это будет та же самая мешанина.
Хочу рассказать свою историю.
Программист, уже 23 года, заканчиваю профильный вуз.
Ранее пробовал искать работу на c#, но не прошел собес на джуна, к которому очень готовился, и перепутал паттерных. Меня не взяли. Потом было одно тестовое задание, но я не успел поднять asp.net mvc, и не смог его сделать.
Сейчас я работаю на php + html + js, пишу под один популярный шаблон магазинов, не важно. Делаю я это бесплатно, проект долгий, как закрою наверное заплатят.
Мне интересен веб, я прошел курсы по html + js, но из - за того что в моей работае эти почти не используется, я почти все уже забыл.
Я постоянно смотрю вакансии, иногда прохожу собес (успешно), мне высылают тестовое, я думаю что меня все равно не возьмут и не делаю его. Уже не представляю себя на нормальной работе в офисе, хотя раньше этого очень хотел. Для меня дико проходить безцельные интервью и ТЗ раз за разом, но нужны деньги.
Вот так и сижу на тухлом стартапе с обещаниями золотых гор, и забываю то что знал ранее.
Сейчас хотя бы пишу дипломы на c# подзаказ, надеюсь смогу оплатить арендное жилье.
Ну, скореллирую со своей историей.
>Ранее пробовал искать работу на c#, но не прошел собес на джуна
Я поначалу тоже на шарпе наяривал. Да и сейчас иногда. Но в моей мухосрани вообще такого не было и я пошел на первую же попавшуюся пхп галеру, как только деньги позарез стали нужны.
В будущем и на нем поработал, но немножко, и на других направлениях. Главным в итоге все равно бекенд остался, причем язык не важен, просто вакансий пруд пруди именно на пхп. Да и душа к нему лежит немного.
>Делаю я это бесплатно, проект долгий, как закрою наверное заплатят.
Тут смотри, как ты знаешь людей с которыми работаешь, и если что указывай авторство на интеллектуальную собственность, а не просто жди оплаты. А лучше всегда так делай, если не составлял договоров.
>мне высылают тестовое, я думаю что меня все равно не возьмут и не делаю его.
Делал тестовые в кучу разных контор, когда уже с более зрелым опытом работу повкуснее искал. С тебя не убудет, особено раз ты безработный по факту и не сильно устаешь. Делай, что сможешь, и забей. Потом их вообще не будут спрашивать, байки потравишь с техническим специалистом в конторе и вакансия твоя.
>Сейчас хотя бы пишу дипломы на c# подзаказ
Как-то раз я за конченный диплом заломил цену, которую студентики не смогли потянуть - как же меня обосрали, ууух. А так тоже мелочью по несколько часиков балуюсь. Это скорее отдых, чем работа.
28, помидор с зп 250к.
Поиском по файлам попробуй найти.
Поныть можно в соседнем перезвоним-треде, тут люди решают задачи и идyт к ycпeхy.
Может кто oбъяснить на примерах?
Это просто как шаблон реализовав по которому класс, oн тoчнo будет верно работать?
Или можно ли как-то сделать, чтобы неймспейсы по дефолту задавались в сooтветствии с путем к файлу, а не в глобал пихались?
Нельзя. Каждый класс относится к какому-то неймспейсу и это определяется еще до выполнения кода.
Что значит "в глобал пихaлись"? Ты ничего не путаешь?
Если тебе тяжело руками писать неймспейсы и use, поставь плагин к редактору, который это делает.
Тут дело в версионирoвании модулей.
Неймспейсы меняются абсолютно везде при создании новой версии, руками можно прaвить, но это пиздец долго и шанс накосячить ебливый.
Редактор для редактироания кода, а не запуска скриптов. Запускать скрипт надо из консоли:
рhр d:\tеmр\1.рhр
Почитай пасту про консоль из ОП поста.
Также, можно настроить саблайм чтобы он по какой-то кнопке запускал PHP, гугли как именно.
И я вкачусь. Студент-мeханик ИTТ, 23 гoда. Заканчиваю магистратуру по направлению механика. Год проработал на заводике инженером-исследователем, думал пойти в науку, но что то совсем не идет у меня это дело. Все время хотел вкатиться в айти, но только начав изучать какой нибудь ЯП через день - два желание пропадало.
У вас тут уютненько в тредике, буду пытаться сделать студентиков!
Объявление - нет. Использование можно, рефлексия работает с зарегестрированными автозагрузчиками. А вообще изза автозагрузки можно вообще на неймспейсы не ориентироваться (не делай этого, просто как пищу для размышлений дал).
>а не в глобал пихались
Они не пихаются. Ну вернее пихаются конечно, директивы же, но автозагрузку по стандартам можно как угодно извратить. Делать так не надо, но он же об этом спрашивал.
>>31629
А вот тут я тебя понял. Я писал костылик для версий для одного проекта. Смена версий не была частой конечно, но нужно было сделать обратную совместить, то есть не терять код. Тут нихуя не поделаешь. Только оставить код прошлой версии позади например в другом неймспесе, а продолжать работать уже в новом.
>А вот тут я тебя понял. Я писал костылик для версий для одного проекта.
Типа когда версия апнулась и изменилась какая-нибудь мелочь и старые версии приложений начинают отваливаться, пока не обновятся? У нас старые версии затребовали оставлять на случай этого кaк раз. Старые приложения работают со старым апи, обновятся - работают с новым. Как-то так.
Что значит версионирование модулей? Тебе надо в одной программе иметь 10 копий одного класса? Ты явно делаешь что-то не так.
Заменить нeймспейс в большом количестве файлов можно также функцией "поиск/замена" в твоем редакторе кода.
Но я ни разу с таким не сталкивался и интуиция подказывает мне что ты делаешь что-то неправильно. Какое еще версионирование, наркоман?
Да, именно для этого. Бывает и хуже. Например когда между версиями меняется схема хранилища, а надо и то и другое держать. В таких ситуациях та еще война идет между разработчиками и менелджерами. Первые опнимают, что проще плюнуть и заставить обновляться, вторым важно не потерять стареньких клиентов, которые или не умеют обновляться, или принципиально не хотят. Но так то все решаемо, просто не по красоте.
Версионирование API это другое дело. Обычно в API действительно используют версию в URL, например:
/api/v2/cities
Нo для этого не требуется генерировать неймспейсы. Просто сделай для работы со старой версией АПИ старое приложение со старым кодом, а для новой - новую. Не надо все версии АПИ запихивать в одно общее приложение.
Если же речь о классах, и ты пишешь например библиотеку, то надо тоже сделать несколько версий библиотеки - наример lib1 для старых приложений и lib2 для новых, не стоит пытаться объединить это в одной универсальной библиотеке.
У меня было по другому. Определенное апи - это точка входа и логика только в этой части приложения. Но ее надо соотнести с прошлыми, чтобы не было и там и там поломок. И с соседними, где логика немного отличается и должна адаптироваться под общую схему. Копировать в такой ситуации было не вариант, хранилище на любое количество и тип приложений было одно - только выкручиваться оставалось.
Ну смотри, допустим у тебя в приложении есть форма логина, пишешь для нее класс.
Затем тебе понадобилась форма регистрации, пишешь для нее класс.
Тут замечаешь, что добрая половина методов и свойств первой и второй формы совпадает.
Если ты быдлокодер и тебе нaсрать на качество твой работы, ты так и оставишь, тем более что ты никогда не писал приложение с более чем 2-3 формами.
Но если ты ответственный программист, то догадываешься, что копипастить куски кода из одного класса в другой наверное неправильно. Тем более что в серьезных приложениях родственных классов будет не 2-3, а десятки-сотни.
Пишешь абстрактный класс, который содержит в себе все общее, что есть у классов форм, называешь AbstractForm.
Наследуешь LoginForm и RegisterForm от AbstractForm, в них прописываешь только уникальные для данного класса свойства и методы.
Что касается интерфейса, то это набор требований к классу, то есть буквально мы пишем: "у всех классов, которые имплементируют данный интерфейс, должен быть определенный функционал (метод), неважно как они будут реализованы, но они должны быть". Пример не знаю какой привести.
Вот чувак приводит пример со столами https://toster.ru/q/10682
>Связью же интерфейсов и классов Вы описываете свойства. Например, стол можно катить: Table_Abstract implements Rollable. Деревянный стол, например, можно сложить: Table_Wood implements Foldable.
Обрати внимание, что Rollable (с колесиками) может быть не только стол, но и стул, кровать, то есть совершенно другие типы объектов. Метод roll() будет у них всех реализован по-разному, поэтому мы не используем тут абстрактный класс типа НечтоКатящееся. Тем более что один класс может реализовывать множество интерфейсов, а абстрактный класс можно унаследовать только один. Стол должен быть одновременно с колесиками и складывающимся. Мы не можем создать абстрактный класс НечтоКатящееся, затем НечтоСкладывающееся, и создать класс Стол наследующий оба абстрактных класса. Да и не для этого они придуманы, класс всегда описывает объект, а интерфейс функционал. Абстрактный класс это обобщенное описание категории объекта, допустим стол, или стул, или кровать. От него наследуем уже какую-то конкретную разновидность, например СтолПисьменный расширяет АбстрактныйСтол реализует Складывающийся интерфейс.
А можно и оба интерфейса, пусть стол будет Складывающийся и Катящийся.
Затем создаем класс КроватьДвуспальная расширяет АбстрактнуюКровать реализует Катящийся интерфейс.
Короче абстрактный класс это обобщение, чтобы не копипастить общие методы и свойства по всем классам-наследникам, мы их группируем в одном классе.
Интерфейс это описание функционала, один класс может реализовывать множество интерфейсов. И один и тот же интерфейс может быть использован множеством классов.
Интерфейс не имеет реализации, он только декларирует, что у класса обязан быть определенный метод, а реализация может быть какая угодно, нас это не интересует, она инкапсулирована внутри.
Ну смотри, допустим у тебя в приложении есть форма логина, пишешь для нее класс.
Затем тебе понадобилась форма регистрации, пишешь для нее класс.
Тут замечаешь, что добрая половина методов и свойств первой и второй формы совпадает.
Если ты быдлокодер и тебе нaсрать на качество твой работы, ты так и оставишь, тем более что ты никогда не писал приложение с более чем 2-3 формами.
Но если ты ответственный программист, то догадываешься, что копипастить куски кода из одного класса в другой наверное неправильно. Тем более что в серьезных приложениях родственных классов будет не 2-3, а десятки-сотни.
Пишешь абстрактный класс, который содержит в себе все общее, что есть у классов форм, называешь AbstractForm.
Наследуешь LoginForm и RegisterForm от AbstractForm, в них прописываешь только уникальные для данного класса свойства и методы.
Что касается интерфейса, то это набор требований к классу, то есть буквально мы пишем: "у всех классов, которые имплементируют данный интерфейс, должен быть определенный функционал (метод), неважно как они будут реализованы, но они должны быть". Пример не знаю какой привести.
Вот чувак приводит пример со столами https://toster.ru/q/10682
>Связью же интерфейсов и классов Вы описываете свойства. Например, стол можно катить: Table_Abstract implements Rollable. Деревянный стол, например, можно сложить: Table_Wood implements Foldable.
Обрати внимание, что Rollable (с колесиками) может быть не только стол, но и стул, кровать, то есть совершенно другие типы объектов. Метод roll() будет у них всех реализован по-разному, поэтому мы не используем тут абстрактный класс типа НечтоКатящееся. Тем более что один класс может реализовывать множество интерфейсов, а абстрактный класс можно унаследовать только один. Стол должен быть одновременно с колесиками и складывающимся. Мы не можем создать абстрактный класс НечтоКатящееся, затем НечтоСкладывающееся, и создать класс Стол наследующий оба абстрактных класса. Да и не для этого они придуманы, класс всегда описывает объект, а интерфейс функционал. Абстрактный класс это обобщенное описание категории объекта, допустим стол, или стул, или кровать. От него наследуем уже какую-то конкретную разновидность, например СтолПисьменный расширяет АбстрактныйСтол реализует Складывающийся интерфейс.
А можно и оба интерфейса, пусть стол будет Складывающийся и Катящийся.
Затем создаем класс КроватьДвуспальная расширяет АбстрактнуюКровать реализует Катящийся интерфейс.
Короче абстрактный класс это обобщение, чтобы не копипастить общие методы и свойства по всем классам-наследникам, мы их группируем в одном классе.
Интерфейс это описание функционала, один класс может реализовывать множество интерфейсов. И один и тот же интерфейс может быть использован множеством классов.
Интерфейс не имеет реализации, он только декларирует, что у класса обязан быть определенный метод, а реализация может быть какая угодно, нас это не интересует, она инкапсулирована внутри.
>кодер без знаний математики
О, я смотрю ты опытный разработчик! Можешь прояснять новичку какая глубина знаний математики требуется пхп/веб разрабочику? С первого взгляда кажется, что можно обойтись арифметикой из начальных классов. Хотелось бы услышать развернутый ответ от специалиста.
>паттернами и ООП
Но ведь почти в каждой вакансии их указывают в требованиях?!
Спасибо
С абстрaктным классов всё ясно.
Ну а для чего и когда используют и стоит использовать интерфейс, я так и не понял особо?
В том случае когда мы не знаем какой объект ожидать и хотим что бы это был хотя бы наследник интерфейса?
Объясните мне хоть, чтобы я понял, где мой мозг отказывается работать.
Вот там в уроке про циклы предлагают написать цикл с умножением числа на само себя.
Ну окей, решил, пусть до 9 умножается включительно. Написал цикл:
for ( $a = 1; $a <= 9; $a++) {
echo "должно быть произведение двух чисел $a и $a = \n";
}
И вот тут моё слабоумие даёт о себе знать. Я не понимаю, как мне впихнуть в цикл произведение этих чисел.
тут ответа нет? https://github.com/codedokode/pasta/blob/master/php/interfaces.md
Интерфейсы реализуют, а не наследуют. Интерфейс это набор требований (требований, чтобы был определенный метод с определенным функционалом).
>какая глубина знаний математики требуется пхп/веб разрабочику?/
Логика и здравый смысл нужны. Математика бонусом идет в любом деле, но фанатизм в таком виде - это минус уже. Заебали ваши срачи, тем более с этими пастами, котоыре я еще лет 5 назад видел. Только тред перекатили и уже все засрано бессмысленной эзотерической хуйней о том, как один обиженный приперся толсто потроллить, а ему решили все ответить. Тред в несущественных спорах о вкусах превратился.
Ну вообще-то это реальные люди. Я лично с ним спорил.
Бля, я догадался, что произведение надо просто в цикл засунуть, и что так тоже можно.
Ну может я и не такой уж и слабоумный.
Чтобы показать что класс относится к данной группе или имеет данное свойство. Ну анон привел пример выше, интерфейсом Rollable мы можем пометить классы, которые можно катать.
Ну или если попробовать придумать более серьезный пример, например в какой-нибудь соцсети можно ставить лайки фотографиям, постам и пользователям. Классы, которые описывают эти сущности (Photo, User, Post), можно пометить интерфейсом Likeable. Допустим в этом интерфейсе определены 2 метода: добавить лайк (addLikeFrom(User $user)) и убрать лайк (removeLikeFrom(User $user)). Каждый класс может реализовать эти методы по своему, лишь бы они были реализованы.
После этого, когда мы пишем функцию, и хотим сказать что на вход ей надо подать любой объект, который можно лайкнуть, мы используем интерфейс:
function setLikeTo(Likeable $object)
{
...
}
Теперь любому программисту понятно какие объекты можно подать на вход этой функции. С другой стороны, функция получает гарантию что у переданного ей объекта есть методы addLikeFrom, removeLikeFrom.
Более того, в будущем список таких объектов можно расширить, не трогая старый код. ну например если нам надо сделать чтобы комментариям можно было ставить лайк, мы делаем чтобы класс Comment реализовал интерфейс Likeable, добавляем ему нужные методы и его теперь тоже можно передавать в функцию setLikeTo, и она будет корректно с ним работать.
То есть интерфейс это что-то вроде договоренности, которая проверяется интерпретатором PHP и он гарантирует что либо договоренность выполняется, либо программа прервется с ошибкой.
Наследование - это другое. Наследование это когда мы делаем класс расширяя другой класс. Наследуются однотипные вещи: например мы можем унаследовать Танк от СредсвоПередвижения, но мы не можем унаследовать Комментарий от Фото так как у них нет ничего общего.
Интерфейсы позволяют объединять не связанные наследованием классы.
Конечно, программа будет работать и без интерфейсов, и без абстрактных классов. Она будет работать даже вообще без классов. Но качество кода будет неприемлемым. Интерфейсы и другие средства ООП позволяют разработчику задать правила использования его классов и методов, описать их. Например, если сделать функцию setLikeTo выше без исплоьзования интерфейсов, нет гарантий что на вход ей дадут правильный объект, и вообще непонятно что ей можно дать на вход. Код становится менее понятным, требует больше времени на работу с ним, легче допустить ошибку.
ООП в первую очередь делался для больших проектов, где очень много кода. Без соблюдения правил ООП код станет настолько запутанным, что любые правки будут вызывать ошибки и будет уходить много времени на их исправление. В коде на 100 или 1000 строчек конечно это не заметно. А например, код ОС андроид содержит тысячи классов (хоть они и не на PHP, а на Яве, но ООП там примерно такой же).
Обычно интерфейсы используются во всяких фреймворках и библиотеках. Ну к примеру фреймворк может содержать в себе код для проверки прав пользователей, но не содержать конкретного класса который представляет пользователя, а только интерфейс. В этом случае ты дeлаешь свой класс как тебе надо, реализуешь интерфейс и фреймворк может с твоим классом взаимодействовать.
Если ты не уверен где надо применять интерфейсы, не применяй их пока.
Чтобы показать что класс относится к данной группе или имеет данное свойство. Ну анон привел пример выше, интерфейсом Rollable мы можем пометить классы, которые можно катать.
Ну или если попробовать придумать более серьезный пример, например в какой-нибудь соцсети можно ставить лайки фотографиям, постам и пользователям. Классы, которые описывают эти сущности (Photo, User, Post), можно пометить интерфейсом Likeable. Допустим в этом интерфейсе определены 2 метода: добавить лайк (addLikeFrom(User $user)) и убрать лайк (removeLikeFrom(User $user)). Каждый класс может реализовать эти методы по своему, лишь бы они были реализованы.
После этого, когда мы пишем функцию, и хотим сказать что на вход ей надо подать любой объект, который можно лайкнуть, мы используем интерфейс:
function setLikeTo(Likeable $object)
{
...
}
Теперь любому программисту понятно какие объекты можно подать на вход этой функции. С другой стороны, функция получает гарантию что у переданного ей объекта есть методы addLikeFrom, removeLikeFrom.
Более того, в будущем список таких объектов можно расширить, не трогая старый код. ну например если нам надо сделать чтобы комментариям можно было ставить лайк, мы делаем чтобы класс Comment реализовал интерфейс Likeable, добавляем ему нужные методы и его теперь тоже можно передавать в функцию setLikeTo, и она будет корректно с ним работать.
То есть интерфейс это что-то вроде договоренности, которая проверяется интерпретатором PHP и он гарантирует что либо договоренность выполняется, либо программа прервется с ошибкой.
Наследование - это другое. Наследование это когда мы делаем класс расширяя другой класс. Наследуются однотипные вещи: например мы можем унаследовать Танк от СредсвоПередвижения, но мы не можем унаследовать Комментарий от Фото так как у них нет ничего общего.
Интерфейсы позволяют объединять не связанные наследованием классы.
Конечно, программа будет работать и без интерфейсов, и без абстрактных классов. Она будет работать даже вообще без классов. Но качество кода будет неприемлемым. Интерфейсы и другие средства ООП позволяют разработчику задать правила использования его классов и методов, описать их. Например, если сделать функцию setLikeTo выше без исплоьзования интерфейсов, нет гарантий что на вход ей дадут правильный объект, и вообще непонятно что ей можно дать на вход. Код становится менее понятным, требует больше времени на работу с ним, легче допустить ошибку.
ООП в первую очередь делался для больших проектов, где очень много кода. Без соблюдения правил ООП код станет настолько запутанным, что любые правки будут вызывать ошибки и будет уходить много времени на их исправление. В коде на 100 или 1000 строчек конечно это не заметно. А например, код ОС андроид содержит тысячи классов (хоть они и не на PHP, а на Яве, но ООП там примерно такой же).
Обычно интерфейсы используются во всяких фреймворках и библиотеках. Ну к примеру фреймворк может содержать в себе код для проверки прав пользователей, но не содержать конкретного класса который представляет пользователя, а только интерфейс. В этом случае ты дeлаешь свой класс как тебе надо, реализуешь интерфейс и фреймворк может с твоим классом взаимодействовать.
Если ты не уверен где надо применять интерфейсы, не применяй их пока.
Требуется для чего? Смотря какие у тебя цели. Я не смотрю на требования. Мне интересно изучать в глубину и ширину. Чтобы не было областей, где я не понимаю что происходит. Это влечет за собой изучение математики, физики, и много чего еще. Просто изучай то чего не знаешь.
Не знаешь архитектуру компьютера, - изучай. Не знаешь как работает процессор, - изучай. Алгоитмы, базы данных, математика, физика, машинное обучение, etc, - изучи это. Изучай то, что тебе нужно. А если изучать только то, что требуют, типа ООП, паттернов, то будешь расти не так как тебе нужно, а как хочет кто-то другой. Это очень ограниченное обучение получится. Потому что в какой-нибудь веб-студии создают сайты из говна и палок, и не хотят ничему учиться. Если следовать требованиям вакансий, то можно научиться какой-нибудь ерунде, про которую кто-то придумал, что она очень важна. Нужно мыслить своей головой.
Циклы не имеют отношения к математике. В математике нет даже изменяемых переменных. В мперативном программировании все не так как в математике.
Вообще, в ООП много средств, которыми ты задаешь правила работы со своим классом:
- с помощью тайп хинтов ты указываешь что надо передать на вход функции
- с помощь конструктора ты определяешь обязательные аргументы, без которых не создать объект
- с помощью public/protected/private ты определяешь, какие методы откудa можно вызывать и инкапсулируешь данные внутри объекта
- с помощью abstract методов ты определяешь правила наследования от данного класса
- с помощью интерфейсов ты помечаешь классы
Важно пользоваться всеми этими возможностями правльно. Их мы изучаем в задачах про Вектор и кошки-мышки.
Хм. Но дело в том, что у ОПа в главе про OОП нет этой информации и предлагается решать их не зная всего этого
Он идет в паре с "usе strict;"
Позволяет oбъявлять переменные только явно "my $result", и избежать ошибки типа "return $reslt;". Сегодня решил попробовать пых, мне такого очень не хватает.
>То есть интерфейс это что-то вроде договоренности
Захотелось добавить, что часто для описания подобной "договоренности" используется слово "контракт". На самом деле повседневное совершенно дело встретиться с тонной контрактов хоть в пхп, хоть в джаве, хоть где либо еще. Просто ремарка, чтобы увидев контракты репозиториев каких-нибудь не было остолбенения.
>мне такого очень не хватает
Там надо добавить error handler - функцию для обработки ошибок. И по ошибке "встретилaсь необъявленная переменная" что-нибудь сделать, например, выбросить исключение.
Но не надейся там особо. Ни один из динамических языков лучше от этого не станет. Проверено уже.
> Как установить игру?
> На компьютер или телефон. Смотрите прямо в поиске Яндекса! 0+
> yandex.ru/Игры_на_Яндексе
(ссылка кстати не работает)
Не удержался от того, чтобы кликнуть - происходит переход на hxxps://yandex.ru/set/games_minecraft/4?from=adwords_gdn_games&utm_source=google&utm_medium=gdn&utm_campaign=Games_Russia&utm_term=&utm_content=ideone.com&gclid=CI-w4dqt9MoCFSUMcwody9MKQw
На этой странице написано:
> Полезное про игры
> Попробуйте Яндекс, просто установив расширение.
> Оно настроит поиск по умолчанию и стартовую страницу в вашем браузере.
То есть реклама - полный обман:
- ведет не на ту ссылку которая указана в объявлении
- страница не содержит ответа на вопрос "как установить игру на телефон", а вместо этого пытается впарить шпионское расширение в браузер, возможно в расчете на неграмотных пользователей (детей?) которые могут подумать что чтобы установить игру надо следовать инструкции на странице
Вот такая реклама ничем не отличается например от тех, кто размещает фальшивые кнопки "скачать" на файлообменнике или фальшивые видео, при клике по которым тебе пишут что надо скачать "кодек". Разница только в том что к таким обманным методам прибегает "белая" компания. Видимо сомнительные метoды распространения вредоносных программ настолько эффективны что даже яндекс не может от них удержаться.
Я вижу такой сценарий:
Перед тем как передать форму на сервер проверяем её жсом и если есть ошибки - выводим их, если нет данные идут в контроллер, который создает модель с переданными значениями. Если значения неправильные, у сеттеров модели выбрасываются исключения, которые мы перехватываем в контроллере. После этого завершаем приложение, пишем в лог ошибки и показываем пользователю какую-нибудь заглушку.
В правильном ли я направлении думаю?
- заходите на главную, ищетe тред, переходите в него?
- сохраняете в закладкти?
- просто держите открытым постоянно и обновляете (я так делаю)
И как находите ответ на свою задачу если ОП часто их проверяет только несколько дней спустя, и за этой время успевают запостить 300-400 постов?
>Перед тем как передать форму на сервер проверяем её жсом и если есть ошибки - выводим их
Правильно, первая линия обороны так сказать, фактически иллюзорная, но лучше пусть будет, чем нет.
>выводим их, если нет данные идут в контроллер, который создает модель с переданными значениями
И в том и другом случае ты валидируешь все от а до я, как минимум не менее тщательно, чем на фронте.
>Если значения неправильные, у сеттеров модели выбрасываются исключения, которые мы перехватываем в контроллере.
Это от твоих предпочтений зависит. Кто исключения кидает на такую мелочевку и ловит их потом по иерархии. А кто составляет стек ошибок. Результат один и тот же. Выводить не обязательно. Что с ними делать решать тебе и под конкретный этап разработки.
>Видимо сомнительные метoды распространения вредоносных программ настолько эффективны что даже яндекс не может от них удержаться.
Что забавно, яндекс накладывает санкции на сайты с подобным видом монетизации.
Добавлен в избранное двача.
Обязательно добавляю в сообщение с решением какое-нибудь ключевое слово (чаще всего название задачи), по нему нахожу свой пост и ответы к нему. Если задачу нужно переделывать, ваш ответ сохраняю в ворд-файл, чтобы не искать каждый раз.
Ага, а я кое-какой торрент качал с китайского (по моему) сайта, и там была страница с информацией о нем и большая зеленая кнопка скачать, а чуть ниже надпись "Яндекс-браузер".
Интересно, все эти люди, кто в Яндексе или Гугле работают, они наверно гордятся тем, какие они умные, как они с закрытыми глазами могут нейросеть на Хаскелле написать (не то что эти крудописатели на PHP), но затем они идут на работу придумывать, как обмануть неискушенного пользователя и заставить установить их программу или ввести свои данные и согласиться на слежку, сохраняя при этом видимость свободного выбора (а также, как обойти GDPR, сохраняя видимость его соблюдения). Обе компании по сути зарабатывают на слежке и монетизации собранных данных.
>И в том и другом случае ты валидируешь все от а до я, как минимум не менее тщательно, чем на фронте.
class Controller
{
// Получается где-то тут, перед передачей в модель нужно валидировать $name, $email?
try {
$model = new Model($name, $email);
} catch () {
// Что-то делаем
}
}
Стандартный вопрос: урок читал? Там есть алгоритм (хотя ты можешь сделать и свой): https://github.com/codedokode/pasta/blob/master/forms.md
> Перед тем как передать форму на сервер проверяем её жсом
Хватит HTML5 валидации.
> Если значения неправильные, у сеттеров модели выбрасываются исключения
Есть такой вариант, когда в модель встроена валидация, но он имеет недостатки. Что, если для проверки уникальности email надо обратиться к БД? Где ты возьмешь объект для работы с БД в модели?
Потому выгоднее может быть сделать отдельный сервис-валидатор и в нем метод валидации:
$studentValidator = new StudetnValidator(...);
$errors = $studentValidator->validate($model);
Использование исключений не позволяет передать несколько ошибок.
Контрллер валидирует только инупт, потом слой модели валидирует данные.
Например контроллер чекает что передано число больше 0, а модель уже валидирует на это число от 2 до 25. Конкретизируй отвественность, сначала контроллер, который ловит самые грубые ошибки, потом модель, которая ловит логические ошибки. Во всяком случае контроллер спокойно число от строки отделит, и многие другие вещи сделает без привязки к бизнес логике, а модель добьет остальное. (Модель в это случае не датакласс или активрекорд, не путай)
<?php
for ( $a = 10000; $a < 1000000; $a = $a + $c ) {
$c = $a * 0.1;
$dayZ = $dayZ + 1;
echo "идёт $dayZ год, и размер суммы составляет $a рублей, а вкладчику стукнуло уже N лет\n";
}
?>
А как сделать, чтобы ещё и года от 16 отсчитывались вперёд?
А то я сам не понял как сделал, чтобы отсчёт лет был, а вот года чёт не выходит.
Опять этот коммивояжёр с обострением шизоидного артрита. Втирал за лямбду, посоны, или нет ещё?
>Не инструменты красят инженера, а инженер инструменты.
Лол. Нормальные люди инструментами пользуются. Нах их надо красить? Тебе их цвет не нравится?
>Математики и инженеры начала, середины, и немного конца 20-го века, были последними кто мог создавать шедевры. Делать вещи простые, компактные, функциональные, но без лишнего. Как пример Лямбда-исчисление Чёрча, и комбинаторная логика Шейнфинкеля-Карри. Кто из современных кодеров додумался до подобной идеи? Никто. Все только плодят бездумно лишние абстракции. Да еще и гордятся этим, задирают нос, думая что они умные.
#мюслиДушевнобольных
Делаю простое CRUD приложение типа блог
$post->body - тут хранится текст одной записи блога.
Вот у меня есть в Blade шаблоне строчка:
{{$post->body}}
Она выводит текст. В случае, если в туда записаны html-теги, они тоже выведутся как текст, однако если записать так:
{!!$post->body!!}
То текст вернется с учетом разметки.
Объясните, в чем цимес и теория стоящая за этими двумя записями? (ну с восклицательными знаками и без)
Не делай вид что не понял. Хорошо, не инструмент украшает программиста, а программист инструмент. В умелых руках и PHP становится нормальным инструментом. А говно-кодеру дай самый лучший язык, все равно говнокод получится.
Зачем бы программисту украшать инструменты?
Ну и говнокодерами были все программисты. Кто был, кто есть. Тебе то что от этого, шизик?
Я не флудю
Я бампаю.
Допустим, есть какое-то стороннее апи, которое возвращает джсон. Я хочу на страничке вводить параметр, который пойдёт в URL, потом по этому URL будет проведён запрос к апи, я получу в объект джсона, и ответ я хочу записать в базу данных.
У меня должен быть один view с текстовым полем и кнопкой, откуда информация передаётся в контроллер, контроллер передаёт параметр в model, там выполняется запрос к апи. А вот дальше я не знаю, как это должно работать. Создавать ещё одну модель, куда будет передаваться джсон и который будет записывать инфу в БД через элоквент? Или всё делать в одной модели? Как правильно, памагити!!111
бамп вопросу
Игра мне тоже понравилась. Действительно почему бы в оппосте не поддержать отечественного производителя!
Ты должен решать проблемы применением паттернов, а не умножать их. Даже так - ты должен решить проблему, а паттерн нужен, чтобы объяснить другим как ты ее решил. В твоем ларавеле даже есть возможность сразу в роуте вьюху прописать. Т.е ты не обязан всегда MVC в голове держать.
Тогда что мне делать конкретно в моем случае? С мвц или без него, мне важно понять как правильно в этом конкретном случае.
ООП головного мозга. Паттерны наше все.
Чтобы работало я слепил бы на коленке в одном пхп файле. Но я собираюсь выкладывать в общий доступ, а значит моя задача сделать ПРАВИЛЬНО (я уже третий раз повторяю это слово, а не слово АБЫ РАБОТАЛО). Если не можешь помочь, то зачем овтетчаешь?
В программировании нет правильного или неправильного. Это творческая профессия. Твори.
>моя задача сделать ПРАВИЛЬНО
Ты выбрал не ту профессию значит. Иди в физику или химию, хотя и там есть элемент творчества, особенно в химии.
Лучше говорить не правильное решение, а приемлемое. Любое решение приемлемо, если оно хотя бы работает. А дальше его можно улучшать постепенно. Эволюция.
720x720, 0:10
Разбираться в этом всем аду особенно трудно, когда у тебя нет никаких контактов с тимой (особенно физических), которая около 2 лет своими руками возводила дополнительные круги ада, в которых на одну страницу приходится по 200 запросов к базе, а в половине из них не меньше 3 джоинов. А в довесок ко всему еще нашлась функция, которая почти в каждый из них добавляла джоин по селекту в котором был еще один джоин и один left join , который тоже блять по селекту в котором еще(!) один джоин.
А самый пиздец в том, что это все в тырпрайз версии. Столько платить за цмс и сотворить с ней такое. Просто пиздец, никогда такой хуйни не видел.
короче сове
1. делаешь штобы работало
2. (опционально) переделываешь, шоб было красиво/быстро
3. (опционально) идёшь нахуй из профессии
в треде снай
Тебе же говорят, не бывает правильного и не правильного в программировании. Это сугубо творчество. Делай как понимаешь сам. Если тебе сказать делай так или так, то ты ничему не научишься. Кто просто повторяет, становится макакой. Учись думать. Принимать решения. Пробовать разные варианты. Для инженера это самое главное.
Спроектировать, собрать, найти слабые места и улучшить, - вот работа программиста-инженера.
Я бы создал дополнительный класс, что-то вроде components/ApiHelper, передавал бы в него параметр, после чего он возвращал json который уже через модель записывался в базу.
Разделение ответственности. Работа с апи может меняться и обрастать дополнительным функционалом. Или потребоваться в другом контроллере.
А почему это нельзя сделать, когда придется разделить ответственность за дополнительный анал?
А что функция это не разделение ответственности? Ее можно сделать универсальной. СИКП почитай. Ты предлагаешь преждевременную оптимизацию. Это overengineering чистой воды. Сразу видно почерк адепта ООП. Использую, да по-больше, но не знаю зачем.
320x240, 0:28
Очередной ООПэшник порвался. Слабенькие вы какие-то.
Молодец! Теперь у тебя будет на каждый пук по классу, которые даже инстанцировать не нужно.
Я благодарю не за содержание, а за тот факт, что он единственный ответил по делу. А хорош его совет или нет мне предстоит ещё определить.
>Ты предлагаешь преждевременную оптимизацию
Класс наваять для этих дел - минутное дело. Зато потом голова болеть не будет, собирая всё это дело в одном месте.
Как можнo выучиться красивому коду без современных и структуированных книжек на английском от профессионалов?
И еще, правильно ли я понимаю что похапе устаревшая бекэнд штука для связи с БД формочек, обычный информационный(редкообновляемый) сайт можно написать без нее, верно?
>похапе устаревшая бекэнд штука
считай, што пыха это хуета, которой ты рулишь протоколом хттп напрямую. врядли это когда-нибудь устареет
Напиши мне на своей ноде или ещё на чём запрос к стороннему API, да так чтобы ты потом не кричал НУ АНИ ДАЛЖНЫ СНАЧАЛА СПЕЦИАЛЬНА В НАСТРОЙКАХ РАЗРЕШИТЬ МНЕ ТЯНУТЬ ИНФОРМАЦИЮ С ДЖАВАСКРИПТА!!1.
>к стороннему API
если опенсорс, то особых проблем возникнуть не должно
https://aws.random.cat/meow
на локалхосте вполне норм, пока девелопишь и тестишь
а в продакшн выкатывать куда? тоже на локалхост?
ведь задача например - написать самый крутой аппликэйшн с котиками и утонуть в море говна бабла
Код где, который я скопирую и вставлю в ноду, которую ты привёл в пример? Давай мне код, я его продублирую у себя, вставлю свою ссылку чужого апи и мы чекнем как оно работает (никак) и сколько строк занимает в сравнении с пхп (овердохуя).
Я не знаю как коротко называть методы.
Это уже совсем пиздец какой-то блять.
Что делать? Как бы вы назвали этот метод?
Просто убрать ByStatusChannelbotIdAndMessageSource нельзя, ибо там и по другим критериям методы есть.
А я то думал это у меня длинные названия. Теперь спокоен.
Впринципе тебе было бы удобнее билдер критериев иметь, чем городить эти обертки с детальным описанием в названии.
С билдером мог бы сделать например
$builder->nthOrEqualFrom(...params)->right()->byStatus(status)->byMessageSource(source)->get();
и это более переиспользуемый и гибкий вариант. Правда я понятия не имею насколько это реально у тебя по коду реализовать.
А нахуя вообще вливать всю суть в название метода?
Бери пример с си-блядей. Они буквально несколько (1-3) букв берут от слова и разбивают его _. Да, это может показаться трудночитаемым, но в си все функции из stdlib хуевочитаемые да и нахуй не нужны, но у тебя же ЕБАНЫЙ ВЕБШТОРМ, навел мышкой на метой и у тебя уже документация подсветилась.
Билдер и называется, только придется фантазию проявить. Примеры и объяснения по учебнику не для таких ситуаций. Наверняка видел аналоги в виде QueryBuilder всяких. Суть та же.
Вообще я знаю паттерн, (но забыл название, лол), который позволяет создавать цепочки вызовов методов типа как ты выше написал. Если вкратце, суть в том, чтобы возвращать $this везде.
Но вообще это уже какая-то ORM нахуй получается, в рот я ебал еще и орм на коленке писать тут, совсем говноедство какое-то будет, никто блядь не поймет потом мой код
Ну вот в твоей ситуации это как бы билдер критерии для метода getNthOrEqualFromThis. Вариантов много, вон аж 6 параметров, один из которых массив. Делаешь class ShittyBuilder {
private $id;
private $otherParam;
private $otherOtherParam;
// other params
public function byId($id) {$this->id = $id; return $this;}
// other methods
public function fetch() {
return $someInstance->getNthOrEqual($allYourParams);
}
}
Вот тебе и билдер конкретно для того страшного метода с кучей параметров. Как ты понимаешь это на коленке и сделать можно лучше во много раз, просто как пример что тут нет ничего сложного. Полноценная орм и прочее, кстати, тоже пригодились бы. Раз у тебя ее нет можешь взять да доктрину подтянуть, там много чего есть.
Тогда придется на тонны других методов тоже отдельные классы писать? Это же просто ебанутся как долго.
Насчет орм и доктрины - да. В следующий раз, пожалуй и буду их юзать. Сейчас уже нет смысла тонны кода переписывать на нее.
Ну как посмотреть. Вот у тебя есть метод getNthOrEqualFromThis. Первая же обертка над ним получилась с длиннющим именем. А таких оберток, судя по количеству параметров, может быть до ебаной жопы. Помоему лучше уж один раз сделать даже самый глупенький билдер и дергать через него, чем делать 100500 длиннющих методов вместо этого каждый раз. Сам же сказал, что есть и другие критерии к нему, значит проблема не в одном только том конкретном методе.
Зато у нас есть неплохая официальная документация и отличный тред в котором полно зелени.
Но тогда это будет практически эквивалентно прямым запросам в БД, только через обертку.
Инкапсуляция, мам...
Нужно создать несколько методов с выборками по определенным критериям, а не просто разрешить ебать таблицу в рот и жопу как хочешь.
А мне нравится это сишное iInterfaceName и всякое подобное. Коротко и понятно, главное контекст знать.
А через эти методы типа только в писечку ебешь, но никак не в рот и жопу как содомит какой-то? Чтобы полноценно выбрать решение надо разобраться в причинах, которые привели к той обертке, а не только на метод имени Льва Толстого посмотреть.
Дьявол на пикче?
>А через эти методы типа только в писечку ебешь, но никак не в рот и жопу
Ну вообще да, в том и смысл!
Я как-то не вижу этого. Обертка с именем на целый фанфик по сути прячет всего 1.5 реальных параметра, притом сама целых 5 принимает. И реально спрятанный параметр всего лишь бул. Судя по всему есть еще и вторая такая, где _is_less тру. Шо так ебать можно, шо эдак.
У тебя еще в phpdoc лишние @param, которые не несут никакой информации и которые стоит убрать.
getNeighbourId/getNthId. Насчет bystatus... - это же явно можно назвать короче. Например, getNthIdByBotAndSource
По-моему, лучше вообще писать такой код, чтобы не опускаться до оберток.
Выше дали совет про билдер.
А если неохота делать билдер, можно сделать передачу массива:
findNthId(['source' => ...., 'botId' => ...]);
или сделать объект-фильтр (отличие от билдера: билдер создает объект, фильтр ничего не создает):
$filter = new TgFilter;
$filter->bySource(...);
findNthId($filter);
или
findNthId(byTgFilter()->withSource(...)->withBotId(....));
findNthId(TgFilter::create()->withSource(...)->withBotId(....));
Как тебе? Без сверхсложных билдеров, объект фильтра типизируемый, документируемый и проверяемый.
Для примера, поиск элементов в клиенте Селениум от фейсбука: https://github.com/facebook/php-webdriver
$element = $driver->findElement(WebDriverBy::id('element id'));
Также, возможно эту функцию просто стоит по другому назвать? Вроде getSimilarMessages или как-то так?
Впринципе то, что я ему предложил больше похоже на фильтр как раз. Запомню это название, а то хуйню одну другой назвал.
Правильнее всего переделать верстку на использование jQ от Yii. Либо мучаться с jQuery.noConflict(), загружая 2 копии библиотеки и используя в верстке приватную копию.
Залезть в исходники фрейма и поменять жиквери на более зрелую, либо переписать верстку.
1. Игнорит все SPL-исключения. Тупо все что унаследовано от двух главных SPL-классов исключений LogicException и RuntimeException - игнорится.
2. Имеет глубину сканирования исключений равную единице.
Если в методе, который вызывается у тебя в методе кидается исключение, ты об этом не узнаешь.
Я нашел как это все включить, но блядь, какого хуя они так сделали по-дефолту?
Пошел нахуй с такими идеями блядь.
Без исключений ему писать. Говножоры ебаные.
Половина стандартной библиотеки и все новые ее функции кидают исключения, а они НУ ЭТО БЕЗ ИСКЛЮЧЕНИЙ ЕБАШЬТЕ))0)
В языке всегда должен быть нормальный метод обработки и проброса ошибок. Обычно это исключения. Могут быть и другие методы, но они должны быть реализованы на уровне языка.
В пыхе это тоже исключения.
Ява так хороша во многом блядь благодаря тому, что там на каждый пук кидается исключение и ты обязан его ловить.
Поэтому скомпиленная прога на яве падает раз в 10 меньше, чем на пыхе и раз в 100 меньше чем на крестах.
КИДАЕШЬ ИСКЛЮЧЕНИЕ В МЕТОДЕ ПРИ НЕКОРРЕКТНОЙ СИТУАЦИИ
@
ОБЕЗЬЯНА-ПРОГЕР ВЫРУБИЛ ВСЕ ИНСПЕКЦИИ В IDE И ЛОВИТ ВСЕ ЭКЗЕПШЕНЫ ГОЛОЙ ЖОПОЙ
@
- НУ МАМ, ПОЧЕМУ ПАДАЕТ, ВОТ ЖЕ КЛЯТЫЕ ГОВНОКОДЕРЫ! НАДО БЕЗ ИСКЛЮЧЕНИЙ ПИСАТЬ!
Метод возвращает значение типа int. Возникает ошибка, из-за которой невозможно возвратить корректное значение.
Как ты сообщишь об ошибке?
А если в методе могут возникнуть 3 разные ошибки?
Так а нахуя ты сравниваешь божественные кресты с богомерзким похапэ? Если бы у пыхи был компилятор, то разрабы идеи заморочились бы немножко и сделали по умолчанию чуть иначе, в глубоким уровнем сканирования исключений. Но тебе, мудаку, дали интерпретатор и отсутствие ебли с исключениями, а тебе не нравится. Что за хуйня? Это программисты? Делаешь, как лучше, а им не нравится.
Если у тебя программы на пхп падают, то это уже твои кривые руки виноваты, видать, не из плеч растут, а из жопы. Писать программы надо сначала на бумажке карандашиком, а потом уже ручками своими корявыми в идэе лезть.
>на бумажке карандашиком
Дедуля, тебе к земле уже привыкать пора.
Выключай кудахтер и сходи исповедуйся.
Двачую. Правильно методы проектируй, чтобы не было ошибок. Для тебя придумали операторы условий, чтобы отдавать некорректное значение.
Иди на бумажке карандашиком найди все исключения, которые может высрать некий говнокод, с которым ты должен работать, написанный не тобой.
От этого могут зависеть бизнес-процессы на дохуя денег, а IDE, несмотря на то, что может их все найти, не делает этого.
Самое смешное что ты даже не понимаешь причину, по которой жопбрейнс ограничили глубину сканирования исключений в пыхе и почему в яве она не ограничена.
>>33177
Вы реально конченые или тралите?
Задача: спроектировать метод, который принимает на вход html-файл и возвращает содержимое его тега <titile>.
ВНЕЗАПНО (никогда такого не было и вот опять) некие кривожопые говнокодеры передали в ваш метод несуществующий файл, не html-файл, некорректный html-файл, анус пса, небо, аллаха и хуй знает что еще.
Что будете делать?
Значит ты простой пыхыпыдебил - разновидность обычного наследственного дебила особой вонючести.
Впрочем, все вы такие.
Пошел нахуй. Еще я буду париться, что там мне какие-то верстальщики насували в iostream, раз по их вине прошла ошибка, им и исправлять.
>либу для парсинга невалидных файлов
Ага, написанную такими же кончеными дебичами, что и ты, которая при невозможности распарсить файл высрет тебе что-то string:"NE MOGU RASPARSIT! OSHIBKA!"
Да ладно, признайся, что исключения нужны только в строго типизированных языках, а в пыхе эта фича нахуй не сдалась.
В согласованной разработке, где каждый знает, что делает, прод не падает. У тебя был печальный опыт работы, я смотрю.
Пыха и есть строготипизированный в последних версиях, с подключением, маня. Или ты там еще без тайпхинтов лапшедерьмо пишешь?
Хотя что от такого ебача ожидать
>на личности
Не льсти себе, дебилушка, ну какая у тебя личность - сплошные спиномозговые рефлексы и обиженный скулеж.
Типичный пхпшник, хаха.
В чем семантический смысл каждого из них?
Иди уже нахуй, идиотик.
Например, есть ланг-файл формата key=value.
Класс, отвечающий за мультиязычность пытается найти такой-то ключ, но его там не оказывается.
Такая хуйня является фатальным недостатком программы и возникает, если прогер забыл внести ключ в ланг-файл.
При таком раскаладе дальнейшее выполнение программы вообще не имеет смысла, ибо она как бы недоделана.
Какое исключение я должен кинуть в этом случае?
Я к тому, что есть исключения, которые НЕ НУЖНО ловить.
То бишь, если уж такое исключение возникло, то это знак для программиста, что в программе произошел полнейший пиздец и его надо исправить на уровне редактирования кода.
То бишь, это не какое-то "обычное" исключение, которое является лишь сигналом об ошибке и может быть нормально поймано.
Исключение типа отсутствия ключа в ланг-файле невозможно исправить никакими вменяемыми способами, кроме как блять добавить ключ в файл.
Склоняюсь к тому, чтобы кидать \RuntimeException или его потомка и вырубить в IDE обнаружение всех таких исключений, чтобы они не мозолили глаза.
Но тогда другой вопрос. Я же не один пишу все это говно.
Что если другие люди срут этими исключениями, не имея под ними ввиду неисправимые ошибки?
Тогда я скрою важную информацию и не буду учитывать то, что должен.
Не помню точно, но да, опять в этой яве исключение RuntimeException можно не ловить, что является исключением (лол) из общей ситуации, где ты обязан ловить все.
То есть если метод генерит такое исключение это как бы знак того, что все, пизда, приехали.
выбранная бд из запроса пуста (следовательно, результат любой выборки равен нулю).
При попытке вернуть количество условий, удовлетворяющих выборке, возвращает единицу при любом заполнении формы.
Где обосрался?
На лекции.
http://jsfiddle.net/8w256gev/3/ - тута не понял как выравнять сноску [..] относительно строки, абсолют или флоат ее смещает вверх, и еще можно ли ее через флоат как-то сделать? Кароче что-то я намудрил кажется.
11
http://jsfiddle.net/rmouc3aj/ - тут доп.пункт подсветка по фокусу с клавы - фокус и при нажатии делается, есть focus visible но он только в лисе.
Автор этой дрисни репортин ин.
Поставленная задача решена : форма стала пропускать на страничку только пользователей, что присутствуют в бд.
https://pastebin.com/wbJNMKaP - решение.
1)Насколько критичны ошибки уровня notice? Речь идет о коротких именах переменных после подключения к субд.
2)Очень коротко: насколько целесообразно в показателях "эффективность/затраченное время" вникать в это сейчас (непонятный ответ на вопрос: " почему решение с mysqli_num_rows() не сработало?".
>Поведение mysqli_num_rows () зависит от того, используются ли буферизованные или небуферизованные наборы результатов. Для небуферизованных наборов результатов mysqli_num_rows () не будет возвращать правильное количество строк, пока не будут получены все строки в результате.
Как в хтмл прописать путь до другого диска? Апач лежит на диске С, нужно иметь доступ к изображениям с диска Е (удаленный). Все что нагуглил -- нужно идти от корня сервера, но нихуя не получается изображение вывести через img src.
Веб-сервер обычно отдает картинки только из корневой папки и подпапок. Может, тебе проще сделать отдельный виртуальный хост и сделать его корнем папку на e: (например: основной - http://site.dev, картинки - http://images.site.dev).
Если хочется извернуться и обойтись одним хостом, то велкам в документацию Апача по роутингу: https://httpd.apache.org/docs/2.4/urlmapping.html
Директива Alias явно подойдет. Учти, что кроме директивы Alias, надо еще дать Апачу доступ к той папке директивой Require в блоке Directory (там есть пример).
Не давай доступ к лишним папкам, проверяй правила.
А, если ты имел в виду, что Апач установлен на диск C, а надо корнем сайта сделать папку на e:, то хватит DocumentRoot + Require в Directory. Если не работает - включи лог ошибок и посмотри, что в него пишется при попытке открыть какой-то URL.
Я могу, конечно, вручную брать и раздавать классы родителям и детям, попутно отмеряя кому в каких колонках сидеть.
Я мог бы даже вместо бутстрапа всякие грид эреа и флексбоксы кастомные выставить.
Но все это ебатория. Вопрос - есть ли вариант проще с пика перейти на бутстрап?
Алсо вы вообще также делаете через слайсы (ну или просто чекая размеры в ПС слоях, кому как удобно) или уже какие-то другие, более автоматизированные способы есть?
1. Сколько ключевых слов зарезервировано языком, что это за слова?
2. Что значит слово “инициализация”?
3. Какие унарные и бинарные арифметические операции вы знаете?
4. Какой оператор используется для перехода к следующей итерации цикла?
5. Как правильно организовать доступ к полям класса?
6. Дайте определение понятию “конструктор”.
7. Что такое сигнатура метода?
8. Расскажите об особенностях класса с единственным закрытым (private) конструктором.
9. Чем отличается переопределение метода от перегрузки?
10. Можно ли объявить метод абстрактным и статическим одновременно?
11. Можно ли перегрузить static метод?
12. Что будет, если единственный конструктор класса объявлен как final?
13. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
1. Сколько ключевых слов зарезервировано языком, что это за слова?
2. Что значит слово “инициализация”?
3. Какие унарные и бинарные арифметические операции вы знаете?
4. Какой оператор используется для перехода к следующей итерации цикла?
5. Как правильно организовать доступ к полям класса?
6. Дайте определение понятию “конструктор”.
7. Что такое сигнатура метода?
8. Расскажите об особенностях класса с единственным закрытым (private) конструктором.
9. Чем отличается переопределение метода от перегрузки?
10. Можно ли объявить метод абстрактным и статическим одновременно?
11. Можно ли перегрузить static метод?
12. Что будет, если единственный конструктор класса объявлен как final?
13. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
Что ещё спрашивали, задачи какие давали? Сам проекты свои какие показывал? Что из задач опа решал?
Ой, да пошли они нахуй. Отвечаю, что га все эти вопросы готов дать ответ с гуглом под рукой, потому что и в работе его юзаю. Какой смысл в зазубривании.
>Сколько ключевых слов зарезервировано языком, что это за слова?
Без знания этого факта нельзя софт писать, да?
>Что значит слово “инициализация”?
Предварительная подготовка.
>Какие унарные и бинарные арифметические операции вы знаете?
Из бинарных and, or, xor, not. Но вообще это хуета.
>Какой оператор используется для перехода к следующей итерации цикла?
Continue;
>Как правильно организовать доступ к полям класса?
Поля позакрывать, как границу при СССР, доступ через сеттеры-геттеры, как у чекистов принято.
>Дайте определение понятию “конструктор”.
Инициализация и запуск объекта. Внезапно.
>Что такое сигнатура метода?
В душе не ебу.
>Расскажите об особенностях класса с единственным закрытым (private) конструктором.
Бесполезная херня, если кроме этого закрытого конструктора там ничего нет.
>Чем отличается переопределение метода от перегрузки?
Понятия не имею.
>Можно ли объявить метод абстрактным и статическим одновременно?
А зачем?
>Можно ли перегрузить static метод?
Статик метод этож вроде глобал функции. Не знаю.
>Что будет, если единственный конструктор класса объявлен как final?
Не пользовался.
>Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
Х.з.
Вопросы как-то совсем из другой плоскости, как по мне. Всегда говорят - учите технологии, а не синтаксис. А тут спрашивают хуйню, которую нагуглить за 10 минут можно.
>Сколько ключевых слов зарезервировано языком, что это за слова?
Без знания этого факта нельзя софт писать, да?
>Что значит слово “инициализация”?
Предварительная подготовка.
>Какие унарные и бинарные арифметические операции вы знаете?
Из бинарных and, or, xor, not. Но вообще это хуета.
>Какой оператор используется для перехода к следующей итерации цикла?
Continue;
>Как правильно организовать доступ к полям класса?
Поля позакрывать, как границу при СССР, доступ через сеттеры-геттеры, как у чекистов принято.
>Дайте определение понятию “конструктор”.
Инициализация и запуск объекта. Внезапно.
>Что такое сигнатура метода?
В душе не ебу.
>Расскажите об особенностях класса с единственным закрытым (private) конструктором.
Бесполезная херня, если кроме этого закрытого конструктора там ничего нет.
>Чем отличается переопределение метода от перегрузки?
Понятия не имею.
>Можно ли объявить метод абстрактным и статическим одновременно?
А зачем?
>Можно ли перегрузить static метод?
Статик метод этож вроде глобал функции. Не знаю.
>Что будет, если единственный конструктор класса объявлен как final?
Не пользовался.
>Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
Х.з.
Вопросы как-то совсем из другой плоскости, как по мне. Всегда говорят - учите технологии, а не синтаксис. А тут спрашивают хуйню, которую нагуглить за 10 минут можно.
Так логика в том, что ты можешь дать ответы на эти вопросы без гугла. Иначе зачем их тебе задавать?
>Сколько ключевых слов зарезервировано языком, что это за слова?
Не, ну можно на месте в уме посчитать все, что вспомнишь, однако это какойто сюр. Ниодин вменяемый человек число ключевых слов в голове не держит, это полностью бесполезная информация.
>Так логика в том, что ты можешь дать ответы на эти вопросы без гугла.
Тебя в лесу работать посадят, среди медведей?
>Без знания этого факта нельзя софт писать, да?
Нет. Вдруг ты назовешь свойство ключевым словом?
>Предварительная подготовка.
Неверно.
>Из бинарных and, or, xor, not. Но вообще это хуета.
Арифметических, а не логических.
>Continue;
Молодец.
>Поля позакрывать, как границу при СССР, доступ через сеттеры-геттеры, как у чекистов принято.
Молодец.
>В душе не ебу.
Это классика, это надо знать.
>Бесполезная херня, если кроме этого закрытого конструктора там ничего нет.
Молодец.
>Понятия не имею.
Классика.
>А зачем?
Нужно.
Иди кароч мат.часть учи.
>Вдруг ты назовешь свойство ключевым словом?
Вы там в блокнотах до сих пор разрабатываете?
>Неверно.
Что не мешает мне пользоваться ей. Я учебники не пишу и знать мне это необязательно.
>Арифметических, а не логических.
Как бы пользоваться ими я тоже умею, без красивых слов.
>Это классика, это надо знать.
Понадобится - узнаю. Это не такая сложная для восприятия информация. Впрочем, как и всё остальное.
Вопросы, судя по всему, ждун и писал. Я-то ожидал, про MVC, паттерны, покажите ваш код и т.д., а тут детсад.
>Нет. Вдруг ты назовешь свойство ключевым словом?
Меня вот эта формулировка бесит. Ну понятно вопрос чекает что там претендент помнит, а может и вовсе знает. Почему бы просто не спросить "перечислите все ключевые слова пхп, которые знаете", а не начать вопрос с "сколько ключевых слов в языке?". Или это попытка глянуть, скажет ли претендент честно, что точное число не заучивал и просто перейдет к перечислению?
Кстати говоря с 7 пыхи все ключевые слова доступны для использовании в качестве имен свойств, констант, методов, трейтов, интерфейсов. Только class нельзя использовать в качестве конснтанты в классе, т.к. там и так есть ::class.
Да все почти сделал из оповских задачек, кроме банкомата и прочего, что требует познаний в математике. Выучил даже основные алгоритмы и научился их применять, но завалился на такой простой хуйне. Написал на хх оригинальное резюме, прикрепил туда ссылки (магазин + гитхаб с оповскими задачами). Откликнулся с сопроводительным письмом на вакансию, пригласили через два дня.
Магазинчик на вукомерсе, простенький, но он реальный и работает. Я торгую всякой мелочью с алиэкспресса.
Сказали, что тестирование будет состоять из теста и тестового задания. Т.к. тест я завалил, то до тестового даже не допустили. Там достаточно кандидатов было на эту вакансию. Такое чувство, что все эти рассказы про дохуя вакансий придумывают эйчары, которым надо делать вид, что они чем-то занимаются.
>Ну понятно вопрос чекает что там претендент помнит, а может и вовсе знает.
Всё равно вопрос странный. Я вот на память мало вспомнить могу - для меня это конструкция, а не просто слова.
Задачи опа это понятно, а студентов, файлообменник или тестхаб делал?
Судя по вопросам контора ни о чем. В такой никакого профессионального роста не жди, а для джуна это важно.
Лол, я толком не писал ничего, но и то знаю ответы на большинство без гугла. Если ты не знаешь, то непонятно что ты за погромист.
Обратись к логике. Конкуренция в PHP наверное самая большая из всех языков. Но уровень кандидатов очень низкий. Поэтому зная чуть больше среднего можно легко их обойти. Искал бы ты работу на Хаскеле, там был бы уровень конкурентов во много раз выше.
>Искал бы ты работу на Хаскеле, там был бы уровень конкурентов во много раз выше.
А на нём работа есть? Больше похоже на клуб илитистов.
Бамп вопросу. После просмотра еще пары промежуточных степ бай степ видосов на ютубе прихожу к выводу, что средств автоматизации в основном нет - люди берут вручную создаю бутстраповую сетку и вручную по ней разносят, прсото чекая пиксели из ФШ. Это так? Блин дримвивер получается юзлесс тогда, раз созданная им табличная сетка нах не нужна, а создавать самостоятельно бутстрап и прочий грид он не умеет.
Алсо, второй вопрос. Вот я вижу как все в видео по СД - ХТМЛ вставляют пиксели в бутстрапные элементы. Но ведь бутстрап ужимает при брейкопйнтах разрешения только сами колонки? Шрифты он сам не меняет,Ж правильно? Шрифты надо вручную менять? Тогда зачем они используют пиксели, а не рем-ем-проценты? Вообще, пошагово:
1.ФШ
2. Пиксельперфект в пикселях.
3. В бутстрап или кастом грид.
4. Пиксели -в рем? Надо ли?
ПОмогите, прочитал и просмотрел кучу всего, сам забилдил два-три макета, но не пойму вот общий шаблон, указанный выше, 4й щаг.
Работа есть. Но уровень нужен выше чем для PHP.
Проверь пожалуйста. Мне очень надо.
> знаю ответы на большинство без гугла
Если ты что-то знаешь с гуглом, то ты нчего не знаешь. Сейчас очень упала ценность чистого знания, когда все появилось в интернете. Ненышнее поколение считает интернет своей памятью и искренне удивляется, что кто-то нодобряет такой подход.
Если ты не знаешь элементарные вещи, значит ты не писал кода. Когда пишешь код, все само запоминается. Все таки они правильно делают, что хотя бы такие вопросы задают. Иначе поналезут нулевые гуглята.
Представь себе нужны для вычислений.
Правильно ли я понял, что после перечисления аргументов через двоеточие идет возвращаемый тип?
func idiNahuy123(idi, na, huy): string
{
}
А что ставить, если метод ничего не возвращает? Void и null не работают, ошибка ссылается на пространство имен.
С 7.1 добавили void. Вроде в этой же версии появились нулабл ретурны, типа ?string.
Ну бамп плиз
зачем ты нюхаешь ноги?
>Иначе поналезут нулевые гуглята.
Как-то в твиче у работников гугла был флешмоб - они писали как здорово нихуя не знают элементарных вещей, на которых постоянно валят джунов разные говноконторки.
Программист должен понимать что делает и как, а не учить синтаксис наизусть. Вообще, всё знать не возможно в ИТ, и основная доля программера - читать документацию и гугл.
>Когда пишешь код, все само запоминается.
Вот именно - когда пишешь, а не когда судорожно пытаешься вспомнить сколько там конструкций в языке.
>а не когда судорожно пытаешься вспомнить сколько там конструкций в языке.
Я кстати погуглил эти ключевые слова из интереса, чтобы подсчитать. Оказалось некоторые из них я например вообще не видел ниразу, не довелось, соответственно я бы их и не назвал. Например insteadof.
Ну вот видишь. Теперь ты не имеешь права писать программы.
>Программист должен понимать что делает и как, а не учить синтаксис наизусть.
Если ты не знаешь унарные и бинарные операторы, то ты ноль, очевидно что код не писал. Они везде одинаковые. Про изучения синтаксиса никто не говорил. Тут как раз не синтаксис, а семантика.
>1. Сколько ключевых слов зарезервировано языком, что это за слова?
не ебу
>2. Что значит слово “инициализация”?
установление первоначального состояния
>. Какие унарные и бинарные арифметические операции вы знаете?
+,-,/,,%, mod. Остальное вроде не арифметическое
унарный знаю минус
>4. Какой оператор используется для перехода к следующей итерации цикла?
continue
>5. Как правильно организовать доступ к полям класса?
сделать их константными
>6. Дайте определение понятию “конструктор”.
функция, возвращающая новый экземпляр класса
>7. Что такое сигнатура метода?
его тип и имя (тут я бы загуглил на самом деле, потому что может это просто его тип?)
>8. Расскажите об особенностях класса с единственным закрытым (private) конструктором.
без статического метода хуй такой создашь
>9. Чем отличается переопределение метода от перегрузки?
первое ad-hoc полиморфизм, второе сабтайпинг
>10. Можно ли объявить метод абстрактным и статическим одновременно?
зачем?
>11. Можно ли перегрузить static метод?
зачем?
>12. Что будет, если единственный конструктор класса объявлен как final?
синтаксическая ошибка, я же не пишу на богомерзкой жабе
>13. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
аналогично
с++-сеньер-300к-в-секунду*
>1. Сколько ключевых слов зарезервировано языком, что это за слова?
не ебу
>2. Что значит слово “инициализация”?
установление первоначального состояния
>. Какие унарные и бинарные арифметические операции вы знаете?
+,-,/,,%, mod. Остальное вроде не арифметическое
унарный знаю минус
>4. Какой оператор используется для перехода к следующей итерации цикла?
continue
>5. Как правильно организовать доступ к полям класса?
сделать их константными
>6. Дайте определение понятию “конструктор”.
функция, возвращающая новый экземпляр класса
>7. Что такое сигнатура метода?
его тип и имя (тут я бы загуглил на самом деле, потому что может это просто его тип?)
>8. Расскажите об особенностях класса с единственным закрытым (private) конструктором.
без статического метода хуй такой создашь
>9. Чем отличается переопределение метода от перегрузки?
первое ad-hoc полиморфизм, второе сабтайпинг
>10. Можно ли объявить метод абстрактным и статическим одновременно?
зачем?
>11. Можно ли перегрузить static метод?
зачем?
>12. Что будет, если единственный конструктор класса объявлен как final?
синтаксическая ошибка, я же не пишу на богомерзкой жабе
>13. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
аналогично
с++-сеньер-300к-в-секунду*
Это не семантика даже, причем тут семантика, это фундаментальные знания, на которых программирование и построено.
>его тип и имя (тут я бы загуглил на самом деле, потому что может это просто его тип?)
Тип не имеет значения. Сигнатура это имя метода со списком параметров.
Семантика это значение единиц языка. Любое вычисление основывается на формальном языке. Это может быть даже не язык программирования. Но у него всегда есть единицы, а них значение. Бинарные операторы на самом деле пришли из математической логики. Они могут обозначаться по разному в разных формальных языках, но значение всегда одинаковое. Поэтому семантика все таки.
Ладно, ты победил. Я до сих пор и не знал толком, что такое семантика, но благодаря тебе узнал.
А вот и "я с гуглом все умею" подкатили.
Проблема вот таких "я с гуглом отвечу на вопрос" в том, что тебе никто не гарантирует, что ты не нарвешься на тупого индуса-копирайтера, который пишет хуйню, но поверишь, и дальше будешь распространять хуйню по свету.
Ты вообще понимаешь, что такое тип метода? Это типы его параметров плюс тип возвращаемого значения. Но у тебя может быть два метода с одинаковым типом, поэтому нужно еще и имя.
А вот имена параметров не важны, поэтому и определение "имя метода со списком параметров" тупое, неверное, и написанное индусом-копирайтером.
Та что справа на девченку даже не похожа. Трап наверное. Я бы тем кто трапов постит, вообще запретил создавать треды. Хоть бери и конкурирующий тред создавай.
Вообще-то это определение не из гугла, а из книжки по жабе от О'Рили. Тип метода это не типы его параметров, а только тип возвращаемого значения. Как ты понимаешь, на вход может придти массивчик, а выйти строка. А сигнатура метода это его название + список параметров. Так как методы можно еще и перегружать, то нужно указывать тип данных этих параметров. Их имена не играют роли, важен их порядок.
Я уж не смогу отличить трапа от не-трапа, но азиатские рожи терпеть не могу.
Надеюсь, что он прислушается и внемлит мольбам анонов.
буду продолжать писать для себя как тупая обезьяна в одном файле без ООП и psr
ответил выше.
Просто у опа один аргумент - "пишешь для ЗАКАЗЧИКА, а не для себя", а так как я пишу для себя, то и в рот ебал эти стандарты и ООП. Мой код все равно никто не увидит, свою задачу он выполняет, остальное мне видимо не нужно. Изначально хотел развиваться, но теперь не вижу смысла.
Фейсбуки с вк точно так же делали: хуяк хуяк и в продакшн, если взлетело - переделываем нормально. Такого подхода буду придерживаться и я, т.к. перфекционизм убьет все мои начинания.
Заказчику врядли важно как оно там, если работает как надо. А вот коллегам и тебе не насрать. Ну дело твое. Пишешь только для себя, и сам же от этого наплевательства пострадаешь в будущем.
>Фейсбуки с вк точно так же делали: хуяк хуяк и в продакшн, если взлетело - переделываем нормально.
Это в целом разумно, только тот же вк например так и не переделали нормально. Подозреваю, что и фейсбук тоже.
>Это в целом разумно, только тот же вк например так и не переделали нормально.
Двачую. Никакого MVC там и в помине нет. Еще уродливые гет-параметры, которые не помещаются в адресную строку.
>Пишешь только для себя, и сам же от этого наплевательства пострадаешь в будущем.
Каким образом?
>Это в целом разумно, только тот же вк например так и не переделали нормально. Подозреваю, что и фейсбук тоже.
Поясни, что с твоей точки зрения у них не так. Работает, не тормозит, что еще нужно?
>Двачую. Никакого MVC там и в помине нет. Еще уродливые гет-параметры, которые не помещаются в адресную строку.
Вы просто размышляете как погромисты, пользователю похуй что там в адресной строке и есть ли там mvc.
Так мы и есть погромисты, нам похуй, что там у пользователя будет. Нам код поддерживать нужно, и чем удобнее это будет, тем лучше.
ну кароч я поэтому и сказал что не быть мне программистом, извините если кого чем обидел. Не хочу писать код ради написания кода, хочу решать задачи.
У тебя практические намерения в кодировании, тебе хочется что-то созидать, а не хуярить класс за классом ради того, чтобы охуеть, какую структуру я могу написать. Создай какой-нибудь интернет-магазин, настрой seo и продавай через него что-нибудь. Вот это годно будет.
да я это и делаю, но зачитывался вашими тредами и дух захватывало - "ничего себе, может и я так могу?" Оказалось, что не могу, или не хочу, хз.
Проблем больше доставило то, что мы говорим на разных языках, и мне с моим подходом нереально будет влиться в какой-то коллектив потом.
Столько я тебе всего написал, а оказалось тебе и правда это не нужно. Бери готовое решение, написанное другими людьми, и работай тогда, в этот тред действительно можно было не заходить.
Доработанный вектор, https://github.com/php2ch/vector/blob/master/index.php
Учёл почти все замечания, а именно:
- Методы подсчёты значений сотрудника перенесены в департамент, в него же добавлены методы select() и isHead().
- Применил spaceship-оператор при сортировке.
- В функцию printCompany() добавил анонимные функции, теперь её можно запускать многократно.
- Среднее значение теперь вычисляется отдельной функцией.
- Методы антикризисного класса теперь статические, компанию не нужно добавлять в конструктор.
А, чтобы задать сотруднику индивидуальную з/п можно заменить содержащийся в нём объект профессии на новый (уникальный). Правда, тогда придётся проверять все объекты профессий в антикризисных мерах, но это уже другая история.
Ты это я. Это смешно, но я уже с 2015 года вкатываюсь попеременно. То забиваю, то снова играет страсть что-то писать/изучать и т.д. Но я понял, что суть была в том, что у меня не было конкретной цели. Теперь я ее нашел. Я пилю свой проект с использованием всех последних бек-энд технологий и потом обязательно применю это на практике. Ну а если не получится, то и хуй с ним, проектом буду заниматься. Но я уверен, что получится, потому что я знаю уже больше, чем все здесь вместе взятые. Но это просто теория, практики у меня мало, щас вот наверстываю.
>Но я уверен, что получится, потому что я знаю уже больше, чем все здесь вместе взятые
Хуя громкие заявления из-за первого опыта написания собственного проекта. Многие тут лет по 10 тернистый путь этот преодолевают, не забивая на качество кода и умудряясь при этом построить карьеру. Ну да, ты шаришь лучше всего треда канеш, уникальный весь.
То ли лыжи не едут, то ли я ебанутый.
10 лет учить php и фреймворки? Хуя ты зелень. Да даже если бы ты 5 сказал, это тоже много.
Даже несмотря на это, я могу ответить за свои слова. Помимо пыхи я знаю еще несколько языков, даже в асме ковырялся. Да что там, когда я сегодня днем вбросил список вопросов, многие отсюда просто сказали, мол, а нахуя это вообще надо? Действительно, нахуя? Чтобы крудить, фундаментальные знания не нужны, а чтобы стать профи, нужно заглянуть дальше переменных со знаком доллара.
Ставь 7.3, если нужны тайпхинты полностью.
10 лет я в целом занимаюсь кодингом, около 7 лет работаю. Есть куча своих проектов, и тоже всегда стремился свое писать. Работал не только на пхп, но и на шарпе, джавке, жсе и питоне. И свои проекты тоже разные совершенно. С чего ты решил, что тут в треде только изучающие?
зайду завтра, чтоб найти работников за лапшу которые будут писать мне модули к симфони (по факту половина из вас пилит вордпресс на фрилансе, а в этом треде все такие девелоперы пиздец)
Я обычно сюда захожу после того, как напишу за пару часов какое-то убогое и кривое поделие под свою задачу. Оно настолько плохое (даже мне очевидно), что прямо больно смотреть. И я иду сюда, чтоб попытаться начать заново и в следующий раз делать все правильно. И каждый раз я ломаюсь и возвращаюсь к началу.
Впрочем мои душевные пиздострадания не имеют никакого отношения к php, так что не буду портить тред своим присутствием.
Что ты имеешь против лапши, гурман?
Инбифо: чтобы узнать, что форма была отправлена с конкретной страницы
Можно было бы и язык еще написать, ну да ладно.
== и equals без перегрузки для ссылочных типов сравнит ссылки.
В шарпе можно перегрузить и то и другое, в джаве только equals, перегрузки операторов нет. (или есть в новых версиях, не следил)
Так же в шарпе для тех же стрингов уже есть перегрузка ==, чтобы сравнивать значения. В джаве этим не заморачивались и будут сравнены ссылки, для сравнения значений переопределены equals у встроенных типов. Ну и == не ругнется на нулл в отличии от equals в левом операнде, что в общем-то очевидно.
Потому что внезапно на странице может быть не одна форма. И я сейчас не имею ввиду формы в типичном представлении пользователя, а именно тег form.
Например, ты реализуешь отправку поста в базу по одной кнопке одной форме, а удаляешь пост из базы по другой кнопке в другой форме с одним полем из этой кнопки.
И это две разные формы с двумя разными кнопками.
Ну и так исторически сложилось, что нужно проверять именно кнопку.
на php, но без стандартов. Имею ввиду, что портить тред про обучение не хочу, т.к. и сам не научился, и другим мешаю.
>Например, ты реализуешь отправку поста в базу по одной кнопке одной форме, а удаляешь пост из базы по другой кнопке в другой форме с одним полем из этой кнопки.
>И это две разные формы с двумя разными кнопками.
Две разные формы с одинаковыми post параметрами?
Слушай, а я вот читал, что в жабе, если ты удалишь объект, то не факт, что он удалится незамедлительно, и некоторое непродолжительное время он будет жить, что может повлечь за собой некоторые баги. В общем, это зависит от того, с какой скоростью сборщик мусора его приберет. Это правда?
>позаботься хотя бы об элементарной безопасности.
Разверни мысль. Или банальное экранирование переменных уже считается чем-то необычным?
А стиль написания кода на безопасность никак не повлияет, в отличие от стада мартышек, слепо действующих по мануалу.
Я не особо шарю в gc, работает на фоне и работает. В пыхе кстати тоже есть, но тут об этом обычно не думают, пока пилишь простое веб приложение и не покоряешь долгоживущие. Удаляется то, на что не остается ссылок. Конкретно самому удалять объекты, как в крестах например, не надо прямо. А то ты вроде именно удаление озвучил. Впринципе для удаления в таких языках можно параноидально обнулить все ссылки на объект и оставить остальное gc.
Какие там баги кроме утечек без понятия. Проще всего понять (да и обосраться) можно на статичных ссылках. Статика живет на уровне класса, поэтому даже после смерти инстансов такая ссылка остается валидной и gc ее не не тронет. Внутренние классы и потоки тоже легкий способ выстрелить в ногу gc. Много об этом не могу сказать, у меня серьезных утечек не было, только мелочевка вполне очевидная, и поэтому не приходилось вдаваться. В голове держу только сам факт, что за этим надо следить.
>>Например, ты реализуешь отправку поста в базу по одной кнопке одной форме, а удаляешь пост из базы по другой кнопке в другой форме с одним полем из этой кнопки.
>>Мужик, здесь не С++, и в ногу себе выстрелить никак нельзя.
Да вы тут поехавшие какие-то. Если ты сам себе шлешь данные пост запросом, то никаких проблем нет. Если ты шлешь данные не себе с одинаковыми полями, то не надо так делать.
Так данные шлешь не ты, а пользователь. А что он там тебе пришлет, одному богу известно.
>В пыхе кстати тоже есть, но тут об этом обычно не думают, пока пилишь простое веб приложение и не покоряешь долгоживущие.
В нетбинсе последнем есть фича принудительного запуска сборщика мусора. И еще есть динамический счетчик памяти, занимаемой скриптом в рантайме.
У тебя были серьезные проблемы с утечками? По какой причине смог выяснить? Интересно опыт в этом плане отличный от своего услышать.
Тащемта, анус затощен под анускрипт, он даже написан на нем. Поэтому треба ставить плагины. Хуевый редактор, если честно. Саблайм и брекеты уделывают его в два счета.
Баги это не должно повлечь. Если на объект не осталось ссылок в переменных программы, то с ним ничего нельзя сделать и есть он или нет - ничего не меняет. Хотя, конечно, при желании можно и в такой системе создать баг. Но это сложнее, чем в языках без сборки мусора, где программирование напоминает хождение по минному полю. На Си пишут лет 30-40 и до сих пор классические проблемы вроде buffer overflow или ошибок работы с памятью они лечить не научились. До сих пор есть шизанутые, которые пишут нечитаемый код в стиле a[i++] = b[j--];
>Никакого MVC там и в помине нет.
Вордпресс тоже MVC не имеет, а сколько сайтов на нём крутятся? Вообще, в веб с норм технологиями как-то не повезло, один говнокод повсюду.
Каждую строку не надо комментировать, только методы\функции, ну и описания классов там, или файлов, немножка - одной строкой. В сам алгоритм вообще лазать не надо, если он написан нормально и работает. Зачем его комментировать?
Аноны, у меня вопрос по этому выражению. Я смотрю на часть шаблона "http://([a-z0-9.-]+)" и интерпретирую его следующим образом. После двух слешей есть один из указанных в квадратных скобках символов, и за ним может следовать любое количество равно таких же символов или не следовать вообще ничего. То есть, строки типа aaa, 11, --------, но не ab--1 или georgebush. Я верно размышляю? И, если да, то зачем [a-z0-9.-]+ заключать ещё и в круглые скобки? Они же содержат установленую последовательность символов. А в конкретно этом случае они ничего не поменяют. Или?
Проверил такой код:
<?php
$text = 'Samwise Gamgee'; // will put "a" in $empty?
$expression = '/[a-z0-9.-]+/';
$empty = [];
preg_match($expression, $text, $empty);
echo var_dump($empty);
?>
Выдал "amgee". Как-то я не допираю. Как вообще функция сканит текст?
В общем, делаю вывод, что [characters_list]+ просто совпадает с любой строкой, в которой есть символы, которые содержатся внутри скобок. Не важно в каком порядке и каком количестве - главное, чтобы был хотя бы один символ. Это показалось мне странным, потому что я думал, что из квадратных скобок выделается какой-то один символ, если после них не стоит никакого кватификатора. А добавление плюса просто означает, что именно один из указанных символов может повторятся любое количество раз. Но это будет другая конструкция - ([characters_list])+
Сложно уложить это в голове почему-то.
Совет всем на будущее и тебе тоже.
1. Выкладывайте код на ideone или делайте скриншот из своего редактора, так будет легче всем воспринимать код.
2. Пишите как можно кратче без лишних витиеватых конструкций и воды. Я уже много раз переставал читать просто потому что слишком много букв. У нас ведь есть свои дела, а чтение длинного поста это трата времени.
3. Будьте благоразумны. Если не получается решить задачу, отдохните и попробуйте решить ее снова. Погуглите. Не целесообразно спрашивать ответы здесь сразу. Кайф от самостоятельного решения задачи, хоть и с гуглом, не сравним с банальной вычиткой ответа из треда.
preach, brother
Зачем здесь нужны тайпхинты вообще, если одна и та же подпрограмма может вернуть кучу разных значений?
в идеологии структурного программирования под единой точкой выхода подразумевается введение оператора return и запрет (либо использование только в необходимых случаях) так называемых "длинных переходов", аналогов setjmp/longjmp в си
те формально фции php уже соответствуют этому требованию
ПАЦАНЫ КАК СПАРСИТЬ ЭТУ СТРАНИЦУ ШТОБЫ ЗАДЕЙСТВАВАТЬ ВОТ ЭТАТ ПАРАМЕТР newface-1
file_get_contents('http://loveplanet.ru/a-search/d-1/foto-1/pol-1/spol-2/bage-24/tage-24/geo-0,0,0/purp-0/newface-1/');
ШТО ДЕЛАТЬ? НАУЧИТЕ И ПАМАГИТЕ ПАЦАНЫ
бля, это же php тред!
не заметил и отписался
я теперь зашквареный, бля
не отмытся перед пацанами
Он нужен для того, чтобы его можно было вызвать у классов-потомков?
Или не вызвать, как захочешь. Ты можешь и не переопределять конструктор в дочерних классах. Или переопределить и насрать на базовый. Видал как много вариантов?
Проиграл в голосяндру.
Ну повыше станут - кодеры из контор хоть посмотреть смогут как пишешь. Это всё же лучше, чем наугад джуна брать.
Неправильно утверждать, что функция всегда должна возвращать один тип. Функцию можно использовать как абстракцию данных. Она может возвращать другую функцию, которая в свою очередь не зависит от типа, и может возвращать разные типы, в зависимости от передаваемых аргументов.
В этом суть абстракции данных. Нам как и функциям, не нужно знать какой тип мы обрабатываемым. Мы можем обрабатывать разные типы одинаковыми функциями. Это дает универсальность и модульность. При таком подходе, не нужно переписывать верхние уровни абстракций, чтобы начать работать с новым типом. Достаточно изменить нижний уровень.
Декларативный хаскеле-червь-пидор, ты опять выходишь на связь, ублюдок?
Ну давай ублюдок, иди сюда, думаешь меня трахнуть? Я сам тебя трахну
> 1. Сколько ключевых слов зарезервировано языком, что это за слова?
Серьезно? Не помню точное количество. Ориентировочно 30-50. Перечислять тоже лень.
> 2. Что значит слово “инициализация”?
Первичное присвоение значения переменной.
> 3. Какие унарные и бинарные арифметические операции вы знаете?
Унарные: унарный плюс/минус, инкремент/декремент. Бинарные: +-*/%
> 4. Какой оператор используется для перехода к следующей итерации цикла?
continue
> 5. Как правильно организовать доступ к полям класса?
Поля непубличные, через геттеры.
> 6. Дайте определение понятию “конструктор”.
Метод, вызываемый при инициализации объекта
> 7. Что такое сигнатура метода?
Аргументы и их типы + возвращаемые значения и их типы
> 8. Расскажите об особенностях класса с единственным закрытым (private) конструктором.
Бля, ну тут хуй знает. Видимо невозможно создать обьект такого класса напрямую. Можно создать в статическом методе такого класса, в его потомке. Скорее всего переопределить private конструктор в потомке тоже нельзя.
> 9. Чем отличается переопределение метода от перегрузки?
Перегрузка в япах обычно означает возможность создания методов с одинаковым названием, но разными аргументами. В пыхе такой хуйни нет.
Переопределение - создание метода с таким же названием в потомке.
> 10. Можно ли объявить метод абстрактным и статическим одновременно?
А хуле бы нет, да.
> 11. Можно ли перегрузить static метод?
Конечно, хуле нет.
> 12. Что будет, если единственный конструктор класса объявлен как final?
Нельзя его перегрузить?
> 13. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
Хуй знает, в анонимных функциях надо все внешние переменные передавать через use. Таким извратом как создание анонимных классов не занимаюсь
Ну давай ублюдок, иди сюда, думаешь меня трахнуть? Я сам тебя трахну
> 1. Сколько ключевых слов зарезервировано языком, что это за слова?
Серьезно? Не помню точное количество. Ориентировочно 30-50. Перечислять тоже лень.
> 2. Что значит слово “инициализация”?
Первичное присвоение значения переменной.
> 3. Какие унарные и бинарные арифметические операции вы знаете?
Унарные: унарный плюс/минус, инкремент/декремент. Бинарные: +-*/%
> 4. Какой оператор используется для перехода к следующей итерации цикла?
continue
> 5. Как правильно организовать доступ к полям класса?
Поля непубличные, через геттеры.
> 6. Дайте определение понятию “конструктор”.
Метод, вызываемый при инициализации объекта
> 7. Что такое сигнатура метода?
Аргументы и их типы + возвращаемые значения и их типы
> 8. Расскажите об особенностях класса с единственным закрытым (private) конструктором.
Бля, ну тут хуй знает. Видимо невозможно создать обьект такого класса напрямую. Можно создать в статическом методе такого класса, в его потомке. Скорее всего переопределить private конструктор в потомке тоже нельзя.
> 9. Чем отличается переопределение метода от перегрузки?
Перегрузка в япах обычно означает возможность создания методов с одинаковым названием, но разными аргументами. В пыхе такой хуйни нет.
Переопределение - создание метода с таким же названием в потомке.
> 10. Можно ли объявить метод абстрактным и статическим одновременно?
А хуле бы нет, да.
> 11. Можно ли перегрузить static метод?
Конечно, хуле нет.
> 12. Что будет, если единственный конструктор класса объявлен как final?
Нельзя его перегрузить?
> 13. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
Хуй знает, в анонимных функциях надо все внешние переменные передавать через use. Таким извратом как создание анонимных классов не занимаюсь
>Ориентировочно 30-50.
Я вчера нагуглил. И уже забыл. Около 70. Почти все реально в памяти не держатся, постоянно используемых гораздо меньше (и от конторы к конторе может разниться то, основной или альтернативный синтаксис юзается).
А, ну в пыхе же ещё куча всякой хуиты уровня endfor и т.п.
Тогда возможно.
Лол, зато я помню, что в Go около 30 ключевых слов
<?php
error_reporting(-1);
for ($x = 1; $x<=10; $x++) {
echo "{$x}x{$x} = $x$x\n";
}
?>
Выдает
1x1 = 11
2x2 = 22
3x3 = 33
4x4 = 44
5x5 = 55
6x6 = 66
7x7 = 77
8x8 = 88
9x9 = 99
10x10 = 10*10
ЧЯДНТ? Пробовал pow($x,$x) и миллион вариантов расстановки круглых и фигурных скобок вокруг переменных, он их просто выводит строкой.
Алсо, ОП, у тебя в первых уроках сказано, что принцип, по которому дают имена переменным, называется camelCase, полез гуглить. Википедия говорит, что CamelCase - это когда каждое слово, включая первое, начинается с большой буквы, а то, как в пыхе называют переменные, называется lowerCamelCase. Ну и прослезился на задачках про доллар по 32 рубля.
У макабы свои правила разметки, которые сильнее пыхи, но код работоспособный, I promise.
>Унарные: унарный плюс/минус, инкремент/декремент. Бинарные: +-*/%
Аллилуйя, хоть кто-то ответил правильно.
>Аргументы и их типы + возвращаемые значения и их типы
Неверно.
>Хуй знает, в анонимных функциях надо все внешние переменные передавать через use. Таким извратом как создание анонимных классов не занимаюсь
Да по тем же правилам, что и к обычной переменой.
С этим разобрался, теперь другой вопрос возник. Как в один цикл впихнуть 2 действия? Например, если есть 2 переменные, и если одна переменная меньше 100, то прибавить 4 к ней, а к другой прибавить 1?
Не пихай в определение цикла такие вещи. А так через запятую 1 и 3 секция фора делится на действия.
Ушёл из сервисного центра в пыхокодеры где-то три четверти года назад.
Сложно, но учиться всегда сложно.
Спасибо, помогло. Действий сколько угодно можно добавить, надо полагать?
>Не пихай в определение цикла такие вещи
Это не я, это всё ОП! Я просто повторяю, что в мануале написано.
Я в курсе, что это можно. Дальше то что? И вообще любой цикл можно описывть через (другой цикл) while(true) или тот же for (;;), только в теле придется побольше написать. Это не значит, что это пиздец хорошая практика и погнали так делать все и всегда.
Просто так нагляднее. Видишь фор, ага, значит цикл, смотришь, что происходит за одну итерацию, так, тут инкрементится, тут складывается, тут ансеттится, тут условие, хуе-мое, а в случае с фор (что-то;что-то;что-то) смотришь что и где, примеряешь каждую итерацию к условию, мысленно прогоняешь итерацию за итерацией и в какой-то момент говоришь: так падажжи ебана.
Я так то ему посоветовал в случае фор использовать только счетчик в определении, все остальное в теле цикла для читаемости (возможно за редкими исключениями), а не добавлять туда всю кучу счетчиков и условий из тела цикла, хоть это и возможно. Он для того и создан, чтобы банальный счетчик итераций из тела вынести, вот пусть так и используется. Для других случаев другие вещи подойдут.
Да ты прав, конечно, просто я поспорить люблю.
Ты не прав. Нужно опираться на логику, а не на твое "Я сказал". Если нужно использовать составное выражение, то нужно использовать составное выражение. Выражения никогда не засоряют код, а вот лишние инструкции еще как. Цикл все равно будет в функции, будет скрыт, один раз написал и все. Потом используешь функцию как хочешь.
https://ideone.com/q3MrtH
Надо написать программу явл палиндромом.
С этими mb функциями пиздец просто в голове и массивы, и циклы и условия, ебись они конём с этой задачей нихуя не выходит. Целый день блять эти задачи решаю.
Заранее благодарю. Соре, пригорело.
Пфф, кто сказал что так нужно делать? Чепуха какая то.
Не годится. Создай функцию, которая будет принимать строку.
Прежде чем решать, расписывай алгоритм на бумажке. Эта техника очень помогает.
Первый:
$x = 10;
function test (&$x) {
$x = 5;
}
test($x);
echo $x; // 5
Второй:
$name = 10;
function test () {
global $name;
$name = 5;
}
test($name);
echo $name; // 5
Ни один. Что ты хотел показать и что хочешь сделать вообще? Если изменить глобальную переменную, то это антипаттерн.
>расписывай алгоритм на бумажке
Да зачем бумагу переводить? Прямо так пускай и пишет в редакторе:
// инициализировать переменные
// запустить такой-то цикл
// с таким-то телом
// и т.д.
А потом по этому скелету собирает.
Два разных способа сделать одно и то же. Спросил, какой предпочтительнее. Выходит - вообще нельзя менять по нормальным правилам? Тогда зачем существует ссылка на переменную?
На бумаге намного эффективней. Лучше использовать блок-схемы. То что ты написал - птичий язык. Он не формализован. По нему составить нормальный алгоритм невозможно. Для алгоритмов есть специальные формальные языки, - блок-схемы например.
Непонятно что ты делал. Учись подробно и четко объясняться. Чем лучше будешь объяснять, тем точнее получишь ответ на вопрос. Попробуй еще раз.
Зависит от того, что ты хочешь. В первом случае глобальная переменная изменится после вызова функции, во втором - нет.
Есть группа однотипных методов, которые принимают одинаковый параметр и возвращают один из возможных вариантов ответа.
Переписывать не вариант, уже пробовал, на архитектуру лучше всего ложится вариант, когда методы могут возвращать разные значения.
Какие есть варианты:
1. Не объявлять возвращаемый тип, а далее проверять через instanceof и функции вроде is_string что мне высрали. Не слишком хороший путь как по мне, ибо за счет динамической природы php будут ебнутые конвертации типов вроде string -> int.
2. Возвращать nullable-тип в связке с каким-то другим типом, то бишь, 2 возможных значения. Остальные значения записывать в члены класса и считывать потом. Тоже какое-то говно.
3. Создать свой класс, содержащий возможные значения и везде возвращать его. Плюсы: методы получаются чистыми, все четко и удобно. Минусы: надо городить очередной value-объект, бесполезный везде кроме этих нескольких методов.
4. out-параметры. Записывать некоторые или вообще все значения в переданные по ссылке переменные. Плюсы: аргументы типизируемы. Я могу передать "безтиповые" пустые переменные, а метод заполнит их нужными типами. Минусы: методы получаются нечистыми и ?? Вроде не такой уж хуевый вариант.
На какой стул сесть?
И во втором изменится - он импортировал её.
Анончики, вопрос по регуляркам.
Задача с проверкой номеров телефона
Сделал первую часть: ^(\s?(\+\s?7|8))
А потом, в книге пишут:
>за ними ровно 10 цифр, между которыми может быть любое число скобок, минусов, пробелов
Как это сделать? 10 цифр это понятно: [0-9]{10}
А как сделать, чтобы между ними учитывались скобки, пробелы и минусы? Можно ли как то это сделать за один раз, либо придется что то типа: сначала идут 3 цифры, потом возможно скобка или пробел или минус, потом еще три цифры и опять может пробел или минус и т.д.?
Вот такая регулярка получилась, не понял, можно ли сделать так как говорили в подсказке к заданию
^\s?(\+\s?7|8)\s?-?\(?\s?[0-9]{3}(\s?-?\)?\s?){1,3}[0-9]\s?-?\)?\s?[0-9]\s?-?\)?\s?[0-9](\s?-?\)?\s?){1,2}[0-9](\s?-?\)?\s?)[0-9](\s?-?\)?\s?)[0-9]{2}$
Вот примеры для проверки https://regex101.com/r/qF7vT8/3.
Конечно получилось так, что он в основном проверяет примеры, которые даны в учебнике, потому что нужно было бы учитывать каждый пробел, тире после цифры, а это еще бы увеличило регулярку. Поэтому если знаете, скажите можно ли как нибудь записать регулярку по типу есть 10 цифр, а между ними может быть либ0 строчка, либо тиру, либо скобки?
Короче сделал увот так вот ^\s?(\+\s?7|8)([\s-\(\)0-9]*)$
Но теперь выделяется вся строка(то есть не только номер телефона, но и вся строка), но сократил как смогпросто увидел регулярку из четвертой части
Во-первых, какие <br/>? Это же не html, хотя не знаю, может в php тоже так можно, но все равно используй \n
Ну и твоя функция ничего не возвращает. ТО есть ты не используешь return
В командной строке? Ты троллишь что ле? У меня по этой ссылке https://ideone.com/VGi2VJ выходит <br/><br/><br/> и все. Если изменить его на \n он работает
Потому что айдеон парсит код перед выполнением и заменяет все \n на <br>, а <br>, написанные тобой выводит, как есть, вот и работает. Такая вот имитация реальности. Как в VR-шлеме.
А что, похож? Нет, к счастью. Я тот, кто спорил с ним по другую сторону баррикад.
обертка( другая_обертка( какой-то_метод() ) );
Обертка лежит в одном классе и передает данные в другую_обертку, которая лежит во втором классе, и она уже запрашивает данные у метода из того же (второго) класса и возвращает первой обертке в первый класс.
Мне нужно из обертки вызвать какой-то_метод, причем, заранее неизвестно, какой именно это метод.
Может можно как-то передать сигнатуру метода в другую_обертку, чтобы она с ее помощью вызвала этот метод?
Возможно такое в php?
Никак не могу понять, почему у меня буква w меняется на заглавную. Помогите сообразить, пожалуйста. Хочу обойти ucfirst()
А что не так? Ты разбираешь предложение по знакам препинания и делаешь каждую первую букву заглавной. Перед w у тебя точка. W - начало нового предложения.
str_replace заменяет все вхождения, переданные первым аргументом. Первый аргумент у тебя w, соответственно функция заменяет все w в строке $sentence на toUpperCase(w). Очевидно же, анониус.
Моё увожение. Благодарю!
Шизик, кто знает что тебе там показалось на заре твоей болезни? Никто не должен перед твоим манямиром оправдываться. Просто пей таблетки, которые врач прописал.
А с чего ты взял, что это одни и те же люди? На пыхе типизация не обязательна, можешь юзать ее, а можешь и не юзать. Можешь юзать частично. Вариантов масса. Да и к тому же, насколько я понял, указывать типы в пыхе это все равно что вставлять палки в свои колеса. Толку от них, все равно, если не укажешь тип - нихуя не произойдет, просто ошибка не выкинется.
Знал такого одного, но он вообще не очень был и все на массивах делал и методах по 1к строк. Типизация так то не обязательная, типа пиши как хочешь, хозяин барин. Хотя по хорошему обязательная во всех случаях, кроме тех, где нестрогость предусматривается логикой. Да и то эта тема доступна только в сигнатурах методов (хотя за версии типа 7.3 не в курсе изменений).
Сижу на 7.3, никаких изменений в отличие от 7.1 не заметил.
>насколько я понял, указывать типы в пыхе это все равно что вставлять палки в свои колеса. Толку от них, все равно, если не укажешь тип - нихуя не произойдет, просто ошибка не выкинется.
ты всё неправильно понял
Вообще, типизация, лучшая вещь, которая случалась с пыхой за последние 5 лет.
В версии 7.4 добавили типизацию переменных класса при объявлении.
Новичкам советую приучаться и юзать всё с типами.
Tut nikto ne yzaet dreampidor ili bootsthui. Dlya wseh uje dawno izobreli CSS Grid.
Сначала долго вкуривал, как работают утверждения в регулярке, но в итоге разобрался в самом принципе. Однако теперь меня ввёл в ступор последний элемент массива в примере ОПа:
preg_split("/(?<=\d)/u", "12abc3"). Значения элементов массива будут такими: ['1', '2', 'abc3', ''].
Насколько я понял, функция будет посимвольно проходить по тексту, начиная с первого символа, и на каждой "остановке" делать проверку, не находится ли слева цифра. Если находится, то всё, что левее этой "остановки" попадёт в массив. Но мне не ясно почему работа регулярки не останавливается на последнем символе строки - 3. Там ведь дальше ничего вообще нет - куда она прёт?
То есть, изначально я думал, что функция сканит строку до символа 3. Остановившись на 3 и не зарегистрировав цифру слева, почему функция вообще выкидывает значение элемента abc3? А последний элемент - это вообще пушка. Как вообще логически туда могло попасть пустое значение?
В общем, я запутался. Помогите разобраться, пожалуйста.
Плохое я время выбрал для своего проекта. Каждые пару месяцев приходится с версии на версию перекатываться.
Помоему гдето раз в полгода-год минорка выходит, и перекатываться не обязательно так сразу.
Я тебе только из головы могу сказать, а я нихера не шарю совершенно, кроме как на мажорку с миноркой ориентироваться, остальное не самое каждодневное.
Ну вот есть такая довольно общепринятая модель нумерования версии. Мажорка с миноркой понятно. Первая - это финиш, практически новый проудкт, вторая тот же продукт, но другое апи. Далее идут сборка и ревизия. Стадия кучи багфиксов так сказать и мелких правок. Сборка - это уже законченные билды, такие себе патчи с множеством фиксов, которые пользователям той же винды подсовывают под видом "нужно обновление" на минутку. Ревизия - тестовые билды конкретной сборки. Типа 3 билд 1452 ревизия означает билд номер 3 и 1452 ревизии этого билда хер знает кем, должно быть контролем качества.
Так то это не закон, иначе бы в школах учили, но полезно хотя бы первые две цифры нормально читать. Остальные уже при углублении.
Я ничего не понял, что ты написал. Шизофазия какая-то. С термина на термин прыгаешь. Тебе никогда не говорили, что ты не логичен?
Допускаю. Эту хуйню легко загуглить можно, не обязательно мой бред слушать.
>>36750
Гуглите семантическое версионирование: https://semver.org/lang/ru/#вступление
>>36422
Ещё со времен PHP 5.3 ведущие фреймворки на полную использовали типизацию, может твои данные устарели лет на 10.
>>36684
В PHP очень медленно и лениво добавляются изменения, для обновления минорной версии достаточно пару строк в проекте поправить (переводил проекты через 7.0 -> 7.1 -> 7.2). Конечно, при условии, что deprecation warnings исправляются сразу же. Это не JS, где каждые полгода проекты переписываются на новом стеке / фреймворке.
>может твои данные устарели лет на 10.
Я так смотрю - пол интернета судит пхп по версии 10-летней давности. Что самое забавно примерно столько же легаси говна на нём уже налепили.
Я тебе больше скажу: не все знают, что вышла 7 версия, и до сих пор продолжают лепить проекты на 5.6 версии по привычке.
>не все знают, что вышла 7 версия
Как можно назвать человека, который в своей профессиональной деятельности не следит за индустрией?
А ты пенсионер что ли, с паркинсоном и амнезией?
Давай не будем оправдывать свою лень и устаревший говнокод возрастом.
>>31410
> Биология имеет мало общего с техническими науками, и инженерией.
Скорее технические науки и инженерия имеют мало общего с биологией. Потому что технические науки и инженерия созданы человеком только за последние сотни лет, а биология это миллионы лет эволюции.
Даже имея наши знания в технических сверх, мы до сих пор не можем понять устройство биологии. Даже имея возможность заглядывать на миллионы световых лет в даль, даже имея атомные источники энергии - это всё не дает на понимания как устроен природный код ДНК. Потому что наши представления и парадигмы программирования так примитивны.
И более того наши технические устройства не так совершенны. К примеру, любое технологическое устройство, даже которое является венцом технологий (к примеру компьютерные сервера, производственные машины), рано или поздно ломаются, если за ними не следить, и им нужна постоянная поддержка человека. А биологические виды способны самостоятельно подстраиваться и использовать среду, способны самостоятельно восстанавливать себя, и самое главное способны к собственной репродукции.
>>31431
>Все наоборот. Глупые идеи всегда выстреливают, потому что умных людей, хорошо понимающих науку и инженерию единицы. Кто отвергнет ООП? Школьники, кодеры без образования? Только тот кто понимает математику, науку, и инженерию. Таких очень мало. Кто использует ООП? Все кому не лень. Но у них у всех есть общая черта, они не знают и не понимают математику. Так как не понимают математику, то не понимают и науку с инженерией в целом.
Всё с точностью да и на оборот.
Человек подвержен к человеческому фактору, и единицам ошибиться проще, чем большинству. Иными словами, если один человек что-то упускает, то другой сможет исправить эту ошибку. И методом бесконечных проб и ошибок ООП становиться более мощным инструментом. Это его плюс.
>Математики и инженеры начала, середины, и немного конца 20-го века, были последними кто мог создавать шедевры. Делать вещи простые, компактные, функциональные, но без лишнего. Как пример Лямбда-исчисление Чёрча, и комбинаторная логика Шейнфинкеля-Карри.
Древние технологии это тонкий и острый инструмент, да. Но каждый инструмент имеет свои плюсы и минусы. Как ты и сказал, ООП предназначено для решения любой абстрактной задачи, но в перевес этому, оно не может решить так эффективно конкретную задачу, как это сделали бы те технологии.
Мастерство заключается в умении правильно применить те или иные плюсы и минусы.
>>31410
> Биология имеет мало общего с техническими науками, и инженерией.
Скорее технические науки и инженерия имеют мало общего с биологией. Потому что технические науки и инженерия созданы человеком только за последние сотни лет, а биология это миллионы лет эволюции.
Даже имея наши знания в технических сверх, мы до сих пор не можем понять устройство биологии. Даже имея возможность заглядывать на миллионы световых лет в даль, даже имея атомные источники энергии - это всё не дает на понимания как устроен природный код ДНК. Потому что наши представления и парадигмы программирования так примитивны.
И более того наши технические устройства не так совершенны. К примеру, любое технологическое устройство, даже которое является венцом технологий (к примеру компьютерные сервера, производственные машины), рано или поздно ломаются, если за ними не следить, и им нужна постоянная поддержка человека. А биологические виды способны самостоятельно подстраиваться и использовать среду, способны самостоятельно восстанавливать себя, и самое главное способны к собственной репродукции.
>>31431
>Все наоборот. Глупые идеи всегда выстреливают, потому что умных людей, хорошо понимающих науку и инженерию единицы. Кто отвергнет ООП? Школьники, кодеры без образования? Только тот кто понимает математику, науку, и инженерию. Таких очень мало. Кто использует ООП? Все кому не лень. Но у них у всех есть общая черта, они не знают и не понимают математику. Так как не понимают математику, то не понимают и науку с инженерией в целом.
Всё с точностью да и на оборот.
Человек подвержен к человеческому фактору, и единицам ошибиться проще, чем большинству. Иными словами, если один человек что-то упускает, то другой сможет исправить эту ошибку. И методом бесконечных проб и ошибок ООП становиться более мощным инструментом. Это его плюс.
>Математики и инженеры начала, середины, и немного конца 20-го века, были последними кто мог создавать шедевры. Делать вещи простые, компактные, функциональные, но без лишнего. Как пример Лямбда-исчисление Чёрча, и комбинаторная логика Шейнфинкеля-Карри.
Древние технологии это тонкий и острый инструмент, да. Но каждый инструмент имеет свои плюсы и минусы. Как ты и сказал, ООП предназначено для решения любой абстрактной задачи, но в перевес этому, оно не может решить так эффективно конкретную задачу, как это сделали бы те технологии.
Мастерство заключается в умении правильно применить те или иные плюсы и минусы.
>>31762
>Аноны, а просто любопытно, как вы читаете тред?
>Добавлен в избранное двача.
This.
>И как находите ответ на свою задачу если ОП часто их проверяет только несколько дней спустя, и за этой время успевают запостить 300-400 постов?
>Обязательно добавляю в сообщение с решением какое-нибудь ключевое слово (чаще всего название задачи), по нему нахожу свой пост и ответы к нему. Если задачу нужно переделывать, ваш ответ сохраняю в ворд-файл, чтобы не искать каждый раз.
Специально для таких случаев уже позаботились об этом - на сайте https://phpclub.tech можно получить конкретную цепочку обсуждения в течении всех тредов!
Чтобы это сделать нужно нажать на иконку "Цепочки" на интересующем вас посте.
https://phpclub.tech/pr/chain/1331762/
Алгоритм работы preg_split такой:
- найти в строке все подстроки (части строки), которые соответствуют выражению. Поиск совпадений производится слева направо, с первого символа до последнего. Подстроки не пересекаются, то есть, если регулярка нашла подстроку с 1 по 10 символ, то далее поиск совпадений продолжается с 11 символа
- вырезать из строки найденные подстроки и вернуть кусочки, которые были между ними + кусочек перед первым совпадением и после последнего
При этом регулярка из утверждений не "захватывает" символы и потому возвращает подстроки нулевой длины.
Пример: строка "abc", выражение "/./ui". Оно найдет подстроки "a", "b", "c". После "вырезания" из строки этих подстрок остается 4 пустых подстроки: ['', '', '', ''] - подстрока слева от a, между a и b, между b и c, после c.
Пример поинтереснее: выражение //ui, строка "ab". Пустое регулярное выражение совпадает с любой строкой, но не захватывает символы из нее. Потому оно "найдет" в строке 3 подстроки: перед a, между a и b и подстроку после b, все подстроки нулевой длины. Разбиение по этим подстрокам даст массив ['', 'a', 'b', ''].
Проверка, угадал ли я результат: https://repl.it/repls/CluelessRaggedAbstractions
По той же причине в твоем примере есть пустая строка - это подстрока, которая была справа от последнего найденного совпадения.
Для отладки ты можешь использовать флаг PREG_OFFSET_CAPTURE в preg_match_all, который покажет позицию найденных подстрок (в байтах, а не символах, но для латиницы 1 байт = 1 символ).
Если ты хочешь зайти глубже, можно скачать библиотеку pcre, к которой приложены отладочные утилиты вроде pcretest ( https://www.pcre.org/ ). Они вызываются из ком. строки. Обрати внимание, что для некоторых платформ библиотека распространяется в исходных кодах и ее надо будет компилировать.
Покажи код и конкретно опиши проблему.
>Возможно такое в php?
Да, это называется callback.
https://ru.wikipedia.org/wiki/Callback_(программирование)
https://secure.php.net/manual/ru/language.types.callable.php
>Ребята, как вы тестируете авторизацию?
https://github.com/someApprentice/Portfolier/blob/master/tests/AuthorizationTest.php
Login/logout выполнен с помощью Symfony Security, но и это тестируется точно так же.
Почитай урок codedokode о тестировании и у тебя появится представление об этом.
https://gist.github.com/codedokode/a455bde7d0748c0a351a
Ты сам-то запускал что понаписал там, оно же, блядь, банально не работает! ОПу еще и дебажить за тебя что-ли?
Никто не обязан твоё говно разбирать, а на галере тебя за такое ебать грязной шваброй будут. Приведи код в порядок и рабочее состояние, чтобы смотреть приятно было. Имей уважение к своему труду и чужому времени, дружок.
Свой негатив можешь оставить в /b/, а здесь люди пытаются научиться программированию на своих ошибках.
Тебя это так раздражает, потому что ты сам не можешь справиться с этим кодом. Ты даже не указал где конкретно ошибка, иными словами, всё что ты сделал, это только показал какой ты слабый и не уравновешенный.
Пожалуйста, займись своими эмоциями в тематических для этого тредах, а в этом треде, и тем более, разделе занимаются программированием.
>Ты даже не указал где конкретно ошибка
Он не работает и человек выложил это на проверку, на всеобщее обозрение. Т.е. он сам неудосужился его проверить. Ошибка между стулом и клавиатурой.
>Свой негатив можешь оставить
А ты мне рот не затыкай, фашист.
Я ожидал что разговор с такими эмоционально неуравновешенными будет бесполезен.
бамп
Пыхыпыдебил - это хуже всего вообще, даже хуже червя-пидора.
Чему ты, гнида, наглядная иллюстрация.
Дружок, ты выложил свой код на оценку - его оценили так как он того заслужил. Он не работает и тебя заслуженно обосрали, отчего ты начал обвинять просмотревшего в неуравновешенности. Заказчику ты тоже такое скажешь?
Спасибо за ссылку, ОП. Благодаря тебе я нашел свой первый пост от 2015 года, где приложил скриншот своей первой имиджборды на html+php, такая-то ностальгия.
есть кусок кода, который должен выполнятся только первый раз. при перезагрузке страницы ничего не должно выполнятся.
Было бы забавно посмотреть, когда у заказчика падает весь магазин китайских поддельных сумок из-за такого вот кода в твоём плагине, а ты ему в ответ про неуровнавешенность лекции читаешь.
В куках ответ сей можно найти.
Я не, ОП. Я основоположник этого сайта и всего лишь учусь у него.
Прикньте у этого чувака так бомбануло, что он начал семенить от моего имени >>37389 >>37391 >>37397 . Ахахахах жалко что нельзя отсылать голосые в тред, у него бы тогда ещё больше бомбануло от того как я смеюсь с него))))
Что это за люди что они делают зачем им всё это)))
P.S.
На этом можно прекратить флуд.
>Ты эмоционально неуравновешен.
Тебе показалось.
А вот ты неуважаешь ни свой труд, ни время других людей и вообще мудак по жизни, судя по треду - твой код ОП уже проверял, так ты, сделал минимальные правки и опять код-ревью на нерабочее говно просишь. Ты совсем шынгыс?
>В чем между ними разница?
Если по простому - их можно ползовать без инициализации объекта. А ещё они выдаются в единственном экземпляре на все объекты этого класса, что иногда удобно и позволяет не размазывать функционал по приложению.
То есть если я вызову нестатический метод в одном объекте, то он повлияет только на него, а если статический вызову из класса, то он повлияет на все?
$stmt = $db->prepare("SELECT xui, pizda "
. "FROM twoja_mat "
. "ORDER BY xui DESC ");
И
$stmt = $db->prepare("SELECT xui, pizda "
. "FROM twoja_mat "
. "ORDER BY :xui DESC ");
$stmt->bindParam(':xui', $xui, PDO::PARAM_STR);
. Причем, если основываться на отладке, то и в первом и во втором случае происходит запрос к бд SELECT xui, pizda FROM twoja_mat ORDER BY xui DESC, но с той лишь разницей, что при привязке ключа, 'xuy' будет в кавычках. Что я делаю не так? Не гуглится нихуя
Разница есть.
ORDER BY a - сортировать по значению поля a
ORDER BY 'a' - сортировать по строке 'a' (то есть как попало, так как мы сортируем по массиву одинаковых строк)
Через плейсхолдеры можно подставлять только значения - числа, строки, null. Имена таблиц или колонок подставлять нельзя. Их придется вставлять напрямую, проверяя по белому списку разрешенных значений.
>>37493
Не сказал бы. Хотя тут правильнее использовать bindValue, bindParam используется для двухстронней привязки, когда данные из БД заносятся обратно в переменную.
Статические методы из вызываются не столько из объекта, а из класса, вроде бы, и доступа к внутренним полям конкретного объекта у него нет, только, опять же, к статическим полям класса.
Ну сам напиши да попробуй, недолго ведь.
Впервые слышу об этом. Я могу получить доступ к полям класса из статического и из нестатического метода.
Я вчера вот точно с такой же хренью сражался. В итоге плюнул и написал костыль сортировки через switch, который ORDER BY тупо соединяет с нужным значением. Думаю меня за это обоссут.
А у меня вроде не получалось - писал, что-то в стиле "нельзя использовать этот метод\ссылку в таком контексте", хотя могу путать - давненько дело было.
>Это точка входа в приложение типа index.php
Говорят это. Я там обычно окружение настраиваю - ошибки, дебаг там, пшеница, рожь, вот это всё. Потом бутстрап.пхп подключаю и понеслася.
Важно понять процедурную абстракцию (функции). Это основа. И обязательно функции высшего порядка.
стагнация и за рубежом не востребован
Ну, смотря что ты хочешь сделать. Можно наугад просто выбрать или же взять и прочитать то, что пишут в интернетах.
Взять можно фреймворк посложнее, если тебе нужно не просто очередной магазин запилить: делаешь фреймворки, которые отвечают твоим задачам, запоминаешь стек фреймворков и расписываешь все плюсы и минусы. Так и сравниваешь потом плюсы и минусы и потом, если тебе нужна какая-то киллерфича, ищешь ее и выбираешь фреймфорк исходя из нее. Размер фреймворка и его архитектура элементов на стиль твоего кода не влияют.
Там минимальный вычислительный элемент - транзистор. Нет там никаких команд на таком уровне. Один набор нулей с единицами - одна команда, другой - другая.
hexlet.io
Архитектура ЭВМ имеет 7 уровней. Ты говоришь про один из нижних. А я говорил про уровень микроархитектуры.
Что тебе именно непонятно? Строки, функции, регулярки?
В этом учебнике только азы, потом повеселее будет, с ООП и студент-листом, где ОП, вроде бы, объясняет, но нифига не всё, а скорее пинает в нужную сторону и катись сам дальше.
На самом деле этот учебник просто сборник задачек с неплохим зазывающим началом. Остальное там хуита ненужная.
Вполне нужная хуита там. Нужная и полезная. Уж точно лучше гугла, который до сих пор в поиске выдаёт советы от знатоков, которые через msql на БД ходят.
В общем я вкатился с полным Nullем знаний, я прошёл задачки в темах Массивы, Циклы и Условия и всё до них. И у меня какое-то зависание теперь происходит. К слову я это именно задрачиваю, т.е. приходя домой с работы в 17.30, я ем и начинаю заниматься до 21-22, а потом намертво падаю до 6.20. И по новой каждый день. Так вот последние 2 дня, я просто нихуя не понимаю что от меня хотят в задачах, какие переменные и куда что засовывать. Я думаю, я просто заебался.
И, кстати учу я так:
1) Читаю гайд от ОПа
2) Мануал ПХП обязательно листаю по подходящей теме
3)Решаю задачи
4)Ищу решения в интернете и осмысляю их
А по факту последние 2 дня я выполняю 1, 2 и всё, даже не уверен что в голове что-то откладывается.
Стоило бы отдохнуть пару дней хотя бы от этого или продолжать тыкаться-мыкаться в эту закрытую стену?
Так рабочий способ же. Низкоуровневый, но рабочий.
Советую тебе просто умереть и не создавать мне конкуренцию, сидящему на шее у мамки и каждый день с утра до ночи пидорящему пыху и смежное.
Скажем так, я заглядываю наперед.
Просто такие вещи требуют времени для понимания, если никогда раньше ничего такого не делал. Понимание машинной логики не всем сразу даётся: все эти циклы, ветвления, переменные. Просто дай себе время чтобы переварить инфу, не гони. Закинул себе тему новую, попробовал задачку - вышла\не вышла, но отдохни день-два, просто возвращайся иногда в мыслях к этой теме, обдумывай её и через пару дней увидишь как всё просто на самом деле. А сдуру и хуй сломать можно.
И поменьше эмоций - успеется ещё жопой пригорать к стулу.
Держи в курсе.
Ты хочешь чисто на эрудицию делать вопросы или на находчивость? Если первое, то обратись к вике, если второе у нас на дваче куча разделов с тематикой, откуда можно почерпнуть вопросов.
Не про вопросы для сайт спросил. Интересно как реализовать сам сайт, я изучаю пхп всего 1.5 месяца, и понимаю только синтаксис, так же еще сделал по видеоуроку интернет магазин, но из него я пока подчерпнул знания с БД и не более. В общем интересна сама реализация.
Например я захожу на сайт и регистрируюсь или просто имею случайное имя типа "гость111", выбираю например сложность вопросов, ищу случайного оппонента либо играю с опредленным, статистика ответов, награды за победы и т.д.
Это мне надо умник ебаный
Ты понимаешь как сделать роутинг? Сессии, БД, вот это вот все изучал? Для такого сайта скорее всего нужно SPA.
благодарю, анон! Так и поступлю.
Это паттерн проектирования, описанный например тут: http://design-pattern.ru/patterns/front-controller.html
Когда все запросы проходят через Front контроллер и дальше уже направляются на обработку Page controller, контроллеру конкретной страницы.
PHP рожден чтобы умирать. У него такая модель жизни приложения. Запустилось и умерло. Поэтому раньше делали роутинг приложения с помощью веб-сервера. Он запускал для каждого запроса отдельный .php файл.
Единая точка входа, это когда все запросы идут в один файл. А там запускается роутер, который вызывает нужные функции, в зависимости от запроса.
Пиздец, спасибо аноне. В итоге просто сделал для сортировки разные препеиры. Но код пиздец раздулся
Вообще, этот паттерн, когда скрипт отрабатывает и завершается - это скорее плюс, так как он убирает лишнее состояние и делает работу приложения на PHP более близкой к функциональной парадигме, и к идее stateless из REST: выполнение одного экземпляра скрипта не влияет на выполнение другого экземпляра. Также, это обеспечивает простоту масштабирования на много серверов, и избавляет от проблем с утечками памяти, которыми часто страдают приложения на других языках. Хуже того, для многих языков при этом нет доступных и удобных средств поиска источника утечек.
Утечки не совсем на уровне скрипта, а на уровне процесса. Так то они все равно существуют, ибо процесс все же не создается полностью с нуля на каждый реквест - не самое шустрое дело. Можно и так конечно, но работа будет нихера не отзывчивой. Просто это дело проходит безболезненно обычно. Тот же php-fpm чаще всего конфигурируется на заданное количество реквестов на один процесс в пуле, после чего тот нормально убивается (соответственно чистится память) и запускается новый. Можно и без перезапуска процессов, но тогда надо убедиться что утечек реально совсем нет, что не всегда вообще от тебя зависит.
SPA как делать в таком случае? Производительность при умирающем приложении очень низкая, 1000 rps потолок, а то и меньше. Еще бывает нужно что-то делать в фоновом режиме.
ФП к этому не относится. В ФП пропагандируется не изменять состояние переменных. Но в базу писать нужно все равно, и запросы обрабатывать. Если каждый раз создавать соединение с базой, производительность будет плачевной.
>Производительность при умирающем приложении очень низкая, 1000 rps потолок
Откуда ты эти цифры берешь? Зависимость от конкретной реализации конкретного приложения и мощностей машины напрямую присутствует.
>SPA как делать в таком случае?
И это тут совершенно не причем.
Для начала просто выясни сколько рпс тебе нужно. Потом поищи узкие места, если все еще актуально будет. 1к рпс в большинстве случаев потащит больше 10к пользователей одновременных. (цифры умозрительные, зависит от логики потому что, просто усреднил. в одной прилоге один пользователь может генерить в среднем 1 запрос за минуту, в другом может 10 запросов за секунду, не угадаешь) Уверен, что у тебя достигается нужная посещаемсоть для преодоления отметки в 1к рпс? Я просто не в курсе по твоему проекту, так что вполне может быть ты раньше времени паниковать начинаешь.
>Откуда ты эти цифры берешь? Зависимость от конкретной реализации конкретного приложения и мощностей машины напрямую присутствует.
Уже давно все протестировано. На хорошем i7 не более 1000 rps держит, при умирающем приложении.
>>37798
>И это тут совершенно не причем.
Как это не причем. Каждый раз поднимать приложение? Это будет говеное SPA, будут задержки.
>>37798
>1к рпс в большинстве случаев потащит больше 10к пользователей одновременных.
Сомневаюсь. Если это просто информационный сайт, то может быть, а взять хотя бы интернет-магазин, пользователь может напинговать за минуту десятки запросов. Не говоря уже о чем то более интерактивном.
>Каждый раз поднимать приложение? Это будет говеное SPA, будут задержки.
Угу, и на приложениях для телефончиков всяких тоже, котоыре все через те же апишки работают, которые очень часто на пхп. Или браузерки возьми какие-нибудь - их там тоже до задницы на самом обычном коде с пхп, как хороших так и плохих.
Если у тебя ощутимые задержки без проблем с интернетом - скорее всего узкое место в твоей реализации и тебе нужно фиксить именно его.
При замерах рпс неважно спа там или нет, потому что ты замеряешь только выносливость приложения на текущей развертке. Среднее время на запрос тогда смотри. Интересно узнать кстати, какое среднее время запроса ты считаешь приемлимым.
>взять хотя бы интернет-магазин
На таких проектах при высокой нагрузке у тебя больше проблем с базой будет, чем с приложением. Там в бд страсти христовы часто.
>Каждый раз поднимать приложение?
Если не лень замерь именно сколько времени тратится на подъем приложения на разных фреймворках, интересненько будет посмотреть.
>Угу, и на приложениях для телефончиков всяких тоже, котоыре все через те же апишки работают, которые очень часто на пхп.
Извини, но это глупость. Создание процесса не быстрое дело. Для SPA нужен мгновенный отклик. Поэтому вероятно сейчас много SPA приложений тормознутые. По хорошему, для SPA нужно активное соединение, и соответственно запущенный процесс. Каждый раз поднимать это глупость. Так могут делать либо дилетанты, либо пофигисты, кто не заботится о пользователях.
>>37806
>Если у тебя ощутимые задержки без проблем с интернетом - скорее всего узкое место в твоей реализации и тебе нужно фиксить именно его.
У меня все в порядке. Мне ничего фиксить не нужно.
>>37806
>Если не лень замерь именно сколько времени тратится на подъем приложения на разных фреймворках, интересненько будет посмотреть.
Я говорил о чистом PHP. С фреймворками оверхед еще больше.
Ну тогда не поднимай каждый раз прилогу, раз сам для себя решил этот вопрос уже. Это возможно и легко гуглится, просто не так часто с этим люди работают и не думаю что ты помощь в этом треде найдешь особенную по этому вопросу.
https://github.com/walkor/Workerman
Вот как пример. Можно еще аналогов найти не мало.
Я разве задавал вопросы? Я отвечал на вопрос. Ты вклинился и начал мне объяснять как у меня все неправильно и плохо.
Это были наводящие вопросы. А не вопросы ответы на которые я не знаю. Если бы я тупо начал писать, что ты все говоришь не правильно, а нужно так и так, то это был бы не аргументированный текст.
Да всегда работает, лол, видимо с мышлением как-то связано, случается какой-то заклин на определенной метакогниции относительно задачи, откладываешь, возвращаешься и вуаля смотришь под другим углом или еще до решения озаряет.
Затуп на 1000 лет
Да понятно. Фронт-контроллер это точка входа приложения. Просто хочу понять, где эта точка входа: файл, куда направляются все пользовательские запросы или инициация всего приложения из этого файла.
Ты можешь даже разные приложения дергать при желании. Вот фронт контроллер этим и занимается. Точка входа самое правильное описание для него, усложнять далее не обязательно.
index.php например. Дальше за дело берется роутер.
Как думаете, если очередные хабрадауны заметят мое поделие, то много вони поднимется из-за того, что я пишу доки на родном языке, а не на их любимом ангельском?
Также хочу кастомизировать обработчик ошибок и исключений, красиво оформить и национализировать для русскоязычного сообщества.
А ты сравни даунов, которые на хабре пописывают, может даже чегото достигают. С теми, которые тут сидят только ради анонимного перекидывания говном, которое ни одной живой душе не интересно. И все на свои места встанет. А так пиши, можешь даже статейку написать о своем поделии, не обязательно на хабр.Велосипедные темы довольно популярны.
Это известный факт, что для обучения нужно время. В идеале ещё и не напрягаться и учить столько, сколько хватает от сессии до сессии и не больше, вот тогда ещё и удовольствие приносить начинает, что, в свою очередь опять улучшает и ускоряет понимание материала. А если напрягаешься во всю, да ещё при этом начинаешь замечать, что туго идёт как-то, то всё - приехали. Стресс, переключение внимания на себя, а не на предмет, потом складывается негативное отношение к процессу и человек ещё на подходе уже угнетать себя начинает. Ну и бросает потом - говно же, как в школе. А нужно именно увлекаться этим, как игрой. В конце-концов в наших тупых играх задачки ещё ебанутее встречаются, и ничего - хаваем.
Такая вот теория.
Да это понятно. Тут в основном только новички-вкатывальщики сидят да какие-то трали, считающие себя ветеранами кодирования.
Спасибо за совет насчет статейки, буду иметь ввиду.
ОП, посмотри мой банкомат (не жадный, с перебором и ограничениями).
https://ideone.com/CRwVJY
Заранее спасибо!
>Надо с самого начала учиться писать правильно.
Уа-ха-ха. Правильно это по твоему только с классами? Это называется ООП головного мозга. Классы нужны там где они нужны. PHP поддерживает ФП. Так что можно вообще без классов обходится если захочется.
Почему бы тогда не давать практические задачки на классы, где они НЕОБХОДИМЫ? Ох вейт, таких задач не существует.
Класс всего лишь абстрактный тип данных. Можно реализовать тоже самое другими способами.
По сути классы дают не более чем модульность. Без классов можно достичь более гибкой абстракции данных.
>Ох вейт, таких задач не существует
Любая, где количество строк больше 1к и много модулей.
Хотя >>38207 выразился немного коряво. Надо писать не "правильно", а "как все и не выёбываться", чтобы ты мог понимать что пишут другие люди и люди могли понимать что ты там накалякал. Хотя, конечно, люди вполне и в ФП пишут, но уровень у тех что пишет на ООП, как ни странно, выше.
>Любая, где количество строк больше 1к и много модулей.
Никакой корреляции с классами нет. В ФП стиле, даже не так, в функционально-объектном стиле (без классов), можно писать приложения любого размера. И не угробить его, не запутаться в нем. На классах такое невозможно. На классах оно перерастет в банальное неподдерживаемое легаси. Код на выброс как говорится.
>>38275
Ну что, кто из вас в состоянии формализовать ваше ООП? Поднимите литературку что ли. Почитайте там, погуглите. Кое что есть по этой теме. Исследования ученых имею ввиду. Только вряд ли вы вообще про это знаете. Вы же как зомби твердите одно и то же "абстракция, наследование, полиморфизм". На уровне формальной модели там совсем другие формализмы вообще то.
Шизик, уймись - всем похуй на твои исследования. Скажи психиатру чтобы таблетки тебе сменил - эти тебя не берут уже. История определили место твоему ФП - у параши, а ты всё не уймёшься. Пришёл в тред ЯП, который не для ФП впринципе, к новичкам, и агитируешь тут свой бред. В других местах тебя уже обоссали, как я понимаю, а то и солёных залуп за щеку натолкали.
Ты смешон и жалок, пойми это.
if (getBool('huita') && getBool('pizda') & ( HUI | GOVNO | MOCHA)) {}
?
Говнокод.
>Надо писать не "правильно", а "как все и не выёбываться"
Лучше таки понимать, что ты пишешь и зачем, а не просто делать как все.
Где про понимание? Опиши формальную модель ООП. Вот ты говоришь с математиком, пытаешься объяснить ему ООП. Как ты это будешь делать, какие формализмы использовать?
Если ты всерьез говоришь, что ООП это что-то имеющее смысл. Так опиши это на языке математики. Если не можешь, то грош цена твоему ООП, и слова твои получаются пустые.
Вся суть оопэшника - жопно-сортирный язык речи.
Что начинается? Я лишь сказал не копировать бездумно, чтобы получилось как "у всех", с такого ничего хорошего не получится. Именно эта чушь про копирование выше и была высказана, или ты не достаточно ясно выразился. Такие копипастеры без понимания хуже чумы, прикрываясь несуществующим пониманием такую херню наделают, что мама не горюй.
>>38310
Не лезь, псих, тут не о твоих галюнах разговор.
Так всё просто.
Традиционные в современном понимании ОО-языки (Java, C# и т.п.) - это просто языки с системой типов с поддержкой subtyping'а. Вот и всё описание.
Пфф. И все? Какое то бурчание под нос. На большее я конечно не рассчитывал.
Любая вычислительная модель должна быть описана. Машина Тьюринга, Машина Поста, Лямбда-исчисление, - все это описано формальным языком. Где модель ООП?
Когда сейчас говорят про системы типов, обычно подразумевается, что речь идёт именно о типизации лямбда-исчислении.
Если про конкретику, то обычно системы типов ОО языков моделируются каким-нибудь тем или иным расширением System F<:
Какое отношение Лямбда-исчисление и System F имеет к ООП на классах? Опять похоже на невнятно бурчание.
Прямое. Ты можешь большинство языков с классовым ООП таким образом смоделировать.
Открываешь TaPL, главу 18, там прямым образом показано, как это можно сделать.
Вот это уже конструктивный разговор. Если еще есть похожие книги по теме, напиши, хотелось быть почитать.
Именно отдельных книг посвященных целиком ООП и связанную с ним теорию типов я не вспомню. А вот статей на том же arxiv'е и т.п. куча. Из относительно интересного что мне попадалось, можно посмотреть DOT-calculus от Одерски, формальное основание для Scala 3.
А если просто про теорию типов, то можно начать с того же TaPL (после него ещё иногда советуют в ATTAPL от того же автора заглянуть), а дальше пойти в сторону зав. типов и пруверов на них (обычно советуют The Software Foundations) и HoTT (тут прям одноименная книга)
Понял, благодарю. От себя добавлю кое-что, что хотел прочесть, но руки не доходили. Может кому интересно будет почитать.
Труды Луки Карделли, который занимался формализацией ООП, в частности статья http://lucacardelli.name/Papers/TypeSystems.pdf
Бертран Мейер Объектно-ориентированное конструирование программных систем, где он также ссылается на Карделли https://www.ozon.ru/context/detail/id/2336754/
В TaPL достаточно много ссылок на Карделли, как раз в тех главах, где заходит речь о ООП. Ну и TaPL, это прежде всего, учебник, поэтому там по сравнению с оригинальными статьями сильно более разжеван материал.
>>38160
Я хотел еще подсказать варианты визуализации решения этой задачи. Вдруг это поможет придумать более эффективный алгоритм. Эта задача напоминает задачу про размен (дана сумма, неограниченное число банкнот, надо выразить эту сумму минимальным числом банкнот), и у задачи про размен есть визуализация, которая позволяет ее легче понять.
Решение задачи про размен с неограниченным числом банкнот есть тут: http://labs.org.ru/dp-3/
Полный перебор потребовал бы проверить порядка N ^ M вариантов, где N = (сумма/номинал самой мелкой купюры), M - число видов купюр. Однако, использование динамического программирования позволяет обойтись выполнением около N * M шагов (ценой чуть более высокого потребления памяти).
Оптимальное решение можно визуализировать таблицей ( Визуализация задачи без ограничений.PNG ), где колонки представляют номиналы купюр, строки - сумму, которую можно выдать, а числа на пересечении - минимальная комбинация купюр для выдачи этой суммы.
Первой идет сумма 0, которая, очевидно, выдается нулевым числом купюр. Затем мы пытаемся выдать сумму 100. Очевидно, тут только один вариант выдачи. Затем сумму 200. Тут есть уже 2 варианта: либо добавить еще одну 100-ю купюру (получается всего 2 купюры), либо добавить 200-ю купюру и убрать 100-ю. Вариант с 200-й купюрой выгоднее, и мы берем его и записываем в таблицу. И так мы добавляем строчки, пока не дойдем до требуемой суммы, и получаем оптимальную комбинацию для выдачи этой суммы.
На каждом шаге мы просто берем предыдущую строчку и пробуем добавлять по одной купюре каждого номинала, выбираем самый выгодный вариант и записываем в новую строчку. Очевидно, что этот путь быстрее полного перебора.
Но эта задача предполагает неограниченное кол-во купюр. Вопрос, можно ли это решение применить к случаю с ограниченным числом купюр? Не факт.
Допустим, у нас есть запас 1x5000, 3x2000, 1x100 и нам надо выдать 6000. Если мы начнем считать комбинации для выдачи сумм, кратных 100, то мы придем к сумме 5000, которая выдается через 5000x1. Но добавляя по описанному выше алгоритму к этой сумме по одной купюре, мы уже никак не получим 6000.
Вот второй вариант визуализации ( Визуализация задачи с ограничением.png ).
Мы можем нарисовать горизонтальную табличку, в которой по горизонтали идет номинал купюр, а по вертикали - отложено их количество. Запас купюр я обозначил штриховой линией. Вариант размена выглядит как линия из 6 точек, по одной в каждой колонке (рисунок 1, вариант размена показан стрелочкой). На первый взгляд, для поиска ответа нам придется перебирать по N вариантов точек в каждой колонке, что дает N ^ 6 комбинаций.
Но мы можем попробовать пройтись по таблице справа налево (и сверху вниз) и в каждой ячейке записать все возможные суммы, которые можно выдать, используя только купюры из данного столбца и столбцов справа от него. В таком случае нам только останется пройтись по заполненной таблице слева направо, выбирая в каждом столбце самую нижнюю ячейку, где есть требуемая сумма ( Идея с хранением всех сумм.png ).
Это позволяет избежать многократных прохождений по одному и тому же пути, которые присутствуют в рекурсивном решении с полным перебором.
Единственное, что меня тут беспокоит - как оценить сложность заполнения таблицы и объем нужной для хранения массивов чисел памяти? Выгоднее ли это, чем перебор N ^ M вариантов? Есть ли какие-то способы эффективно хранить/сжимать наборы чисел в ячейках? Как-нибудь в виде списка "от X до Y с шагом Z + от A до B с шагом C"? Битовую маску какую-нибудь использовать?
Без оптимизации, если номиналы купюр не кратны друг другу, в первом столбце будут гигантские списки чисел, как раз размерности порядка N ^ M.
Можешь подумать, и все остальные аноны, приглашаю вас тоже поломать голову.
По твоему коду.
> while ($requiredAmount > 0 && $amountOfBills >= $tempSum) {
> // Если есть остаток - рекурсируем функцию
> if ($tempSum > 0) {
> getBillsAndAmount($tempSum, $tempBills, $result, $tempResult);
Внутри цикла значение $tempSum не меняется, и потому нет особого смысла делать эту проверку на каждом шаге - её достаточно сделать один раз перед циклом, таким образом:
if ($tempSum == 0) {
$result = $tempResult;
return;
}
> if ($requiredAmount > $amount) $requiredAmount = $amount;
Тут можно было использовать функцию min()
Вместо ссылок можно было возвращать результат функции через return.
Также, вместо этого огромного if:
if ($bill <= $sum && $amount > 0) {
....
}
Можно было написать короче:
if ($bill > $sum || $amount <= 0) {
return;
}
Так, неплохо. Но можешь поломать голову над поиском оптимального решения, если хочешь.
>>38160
Я хотел еще подсказать варианты визуализации решения этой задачи. Вдруг это поможет придумать более эффективный алгоритм. Эта задача напоминает задачу про размен (дана сумма, неограниченное число банкнот, надо выразить эту сумму минимальным числом банкнот), и у задачи про размен есть визуализация, которая позволяет ее легче понять.
Решение задачи про размен с неограниченным числом банкнот есть тут: http://labs.org.ru/dp-3/
Полный перебор потребовал бы проверить порядка N ^ M вариантов, где N = (сумма/номинал самой мелкой купюры), M - число видов купюр. Однако, использование динамического программирования позволяет обойтись выполнением около N * M шагов (ценой чуть более высокого потребления памяти).
Оптимальное решение можно визуализировать таблицей ( Визуализация задачи без ограничений.PNG ), где колонки представляют номиналы купюр, строки - сумму, которую можно выдать, а числа на пересечении - минимальная комбинация купюр для выдачи этой суммы.
Первой идет сумма 0, которая, очевидно, выдается нулевым числом купюр. Затем мы пытаемся выдать сумму 100. Очевидно, тут только один вариант выдачи. Затем сумму 200. Тут есть уже 2 варианта: либо добавить еще одну 100-ю купюру (получается всего 2 купюры), либо добавить 200-ю купюру и убрать 100-ю. Вариант с 200-й купюрой выгоднее, и мы берем его и записываем в таблицу. И так мы добавляем строчки, пока не дойдем до требуемой суммы, и получаем оптимальную комбинацию для выдачи этой суммы.
На каждом шаге мы просто берем предыдущую строчку и пробуем добавлять по одной купюре каждого номинала, выбираем самый выгодный вариант и записываем в новую строчку. Очевидно, что этот путь быстрее полного перебора.
Но эта задача предполагает неограниченное кол-во купюр. Вопрос, можно ли это решение применить к случаю с ограниченным числом купюр? Не факт.
Допустим, у нас есть запас 1x5000, 3x2000, 1x100 и нам надо выдать 6000. Если мы начнем считать комбинации для выдачи сумм, кратных 100, то мы придем к сумме 5000, которая выдается через 5000x1. Но добавляя по описанному выше алгоритму к этой сумме по одной купюре, мы уже никак не получим 6000.
Вот второй вариант визуализации ( Визуализация задачи с ограничением.png ).
Мы можем нарисовать горизонтальную табличку, в которой по горизонтали идет номинал купюр, а по вертикали - отложено их количество. Запас купюр я обозначил штриховой линией. Вариант размена выглядит как линия из 6 точек, по одной в каждой колонке (рисунок 1, вариант размена показан стрелочкой). На первый взгляд, для поиска ответа нам придется перебирать по N вариантов точек в каждой колонке, что дает N ^ 6 комбинаций.
Но мы можем попробовать пройтись по таблице справа налево (и сверху вниз) и в каждой ячейке записать все возможные суммы, которые можно выдать, используя только купюры из данного столбца и столбцов справа от него. В таком случае нам только останется пройтись по заполненной таблице слева направо, выбирая в каждом столбце самую нижнюю ячейку, где есть требуемая сумма ( Идея с хранением всех сумм.png ).
Это позволяет избежать многократных прохождений по одному и тому же пути, которые присутствуют в рекурсивном решении с полным перебором.
Единственное, что меня тут беспокоит - как оценить сложность заполнения таблицы и объем нужной для хранения массивов чисел памяти? Выгоднее ли это, чем перебор N ^ M вариантов? Есть ли какие-то способы эффективно хранить/сжимать наборы чисел в ячейках? Как-нибудь в виде списка "от X до Y с шагом Z + от A до B с шагом C"? Битовую маску какую-нибудь использовать?
Без оптимизации, если номиналы купюр не кратны друг другу, в первом столбце будут гигантские списки чисел, как раз размерности порядка N ^ M.
Можешь подумать, и все остальные аноны, приглашаю вас тоже поломать голову.
По твоему коду.
> while ($requiredAmount > 0 && $amountOfBills >= $tempSum) {
> // Если есть остаток - рекурсируем функцию
> if ($tempSum > 0) {
> getBillsAndAmount($tempSum, $tempBills, $result, $tempResult);
Внутри цикла значение $tempSum не меняется, и потому нет особого смысла делать эту проверку на каждом шаге - её достаточно сделать один раз перед циклом, таким образом:
if ($tempSum == 0) {
$result = $tempResult;
return;
}
> if ($requiredAmount > $amount) $requiredAmount = $amount;
Тут можно было использовать функцию min()
Вместо ссылок можно было возвращать результат функции через return.
Также, вместо этого огромного if:
if ($bill <= $sum && $amount > 0) {
....
}
Можно было написать короче:
if ($bill > $sum || $amount <= 0) {
return;
}
Так, неплохо. Но можешь поломать голову над поиском оптимального решения, если хочешь.
>>38349
Поддерживает.
>>38310
ООП все же в первую очередь предназначен для разработки программ. Тебе не нужна математика, чтобы спроектировать объектную модель текстового документа или векторного изображения, или системы для учета работников.
Потому нельзя сказать, что "грош цена ООП". Со своими задачами - разработка программ - оно справляется.
>>38296
& и | это битовые операции, почитать можно например тут: https://ru.wikipedia.org/wiki/Битовые_операции
Чтобы их понять, надо перевести числа в двоичную систему счисления, почитай про неё, если не знаком.
>>38290
Не нужно писать в таком стиле.
>>38267
Наверно можно, но неудобно в прикладных задачах. Ты можешь показать код на этих языках для решения прикладных задач - вроде редактора электрических схем, интернет-магазина или чего-то подобного? А ООП там прекрасно работает.
show me the code
>>38232
Инкапсуляцию и наследование же. Плюс интерфейсы еще есть.
>>38223
Задача: сделать модель дерева текстового документа с картинками и таблицами, например. Или представление электрической схемы.
У нас есть учебные задачи на ООП:
- ООП-Будильник: https://phpclub.tech/pr/res/1232710.html#1263399
- ООП-Гостиница: https://phpclub.tech/pr/res/1082507.html#1097078
>>38203
Тут они не требуются.
>>38135
Рано, еще не всем ответили.
Там говориться, что ты должен быть способным стать профессионалом(?), по крайне мере, по 2-ум языкам за несколько недель.
>You'll have to be able to become proficient in at least 2 of these languages within a few weeks, and learn any other language equally rapidly.
Это вообще возможно за пару недель стать мастером, например в C или Java? Или тут имеется ввиду, что твои познания должны быть настолько глубокими в программировании, что они легко лягут на любой язык, и остается вопрос только в изучении синтаксиса?
Мало в каких вузах хорошо дают теорию типов, если ты про нее интересуешься. Но это относительно простая тема, её при желании можно спокойно самостоятельно освоить. Нужно только немного логического мышления и отсутствие страха перед математическими обозначениями.
>>38431
Многие языки программирования очень похожи друг на друга, как во внутреннему устройству, так и по принятому стилю. Т.е., например, знаешь С# - очень быстро сможешь писать на Java, Kotlin и базовой скале. Знаешь какой-нибудь из лиспов - опять-таки, запросто перейдешь на другой. То же самое и с ML-подобными, и с современными скриптовыми, да и с низкоуровневыми тоже (умея писать в современном стиле на крестах, пересесть на раст вообще не проблема).
Поэтому, достаточно только хоть как-то знать по языку из каждой группы и дальше учить новые будет очень быстро и просто. И в целом советую быть полиглотом в плане ЯП,это сильно улучшает кругозор и учит приемам из кучи разных парадигм и подходов.
Не стать профессионалом, а овладеть 2 языками за несколько недель. Это вполне адекватное требование. Оно отсеет тех, кто учил языки, но не понимал их сущность, парадигмы на которых они основаны. Те кто зрят в корень, учат не языки а парадигмы. Они таки могут овладевать языком за несколько недель.
Аноны, помогите плз как сделать чтобы поле "Комментарий" было скрыто, если оно пустое
Сап, аноны. Хелп.
Есть вакансия младшего программиста баз данных. Требований там нет(кроме голода новых знаний). Так вот хочу попытаться туда устроиться. Но в Преимуществах:
Опыт написания запросов SQL
Опыт разработки приложений баз данных на любых языках/субд
Опыт составления тестовых кейсов(что это?).
Там же есть вакансия PHP программиста, но в требованиях там опыт от двух лет. Поэтому решил пойти на младшего программиста БД. Но все таки подумал, что с пустыми руками туда лучше не идти. Сейчас прохожу книгу ОПа, но застреваю на заданиях с регулярками(сейчас на главе: Повторим?). Так вот, может кто-нибудь поможет, пожалуйста, составить план(типа интенсива), чтобы я смог по быстрому подготовиться к этой вакансии, но только без изучений ПОКА лишней информации? Ну то есть , чтобы у меня было приложение и я мог отвечать на вопросы?
И кстати, как вы думаете, под младшим программистом БД они имели в виду, что я буду работать на прямую с сайтом или имелось в виду работа с товаром, если учесть, что это вакансия интернет магазина(или обычного магазина)?
Так же есть вакансия Стажера-разработчика в другой фирме. Там из обязанностей общее представление о разработке сайтов, а из требований коммуникативные качества(фак) и отличное знание ПК и Интернет(что они имеют в виду?). Но там полный рабочий день, а я учусь 3 дня в неделю. Так вот, может ли стажер иметь полный рабочий день(у младшего программиста БД гибкий график) или они ошиблись и не это имели в виду?
Реляционную алгебру читал?
https://ru.hexlet.io/courses/rdb-basics
https://ru.hexlet.io/courses/postgresql-ddl
Недописал
https://ru.hexlet.io/courses/rdb-basics
И в довесок регулярки на PHP
https://ru.hexlet.io/courses/regexp
Хелп, очень нужна ваша помощь. Так и не понял как это сделать
>>33346
Разве у каждого языка не существует ещё несколько фрейморвков, из каждого у которого есть свои собственные тонкости?
Отличай язык от библиотеки. Фреймворк это просто библиотека кода. Во фреймворках как и языках есть свои подходы. Изучать нужно подходы. Тогда любой новый фреймворк легко освоить.
Если ты ещё регулярки осваиваешь, то рано. Это ж детский садик ещё, а ты уже в программисты БД лезешь странное название вакансии.
В большинстве случаев количество и важность этих тонкостей сильно переоценивают.
К тому же сейчас в мейнстриме те же веб фреймворки для разных платформ и языков очень друг на друга похожи.
Не нужно.
Есть видео уроки там где все объясняется.
Спасибо.
>Почему при помощи define можно константе присвоить результат работы функции, а const нет?
Очевидно потому, что define это функция, которая принимает строку и связывает её с значением которое может быть результатом работы функции, а const это объявление константы и только.
> `hash` varchar(100) NOT NULL,
Здесь бы не помешал комментарий к колонке (COMMENT '...'), что это за хеш.
> groupa
Это и не английское слово, и не транслит с русского. Не стоит выбирать такие идентификаторы, так как при работе с кодом ты будешь делать ошибки в написании, и тратить время на их исправление. В идеале надо использовать английский язык или хотя бы транслит.
> `gender` varchar(1) NOT NULL
Тут бы лучше подошел тип ENUM
> `email` varchar(20)
Я бы сделал побольше символов.
> CHARSET=utf8;
Кодировка utf-8 обозначается в MySQL как utf8mb4. utf8 - это урезанная кодировка (utf8mb3), я бы не советовал ее использовать, так как в ней, например, нет кодов эмодзи.
Далее, у тебя нет публичной папки, у тебя все файлы по сути в открытом доступе. Это небезопасно, и надо сделать отдельную папку для публичных файлов, это описано в комментариях к задаче. Это не так сложно, всего лишь надо в конфиге веб-сервера поменять корневую папку для сайта. В Апаче, например, это делается директивой DocumentRoot.
Сейчас получается, любой может скачать SQL-дамп с данными пользователей.
Здесь в автозагрузчике получается относительный путь вроде "Some/file.php". Этот путь будет интерпретироваться относительно текущей директории процесса (не обязательно относительно папки с файлом index.php), а также искаться во всяких include_path. Лучше составить полный путь, используя константу __DIR__.
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/bootstrap.php
Конфиг лучше бы вынести в отдельный файл, который находится в gitignore (это вроде описано в комментариях к задаче). А то сейчас, если один разработчик впишет туда свой пароль и закоммитит изменения, то эти изменения появятся у других разработчиков.
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/core/Router.php
Здесь пока плохо с форматированием. Тебе надо либо приучиться сразу писать код в правильном стиле, либо использовать какую-то IDE c встроенным форматированием. Например, Netbeans, PhpStorm, VS code (могут понадобиться плагины). Вот пример, обрати внимание на пробелы вокруг знака равно и запятой:
> $params = trim(parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH),"/");
> $params =explode('/',$params);
Плохое оформление кода произведет негативное впечатление, если ты будешь делать тестовое задание, так что учись сразу оформлять код правильно.
Далее, тут:
> if($params[1]) {
Если в массиве нет элемента с индексом 1, то будет ошибка (notice или warning). Надо проверять через array_key_exists, empty или isset.
> try {
> } catch (\Exception $e) {
Здесь скорее всего неправильно исопльзуются исключения. Если ты хочешь ловить и обрабатывать исключения, тебе надо сделать свой класс исключений для каждого вида ошибки. А так, ты ловишь вообще все исключения в программе, и вместо записи их в лог (что PHP делает по умолчанию, если ты их не ловишь) просто выводишь на экран, не записывая в лог. Почитай урок https://github.com/codedokode/pasta/blob/master/php/exceptions.md
Также, для ошибки "страница не найдена" надо отдавать HTTP код 404. Если ты не знаешь, что такое HTTP и код статуса, почитай что-нибудь по этой теме, например урок https://github.com/codedokode/pasta/blob/master/network/http.md
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/controller/ControllerFactory.php
Нельзя ли создание контроллеров делать в DI контейнере? А то получается дублирование тут его функционала. Правда, контроллер надо каждый раз создавать новый, а твой DI контейнер, увы, так не умеет. Если это слищком сложно, можно оставить так, но можно бы и попробовать сделать. Для этого надо в DI контейнер передавать не созданные объекты, а функции для их создания, и он будет вызывать их при необходимости.
https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/controller/controller.php
Имя файла должно совпадать с именем класса с учетом регистра. У тебя файл с маленькой буквы. Под Windows, чтобы поменять регистр букв в имени, может понадобиться переименовать файл под другим именем сначала.
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/controller/MainController.php
> private $model;
Лучше бы давать более понятное название, например, studentTG или как-то так. Так код будет понятнее.
> $search=$_GET['search'];
Лучше делать strval и trim. Так как могут передать массив вместо строки, а также, там могут быть лишние пробелы.
> setCurrentPage($_GET['page']);
Здесь тоже безопаснее принудительно преобразовать данные от пользователя к числу.
> paginator->countPage
Неточное название, лучше setRecordCount или setItemCount, или как-то так.
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/controller/ProfileController.php
Тут много общего кода. Лучше всего было бы объединить его, а не копипастить.
> if(!$this->auth->checkHash())
А что, если пользователь залогинен? Выводим белую страницу? Надо эту ситуацию тоже обрабатывать.
> header("Location:/profile");die();
Тут наверно лучше использовать return, вдруг ты захочешь в index.php или в роутере что-то делать после обработки запроса. Хотя можно пока и так.
> if($this->auth->checkHash())
> {
> $student = $this->model->getStudentByHash($_COOKIE['hash']);
Тебе не кажется, что правильнее было бы инкапсулировать (скрыть) всю работу с куками в AuthService и сделать в нем готовый метод для получения текущего пользователя? А то у тебя нет единого ответственного за работу с кукой hash, вместо этого работа с кукой размазана по всему коду. Плохо.
> public function __construct($model,$validator,$auth)
Здесь нужны тайп-хинты для защиты от ошибок и повышения понятности кода.
> private function grabPostValues()
Здесь бы нужен тайп-хинт на возвращаемое функцией значение.
https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/helpers/Authorization.php
Названия функций можно улучшить, также стоит добавить тайп-хинты на возвращаемые значения функций.
Вместо checkHash лучше написать что-то вроде isLoggedIn().
Тут правильнее было бы сделать свой класс исключений, если уж делать все идеально. А то как ловить такое исключение и отличать от других?
https://github.com/asdasdasdasddasasdasdas/StudentList/blob/89c01482b1e548fb1b258bf2b7708aa687911571/app/helpers/DIContainer.php#L9
> public $dependencies = [];
А почему public? Думаю, тут лучше ограничить доступ к полю. Ты не читал про инкапсуляцию?
---------
Инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.
Суть инкапсуляции в том, что класс скрывает (инкапслирует) в себе логику работы с данными и сами данные, а наружу выставляет только методы. Пользователю этих методов не важно, как класс устроен внутри, как он хранит данные, какие у него есть поля, ему достаточно вызвать нужный метод чтобы получить результат.
Кроме нескольких публичных методов, остальные методы и свойства закрываются от доступа снаружи модификаторами private или protected. То есть с объектом снаружи ничего нельзя сделать, кроме вызова публичных методов.
Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название публичных методов (и может быть комментарии к ним). Также, это упрощает изменение кода: если какое-то свойство имеет уровень private, то доступ к нему возможен только из того же класса и тебе не надо бегать по всему коду и смотреть что там с этим свойством делается, тебе достаточно просмотреть один файл с этим классом.
При инкапсуляции автор класса таким образом задает ограничения, что можно делать с объектом.
Как плюс, мы можем поставить какие-то проверки в методах, и запретить установку неправильных значений свойств. Таким образом, снаружи записать неправильное значение в объект будет нельзя и автор класса может гарантировать его корректную работу в любой ситуации. Если у нас есть публичные свойства, то в них можно записывать что угодно, а приватные свойства изменять снаружи нельзя, можно только вызвать методы, которые что-то делают.
Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.
Если проводить аналогии, то можно представить кофе-машину. Ты нажимаешь кнопку (=вызываешь публичный метод) и получаешь кофе (=результат вызова этого метода), при этом ты не видишь что происходит внутри нее и тебе не надо в этом разбираться.
---------
> `hash` varchar(100) NOT NULL,
Здесь бы не помешал комментарий к колонке (COMMENT '...'), что это за хеш.
> groupa
Это и не английское слово, и не транслит с русского. Не стоит выбирать такие идентификаторы, так как при работе с кодом ты будешь делать ошибки в написании, и тратить время на их исправление. В идеале надо использовать английский язык или хотя бы транслит.
> `gender` varchar(1) NOT NULL
Тут бы лучше подошел тип ENUM
> `email` varchar(20)
Я бы сделал побольше символов.
> CHARSET=utf8;
Кодировка utf-8 обозначается в MySQL как utf8mb4. utf8 - это урезанная кодировка (utf8mb3), я бы не советовал ее использовать, так как в ней, например, нет кодов эмодзи.
Далее, у тебя нет публичной папки, у тебя все файлы по сути в открытом доступе. Это небезопасно, и надо сделать отдельную папку для публичных файлов, это описано в комментариях к задаче. Это не так сложно, всего лишь надо в конфиге веб-сервера поменять корневую папку для сайта. В Апаче, например, это делается директивой DocumentRoot.
Сейчас получается, любой может скачать SQL-дамп с данными пользователей.
Здесь в автозагрузчике получается относительный путь вроде "Some/file.php". Этот путь будет интерпретироваться относительно текущей директории процесса (не обязательно относительно папки с файлом index.php), а также искаться во всяких include_path. Лучше составить полный путь, используя константу __DIR__.
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/bootstrap.php
Конфиг лучше бы вынести в отдельный файл, который находится в gitignore (это вроде описано в комментариях к задаче). А то сейчас, если один разработчик впишет туда свой пароль и закоммитит изменения, то эти изменения появятся у других разработчиков.
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/core/Router.php
Здесь пока плохо с форматированием. Тебе надо либо приучиться сразу писать код в правильном стиле, либо использовать какую-то IDE c встроенным форматированием. Например, Netbeans, PhpStorm, VS code (могут понадобиться плагины). Вот пример, обрати внимание на пробелы вокруг знака равно и запятой:
> $params = trim(parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH),"/");
> $params =explode('/',$params);
Плохое оформление кода произведет негативное впечатление, если ты будешь делать тестовое задание, так что учись сразу оформлять код правильно.
Далее, тут:
> if($params[1]) {
Если в массиве нет элемента с индексом 1, то будет ошибка (notice или warning). Надо проверять через array_key_exists, empty или isset.
> try {
> } catch (\Exception $e) {
Здесь скорее всего неправильно исопльзуются исключения. Если ты хочешь ловить и обрабатывать исключения, тебе надо сделать свой класс исключений для каждого вида ошибки. А так, ты ловишь вообще все исключения в программе, и вместо записи их в лог (что PHP делает по умолчанию, если ты их не ловишь) просто выводишь на экран, не записывая в лог. Почитай урок https://github.com/codedokode/pasta/blob/master/php/exceptions.md
Также, для ошибки "страница не найдена" надо отдавать HTTP код 404. Если ты не знаешь, что такое HTTP и код статуса, почитай что-нибудь по этой теме, например урок https://github.com/codedokode/pasta/blob/master/network/http.md
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/controller/ControllerFactory.php
Нельзя ли создание контроллеров делать в DI контейнере? А то получается дублирование тут его функционала. Правда, контроллер надо каждый раз создавать новый, а твой DI контейнер, увы, так не умеет. Если это слищком сложно, можно оставить так, но можно бы и попробовать сделать. Для этого надо в DI контейнер передавать не созданные объекты, а функции для их создания, и он будет вызывать их при необходимости.
https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/controller/controller.php
Имя файла должно совпадать с именем класса с учетом регистра. У тебя файл с маленькой буквы. Под Windows, чтобы поменять регистр букв в имени, может понадобиться переименовать файл под другим именем сначала.
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/controller/MainController.php
> private $model;
Лучше бы давать более понятное название, например, studentTG или как-то так. Так код будет понятнее.
> $search=$_GET['search'];
Лучше делать strval и trim. Так как могут передать массив вместо строки, а также, там могут быть лишние пробелы.
> setCurrentPage($_GET['page']);
Здесь тоже безопаснее принудительно преобразовать данные от пользователя к числу.
> paginator->countPage
Неточное название, лучше setRecordCount или setItemCount, или как-то так.
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/controller/ProfileController.php
Тут много общего кода. Лучше всего было бы объединить его, а не копипастить.
> if(!$this->auth->checkHash())
А что, если пользователь залогинен? Выводим белую страницу? Надо эту ситуацию тоже обрабатывать.
> header("Location:/profile");die();
Тут наверно лучше использовать return, вдруг ты захочешь в index.php или в роутере что-то делать после обработки запроса. Хотя можно пока и так.
> if($this->auth->checkHash())
> {
> $student = $this->model->getStudentByHash($_COOKIE['hash']);
Тебе не кажется, что правильнее было бы инкапсулировать (скрыть) всю работу с куками в AuthService и сделать в нем готовый метод для получения текущего пользователя? А то у тебя нет единого ответственного за работу с кукой hash, вместо этого работа с кукой размазана по всему коду. Плохо.
> public function __construct($model,$validator,$auth)
Здесь нужны тайп-хинты для защиты от ошибок и повышения понятности кода.
> private function grabPostValues()
Здесь бы нужен тайп-хинт на возвращаемое функцией значение.
https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/app/helpers/Authorization.php
Названия функций можно улучшить, также стоит добавить тайп-хинты на возвращаемые значения функций.
Вместо checkHash лучше написать что-то вроде isLoggedIn().
Тут правильнее было бы сделать свой класс исключений, если уж делать все идеально. А то как ловить такое исключение и отличать от других?
https://github.com/asdasdasdasddasasdasdas/StudentList/blob/89c01482b1e548fb1b258bf2b7708aa687911571/app/helpers/DIContainer.php#L9
> public $dependencies = [];
А почему public? Думаю, тут лучше ограничить доступ к полю. Ты не читал про инкапсуляцию?
---------
Инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.
Суть инкапсуляции в том, что класс скрывает (инкапслирует) в себе логику работы с данными и сами данные, а наружу выставляет только методы. Пользователю этих методов не важно, как класс устроен внутри, как он хранит данные, какие у него есть поля, ему достаточно вызвать нужный метод чтобы получить результат.
Кроме нескольких публичных методов, остальные методы и свойства закрываются от доступа снаружи модификаторами private или protected. То есть с объектом снаружи ничего нельзя сделать, кроме вызова публичных методов.
Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название публичных методов (и может быть комментарии к ним). Также, это упрощает изменение кода: если какое-то свойство имеет уровень private, то доступ к нему возможен только из того же класса и тебе не надо бегать по всему коду и смотреть что там с этим свойством делается, тебе достаточно просмотреть один файл с этим классом.
При инкапсуляции автор класса таким образом задает ограничения, что можно делать с объектом.
Как плюс, мы можем поставить какие-то проверки в методах, и запретить установку неправильных значений свойств. Таким образом, снаружи записать неправильное значение в объект будет нельзя и автор класса может гарантировать его корректную работу в любой ситуации. Если у нас есть публичные свойства, то в них можно записывать что угодно, а приватные свойства изменять снаружи нельзя, можно только вызвать методы, которые что-то делают.
Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.
Если проводить аналогии, то можно представить кофе-машину. Ты нажимаешь кнопку (=вызываешь публичный метод) и получаешь кофе (=результат вызова этого метода), при этом ты не видишь что происходит внутри нее и тебе не надо в этом разбираться.
---------
> public function countPage($cstudents)
Тут нужен тайп-хинт и надо бы переименовать функцию.
> return "/?page=".$previousPage.'&search='.$_GET['search'];
Вот это плохо. Почему класс лезет куда-то в параметры запроса? Откуда он знает, что там хранится параметр поиска? У тебя нет разделения ответственности между пагинатором и контроллером. Не надо вообще в GET/POST лезть откуда-то, кроме контроллера.
Вдобавок, ты еще и неправильно подставляешь данные в ссылку, не исплоьзуя процентное кодирование спецсимволов через urlencode. А что, если там встретятся символы & или # ?
Наконец, гибче было бы, если бы пагинатор вообще не знал про поиск, а просто принимал дополнительные параметры для ссылки.
И еще. Сейчас у тебя некоторые методы пагинатора неявно полагаются на то, что ранее были вызваны другие методы. Например, метод setCurrentPage() ожидает, что перед ним будет вызван countPage(), но это никак не проверяется и даже никак не задокументировано. Как другому программисту разобраться в этом? Это признак плохого кода.
Исправить это можно так:
- сделать передачу обязательных параметров в конструкторе, так, что не получится создать пагинатор без их указания
- или сделать проверку на заполнение нужных параметров в фукнции, которая их использует
Первое наверно проще.
> public function ValidateAll($student)
Нужен тайп-хинт, а в идеале еще комментарий. Имена методов пишут с маленькой буквы.
> public function fill($post) :void
> {
> $this->name = $post['name'];
А тут есть гарантия, что в массиве всегда есть такой элемент? Также, нужен тайп-хинт.
> return $stmt->fetchAll(PDO::FETCH_CLASS);
Имей в виду, что у FETCH_CLASS есть странность: http://phpfaq.ru/pdo/fetch#oop
> По умолчанию PDO присваивает значения свойствам класса до вызова конструктора. При помощи же данной константы это поведение можно изменить - сначала будет вызываться конструктор
Это реально странно, так как конструктор в теории может сбрасывать значения свойств.
> public function countAllStudent() : int
> return $result->fetchColumn();
fetchColumn() возвращает строку, а не число. Ты увидишь ошибку, если включишь strict_types=1 в начале файла.
https://github.com/asdasdasdasddasasdasdas/StudentList/blob/89c01482b1e548fb1b258bf2b7708aa687911571/app/model/StudentTableGateway.php#L133
Здесь ошибка в логике. Если в БД есть совпадающий email, но первой вернется строчка с id пользователя, то это не будет замечено. Перепроверь логику работы функции.
https://github.com/asdasdasdasddasasdasdas/StudentList/tree/ads/public/view
Вообще, view не надо выкладывать в паблик. Их исходный код ведь пользователю видеть не надо.
https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/public/view/layouts/def.php
Форматирование кода очень плохое. Отступы неправильные.
> if(!$this->auth->checkHash()) : ?>
Лучше было бы наверно передавать переменную loggedIn.
> href=<?=$this->paginator->getPreviousPageUrl();?>
А где экранирование? Не забывай, что & это спецсимвол в HTML.
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/public/view/partials/form.php
Форматирование плохое.
> <?= $errors['surname_error'] ?>
Тут лучше бы экранировать все на всякий случай.
> <input class="form-control " type="number" name="balli" value=<?=htmlspecialchars($student->balli) ?> required>
А нельзя ли тут ограничить мин/макс значения?
> <?= $student->gender == 'f' ?
Лучше бы конечно использовать константу.
> html,body{
> height:1000px;
> overflow-y: hidden;
> overflow-x: hidden;
По моему, это плохая идея. Если что-то не поместится на экран, то это будет никак не увидеть.
> thead th{
Ты зря задаешь стили для всех таблиц на сайте. Лучше применять только к таблицам с определенным классом. Это тебе потом помешает при развитии сайта.
> form{
То же самое.
> span.text-danger{
То же самое.
> .table-responsive{
То же самое. Сделал бы класс вроде student-table и применял бы к нему.
> public function countPage($cstudents)
Тут нужен тайп-хинт и надо бы переименовать функцию.
> return "/?page=".$previousPage.'&search='.$_GET['search'];
Вот это плохо. Почему класс лезет куда-то в параметры запроса? Откуда он знает, что там хранится параметр поиска? У тебя нет разделения ответственности между пагинатором и контроллером. Не надо вообще в GET/POST лезть откуда-то, кроме контроллера.
Вдобавок, ты еще и неправильно подставляешь данные в ссылку, не исплоьзуя процентное кодирование спецсимволов через urlencode. А что, если там встретятся символы & или # ?
Наконец, гибче было бы, если бы пагинатор вообще не знал про поиск, а просто принимал дополнительные параметры для ссылки.
И еще. Сейчас у тебя некоторые методы пагинатора неявно полагаются на то, что ранее были вызваны другие методы. Например, метод setCurrentPage() ожидает, что перед ним будет вызван countPage(), но это никак не проверяется и даже никак не задокументировано. Как другому программисту разобраться в этом? Это признак плохого кода.
Исправить это можно так:
- сделать передачу обязательных параметров в конструкторе, так, что не получится создать пагинатор без их указания
- или сделать проверку на заполнение нужных параметров в фукнции, которая их использует
Первое наверно проще.
> public function ValidateAll($student)
Нужен тайп-хинт, а в идеале еще комментарий. Имена методов пишут с маленькой буквы.
> public function fill($post) :void
> {
> $this->name = $post['name'];
А тут есть гарантия, что в массиве всегда есть такой элемент? Также, нужен тайп-хинт.
> return $stmt->fetchAll(PDO::FETCH_CLASS);
Имей в виду, что у FETCH_CLASS есть странность: http://phpfaq.ru/pdo/fetch#oop
> По умолчанию PDO присваивает значения свойствам класса до вызова конструктора. При помощи же данной константы это поведение можно изменить - сначала будет вызываться конструктор
Это реально странно, так как конструктор в теории может сбрасывать значения свойств.
> public function countAllStudent() : int
> return $result->fetchColumn();
fetchColumn() возвращает строку, а не число. Ты увидишь ошибку, если включишь strict_types=1 в начале файла.
https://github.com/asdasdasdasddasasdasdas/StudentList/blob/89c01482b1e548fb1b258bf2b7708aa687911571/app/model/StudentTableGateway.php#L133
Здесь ошибка в логике. Если в БД есть совпадающий email, но первой вернется строчка с id пользователя, то это не будет замечено. Перепроверь логику работы функции.
https://github.com/asdasdasdasddasasdasdas/StudentList/tree/ads/public/view
Вообще, view не надо выкладывать в паблик. Их исходный код ведь пользователю видеть не надо.
https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/public/view/layouts/def.php
Форматирование кода очень плохое. Отступы неправильные.
> if(!$this->auth->checkHash()) : ?>
Лучше было бы наверно передавать переменную loggedIn.
> href=<?=$this->paginator->getPreviousPageUrl();?>
А где экранирование? Не забывай, что & это спецсимвол в HTML.
> https://github.com/asdasdasdasddasasdasdas/StudentList/blob/ads/public/view/partials/form.php
Форматирование плохое.
> <?= $errors['surname_error'] ?>
Тут лучше бы экранировать все на всякий случай.
> <input class="form-control " type="number" name="balli" value=<?=htmlspecialchars($student->balli) ?> required>
А нельзя ли тут ограничить мин/макс значения?
> <?= $student->gender == 'f' ?
Лучше бы конечно использовать константу.
> html,body{
> height:1000px;
> overflow-y: hidden;
> overflow-x: hidden;
По моему, это плохая идея. Если что-то не поместится на экран, то это будет никак не увидеть.
> thead th{
Ты зря задаешь стили для всех таблиц на сайте. Лучше применять только к таблицам с определенным классом. Это тебе потом помешает при развитии сайта.
> form{
То же самое.
> span.text-danger{
То же самое.
> .table-responsive{
То же самое. Сделал бы класс вроде student-table и применял бы к нему.
>>39006
Думаю, что нет, но лучше измерить и проверить.
>>38943
Если почитать мануал http://php.net/manual/ru/language.constants.syntax.php , то можно увидеть упоминание, что константы определяются при компиляции скрипта. Видимо, вычисление выражений в этот момент все усложнило бы. Да и это, наверно, усложнит чтение кода, так как значение константы явно не указано.
Возможно, тебе нужна переменная, а не константа.
> И еще, хорошо ли это, что я использую const вне классов?
В этом ничего плохого нет.
>>38955
Обычно тут не используют такое наследование, как ты описал. То есть, делают просто 1 класс для категорий, и 1 класс для любых товаров. Зачем тут делать несколько классов?
> Можно ли любой класс, экземпляр которого я не хочу создавать, делать абстрактным?
Можно. Хотя абстрактный класс - это недоделанный класс, класс-заготовка, от которого наследуются чтобы получить конкретный класс.
ErrorException обычно используют для случая, когда PHP-ошибки, варнинги, нотисы превращают в исключения. Как это описано в мануале. Так как в PHP действует две параллельных системы: исключения и просто ошибки/варнинги/нотисы и многие педпочитают свести их к одной системе исключений.
Класс Error - как описано в мануале, базовый класс для внутренних ошибок PHP. Его использует PHP. Тебе его использовать не надо.
Exception - базовый класс исключений, от которого они все должны были наследоваться, до введения интерфейса Throwable. Ты можешь от него наследовать свои исключения или можешь не наследовать, если не хочешь.
> Когда нужно использовать что-то из этих трех?
Обычно используют Exception для создания своих классов исключений на его основе.
> Я могу в любом месте кода выбросить любой из этих объектов через throw.
В такой ситуации принято делать свой класс исключений, так как на каждый тип ошибки в идеале делается свой класс, чтобы их можно было различать и ловить только нужные. Например, если ты не смог прочесть файл, то можешь выкинуть IOException. Или у пользователя нет прав для выполнения действия - выкидываешь AccessDeniedException. Также, в PHP есть несколько готовых классов исключений на распространенные случаи: http://php.net/manual/ru/spl.exceptions.php
Если класс Error обозначает внутреннюю ошибку PHP, как ты можешь его выкидывать? Ты ведь не интерпретатор PHP пишешь, у тебя такая ошибка не возникнет.
Мой урок по исключениям, советую прочесть: https://github.com/codedokode/pasta/blob/master/php/exceptions.md
> Допустим, Error я использую для отлова ошибок, а Exception для отлова исключений, получается, что ErrorException это результат множественного наследования от Error и Exception?
В PHP нет множественного наследования. Также, из твоего описания непонятно, чем у тебя отличаются "ошибки" от "исключений". Думаю, что ничем не отличаются.
> Что делает этот класс?
Объект исключения хранит подробности ошибки. Что это за ошибка, какие-то дополнительные подробности. Класс описывает свойства и методы, которые есть у объекта.
>>38761
Не думаю, что там есть такое требование.
ErrorException обычно используют для случая, когда PHP-ошибки, варнинги, нотисы превращают в исключения. Как это описано в мануале. Так как в PHP действует две параллельных системы: исключения и просто ошибки/варнинги/нотисы и многие педпочитают свести их к одной системе исключений.
Класс Error - как описано в мануале, базовый класс для внутренних ошибок PHP. Его использует PHP. Тебе его использовать не надо.
Exception - базовый класс исключений, от которого они все должны были наследоваться, до введения интерфейса Throwable. Ты можешь от него наследовать свои исключения или можешь не наследовать, если не хочешь.
> Когда нужно использовать что-то из этих трех?
Обычно используют Exception для создания своих классов исключений на его основе.
> Я могу в любом месте кода выбросить любой из этих объектов через throw.
В такой ситуации принято делать свой класс исключений, так как на каждый тип ошибки в идеале делается свой класс, чтобы их можно было различать и ловить только нужные. Например, если ты не смог прочесть файл, то можешь выкинуть IOException. Или у пользователя нет прав для выполнения действия - выкидываешь AccessDeniedException. Также, в PHP есть несколько готовых классов исключений на распространенные случаи: http://php.net/manual/ru/spl.exceptions.php
Если класс Error обозначает внутреннюю ошибку PHP, как ты можешь его выкидывать? Ты ведь не интерпретатор PHP пишешь, у тебя такая ошибка не возникнет.
Мой урок по исключениям, советую прочесть: https://github.com/codedokode/pasta/blob/master/php/exceptions.md
> Допустим, Error я использую для отлова ошибок, а Exception для отлова исключений, получается, что ErrorException это результат множественного наследования от Error и Exception?
В PHP нет множественного наследования. Также, из твоего описания непонятно, чем у тебя отличаются "ошибки" от "исключений". Думаю, что ничем не отличаются.
> Что делает этот класс?
Объект исключения хранит подробности ошибки. Что это за ошибка, какие-то дополнительные подробности. Класс описывает свойства и методы, которые есть у объекта.
>>38761
Не думаю, что там есть такое требование.
У многих языков только один распространенный фреймворк вроде RoR в Ruby или Django в Питоне.
>>38685
Фреймворк это все же не совсем библиотека. Бибилиотека - это когда ты вызываешь функцию. А фреймворк - каркас приложения - часто сам вызывает твои функции.
>>38608
>>38494
Думаю, что в вакансии нужна не совсем реляционная алгебра. Есть среды разработки, где ты можешь создавать базу данных и писать дополнительные скрипты, формы, отчеты для работы с ней. Например: MS Access. Возможно, имеется в виду знание чего-то такого. Или, возможно, требуется умение писать хранимые процедуры на PL/SQL. Или, например, 1С - там тоже БД + фреймворк для разработки приложений для взаимодействия с ней. А может просто имеется в виду навык работы с phpMyAdmin, кто их знает. Написано не очень понятно, стоило бы уточнить.
Формально, конечно, список студентов отдаленно подходит под "приложение базы данных" (хоть и запросы там простейшие), но я думаю, что имелось в виду что-то другое.
> Опыт составления тестовых кейсов(что это?).
http://www.protesting.ru/testing/testcase.html
Думаю, это описание того, как надо тестировать тут или иную фичу. То есть что-то вроде "алгоритма" для человека-тестера. Возможно, имеется в виду также не просто опыт написания тест-кейсов, а опыт работы с определенной программой для их составления.
> отличное знание ПК и Интернет(что они имеют в виду?)
Умение пользоваться браузером, вордом, экселем, электронной почтой, что-то в таком роде.
>>38592
> тута не понял как выравнять сноску [..] относительно строки, абсолют или флоат ее смещает вверх, и еще можно ли ее через флоат как-то сделать?
Думаю, что вертикально можно выровнять, добавив паддинг/маргин сверху вручную. Флоат имеет то отличие, что если в строке два em, то флоаты можно поместить друг над другом с помощью clear (ценой разрыва текста), а абс. поз. элементы нельзя. В принципе, годятся оба варианта.
В твоем решении картинка не ужимается при уменьшении размеров окна. У тебя на картинке есть min/max-width, но этого недостаточно. Картинка - это замещаемый (replaced) элемент (как и input, button, select, form, object и тд), и если ей не указать ширину явно, то она берется из размеров картинки (350px). Потому ты должен указать width + max-width явно, чтобы картинка сужалась при уменьшении ширины окна.
> span {
Плохая идея ставить стили на span, лучше явно указать название класса, так как на странице может быть куча других спанов.
> min-height: 150px;
Это может приводить к искажению пропорций картинки, если ты будешь её уменьшать.
Тут можно было обернуть переключатель в див, и повесить класс на него, чтобы не вешать его на каждый label.
> label.super-button input {
> position: fixed;
Это плохая идея, ты закрепляешь его где-то поверх других элементов, и он хоть и невидим, но может перехватывать клики по своей области, перекрывая элемент под ним.
Что касается фокуса, то есть псевдокласс :focus для сфокусированных элементов. Достаточно добавить outline для input:focus + i.
> фокус и при нажатии делается
Думаю, это не проблема, пусть подсвечивается в ллюбом случае. Это лучше, чем отсутствие подсветки.
Если стоит цель подсвечивать только при нажатии Tab (что было бы красивее), увы, тут решение только с помощью яваскрипта вроде описанного тут: https://stackoverflow.com/questions/23705055/input-effect-on-keyboard-tab-focus-but-not-on-click
Также, если ты знаешь JS, то можно повесить обработчик на кнопки, и, если над кнопкой была отпущена кнопка мыши, и элемент сфокусирован (document.focusedElement), то отдавать фокус функцией blur().
>>38483
Думаю, нужен яваскрипт.
>>38592
> тута не понял как выравнять сноску [..] относительно строки, абсолют или флоат ее смещает вверх, и еще можно ли ее через флоат как-то сделать?
Думаю, что вертикально можно выровнять, добавив паддинг/маргин сверху вручную. Флоат имеет то отличие, что если в строке два em, то флоаты можно поместить друг над другом с помощью clear (ценой разрыва текста), а абс. поз. элементы нельзя. В принципе, годятся оба варианта.
В твоем решении картинка не ужимается при уменьшении размеров окна. У тебя на картинке есть min/max-width, но этого недостаточно. Картинка - это замещаемый (replaced) элемент (как и input, button, select, form, object и тд), и если ей не указать ширину явно, то она берется из размеров картинки (350px). Потому ты должен указать width + max-width явно, чтобы картинка сужалась при уменьшении ширины окна.
> span {
Плохая идея ставить стили на span, лучше явно указать название класса, так как на странице может быть куча других спанов.
> min-height: 150px;
Это может приводить к искажению пропорций картинки, если ты будешь её уменьшать.
Тут можно было обернуть переключатель в див, и повесить класс на него, чтобы не вешать его на каждый label.
> label.super-button input {
> position: fixed;
Это плохая идея, ты закрепляешь его где-то поверх других элементов, и он хоть и невидим, но может перехватывать клики по своей области, перекрывая элемент под ним.
Что касается фокуса, то есть псевдокласс :focus для сфокусированных элементов. Достаточно добавить outline для input:focus + i.
> фокус и при нажатии делается
Думаю, это не проблема, пусть подсвечивается в ллюбом случае. Это лучше, чем отсутствие подсветки.
Если стоит цель подсвечивать только при нажатии Tab (что было бы красивее), увы, тут решение только с помощью яваскрипта вроде описанного тут: https://stackoverflow.com/questions/23705055/input-effect-on-keyboard-tab-focus-but-not-on-click
Также, если ты знаешь JS, то можно повесить обработчик на кнопки, и, если над кнопкой была отпущена кнопка мыши, и элемент сфокусирован (document.focusedElement), то отдавать фокус функцией blur().
>>38483
Думаю, нужен яваскрипт.
>Если класс Error обозначает внутреннюю ошибку PHP, как ты можешь его выкидывать? Ты ведь не интерпретатор PHP пишешь, у тебя такая ошибка не возникнет.
>Класс Error - как описано в мануале, базовый класс для внутренних ошибок PHP. Его использует PHP. Тебе его использовать не надо.
Я про то, что я в принципе могу выкинуть это через throw new \Error().
Мне нужно ошибки и исключения как-то различать. Но идеалогически верным было бы приводить все исключения к ошибкам, потому что на самом деле мало исключительных ситуаций может возникнуть во время работы программы. Львиная доля всех исключений порождает прерывание работы программы, а значит, это скорее ошибка, а не исключение, которое можно обработать и получить альтернативный, но все-таки положительный результат.
>Фреймворк это все же не совсем библиотека. Бибилиотека - это когда ты вызываешь функцию. А фреймворк - каркас приложения - часто сам вызывает твои функции.
Фреймворк это библиотека. Код на языке, для последующего использования. Вот пакетный менеджер обычно отдельное приложение. В фреймворке также вызываются функции, скафолдинг, миграции, и другие.
>>39040
>Думаю, что в вакансии нужна не совсем реляционная алгебра.
На ее основе строится работа с данными, в любых базах, даже не реляционных. Даже вне баз используются принципы реляционной алгебры, для проектирования работы с данными. Без знаний ее основ считай калека.
https://ideone.com/miZCtl
Не понимаю как добавить игнорирование любого числа скобок, минусов, пробелов.
Благодарю заранее!
У меня в разных проектах образовалась пачка классов-утилит, которую часто использую.
Пространство имен сейчас у них везде разное.
Как поступить? Думаю залить это говно на гитхаб и в пространстве имен тупо задать им namespace MyGithubNickname\SomeUtil;
А далее в композере в проектах тупо подрубать им путь через psr-4, чтобы они грузились. Норм идея?
Да.
Не понял, ты хочешь, чтобы все твое добро работало на гитхабе? Он поддерживает только статичные html-css-javascript сайты, для пых-кода нужен интерпретатор и демон, на котором он должен крутиться и принимать запросы.
она говно
>Не думаю, что там есть такое требование.
Как раз таки это требование, так как без этого миграции не проходят, таблица в базе данных migrations создается а остальные миграции нет.
ОП, а почему ну как мне кажется ты любишь "алгоритмические задачи"? Знания алгоритмов нужная вещь в PHP разработке? Ты же обещал, что не будет никакой математики. Тут и так регулярки сложные... Как так то?
>регулярки сложные
Что там сложного?
Мимо написал овер сотню спамеров и любую регулярку пишу с закрытыми глазами
Ну как сказать. Может я конечно передергиваюгибаю. Написать регулярку рили не так сложно, но вот чтоб сделать ее не громоздкой, тут уж нужны знания.
Я тоже раньше такие вопросы задавал, про говнокод, про то, что засмеют. Мне тогда и сейчас понравился ответ одного анона: просто пиши, со временем сам увидишь где говнокод а где норм - это просто дело опыта.
А ещё учти такой факт, что все писали лапшу и ничего в этом нет сильно плохого, это просто повод расти дальше.
Да нет, спасибо, уже не надо.
Я вот тут писал
>>35517
>>35533
>>35758
Решил кое как, ну и так сойдет.
Сейчас просто решаю задачу про банкомат. Задачу обычным способом решить еще можно ("жадный" алгоритм). А вот если брать осложненную версию, то тут уже тупняк.
По ссылкам проходишь, чтобы изучить метод динамического программирования, но чет не понятно. Ну сейчас >>38388
этот комментарий дочитаю, может понятней будет
Не надо об этом думать, словно это какое-то великое знание. Это шаблон строки, заданный спецсимволами. Если чувствуешь неуверенность - поиграйся с ними и всё пройдет.
Фишка в другом.
В том, что кукарекать где говнокод - легко, но сами кукаретики хуй напишут то, что считают не говнокодом.
>со временем сам увидишь где говнокод а где норм
Подсказываю: говнокод будет всегда и везде из-за фундаментальных ограничений самих япов + в любом проекте сложнее хеллоуворда будет овердохуя узких и спорных мест и компромисов, которые являются самым настоящим говнокодом.
Возьми код любого популярного фреймворка и охуей от этого кала.
Костыль на костыле и костылем погоняет. Но за счет большого форса в комьюнити и хорошей документированности этим пользуются.
Я серьезно пришел к выводу, что писать идеальный или даже приближенный к нему код вообще невозможно нахуй, ибо япы не настолько развиты.
Например, хуй в каком популярном языке есть такая фишка, как ссылка на имя метода класса.
Ну или многопоточность. Там тоже все через жопу.
Код на C++ - так вообще один большой костыль, как и сам язык, на нем в принципе абсолютно нихуя нормального не напишешь.
И так везде. Одно говно блять.
Можно лишь научиться более-менее ловко его жрать. Но твой код всегда будет парашей
Ты ж сам накукарекал про кукаретиков, и сам же раскукарекался. Как так?
Говнокод обычно там, где не соблюдаются стандарты, т.е. типично-любительский такой джунский код. А костыли там, где без них никак это просто костыли.
Да какие в жопу стандарты.
Недавно начал делать проект на laravel и чуть не проблевался с этих роутов, которые захардкаживаются строками блядь.
Причем даже нельзя написать MyController::class, надо руками писать 'MyController'.
Да даже блядь обертку нельзя написать чтобы извлекать базовое имя класса, ибо там все через жопу сделано и то не поможет в случае если контроллер находится в подпапке.
Истинное ебаное говно блять.
И так везде - в сервис-провайдерах, в ядрах опять охуительные тонны стороковых литералов.
При рефакторинге вручную ходишь и идешь это говно.
Эти волшебные методы, которые перехватываются через __callStatic().
Да, в целом любой популярный фреймворк - лучше использовать, чем нет, но говорить что они написаны "хорошо" - это бред.
Нихуя не хорошо.
В крестах же любой сложный проект состоит из подобной пораши чуть менее чем полностью. Ввиду отсутствия какого бы то ни было стандарта в комьюнити и тонн одинаковых инструментов, которые делают то, что даже в пыхе делает стандартная библиотека.
Чего только стоит свой класс строк, который НЕПРЕМЕННО блять есть в каждой крестовой параше и везде он разный, ибо одинакового родного-то нет (точнее есть, но это просто недоразумение, которое использовать нельзя).
Стандарты по сути придуманы, чтобы не заблудиться в говнокоде совсем, так сказать последний рубеж, перед полным проигрышем разумным машинам.
Уже давно не помню откуда.
>>39134
Довольно просто. Сначала мы пишем выражение вида "ровно 1 цифра, за ней любое число скобок, минусов, пробелов". Затем мы оборачиваем его в круглые скобки и указываем 10 повторений: (....){10}
Также, замечание. [+7,8] значит "ровно один символ: плюс, семерка, запятая или восемь".
>>39697
В PHP, кстати, есть ссылка на метод конкретного объекта:
$ref = [$object, 'getValue'];
$value = call_user_func($ref);
>>39689
> А как сделать, чтобы между ними учитывались скобки, пробелы и минусы? Можно ли как то это сделать за один раз, либо придется что то типа: сначала идут 3 цифры, потом возможно скобка или пробел или минус, потом еще три цифры и опять может пробел или минус и т.д.?
Процитирую ответ выше:
> Довольно просто. Сначала мы пишем выражение вида "ровно 1 цифра, за ней любое число скобок, минусов, пробелов". Затем мы оборачиваем его в круглые скобки и указываем 10 повторений: (....){10}
> По ссылкам проходишь, чтобы изучить метод динамического программирования, но чет не понятно.
Он применяется к похожей, но другой задаче (дана сумма и неограниченный запас купюр, надо найти способ представить эту сумму минимальным числом купюр). Суть этого метода, что мы находим способ, как от представления суммы x перейти к представлению суммы x + 1 (попробовать добавлять по 1 купюре разных номиналов, и выбрать комбинацию с наименьшим числом купюр). И так, увеличивая x от 0 до искомой суммы, мы постепенно найдем решение.
Если что, тут есть примеры задач, которые этим методом решаются: https://ru.wikipedia.org/wiki/Динамическое_программирование#Классические_задачи_динамического_программирования
Я не могу гарантировать, что им можно решить задачу про банкомат, но ты можешь попробовать.
>>39134
Довольно просто. Сначала мы пишем выражение вида "ровно 1 цифра, за ней любое число скобок, минусов, пробелов". Затем мы оборачиваем его в круглые скобки и указываем 10 повторений: (....){10}
Также, замечание. [+7,8] значит "ровно один символ: плюс, семерка, запятая или восемь".
>>39697
В PHP, кстати, есть ссылка на метод конкретного объекта:
$ref = [$object, 'getValue'];
$value = call_user_func($ref);
>>39689
> А как сделать, чтобы между ними учитывались скобки, пробелы и минусы? Можно ли как то это сделать за один раз, либо придется что то типа: сначала идут 3 цифры, потом возможно скобка или пробел или минус, потом еще три цифры и опять может пробел или минус и т.д.?
Процитирую ответ выше:
> Довольно просто. Сначала мы пишем выражение вида "ровно 1 цифра, за ней любое число скобок, минусов, пробелов". Затем мы оборачиваем его в круглые скобки и указываем 10 повторений: (....){10}
> По ссылкам проходишь, чтобы изучить метод динамического программирования, но чет не понятно.
Он применяется к похожей, но другой задаче (дана сумма и неограниченный запас купюр, надо найти способ представить эту сумму минимальным числом купюр). Суть этого метода, что мы находим способ, как от представления суммы x перейти к представлению суммы x + 1 (попробовать добавлять по 1 купюре разных номиналов, и выбрать комбинацию с наименьшим числом купюр). И так, увеличивая x от 0 до искомой суммы, мы постепенно найдем решение.
Если что, тут есть примеры задач, которые этим методом решаются: https://ru.wikipedia.org/wiki/Динамическое_программирование#Классические_задачи_динамического_программирования
Я не могу гарантировать, что им можно решить задачу про банкомат, но ты можешь попробовать.
Мозги развивают. Я бы советовал тем анонам, у которых нет работы (и есть время) пробовать решать олимпиадные задачи.
Регулярки станут не такие сложные, когда ты с ними разберешься и научишься использовать. Это всего лишь способ записать шаблон для поиска последовательности символов в строке.
>>39463
Тебе надо изучать ООП, MVC и фреймворки. Начать будет проще всего с микрофреймворка вроде Slim. На нем как раз можно и блог сделать.
>>39285
Обычно используют название проекта, и если он большой, то названия компонентов. Ну например: \Symfony\Component\HttpFoundation\Request.
> У меня в разных проектах образовалась пачка классов-утилит, которую часто использую.
Вынеси их в библиотеку с названием XyzTools и соответственно так же назови пространство имен.
> Как поступить? Думаю залить это говно на гитхаб и в пространстве имен тупо задать им namespace MyGithubNickname\SomeUtil;
Хороший вариант.
> А далее в композере в проектах тупо подрубать им путь через psr-4, чтобы они грузились. Норм идея?
Это лучше сделать в самой библиотеке, добавить в неё composer.json с описанием автозагрузки.
> Я про то, что я в принципе могу выкинуть это через throw new \Error().
Правильнее так: либо используй классы исключений из SPL, либо делай свои классы исключений. Класс Error не для тебя сделан. Использовать объект класса Error неправильно, так как он выкидывается при ошибках PHP, и ты не сможешь отличить ошибки PHP от своих ошибок.
Error - это не ошибка, а исключение. Так как он реализует интерфейс Throwable и выкидывается через throw. Ошибка в PHP формально - это то, что генерируется вызовом trigger_error. Ты считаешь ошибкой исключение, которое ловится, но это лишь твое мнение.
Также, есть еще вариант, если ты ожидаешь ошибку, можно не выкидывать ее через throw, а возвращать через return.
>>40266
Я смотрю, у тебя много тайп-хинтов, обрати внимание тогда, что в PHP7.4 добавили тайп-хинты для свойств: https://wiki.php.net/rfc/typed_properties_v2
> // Увольняем сотрудников, вызывая соответствующий метод департамента
> array_filter($engineers,
Это с точки зрения не очень правильно, так как array_filter предназначена для отбора элементов массива. Тебе бы больше подошла функция array_walk или просто foreach. Также, ты переносишь тут аргументы не по PSR-2.
> @param Company $company
Это не несет никакой новой информации и, по-хорошему, можно было бы и не писать.
> $profession = $analyst->getProfession();
> $profession->setBaseRate(1100);
Если объект profession у всех сотрудников один, то эта строчка повысит зарплату всем аналитикам во всех компаниях. Там в задаче ведь требуется создать несколько копий компании и к каждой копии применить свои меры, но ты повысишь зарплату во всех копиях компаний.
> $department->select(
> function ($employee) {
> if ($employee->getProfession() instanceof Manager && $employee->getRank() < 3) {
> $employee->setRank($employee->getRank() + 1);
Это плохо с точки зрения читабельности, так как вызывается функция select(), которая судя по названию, лишь отбирает работников, но не делает изменений в них. Плюс, в теории нет гарантий, что твоя функция вызывается из select() ровно один раз для каждого работника, если select() будет по каким-то причинам вызывать её 2 раза, то ты повысишь всех на 2 ранга.
Ты мог бы сделать функцию tranform, forEach или с похожим названием, если хочешь, чтобы она обходила работников и что-то с ними делала.
> if ($coffeeVolume < 1) {
> 'Переданное значение меньше нуля'
Небольшое расхождение.
Так, в общем, сделано хорошо, если не считать проблемы с профессией и с тем, что ты применяешь 3 меры к одной компании, а надо применить 3 меры к 3 копиям компании и вывести 3 результата.
Если хочешь еще порешать задачки на ООП, то ищи "будильник" и "гостиницу" тут в треде или на phpclub.tech
>>40266
Я смотрю, у тебя много тайп-хинтов, обрати внимание тогда, что в PHP7.4 добавили тайп-хинты для свойств: https://wiki.php.net/rfc/typed_properties_v2
> // Увольняем сотрудников, вызывая соответствующий метод департамента
> array_filter($engineers,
Это с точки зрения не очень правильно, так как array_filter предназначена для отбора элементов массива. Тебе бы больше подошла функция array_walk или просто foreach. Также, ты переносишь тут аргументы не по PSR-2.
> @param Company $company
Это не несет никакой новой информации и, по-хорошему, можно было бы и не писать.
> $profession = $analyst->getProfession();
> $profession->setBaseRate(1100);
Если объект profession у всех сотрудников один, то эта строчка повысит зарплату всем аналитикам во всех компаниях. Там в задаче ведь требуется создать несколько копий компании и к каждой копии применить свои меры, но ты повысишь зарплату во всех копиях компаний.
> $department->select(
> function ($employee) {
> if ($employee->getProfession() instanceof Manager && $employee->getRank() < 3) {
> $employee->setRank($employee->getRank() + 1);
Это плохо с точки зрения читабельности, так как вызывается функция select(), которая судя по названию, лишь отбирает работников, но не делает изменений в них. Плюс, в теории нет гарантий, что твоя функция вызывается из select() ровно один раз для каждого работника, если select() будет по каким-то причинам вызывать её 2 раза, то ты повысишь всех на 2 ранга.
Ты мог бы сделать функцию tranform, forEach или с похожим названием, если хочешь, чтобы она обходила работников и что-то с ними делала.
> if ($coffeeVolume < 1) {
> 'Переданное значение меньше нуля'
Небольшое расхождение.
Так, в общем, сделано хорошо, если не считать проблемы с профессией и с тем, что ты применяешь 3 меры к одной компании, а надо применить 3 меры к 3 копиям компании и вывести 3 результата.
Если хочешь еще порешать задачки на ООП, то ищи "будильник" и "гостиницу" тут в треде или на phpclub.tech
Покажи как ты на руби и на дж делаешь запрос к стороннему апи и получаешь джсон.
Можно такой же вопрос спросить про Руби. И кстати, тайп-хинты в Руби завезли? А вообще, https://habr.com/ru/post/315152/
Я уже ебанулся это читать. Passport какой-то - это вообще нахуй какой-то фреймворк в фреймворке с кучей свистоперделок и даже собственными (!) таблицами в бд и собственными миграциями.
Я всего-то хотел простейшую авторизацию по токенам для апи сделать, а мне суют в ебало O-Auth и прочую бесовщину.
Сука, вынуждают блять просто взять и наговнокодить себе свою авторизацию на коленке тупо через middleware, привязанные к роутам.
Че делать, помогити
>зачем люди учат php
Я начал учить еще очень давно, когда кроме него нихуя не было в вебе.
Теперь просто жру говно по инерции.
Зачем люди в этом треде учат - вообще хуй знает.
Я спрашивал, говорят тип вакансий много то что не менее 50% их них - ковыряние ложкой в сладком хлебе в вебстудиях, где тебе дадут пхп 5.6, обмажут джумлой, битриксом и прочими высерами мирового программирования - их не ебет.
А если говно отсеить, то окажется, что вакансий на тот же жс больше.
Да и кроме него языки есть.
Да и пхп уже не в моде.
Я бы сейчас в 2к19 php не учил.
Есть, как ты заметил, более хайповые и молодежные стеки. Js, Go.
Selenium
>на гоу 2 вакансии
Ну это пока.жпг
>в моем 1кк
Мухосрани как бы никогда на острие прогресса не стояли.
Меньше платить нужно чуханам, которые повелись на НОВОЕ МОЛОДЁЖНОЕ.
В душе не ебу, но го набирает популярность уже несколько лет.
Ну и он более производительный, можно легче писать всякий хайлоад.
ОП, а можно в студентах использовать компоненты из фреймворков? Или лучше самому велосипедить?
Ну и что теперь, бросать изучать пхп?
Почему они называют моделями сраный orm-билдер запросов?
Я привык что модель представляет собой некий интерфейс взаимодействия с данными. Инкапсуляция данных от внешнего кода. Внешний код может взаимодействовать с данными только с помощью методов модели.
А тут вообще нихуя не так. Модель всего лишь привязывается к определенной таблице и все, далее любой хуй может дрочить ее как хочет, фактически напрямую делая sql-запросы (но с помощью моднявой орм).
Это че за наебалово блять.
Еще замечу, что в ларавеле нихуя не ActiveRecord, а какая-то левая параша.
ActiveRecord сам по себе является хуйней, так в ларавеле к нему прикрутили еще и целый анальный поезд с клоунами.
Сука, зачем я только проект на этом говне начал...
То бишь, они предлагают мне писать всю логику выполнения запросов к БД тупо в контроллерах.
Охуенно блять, просто гениально нахуй.
Какая инкапсуляция, это все для лохов, игрушки дьявола
Это вроде паттерн ActiveRecord. А так, Ларавель идеи заимствовал из RoR, а там примерно так же.
Можно, но идея конечно была разобраться самому, как работать с таблицами в БД, как работать с формами. Компоненты использовать можно, если ты понимаешь их внутреннее устройство и способен сам написать аналогичный.
Щас бы писать логику работы с данными в классах, являющимися билдерами запросов.
Это примерно как унаследоваться от какого-нибудь класса DateTime и писать там логику своего приложения.
Ты половину моего поста почему-то не прочел. Я еще в сервисах предлагал писать. Что касается моделей - в Ларавель их используют для этого, если тебе такой подход не нравится, то зачем ты этот фреймворк взял?
https://martinfowler.com/eaaCatalog/serviceLayer.html
Класс, содержащий методы бизнес-логики. Вроде зарегистрировать пользователя или удалить товар. Просто класс с методами, который не представляет какую-то сущность, а обычно существует в одном экземпляре.
Ну вот примерно так я и собираюсь сделать.
Вот в этой статье чел понял какая проблема с ларавельскими проблемами: https://habr.com/ru/post/350778/
(Но зачем-то замутил еще один дополнительный слой абстракции, нахуя он это сделал - хуй знает).
Короче репозиторий. Сервис. Как ни называй это говно, суть в том, что этот класс выполняет запросы к базе в своих методах, а внешний код обращается к этому классу, когда ему надо провзаимодействовать с БД.
Тем самым осуществляются 2 вещи:
1. Внешний код может взаимодействовать с данными только так, как позволяет класс репозитория/сервиса.
2. Как репозиторий выполняет запросы является деталью реализации (хоть в нормальном приложении тебе и никогда не придется подменять эту реализацию)
* ларавельскими моделями
Так бы называлась эта статья, если бы я писал ее какую-нибудь хабропомойку
Вот чел в 2015 году понял всю суть этого вороха абстракций.
Я в процессе работы над одним проектиком, где вручную накостылял все взаимодействие с БД пришел к одной схеме, которая и кажется мне сейчас идеальной.
Выдвину аксиомы:
1. Тебе никогда не потребуется менять СУБД прямо в ходе проекта.
2. Даже если ты захочешь, ты не сможешь это сделать из-за деталей реализации, различающихся в разных субд. Транзакции, сложные запросы, специфические команды и т.п.
Итого, сразу отваливается слой HQL. Тип некая обертка, которая позволяет тебе описывать запросы одинаково, что для mysql, что для postgress, что для sqlite...
Короче мало того, что это говно в принципе возможно только для простейших запросов, которые одинаковы в разных субд, так оно еще и не нужно по двум причинам.
1. Это параша будет тормозить приложение ну просто на ровном месте. Ты еще нихуя не написал, а эта поебень уже работает медленнее, чем если бы тупо написал чистый SQL. И если ты думаешь, что потери в производительности незначительны - нихуя не так. Какой-нибудь основательно напердоленный фреймворк может изи сжирать на это говно 100 милисекунд.
2. Это не нужно, ибо за этими обертками ты "теряешь контроль" над реальным телом sql-запроса.
Видешь какую-нибудь хуиту уровня ->where ('hui', '>=', 2)->join (phone)->firtst().
Ну и как блять выглядит sql-запрос для этой хуйни? Ты должен постоянно держать в голове включенным транслятор этого бреда на sql.
Я уже говорил, что в орм может не оказаться специфических возможстей конкретных субд?
А еще в этом говне могут быть баги и sql-запрос будет выглядеть не так, как ты думол.
Ну и зачем нужна эта срань, если ты можешь просто и без задней мысли писать чистые sql-запросы в ебаных методах?
И сразу все всем понятно, что именно будет делать этот запрос.
Итого, мы получаем TableDataGateway, где прямо в методах sql-запросы.
Далее можно навернуть ActiveRecord, DataMapper, но важно нечто иное, что в этих статьях упускают.
ЧТО тебе возвращают эти методы?
Допустим, в пыхе это будут массивы. Да, говно.
Короче, самой важной абстракцией является абстракция над сущностью.
Метод getUser() должен возвращать не массив, даже не какой-нибудь ArrayList<> в статическом языке.
Он должен возвращать объект данных.
Q: Что если запрос сложный, где возвращаемый ответ не полностью соответствует строке из БД, допустим, с join или динамически генерируемыми столбцами?
Ну и похуй. Все равно должен возвращаться объект данных.
Все методы этого TableDataGateway, Service, Repository или еще какой хуиты, где находится твой sql-код должны высирать или примитив или DAO (ValueObject).
Для сложных запросов будет просто уникальный объект.
Все.
По сути структура абстракций такая:
1. В результате выполнения чистого sql-кода возвращаются некие "сырые" данные.
2. Эти сырые данные преобразуются в value object.
3. Метод класса, где находился вышеописанный код возвращает тебе этот value object.
В итоге имеем:
1. Простоту написания и отслеживания изменений в SQL-коде.
2. Хорошую производительность ввиду отсутствия дополнительных прослоек.
3. Внешний код вызывает методы модели для получения value object'ов, но он ничего не знает о реализации этих методов.
Все блять. Что думаете?
Так бы называлась эта статья, если бы я писал ее какую-нибудь хабропомойку
Вот чел в 2015 году понял всю суть этого вороха абстракций.
Я в процессе работы над одним проектиком, где вручную накостылял все взаимодействие с БД пришел к одной схеме, которая и кажется мне сейчас идеальной.
Выдвину аксиомы:
1. Тебе никогда не потребуется менять СУБД прямо в ходе проекта.
2. Даже если ты захочешь, ты не сможешь это сделать из-за деталей реализации, различающихся в разных субд. Транзакции, сложные запросы, специфические команды и т.п.
Итого, сразу отваливается слой HQL. Тип некая обертка, которая позволяет тебе описывать запросы одинаково, что для mysql, что для postgress, что для sqlite...
Короче мало того, что это говно в принципе возможно только для простейших запросов, которые одинаковы в разных субд, так оно еще и не нужно по двум причинам.
1. Это параша будет тормозить приложение ну просто на ровном месте. Ты еще нихуя не написал, а эта поебень уже работает медленнее, чем если бы тупо написал чистый SQL. И если ты думаешь, что потери в производительности незначительны - нихуя не так. Какой-нибудь основательно напердоленный фреймворк может изи сжирать на это говно 100 милисекунд.
2. Это не нужно, ибо за этими обертками ты "теряешь контроль" над реальным телом sql-запроса.
Видешь какую-нибудь хуиту уровня ->where ('hui', '>=', 2)->join (phone)->firtst().
Ну и как блять выглядит sql-запрос для этой хуйни? Ты должен постоянно держать в голове включенным транслятор этого бреда на sql.
Я уже говорил, что в орм может не оказаться специфических возможстей конкретных субд?
А еще в этом говне могут быть баги и sql-запрос будет выглядеть не так, как ты думол.
Ну и зачем нужна эта срань, если ты можешь просто и без задней мысли писать чистые sql-запросы в ебаных методах?
И сразу все всем понятно, что именно будет делать этот запрос.
Итого, мы получаем TableDataGateway, где прямо в методах sql-запросы.
Далее можно навернуть ActiveRecord, DataMapper, но важно нечто иное, что в этих статьях упускают.
ЧТО тебе возвращают эти методы?
Допустим, в пыхе это будут массивы. Да, говно.
Короче, самой важной абстракцией является абстракция над сущностью.
Метод getUser() должен возвращать не массив, даже не какой-нибудь ArrayList<> в статическом языке.
Он должен возвращать объект данных.
Q: Что если запрос сложный, где возвращаемый ответ не полностью соответствует строке из БД, допустим, с join или динамически генерируемыми столбцами?
Ну и похуй. Все равно должен возвращаться объект данных.
Все методы этого TableDataGateway, Service, Repository или еще какой хуиты, где находится твой sql-код должны высирать или примитив или DAO (ValueObject).
Для сложных запросов будет просто уникальный объект.
Все.
По сути структура абстракций такая:
1. В результате выполнения чистого sql-кода возвращаются некие "сырые" данные.
2. Эти сырые данные преобразуются в value object.
3. Метод класса, где находился вышеописанный код возвращает тебе этот value object.
В итоге имеем:
1. Простоту написания и отслеживания изменений в SQL-коде.
2. Хорошую производительность ввиду отсутствия дополнительных прослоек.
3. Внешний код вызывает методы модели для получения value object'ов, но он ничего не знает о реализации этих методов.
Все блять. Что думаете?
Ты путаешься. ORM используют не для того, чтобы писать запросы через Query Builder (стрелочками и скобочками). Наоборот, Query Builder используют, когда запрос надо собирать в зависимости от кучи условий (на SQL склеивание строк будет выглядеть довольно коряво). Обычно это всякие выборки с филтьрацией по разным условиям.
И не для того, чтобы менять одну базу данных на другую (хотя некоторые проекты это делают). Он для того, что написано в его названии (object-relational mapping).
Это хорошо, что ты хочешь написать критику, но хорошо бы сначала получше разобраться в том, что ты критикуешь, и зачем оно придумано.
> Далее можно навернуть ActiveRecord, DataMapper
Так Доктрина и есть ORM по схеме DataMapper. Ты сам себе противоречишь, потому что в начале пишешь, что она не нужна.
Плюсы ORM в том, что тебе не надо писать руками код загрузки объектов из БД и рутинные запросы вида "найти по id". Это быстро надоедает. Также, ORM умеет делать связи между сущностям, включая ленивую загрузку (где она в твоем самописном ORM), также, ORM умеет сам находить изменения в графе сущностей и сохранять их обратно в БД.
И все это самому написать довольно сложно. Попробуй хотя бы спроектировать, как ты будешь все это сам реализовывать. Получается, либо ты берешь Доктрину, либо мучаешься с написанием рутинных запросов и маппингом массивов на объекты руками.
То есть ты обмениваешь удобство и скорость разработки на скорость работы и потребление памяти. По моему опыту, выгоднее всего получается что-то получать через ORM, а что-то SQL запросами.
Также, насчет объектов.Крайне нежелательно делать для одной сущности разные представления (в виде разных объектов), так как в этом случае полезные методы смогут работать только с одним представлением, но не с другим.
Например, я как-то ломал голову на тему: как, например, при выборке списка статей избежать загрузки текста статей? Сделать 2 сущности - Post и FullPost? Это плохой вариант. По факту, надо делать либо лениво загружаемые поля (в Доктрине их нету), либо мапить таблицу постов на 2 сущности: Post и PostDetails, связанные отношением 1-к-1 (Доктрина это тоже не умеет).
>для одной сущности разные представления
А как такое может быть? Если они различаются, значит это разные сущности.
>как, например, при выборке списка статей избежать загрузки текста статей?
Ох уж эти проблемы орм-зависимых.
Массив id - разве не примитивный тип?
Не вижу проблемы.
Я думаю, все что высирается в результате любых запросов к БД - должно быть определенным объектом.
Ну или примитивом. Одномерный массив какой-нибудь хуйни - тоже примитивный тип. Как массив айдишников статей.
Не знаю, как там в доктрине, но в АР ларки или yii такие выборки поддерживаются с маппингом в модель.
ИЛИ
Контроллер должен забирать данные через методы модели и обрабатывать, а если я использую ОРМ, то роль модели здесь стремится к нулю
Модель это не только непосредственная работа с бд. Вообще всю бизнес логику проще назвать слоем модели, а эти орм только его часть. Так что эксперементируй. Ну а в контроллерах старайся делать поменьше, это просто посредники между клиентом и твоей логикой.
Модель, хуель, все эти слова давно извратили и никто уже в душе не ебет что это вообще значит.
Но что могу сказать - нельзя напрямую обращаться к базе данных в контроллерах.
То бишь, писать там sql-запросы. Ну или обернутые в ORM sql-запросы.
Нужен отдельный слой, который будет этим заниматься, а контроллеры уже будут с ним и работать.
Теперь я не могу просто сделать как на третьем пикреле, ибо порядок столбцов неизвестен.
Сука, прямо какое-то стремление жрать говно наблюдается в этом фреймворке и особая тяга к захардкаживанию всего и вся в строковых ключах.
Сука, чтобы я еще раз что-то прогал на этой помойке - лучше убейте меня.
Нахуячили магии половину фреймворка, так для этой параши автокомплит ide (самой лучшей блять) не работает даже при напердоливании родными плагинами ларавеля.
Это какой-то новый уровень говноедства.
>Нахуячили магии половину фреймворка
Ух как мне тоже это не нравилось в свое время. Но потом как-то успокоился.
Мне не нравится ПХП потому что постоянно приходится вводить комбинацию шифт+знак доллара, мизинец устает.
Это можно пофиксить как-нибудь?
Я тебе тут с этим не помогу, просто хотел еще до кучи накинуть следующее: -> для образения к методам инстанса, :: для обращения к статическому контексту, точечка для конкатенации.
Меня ничего из этого не парит, но я видел людей которые со всего перечисленного блевали.
http://jsfiddle.net/b1wmyoe8/1/
10
http://jsfiddle.net/zgerh70m/1/ - пофиксил
>В твоем решении картинка не ужимается при уменьшении размеров окна.
Нагуглил решение(в блоке img), но не понимаю как оно работает толком. Что дает max-width: 100% + width: auto?
11
http://jsfiddle.net/0wbntouz/1/ - пофиксил, сделал подсветку
> position: fixed; Это плохая идея, ты закрепляешь его где-то поверх других элементов, и он хоть и невидим, но может перехватывать клики по своей области, перекрывая элемент под ним.
сделал absolute, так он на своем месте останется
Лиличка:
https://3v4l.org/IqEma
Считалка:
https://ideone.com/h8Oe7g
По кругу:
https://3v4l.org/BAtH4
Не понял зачем тут $fromAngle = -80; $toAngle = 260; т.к. не стал вникать в тригонометрию.
Все я выяснил в чем проблема, в папки в которой вложен ларавель не должно быть папок с русскими именами.
https://pastebin.com/RRXiNjLC
img - картинка - это replaced element, то есть элемент, у которого есть "внутренний размер" (размер картинки). Правила вычисления ширины для таких элементов описаны в спецификации CSS2.1:
- https://www.w3.org/TR/2011/REC-CSS2-20110607/visudet.html#inline-replaced-width
Если ты понимаешь английский, попробуй прочесть, там написано, как вычисляются размеры, если они не указаны явно. Если непонятно, спрашивай.
Наверно, тебе интереснее будет разобраться самому, чем увидеть правильный ответ.
Я так же пишу, когда стараюсь. Вроде норм.
Что вернет toArray(), если его вызвать несколько раз подряд?
По коду - нет комментариев и объяснений, зачем этот класс, то есть вcя информация о классе есть только в твоей голове. Это не подходит для работы в команде.
Экспорт в JSON имхо тут делать довольно бессмысленно. Также, на практике, если ты делаешь JSON API, часто нужна не просто копия данных, а надо часть полей скрыть, часть полей преобразовать итд. И твой код с этим не справится.
Интересный баг, не знал.
Я вообще не понимаю, зачем они сделали не-строгий режим, хотя бы для новых функций вроде тайп-хинтов на return values, которых не было в старом коде. Вроде как разум вернулся в головы разработчиков и в тайп-хинтах для свойств они сделали строгую проверку типов.
Ты баг в баг-трекере не пробовал поискать или создать? А то, может, мужики-то не знают.
Еще у меня случается конфуз мозга, когда я слышу или читаю сленг программистов. Например, из последнего, некий анон употребил термин "тип" в значении "подсказка". Что-то типа "накидайте мне типов для хуйня_нейм". Я долго думал, что это значит и как относится к самому кодированию, пока не вспомнил, что пхпшторм мне в самом начале предлагал отключить ежедневные tips из функционала, что я и сделал.
Еще были проблемы со словом паттерн, которого нет в русском языке, но есть английское pattern. И когда я читаю его в английском тексте, я знаю, что это означает и читаю без остановок. Но когда раньше слышал в русском не шаблон, а паттерн, я начинал тупить.
И этого сленга очень много. Скажите, в реальной жизни ведь его тоже употребляют? Как мне зазубрить все эти сленговые словечки, чтобы понимать будущих коллег?
Само собой произойдет.
Ну а с коллективом бывает просто не везет, однако чаще всего даже аутисты (например я) вливаются нормально в коллектив. А почему бы и нет собственно? Этож говнокодерство, там многие разной степени аутяги, да и ненависть к менеджерам всяким объединяет.
>>42545
С чего вы взяли, что это баг? === - это строгое сравнение, которое помимо значений проверяет еще и типы данных.
В данном случае ты сравниваешь строку с числом. Но в мануале ясно говорится, что если ты не используешь строгую декларацию, то типы будут динамически преобразовываться, где это возможно.
Ты наверняка модный и доброжелательный анон с популярными интересами. Я на свои текущие 24 года не нашел ни одного человека, дотягивающего до моего уровня. Так что аутист аутисту рознь.
Получается больше 8 лет, в 21 первый раз устроился.
Правильно ли я понимаю, что что все cms имеют под собой базу в виде небольшого фреймворка?
>Что вернет toArray(), если его вызвать несколько раз подряд?
Ну все то же самое.
Вообще суть кода в том, что базовый класс создает статический массив с ИМЕНАМИ переменных в ДОЧЕРНЕМ классе. Так как у всех объектов одного класса имена переменных будут одинаковы.
А далее уже toArray() уже напрямую, без рефлексии, то есть, очень быстро обращается по этим именам к полям уже конкретного ОБЪЕКТА.
Как раз это и сделано затем, чтобы на каждый объект не дрочить рефлексию.
Допустим, когда у тебя массив из сотни таких объектов, рефлексия и поиск имен свойств будет выполнен 1 раз, а далее все последующие объекты будут преобразовываться в массив уже прямым обращениям по именам.
>Также, на практике, если ты делаешь JSON API, часто нужна не просто копия данных, а надо часть полей скрыть, часть полей преобразовать итд.
Если понадобится - перегружаешь метод и делаешь все что надо вручную.
Необязательно, кто-то на чистом пишет, особенно среди древних цмэсок, сейчас больше на фреймворках наверняка, да.
Тебе в /s.
>>42624
Я (автор ссылки на ideone) и не утверждал, что это баг. Более того, об этой особенности знал ещё пару лет назад, когда PHP7 только вышел. Проблема в том, что программист в больших проектах в 90% времени будет работать с кодом, который писал не он, а потому подобного рода проблемы сложно обнаружить, просто взглянув на код, часто приходится вооружаться отладчиком. Решил сообщить о такой особенности тайпхинтов в PHP для тех, кто не знал.
https://ideone.com/21EtbE
Задача:
W5.1. Школьник решил купить айфон и для этой цели взял кредит. Сумма кредита — 40000 р., банк в начале каждого месяца (включая первый) начисляет 3% от остатка долга за пользование кредитом и 1000 р. комиссии (да, а ты думал, обойдешься процентами?). После этого, в конце каждого месяца, наш герой идет в банк и пытается выплатить долг, но он не может заплатить более 5000 р за раз (сэкономленных на школьных завтраках). Вопрос, когда он избавится от долга? Во сколько школьнику обошелся айфон?
Ответ:
Всего будет выплачено около 61270 р. за 13 мес.
Проверь переменную $pr анон и всё будет
Ну ты же понимаешь, что ты с этим далеко не уедешь?
Это как учить раскладку дворак.
Вся хуйня на этой планете заточена под фотошоп, а у тебя видите ли работает медленно.
Ты не сможешь быть профессионалом не юзая фотошоп.
Двачую вопрос.
В кач-ве выхода наверное есть способ забиндить знак доллара на нажатие одной кнопки.
Мне кажется настоящий мидл понимает, что нужно писать, и не задает таких вопросов. Гугли вакансии, где требуются мидлы, и смотри, соответствуешь ли ты.
И это хуево, что нет аналогов, потому что фш с каждой версией становится тормознутее, а монополистическое фш-общество уже трудно будет отказаться от фш в пользу чего-то другого. Должно пройти поколение-другое, прежде чем от фш можно было отказаться как от стандарта в отрасти.
Изобретатель языка php не случайно ввел знак доллара в инструкцию декларации переменной. Каждый написанный знак доллара притягивает к пишущему деньги. Это псевдоним для священной фразы ГОЛОВА ДАЙ ДЕНЕГ.
А в теге <?php закодированы правила и пик, без которых эта фраза не работает. Сочетание этих символов складывается в особый бинарный код, который и генерирует эти правила и пик с ГОЛОВОЙ. Именно поэтому php код не работает вне этого тега.
ГОЛОВА ДАЙ ЖЕ МНЕ ДЕНЕГ
Вообще, знак доллара до PHP для переменных использовался в Perl и в оболочках вроде bash. Он используется перед переменными в Ruby, XSLT. В Pascal он обозначает 16-чные числа. В JS, Java он может быть частью имени переменной. В BASIC обозначает строковые переменные. В Fortran является частью управляющей директивы.
Ты свой код проверял? Я уверен, что не проверял. Зачем ты тогда так уверенно пишешь, что все правильно, если тебе намекают, что это не так? toArray() при каждом вызове будет возвращать массивы все большего размера.
Далее, я не уверен, что если отнаследовать от твоего класса несколько классов, то в них будут разные экземпляры $reflection и $propertyNames. Даже если так, это все равно получается переусложненный и запутанный код, в котором легко допустить ошибку при правке.
Протестируй свой код.
>toArray() при каждом вызове будет возвращать массивы все большего размера.
Черт, да ты прав, это действительно так. Да, я обосрался.
>не уверен, что если отнаследовать от твоего класса несколько классов, то в них будут разные экземпляры $reflection и $propertyNames.
Тот код несколько неверный, я уже переписал. Теперь там ни одного слова self, только static.
Вот окончательный вариант:
https://pastebin.com/sX5reRfW
Есть базовый контроллер, у него есть зависимости, которые указываются в конструкторе и подключаются через IoC.
Дочерние контроллеры тоже могут указывать свои зависимости в своих конструкторах и они тоже подключаются через IoC.
Но папкин конструктор-то они все равно должны вызывать! И все его зависимости тоже должны перечислять и передавать в базовый.
Так вот, проблема в том, что список этих зависимостей постоянно меняется по ходу разработки и поэтому меняются сигнатуры конструкторов ВСЕХ дочерних контроллеров.
Так вот, я придумал создать объект, содержащий все базовые зависимости контроллера, в который они будут передаваться, как вы уже поняли, через IoC.
А базовый контроллер будет принимать в конструктор себе только 1 этот объект и оттуда вытягивать все зависимости.
При изменении списка зависимостей я меняю только объект зависимостей, а сигнатуры дочерних контроллеров никогда не меняются при этом.
Так вот, вопрос в том, каким паттерном можно это описать? Вроде это не делегат.
Я уже давно не программист, настраивать окружение лень, поэтому обуздайте мое любопытство.
В C++ есть похожая хуйня, когда 2 объекта могут ссылаться друг на друга.
То есть, есть класс, там ссылка на объект, компилятор проходит по ссылке, а там ссылка на тот класс, из которого он пришел, но он еще не определен!
Но это там разруливается с помощью какой-то неведомой хуйни, так что да, можно и такое сделать.
Хули он делает?
Как ему сказать, чтоб открывал не текст, а скрипт?
Пробовал запускать и через хтмл тоже, нихуя, тупо весь код показывает.
Сам локалхост работает, показывает Apache2 Debian Default Page.
ЧЯДНТ?
Все сделал, спасибо.
И директорию свою выбрал для удобства, а то приходилось вечно ползать под админом в var/www/html.
php -v что говорит?
так чо вместо php все таки учить node.js ? Сам js знаю, но 7ая пыха говорят не уступает ноде по быстродействию и с асинхроностью проблем нет.
Если ты только начинаешь, то я бы на твоем месте ноду учил. У нее большое будущее.
Ну фактически с дивана, однако знакомый из компании-конкурента рассказывал, что какие-то проекты там стали на ноде пилить и с каждым финансовым годом это число увеличивается.
Просто дело в том, что проект для чайников, и эти чайники не в состоянии установить композер для дальнейшей разработки. Что же мне делать?
БД настроена, контакт есть. Скрипт выполняется, но данные в БД не приходят. Что за хуйня может быть? Я думаю что проблема возможна в:
A) В переменной $query проебался с синтаксисом или вообще хуйню написал
Б) В самой созданной БД проебался с настройкой таблы, возможно
P.S. Подключение к БД есть
И в первом и от втором случаях не могу сделать, чтоб первая и вторая строки были различными.
Можно было бы сделать еще три $rand для второй строки.
Но тогда код будет больше и будет повторяться. Стараюсь так не делать.
Во втором случае тупо ловлю ошибку.
В чем дело? Как это исправить?
>>43463
Включи выбрасывание ошибок через исключени и увидишь ошибку:
$pdo->setAttribute (\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
https://pastebin.com/HxiZ2U6T
По-дефолту ошибки не отображаются.
Двачую вопрос, есть нормально структурированные курсы начиная с типов данных, строках строковых операторах, массивах, итераторах итд. А не как написать хелоу ворд в html? Можно на инглише.
>>43617
SoloLearn или курс с ОП- поста. Не?
> У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не читайте, не сохраняйте, не запоминайте его, он временный).
Что нужно написать в PATH, чтобы не писать полностью путь php в командной строке?
D:\tmp\php - вот папка, где распакованы php компоненты
Бамп вопросу
Композер
Поясни за $this.
Можно его не использовать при выведении чего- либо через конструктор __construct(), так как появляется = при использовании текста.
Конкатенация и правда работает. А вот фигурные скобки - не всегда.
Наверно это от компилятора зависит, так как некоторые переваривают перенос строки через /n, а некоторые только <br/>.
Уже несколько лет так живу. Тянки говорят, что выгляжу норм. Но стараюсь делать всетаки зарядку каждый день - может это помогает. Хотя лысеть начал всетаки
Ты сгенерировал случайное слово 1 раз, положил его в переменную и вывел 2 раза одно и то же значение. Ты можешь хоть 10 раз его вывести, значение, положенное в переменную, само по себе не меняется.
Чем плох доллар? Никак не пойму той предьявы. Наоборот же удобно - сразу видишь что это переменная
Ну как тогда быть?
И чтобы не было:
> Можно было бы сделать еще три $rand для второй строки.
> Но тогда код будет больше и будет повторяться. Стараюсь так не делать.
Ящитаю, есть способ сделать это без копирования однообразных действий.
Какие то шаблонизаторы, верстка ебаная вообще охуеть
Ну охуеть теперь, может еще и двойные кавычки не использовать?
Добро пожаловать в высокоуровневое программирование.
Можешь и 2 недели абстракцию на абстракцию наворачивать, так ничего осязаемого и не написав.
Это задачки из учебника в ОП посте.
http://codedokode.github.io/phpbook в теме "Строки, хакеры и шифровки".
уже 3 дня учу js на русском сайте, не собираюсь останавливаться
только вот пугают долги по сессии и англицкий
ой, какой классный аниме-учебник)) я бы такой бумажный в каком-нибудь магазине купил
Композер падает от нехватки оперативки на вдс с гигом RAM.
Сука, ебаный пхп не может установить свое говно, как жить блять
Зачем тебе гайд? Регаешь свою функцию в spl-загрузчике, которая на вход берёт полное имя класса, с неймспесом. Ну и делаешь шо хочешь там.
Только ошибку не вызывай, если не нашёл класс - неположено, т.к. там могут быть и другие, а ошибку тебе сам пых покажет.
Если слушать всех советчиков, то ты для хелловорлда с десяток классов создашь, либу с гитхаба загрузишь и обязательно где-нибудь обосрёшься.
Давно уже такое заметил за сообществом кодеров.
Нормально, мировая практика.
Вот я тот, кто писал выше как композер падает от нехватки памяти.
Устанавливал пак локализации для фреймворка (без выбора языка, эта хуйня тупо грузит ВСЕ имеющиеся) и эта хуйня падает.
Пошел в исходники этой хуйни и выдрал 1 (ОДИН блять) файл на несколько килобайт, который вручную добавил и все заебись.
И на всё надо создать интерфейсы, как же мы без интерфейсов - не поймём же что куда втыкается! Нужны интерфейсы даже для обосрамса.
Я этот кун >>43463
Ошибка высветилась, подправил хуй знает как и куда нажал
Теперь другая ссанина вылетает, мать её.
Буду благодарен <3
красным ошибка
Хотя бы дайте пинка куда смотреть, потому что я сериоузли думаю что проебался в скрипте и имеет смысл удалить всё нахуй и попытаться переписать с нуля
Передаешь строку 'score' в столбец score, где тип smallint (не строковый нахуя тебе smallint в эпоху bigint, поехавший?)
Просто читай что написано в ошибке, также гугли по КОДУ ошибки. Тексты ошибок могут совпадать, но код всегда однозначно говорит о проблеме.
Ему не нравится тип данных, которые ты посылаешь - в 'score' используется smallint, а ты ему integer посылаешь. Либо тип в таблице меняй, либо то, что посылаешь.
Прочитай, что за тип smallint, и какие у него есть ограничения (и что значит число в скобках). Выведи число, которое ты пытаешься туда вставить, с помощью var_dump, и проверь, соответствует ли оно ограничениям. Также, если не понятно, покажи кусочек кода, возможно, найдется эксперт по теме работы с БД.
У меня ощущение, что ты туда строку пытаешься вставить.
Какой смысл удалить? Ты от этого знаний не получишь. Чтобы получить знания, надо понять причину ошибки, и больше ее не делать.
>>44257
Памяти мало наверно. Ну или баг, что тоже возможно, который стоит тогда зарепортить, а лучше разобраться и исправить.
>>44251
Преувеличение. Наоборот, не понимаю, в чем удовольствие писать то, что уже кем-то написано. Много времени лишнего? И сторонняя библиотека скорее всего будет содержать тесты, документацию, ее будут поддерживать, а у твоей самоделки всего этого скорее всего не будет. Вот радости-то, разбирать чей-то кривой велосипед без комментариев и документации.
Возможно, ты делал только небольшие скрипты и не понимаешь плюсов, или же ты не прочел документацию композера (читал?), не разобрался в нем, и из-за этого им недоволен.
>>43765
Есть: https://github.com/codedokode/pasta/blob/master/php/autoload.md
По моему опыту, 700 Мб обычно хватает. У тебя случайно сервер не на технологии OpenVZ, который потребление памяти умножает на два? Если не так, то попробуй взять более старую версию композера, отключить xdebug.
Кстати, если есть желающие с головой погрузиться в композер и понять, что ему мешает потреблять меньше памяти, можем этим заняться, я помогу советами и идеями.
>>43872
Если ты не знаешь шаблонизаторы, то писать "реальный" код тебе еще рано. Только какие-то учебные простые примеры. Кстати, простым языком шаблоны описаны в моей статье: https://github.com/codedokode/pasta/blob/master/php/templates.md
Программирование - это не работа в макдональдсе, где достаточно посмотреть на других и делать так же.
>>43959
Это только если ты изучаешь эти абстракции. На практике, злоупотреблять ими не стоит, а стоит писать простой, понятный другим код.
>>43849
Поместить выбор случайного слова внутрь тела цикла. Третья строка делается по другому шаблону и её в цикл поместить не выйдет.
Или же, как описано в подсказках к задаче, сделать массив, где каждый элемент содержит варианты слов, которые могут быть в этом месте, пройтись по нему циклом и сгенерировать стих.
Не \n, а <br>. \n это перенос строки, но если ты вываливаешь вывод скрипта в браузер, то он интерпретирует вывод как HTML, а в HTMl перенос строки равносилен пробелу.
Выход - либо использовать br, либо указать в заголовке Content-Type тип содержимого text/plain.
Версия интерпретатора тут не при чем. Интерпретатор вообще никак не трогает выводимый текст и ничего в нем не заменяет.
>>43802
У тебя неправильный код. Ты должен писать команду присваивания
$this->name = $name;
как отдельную команду, а не внутри строки.
Использовать this ты не обязан, но судя по вопросу, ты просто не понимаешь, что это такое и зачем нужно. Можешь открыть и почитать главу про ООП в учебнике из ОП-поста или любом другом учебнике.
Нет, ты включаешь игнорирование папки vendoк гитом файле .gitignore и и сохраяешь в репозиторий только composer.json + compoder.lock. Тот, кто скачает твой код, установит заисимости композером.
>>43412
Сделай инсталлятор или оболочку, не знаю.
>>43301
Если require то будет вечный цикл, и PHP упадет. Если require_once, то все ок.
Неправильно усложнять код из-за того, что ты его правишь. Используй опции рефакторинга в IDE или поиск/замену по файлам.
320x180, 0:03
Раньше думал бесполезное говно, но как узнал, что трейты могут определять абстрактные методы, устанавливая требования к родительскому классу - все резко изменилось.
Причем 2 разных трейта могут определять одинаковый абстрактный метод и базовый класс, использующий 2 таких трейта будет работать, эти методы как бы наложаться друг на друга (а одинаковые переменные разные трейты определять не могут).
Раньше страдал от такой хуйни, как большие контроллеры и всякие "базовые" классы для других классов, это говно могло разрастаться до 1000 строк.
Теперь я выношу связанные компоненты по трейтам и сам класс содержит только методы логики, а не свистоперделки и хелперы.
Заебись.
А еще фишка трейта в том, что он ни от чего не зависит, ну то есть вообще от нихуя. Любой трейт ты можешь тут же выдрать из любого проекта и всунуть в любой другой. И если класс определяет абстрактные методы трейта, все будет работать.
Прям аж охуел с пхп, жалко в других языках нет трейтов.
В общем вчера я решил упростить себе задачу, дабы разобраться. С отправкой форм. И ограничился пока только текстовыми полями.
Также переименовал названия в таблице, ибо были какие-то эроры связанные с отправкой формы из NAME и Second-name.
Теперь мой код выглядит таким образом. Однако данные из форм по-прежнему не отправляются в бд. Из-за этого:
Invalid parameter number: number of bound variables does not match number of tokens
Все колонки я уже проверил.
Почему решил переписать код? Потому что вчера я решил трайнуть в ту самую неблагополучную колонку 'score' отправить текстовые данные. Однако в итоге в БД пришли только названия колонок.
Код конечно сейчас приятнее выглядит, но какой с этого толк, если он не работает?
Заранее благодарен.
>number of bound variables does not match number of tokens
Ебаный ты аутист, ты начнешь когда-нибудь читать что тебе пишут в текстах ошибок?
Число переменных не совпадает с числом плейсхолдеров.
Олсо, полагаю что при назначении параметров надо их тоже с двоеточием указывать.
Да и вообще используй вопросики и и не еби мозг. ? ? ? ? ?.
да я прочитал бля, только число переменных 5, в бд их тоже 5, как и в хтмл коде 5. Я убрал нахуй двоеточия и эта ебатека исчезла, теперь мне в бд приходят ПРОСТО МАТЬ ИХ ПУСТЫЕ ЗНАЧЕНИЯ БЛЯТЬ
Откроем мануал: http://php.net/manual/ru/pdostatement.execute.php
> Запускает подготовленный запрос
> input_parameters
> Массив значений, содержащий столько элементов, сколько параметров заявлено в SQL-запросе
Ты должен вызывать execute 1 раз, но с полным массивом параметров. Если ты хочешь добавлять параметры по одному, то используй bindvalue на объекте PDOStatement: http://php.net/manual/ru/pdostatement.bindvalue.php
Это не страшно, что ты делаешь тут ошибки, но начинай всегда с чтения официального мануала по используемой функции и может быть, в следующий раз, ты это ошиюку не совершишь.
Также, try/catch писать не нужно. Если у тебя включен display_errors = 1,то PHP сам поймает и выведет это исключение (если не включен - запишет в лог (журнал) ошибок).
>>44447
Надо быть культурнее.
О, спасибо за конструктивный ответ! Буду исправляться.
Давай я еще научу тебя, как защититься от вставки в базу совсем неправильных значений, вроде пустых полей.
Во-первых, если ты укажешь для колонки NOT NULL, это потребует обязательно указывать ее значение при вставке. У тебя это сделано. Но если ты не включил "строгий" режим в MySQL, то MySQL по доброте душевной все равно разрешает не заполнять поля и подставляет для них сама пустые значения. Потому стоит включить "строгий" режим в MySQL.
- Официальный мануал про то, как его включить (англ, сложный): https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-strict
- Статья: https://dev-tips.ru/blog/post/ustanovka-strict-mode-dlya-mysql
Это можно сделать либо в конфиге my.ini, либо в твоем коде, сделав запрос SET SESSION sql_mode = ...
Проверить текущий режим можно, сделав запрос SELECT @@sql_mode.
Если ты используешь новейшую версию MySQL (8 и выше), то скорее всего он уже включен по умолчанию.
Во-вторых, при создании таблицы ты можешь указать выражение, которому должно соответствовать вставляемое значение. Это делается опцией CHECK в запросе CREATE TABLE. Например, ты можешь указать. что значение колонки должно быть от 10 до 20:
CREATE TABLE t1 (age INT CHECK age BETWEEN 10 AND 20)
или, что длина поля должна быть не менее 3 символов:
CREATE TABLE t1 (name VARCHAR(100) CHECK LENGTH(name) >=3)
Эта опция работает только начиная с MySQL 8.0.16 (эта версия пока не выложена для Windows). Также, она работает в других СУБД вроде Postgres. Если ты создаешь таблицы не SQL-запросом, а через программы вроде phpmyadmin, то там может не быть такой возможности, а может, кстати и быть. Если ее нет, то ты можешь добавить ограничение после создания таблицы запросом ALTER TABLE.
Оф. мануал на англ: https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html
Я бы советовал писать такие ограничения, так как они защищают тебя от ошибок.
Давай я еще научу тебя, как защититься от вставки в базу совсем неправильных значений, вроде пустых полей.
Во-первых, если ты укажешь для колонки NOT NULL, это потребует обязательно указывать ее значение при вставке. У тебя это сделано. Но если ты не включил "строгий" режим в MySQL, то MySQL по доброте душевной все равно разрешает не заполнять поля и подставляет для них сама пустые значения. Потому стоит включить "строгий" режим в MySQL.
- Официальный мануал про то, как его включить (англ, сложный): https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-strict
- Статья: https://dev-tips.ru/blog/post/ustanovka-strict-mode-dlya-mysql
Это можно сделать либо в конфиге my.ini, либо в твоем коде, сделав запрос SET SESSION sql_mode = ...
Проверить текущий режим можно, сделав запрос SELECT @@sql_mode.
Если ты используешь новейшую версию MySQL (8 и выше), то скорее всего он уже включен по умолчанию.
Во-вторых, при создании таблицы ты можешь указать выражение, которому должно соответствовать вставляемое значение. Это делается опцией CHECK в запросе CREATE TABLE. Например, ты можешь указать. что значение колонки должно быть от 10 до 20:
CREATE TABLE t1 (age INT CHECK age BETWEEN 10 AND 20)
или, что длина поля должна быть не менее 3 символов:
CREATE TABLE t1 (name VARCHAR(100) CHECK LENGTH(name) >=3)
Эта опция работает только начиная с MySQL 8.0.16 (эта версия пока не выложена для Windows). Также, она работает в других СУБД вроде Postgres. Если ты создаешь таблицы не SQL-запросом, а через программы вроде phpmyadmin, то там может не быть такой возможности, а может, кстати и быть. Если ее нет, то ты можешь добавить ограничение после создания таблицы запросом ALTER TABLE.
Оф. мануал на англ: https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html
Я бы советовал писать такие ограничения, так как они защищают тебя от ошибок.
Ну то есть как обычно бывает. Есть id, есть какой-нибудь user_id, который указывает на таблицу юзеров.
А если у меня там что-то типа
id, type, table_id?
И в зависимости от type table_id может указывать на значения в разных таблицах.
Как это грамотнее сделать?
Не храни пароли в открытом виде! Используй соленый хеш, как описано тут: https://github.com/codedokode/pasta/blob/master/security/password-hashing.md
Также, в HTML значения атрибутов лучше писать в кавычках и без пробелов после знака равно.
Если ты делаешь задачу про студентов, то обязательно позже прочти все комментарии к ней.
>>44413
Есть и минусы. У трейтов нет конструкторов, и они не могут делать инициализацию, использовать какой-то DI (разве что через абстрактные методы).
А так да, трейты могут быть полезны, если их использовать по назначению.
Но, на мой взгляд, не стоит использовать трейт там, где подойдет отдельный класс-сервис.
Большие базовые классы могут говорить о нарушении принципа разделения ответственности, что ты пытаешься всё в один класс запихнуть.
>>43044
Так же, как раньше: конвертировать в JSON и встраивать прямо в страницу в тело скрипта.
Лучше всего для каждой таблицы делать свое поле. Так как иначе ты не сможешь сделать внешние ключи, а без них база данных превращается в свалку.
В общем случае твоя проблема напоминает проблему "наследования" таблиц, для которой есть 3 паттерна: https://www.google.com/search?q=паттерны+наследования+таблиц&gbv=1&sei=D8JeXM2EC6LmmwX63L7wBg
Ну хуй знает, даже не думал об этом в контексте наследования.
https://stackoverflow.com/questions/441001/possible-to-do-a-mysql-foreign-key-to-one-of-two-possible-tables
Тут говорят, что это полиморфные ассоциации.
>Лучше всего для каждой таблицы делать свое поле.
Об этом тоже думал.
id, facebook_id, vk_id, twitter_id.
Только вот таблица должна содержать только ОДНО из этих возможных значений, или facebook_id, или vk_id, или twitter_id, но не все сразу и даже не 2, а только одно.
А это нельзя гарантировать на уровне sql.
В твоем случае проще всего сделать общую таблицу social_networks и ссылаться на нее. А не по таблице на каждую соцсеть.
Дело в том, что у каждой соц-сети свои уникальные столбцы и вообще разное их количество, эти таблицы не одинаковы.
То есть, есть такие таблицы:
users,
vk,
twitter,
user_social_networks
И user_social_networks будет содержать ключи на 3 другие таблицы:
id, facebook_id, vk_id, twitter_id.
По логике программы юзер может иметь несколько акаунтов в любых соц-сетях.
И user_social_networks должна хранить ссылки на акки юзера.
Но по идее, в одной строке этой таблицы не должно быть установлено больше одного столбца из списка соц-сетей, а остальные должны быть null.
То есть, 1 строка хранит ссылку только на 1 соц-сеть.
Но это нельзя гарантировать с точки зрения mysql.
Вроде в последних версиях можно сделать это для конкретного случая двух таблиц, но для большего количества нельзя.
В качестве плюсов - простая и очевидная структура БД.
Из минусов - нет идеального наложения на реляционную природу субд.
В целом, даже если по какой-то причине в базе окажется строка, где одновременно будут заданы 2 соц-сети и более - ничего страшного не случится. Небольшая цена за удобство.
А, ну еще забыл сказать, что структура вида id, facebook_id, vk_id, twitter_id все же имеет нормальные реляционные ключи на другие таблицы и к ней может применяться каскадное удаление/изменение.
В отличие от id, social_network_type, social_network_id
Начиная с версии 8.0.16 это можно гарантировать, добавив на таблицу ограничение CHECK. https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html
Оно же есть в Postgres и других системах.
Тоже вкатываюсь в PHP. Задачки из оп-поста успешно решаю, но вот затух на установке mbstring и чет не догоняю, что делать.
Пробовал ковыряться в php.ini, но результат на пике.
Киньте плиз ссылку на мануал или подскажите, если все не так сложно.
Устанавливай виртуалку с debian, устанавливай туда нормально пхп и все что угодно.
Вот это и имел ввиду.
Но как там сделать проверку на 3+ столбца?
Только на 2 можно.
CHECK (col1 NOT NULL XOR col2 NOT NULL)
Можно ли дописать XOR col3 XOR col4...?
Допустим, у нас есть два файла:
data.php
<?php
$a = 1;
?>
и index.php
<?php
function b()
{
require_once('data.php');
echo $a;
}
?>
При запуске index.php получим ошибку "Notice: Undefined variable: a".
Мне нужно без правок в файле data.php, работать с его данными из функции b файла index.php. При этом изменять количество входных параметров функции тоже нельзя.
То есть, запускаем функцию и она уже внутри должна подключить файл и считать из него переменную. Но не считывает. Как это пофиксить?
Ну банально присвоить 1 если поле заполнено, и 0 если нет (x IS NULL), сложить и проверить что сумма равна 1.
>>44553
У тебя в php.ini прописана директива для загрузки расширения mbstring, но PHP не смог найти файл (dll) с ним. Либо ты неверно указал папку, либо ты не скачал это расширение. Он тебе даже пишет, где он пытался искать файл.
Мануал http://php.net/manual/ru/install.pecl.windows.php
mbstring, если не путаю, идет под Windows в комплекте с PHP, так что скорее всего ты неверно указал папку. Зайди туда и глазами найди нужный файл.
Спрашивай, если непонятно.
require_once выполняет файл только первый раз, как следует из ее названия. Тебе нужен require.
Спасибо.
Однако, мистика. Попробовал require - получилось. Попробовал снова require_once - снова получилось. никаких ошибок. А раньше были.
>Наоборот, не понимаю, в чем удовольствие писать то, что уже кем-то написано
Собственно вот тебе ответ >>44257
В посте явно видно, что иногда лучше самому навелосипедить по-минималке, чем тащить толстые либы от неизвестного Васяна с неизвестным исходом.
>Возможно
А ещё не надо фантазировать надо моими постами. Возможно ты умственны инвалид, у которого проблемы с пальцами и ты не можешь сам написать ничего.
Вообще, какой смысл разбираться в технологиях, если потом только чужие либы юзать?
А я неделю от веба отдохнуть решил, продолжая изучать основное направление.
Хм. После перезагрузки компа, пхпшторм подчёркивает $a и предупреждает, что она "Undefined variable", но в браузере всё отрабатывает без ошибок и нотисов. Прогуглил всё, что смог придумать для поискового запроса, нигде не пишут, что в функции require и require_once работают как-то по другому. Вот теперь думаю, можно в таком виде отправлять, или нет. то ли это просто пхпшторм не видит переменной в подключённом файле и можно забить, то ли это грубая ошибка на видимость переменных и её допускать нельзя.
$_list передается в метод по значению.
Вроде все идеально. value передано по ссылке.
В итоге массив не изменяется блять.
Как так?
Отбой тревоги, дело оказалось в реализации ->toArray() в объектах EntityEnterface.
Короче если у EntityEnterface в качестве члена другой EntityEnterface, то он не конвертился в массив, а прямо передавался.
Сделал рекурсивно, теперь заебись.
Рекурсия в рекурсии, кажется я познал дзен программирования.
во втором случае у тебя бессмыслица, ты по чему сортировать собрался? сортировать по колонке можно, там байнд не нужен, когда ты байнд делаешь у тебя вместо колонки строка обычная подставляется, и это перестает быть колонкой
Есть форма авторизации, есть бд с логинами и паролями. Пароли которой хэшируются по принципу:
$hash = password_hash($password, PASSWORD_DEFAULT);
В бд приходят пароли в виде $2y$.....
Загвостка в том, что при авторизации приходит в бд совершенно другой хеш пароля. Соответственно один и тот же парольчто вносится в базу при регистрации, и который вводится при авторизации имеют различный хэш.
Как это решается?
Для проверки надо не колхозить свою функцию, а использовать http://php.net/manual/ru/function.password-verify.php
Хеш разный каждый раз, так как там перед хешированием генерируется случайная соль.
1)есть форма для информации и файл куда сбрасываются значения
2)далее страница обновляется и отображаются значения из файла
проблема в том что после обновления странички, показывается старая версия файла, т.е до ввода информации(если глянуть в файл, то в нем все корректно записалось), после повторного обновления странички показываются уже корректные данные.
код не скидываю т.к он норм все отрабатывает
куда копать?
>куда копать?
Как там файл открыт, с каким флагом?
Читается как, до записи или после?
Ну ты понел...
как всегда нашел ошибку после того как написал в тред, не совсем понял почему так призошло, но хотелось бы услышать мнение от более опытных людей, если их это говно заинтересует
Я вообще ничего до этого время не слышал про это дерьмо и генераторы.
Пиздец блять.
Есть что-то еще, о чем мне стоит знать?
и форматирование и структура и общая гармония.
я когда редактор ставлю, то два часа настриваю цветовую схему и подстветку кода, чтобы приятно было смотреть на код
И что? Ты это высрал, чтобы выебанутся тут?
>Есть что-то еще, о чем мне стоит знать?
Да есть - ты хуёвый программист, раз не обращаешь внимание на развитие твоей платформы, ну и сам не развиваешься значит. Добро пожаловать в стагнацию, говнокодер.
Т.е. при отсутствие кук и сессии-доступ к этому url закрыть. Как это правильно реализовать?
забей, во современных фреймворках это делается в одну строчку при создании нового роута
ну подскажи в каких фреймворках, и с какой строчкой :)
Я совсем недавно начал заниматься пхп, мало понимаю.
создаешь файл пхп где происходит проверка сессий, если не прошло выкидывает через хедер на страничку авторизации, и подключаешь файл через реквайр куда тебе надо
Я лично это прописал в роутере т.е. если человек, который заходит на сайт, не имеет сессии, он всегда попадает в разрешенные ему каталоги даже не получая доступ к контроллеру этого адреса. Либо можно сделать как написал этот анон >>46416 , но его способ у меня лично вызвал небольшую жопную боль и раздувание кода (если я правильно понял о чем он)
В нормальных IDE сложнее блокнота всегда есть автоформатирование по нажатию комбинации клавиш.
1 раз настроил и далее твой код всегда идеально отформатирован.
Я даже так и пишу зачастую, ибо так быстрее.
Например, пишу что-нибудь в духе if (1===2){return true;}
прям вот так в строку, похуй, так быстро.
Затем нажимаю crtr+shift+f и все, код нормально форматируется.
Сейчас еще пришел к такой хуйне, что не пишу полностью названия переменных и функций, даже знак доллара иногда не пишу, все ide подсказывает.
Короче, IDE - очень важный инструмент, который предохраняет от ошибок путем статического анализа и экономит тонны твоего времени благодаря продвинутому автокомплиту и автоформатированию.
Если ты опытный, то отвечай на мой ответ:
у меня в шаблоне вывод ошибок валидации сделан через подстановку массива $errors[%fieldname%], ну тупо так, по-колхозному. И если ошибок нет, то у меня нотисы вываливаются на несуществующее смещение в массиве.
Мне кажется, что городить if-else конструкции в шаблоне ниочень идея. Как вариант - заполнять пустыми строками эти ключи, но тоже несколько велосипедно сие.
Что делают синьоры-помидоры в таких случаях?
В шаблонизаторе должна быть функция показа ошибок, что-то вроде showErrors().
Она должна быть реализована на верхнем уровне кода по отношению к шаблону.
А уж далее в ней обходишь массив ошибок и выводишь как хочешь.
Плюс если что можешь изменить формат вывода в одном месте.
Если у тебя не самописный шаблонизатор, то там такое уже есть, если нет - стоит написать.
>>46503
Ну вот, например: https://laravel.com/docs/5.7/validation#quick-displaying-the-validation-errors
Короче, не обращайся к ошибкам по строковым ключам, код показа ошибок не должен париться о том, сколько их, какие из них существуют, как называются и т.п.
Этого можно достичь помещая ошибки в массив, а далее обходя его в цикле.
Этот код обхода в цикле может быть как в самом шаблоне, так и в функции высшего порядка, смотря как сделаешь
Писать шаблонизатор - не вариант. По условию ОПа надо на чистом PHP выводить, как я понял. А на чистом - там надо городить проверку на каждое поле ввода, или обязательно заполнять по ключу. Или отключать вывод ошибок и срать в логи сотнями.
Можно ещё класс написать, чтобы обрабатывал эти запросы по несуществующему ключу, но я тяжелыми наркотиками не балуюсь.
Не понимаю как выкрутиться.
>Короче, не обращайся к ошибкам по строковым ключам, код показа ошибок не должен париться о том, сколько их, какие из них существуют, как называются и т.п.
>Этого можно достичь помещая ошибки в массив, а далее обходя его в цикле.
Но тогда у меня ошибки будут выводиться в кучу, а по проекту надо под полем ввода, где непрошла валидация.
Хотя способо через цикл годный, хоть что-то. Если не придумаю лучше за вечер, то им и сделаю.
Посмотрел пока исходник redbeanphp, не нашел там нужного.
Не нужно бессмысленно городить методы. Нужно либо продумать, что именно нужно, либо посмотреть на другие библиотеки.
Также, может быть тебе поможет статья про паттерны работы с БД: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
Можно убрать хранение лишних данных (токен доступа к группе) из сессии.
>>46493
Тебе еще и экранировать данные придется при выводе. Можно либо if/else, либо заполнять все ключи. Либо сделать функцию, внутри которой будет if и которую можно вызывать. На практике обычно используют какую-то библиотеку для форм (Symfony Forms например), и она предоставляет вывод ошибки/ошибок одной строчкой вроде такой:
{{ form_errors(form.email) }}
Это с использованием шаблонизатора твиг. Без него можно так:
<?= showErrors($errors, 'email') ?>
В задаче про студентов и других задачах можно использовать шаблонизатор, если ты наизусть выучил урок про XSS и способен разобраться в шаблонизаторе.
>>46510
Такого условия нет, если я не путаю. Нотисов в коде не должно быть, они считаются ошибкой разработчика.
>Тебе еще и экранировать данные придется при выводе
Надо ли? Если разработчик в строку ошибки вставляет теги, когда есть шаблон и там вывод оформлен, то земля ему пухом, братишке. Разве нет?
Но с функцией тоже интересный вариант. У меня есть уже одна - для сборки УРЛа с параметрами, значит и вторая туда же пойдёт.
Их значит уже 2 + метод рендера(в контроллере) + заголовков ХТМЛ можно выделить место. Значит мне писать отдельно класс Представления, как я понимаю? А то у меня простое подключение шаблонов.
Вроде же простое приложение, а целый фреймворк городить надо.
Не подозревал, что русский есть, он дописан хоть? На английском и так все понятно же и родные названия все.
А, ну тогда через функцию вида getError ("name").
Внутри проверяй, есть ли ошибка для этого поля и если есть - возвращай.
Можешь сократить в шаблоне:
e("name");
Чувак, ты почти точно делаешь бесполезное говно.
Если в твоей ORM не будет таких вещей, как many-to-many отношения и полиморфные отношения - она является просто обёрткой над SQL.
мне кажется ты тролль и пососать мне не удастся (
Смысла у тебя БД тогда немного. В БД хранят данные, чтобы можно было быстро делать выборки по индексам, джойнить, анализировать и прочее. Если у тебя весь объект хранится как строка, то никаких операций кроме выгрузки-загрузки невозможно. Еще и будет медленнее все, если таких объектов через serialize много грузить.
Да serialize тут не к чему, ты прав.
Вопрос снимается и тут же новый появляется.
Есть ли какой-то встроенный способ для передачи объекта в таблицу бд? Ведь можно получить готовые объекты из таблицы прописав $request->fetchAll(\PDO::FETCH_CLASS, User::class);
Имеем входные данные - это csv файлик - все выводы я сделал, но нужно сделать realated-вывод записей
То есть смотрите, такие столбцы:
тайтл|картиночка|текстовка|категория|теги через запятую
title|image_url|text|Яблоки|продукты, фрукты, еда
title|image_url|text|Яблоки|продукты, фрукты, еда
title|image_url|text|Яблоки|продукты, фрукты, еда
title|image_url|text|Апельсины|продукты, фрукты, еда
title|image_url|text|Груши|продукты, фрукты, еда
Все-все-все строки берутся и складываются в большущий массив $key[]. А значения из каждой строки на каждой конкретной веб-странице (то есть строчке) выбираю через
$mkey = $key;
$mkeyarr = explode("|", $mkey);
И дальше у меня на каждую строчку уже свой массив идет:
$mkey0 = $mkeyarr[0];//title
$mkey1 = $mkeyarr[1];//image_url
$mkey2 = $mkeyarr[2];//text
$mkey3 = $mkeyarr[3];//cats
$mkey4 = $mkeyarr[4];//tags через запятую
Я путаюсь в массивах, помогите с двумя задачами:
1. Вывести массив записей той же категории, что и текучая
2. Вывести массивы тех же тегов, что и совпадают с текущим
Имеем входные данные - это csv файлик - все выводы я сделал, но нужно сделать realated-вывод записей
То есть смотрите, такие столбцы:
тайтл|картиночка|текстовка|категория|теги через запятую
title|image_url|text|Яблоки|продукты, фрукты, еда
title|image_url|text|Яблоки|продукты, фрукты, еда
title|image_url|text|Яблоки|продукты, фрукты, еда
title|image_url|text|Апельсины|продукты, фрукты, еда
title|image_url|text|Груши|продукты, фрукты, еда
Все-все-все строки берутся и складываются в большущий массив $key[]. А значения из каждой строки на каждой конкретной веб-странице (то есть строчке) выбираю через
$mkey = $key;
$mkeyarr = explode("|", $mkey);
И дальше у меня на каждую строчку уже свой массив идет:
$mkey0 = $mkeyarr[0];//title
$mkey1 = $mkeyarr[1];//image_url
$mkey2 = $mkeyarr[2];//text
$mkey3 = $mkeyarr[3];//cats
$mkey4 = $mkeyarr[4];//tags через запятую
Я путаюсь в массивах, помогите с двумя задачами:
1. Вывести массив записей той же категории, что и текучая
2. Вывести массивы тех же тегов, что и совпадают с текущим
>Я путаюсь в массивах, помогите с двумя задачами:
>1. Вывести массив записей той же категории, что и текучая
>2. Вывести массивы тех же тегов, что и совпадают с текущим
Почему ты не хочешь загружать csv в БД и уже оттуда доставать как тебе надо одной строкой? Зачем колесо изобретать?
Ну а вообще это легко делается через foreach. Или через array_filter\walk какой-нибудь.
Проходим по всему массиву и сохраняем в результирующий массив те, где совпадает что тебе там надо. Одной функцией наверное даже можно.
Но лучше БД.
задание на ждуна, я даже не понял какую консоль они имеют ввиду
Ебанутенько.
Збс. Неужели пыха наконец-то начинает признаваться не только как язык для сайтоклепства
Командная строка или консоль:
https://github.com/codedokode/pasta/blob/master/soft/cli.md
https://beginpc.ru/windows/komandnaya-stroka
Если ты не понял, то значит, надо учиться.
serialize() имеет недостаток, что его формат не определен и не гарантируется его сохранение между версиями PHP. Также, другие программы не смогут читать эти данные. Если тебе надо что-то сериализовать в БД, лучше использовать JSON.
Если вдруг ты принимаешь данные от пользователя и десериализуешь их - это уязвимость. Используй JSON в таких случаях.
> Надо ли? Если разработчик в строку ошибки вставляет теги, когда есть шаблон и там вывод оформлен, то земля ему пухом, братишке. Разве нет?
При таком подходе, чтобы проверить, что все безопасно, тебе надо для каждого шаблона разбираться, откуда пришли данные в него, что они содержат, анализировать код. Более того, возможно, что сейчас код безопасный, но завтра ты при валидации добавишь в текст ошибки значение от пользователя и возникнет уязвимость. И ты её даже не заметишь.
100% безопасный вариант: все экранируется в шаблоне.
Небезопасный вариант:
- получаем данные из функции X, держа в голове что они должны быть безопасными
- передаем в шаблон
- выводим без экранирования
Тут, чтобы проверить, что все безопасно, надо изучить весь код. включая функцию X и откуда в нее приходят данные. Более того, другой программист может модифицировать функцию X, сделав так, что она перестанет быть безопасной. Он ведь не знает, что эти данные потом выводятся без экранирования.
Можно сделать вспомогательный класс со статическими методами, например. Можно сделать класс для View и поместить методы туда, но при росте приложения это не очень удобно, так как все будут туда добавлять методы и он разрастется.
Писать крестики-нолики на PHP это как клепать сайты на C. А требовать такое от джунов - это слабоумие.
базовый класс активной записи это базовый класс модели, от которого наследуются конкретные классы активных записей - конкретные классы модели (типа Отзыв или Продукт).
Я все правильно описал?
Не совсем то, у тебя от сложного к простому, а крестики нолики это от простого к сложному.
В чем проблема-то?
Спасибо большое, запишу. А помимо этого? Какие-нибудь каналы на ютубе или статьи еще, книги
Да никому в здравом в голову не придёт писать крестики-нолики на PHP, когда есть более удобные для этого ЯП.
Вообще, в норме людям такие тестовые давать, которые макс приближены к тому, чем они там в конторе занимаются. По крайней мере станет видно умеет человек нормально в разработку веб или нет.
А вот такое - бред сивой кобылы. Что этот тест покажет? Ни знания фреймворков, ни паттернов(разве что из геймдева лол), ну и тд. Придёт это ждун и будет им там крестики-нолики писать вместо продукта.
Как-то тоже об этом задумывался - неявные штуки получаются.
>>47385
>сделать класс для View и поместить методы туда, но при росте приложения это не очень удобно, так как все будут туда добавлять методы и он разрастется
Я просто хочу убрать туда методы работы с шаблоном, которые часто в нём используются. Ну, типа, базовые, вроде вывода ошибок где надо, отрисовка, сборка урл с параметрами, шаблонизатор прикрутить туда же можно, если надо. Это ведь много где используется и из можно по-умолчанию при рендере передавать, чтобы в любом шаблоне доступно было.
Или как?
>Можно сделать вспомогательный класс со статическими методами, например
А этот класс не будет разрастаться, если всё подряд туда сливать? Это же получится просто свалка разнородных функций, которые делают совершенно разные вещи.
Близкую к реальности задачу быстро не сделать. Так как на практике там идет работа с большим приложением, с фреймворком, библиотеками, интеграциями, в котором только разбираться можно несколько дней.
Потому и приходится выдумывать задачи, которые не потребуют много времени, но позволяют оценить стиль программиста и вообще способность писать код. Задача про крестики-нолики примитивная и решается быстро.
Кстати, раз уж речь о задачах - кто хочет поломать голову?
Задача. Напишите функцию, находящую различия между двумя массивами строк аналогично утилите diff.
На вход подается 2 массива строк, left и right. Функция должна определить различия между ними и дать на выходе массив элементов, где для каждой строки указано: присутствует ли она в обоих массивах, или только в каком-то одном. При этом массив на выходе должен сохранять порядок строк и позволить восстановить оба исходных массива.
Массив на выходе имеет вид [ [признак, строка], [признак, строка], ... ] где признак - это "", если строка есть в обоих входных массивах, "-", если она есть только в left или "+", если она есть только в right.
Пример: left = ['abc', 'def', 'ghi']; right = ['abc', 'ghi', 'xyz'];
Результат:
[
['', 'abc'],
['-', 'def'],
['', 'ghi'],
['+', 'xyz']
]
По возможности, если это не требует больших вычислительных затрат, стоит выбирать более короткое представление результата. Например, для left = [a, b, c, d] и right = [a, x, y, b, c, d] стоит выбрать форму:
a
+x
+y
b
c
d
А не более длинную:
a
-b
+x
-c
+y
-d
+b
+c
+d
Описание утилиты diff: https://ru.wikipedia.org/wiki/Diff
Алгоритм LCS: https://ru.wikipedia.org/wiki/Наибольшая_общая_подпоследовательность
Если вы просматриваете результат работы программы в браузере, то стоит сделать еще визуализацию результата, например, вроде такой: https://www.tecmint.com/wp-content/uploads/2016/07/DiffMerge-Compare-Files-in-Linux.png
Близкую к реальности задачу быстро не сделать. Так как на практике там идет работа с большим приложением, с фреймворком, библиотеками, интеграциями, в котором только разбираться можно несколько дней.
Потому и приходится выдумывать задачи, которые не потребуют много времени, но позволяют оценить стиль программиста и вообще способность писать код. Задача про крестики-нолики примитивная и решается быстро.
Кстати, раз уж речь о задачах - кто хочет поломать голову?
Задача. Напишите функцию, находящую различия между двумя массивами строк аналогично утилите diff.
На вход подается 2 массива строк, left и right. Функция должна определить различия между ними и дать на выходе массив элементов, где для каждой строки указано: присутствует ли она в обоих массивах, или только в каком-то одном. При этом массив на выходе должен сохранять порядок строк и позволить восстановить оба исходных массива.
Массив на выходе имеет вид [ [признак, строка], [признак, строка], ... ] где признак - это "", если строка есть в обоих входных массивах, "-", если она есть только в left или "+", если она есть только в right.
Пример: left = ['abc', 'def', 'ghi']; right = ['abc', 'ghi', 'xyz'];
Результат:
[
['', 'abc'],
['-', 'def'],
['', 'ghi'],
['+', 'xyz']
]
По возможности, если это не требует больших вычислительных затрат, стоит выбирать более короткое представление результата. Например, для left = [a, b, c, d] и right = [a, x, y, b, c, d] стоит выбрать форму:
a
+x
+y
b
c
d
А не более длинную:
a
-b
+x
-c
+y
-d
+b
+c
+d
Описание утилиты diff: https://ru.wikipedia.org/wiki/Diff
Алгоритм LCS: https://ru.wikipedia.org/wiki/Наибольшая_общая_подпоследовательность
Если вы просматриваете результат работы программы в браузере, то стоит сделать еще визуализацию результата, например, вроде такой: https://www.tecmint.com/wp-content/uploads/2016/07/DiffMerge-Compare-Files-in-Linux.png
>Кстати, раз уж речь о задачах - кто хочет поломать голову?
У нас тут вроде прикладное программирование, а не школа информатики, где детки дрочат алгоритмы.
Я лучше очередной класс напишу для своего проекта, чем на это полвечера убью безрезультатно.
Я немного знаю пхп, получше знаю JS и средне знаю sql.
Мне нужен паттерн/шаблон/проект типичного сайта на пхп. Структура сайта, если угодно, скелет.
Или сурс дайте.
Очень нужно!
Как по мне то норм. Хз я пилю гору консольных скриптов на пыхе, если бы мне надо былобы заниматься онли сайтошлепством - укатился бы в питон.
Не пойму чем пыха не подходит
>Не пойму чем пыха не подходит
Дело не в пыхе, а в таких задачках.
Какой в них смысл, если это в 99% проектах не используется? Вот убьёт какой джун на твою ерунду день и что? Ему это в вебе не пригодится вообще.
Лучше бы почитал чего нужного в это время.
Такие задачки бессмысленны ещё потому, что ничему не обучают впринципе - суходрочка одна на алгоритмы. Без постоянного применения такие вещи из головы вылетают быстро. Писал в своё время сортировки и задачки аналогичные - сейчас я это всё фуфлом для ЧСВшных студентов считаю.
>Хз я пилю гору консольных скриптов на пыхе
И что ты там за скрипты пишешь? Поди велосипеды изобретаешь раз за разом с таким подходом.
Типичный сайт сделан на CMS (Drupal, Wordpress) или фреймворке, например, Laravel или Symfony. Ты можешь поискать туториалы по созданию сайта на них или поискать готовые примеры. Вот например демо-сайт на Симфони: https://github.com/symfony/demo
Чтобы разобраться в них, тебе надо знать ООП, MVC, может быть, разные паттерны.
>>47764
Задача на крестики-нолики - это не алгоритмы, а просто проверка знаний. Смысл - показать работодателю, что ты лучше других кандидатов.
Что касается алгоритмов, я не соглашусь - это и расширяет кругозор, и полезно, и просто интересно. Знание алгоритмов и структур данных пригодится, например, чтобы понять, какие операции лучше оптимизируются индексом в БД. Ну и если ты захочешь написать какое-нибудь хранилище на Го, то тоже пригодятся.
Я понял, что алгоритмы тебе не интересны и на твоей работе не требуются, прекрасно, но у других людей может быть другое мнение и другой карьерный путь.
>расширяет кругозор,
Не расширяет. Знания, которые не используются - забываются. А умение решить твою задачку даже знанием не назовёшь - с этим любой справится, немного поломав голову.
Кругозор расширяет теория и изучение современных технологий.
>и полезно
Туда же.
>и просто интересно
Вкусовщина. Если нравятся эти олимпиадные задачки - вперёд, только не надо рассказывать, что это нужно и полезно. Изучить новую модную либу - вот польза.
И не надо смешивать теорию, типа структур данных, со своей бессмысленной задачкой. И не дай бох ты будешь так писать в рабочем проекте, как в этих задачках. Алгоритмы вообще отдельная песня и нечего пихать это везде где можно.
>Ему это в вебе не пригодится вообще
Большая часть моей работы заключается в написании консольных скриптов и подводных, которые необходимо знать там полно.
Банальный парсер и тот таит в себе кучу всего с чем не сталкиваешь при банальном сайтоделании. Знание HTTP, когда ты пилишь сайт - практически нинужны, а когда тебе в консольном варианте необходимо соеденятся с другими ресурсами, дрочиться для обхода разных антиботных защит - это другое дело.
Я уже не говорю о том при работе с сайтом - твой код живет 1 секунду, консольный же скрипт может работать неделями, что заставляет учитывать совсем другие проблемы (сохранение состояния при падении, утечки памяти и пр.)
Я б тебе работу не дал, если ты даже сосоль не знаешь. Но вообще задание простейшее, тупо в лоб команды из консоли, по ним вывод соответствующих классов, даже никакого интерфейса не выводить.
есть где-то описания, как это в orm реализовано? интересно внутреннюю механику таких штук узнать
Я вот несколько лет в офисе, на фриланс так и не получилось до сих пор. Не знаю, кто там с фриланса сразу начинает, это сложнее намного, знаний много надо.
Гайд неполный, но основы дает. Дальше придется курить уже документации и книги по отдельным технологиям, это большую часть времени на изучение и съедает. Но сначала основы из оп поста знать надо, иначе будешь плавать во всем и не понимать как и что с чем связано.
Не сработает, если на странице будет джава. Мне нужен рабочий способ для всех случаев.
Почему там все ЗАГЛАВНЫМИ БУКВАМИ?
Почему там используется синтаксис доисторической пыхи?
Почему он не запускается на пыхе 7.3?
Почему там лезут постоянно предупреждения об ошибках из самого ядра?
Заставили пилить сайт на оном. Моя жеппа в щепки порвана
Каким образом я могу реализовать конструкцию:
1) Есть маленькое говно с неполным текстом
2) Кликаешь
3) Открывается полная версия на этой же странице
Я бы написал сам, сука, но эта дрянь не дает, а сама такого функционала не предоставляет
И второе, как сделать так, чтобы при вводе url следующей страницы обходя форму авторизации пассажира выкидывало на index например. Опыта у меня не много, но я что-то совсем запутался с этой хуетой и уже не понимаю в какую сторону мне нужно копать.
Лопни мои ебанные глаза! Чувак, найди в инете готовое решение. Твой код даже комментировать бесполезно - это сплошной кусок говна.
Гугли rbac. А потом гугли решения на php или пиши свое.
Проиграл в голос, ты прав. Но, я думаю мне стоит как-то дособирать это говно из палок и чтоб оно как-то держалось. Дабы апнуть свои знания.
Прочитай про SQL инъекцию: https://github.com/codedokode/pasta/blob/master/security/sql-injection.md
Также, ты неправильно делаешь, что выводишь исключение на экран. В логи оно не попадет, ты о нем не узнаешь, а пользователю оно ничего не скажет.
Ладно, попробую тебя направить:
1. try catch должен обрамлять только тот участок кода, где может вылезти исключение. В твоем случае это подключение к базе. Его и оберни, а логики вынеси из try нехуй ей там делать.
2. Пришедший постом логин может содержать sql injection. Пихать его в таком виде в sql запрос даже не выстрел в ногу, а в голову.
3. Нахрена ты стартуешь сессию до подключения к бд?
>>47789
СПС. Я нашел простенький пример MVC, единственно в классах php немного невдупляю. По мне так классы в JS попроще я знаю что в JS класс - это обертка над прототипами.
Еще вопрос - я так понимаю что в браузере исполняться может только JS? Тоесть если php шаблон отдан клиенту, то все изменения в DOM либо с помощью JS прямо на месте, либо отправка данных о изменении на сервер, и перерисовка php-страницы полностью?
Для примера - событие допустим hover в браузере php никак не перехватит? И допустим нет JS. Кто то провел курсором над элементом, возникло событие, как тут может среагировать php?
аяксом
протестую, я тот самый анон, я просто открыл страницу в браузере!
phpstorm не влез одним скрином.
благодарю, учту и допилю. Однако я спрашивал о другом.
окей, я тебя понял. Лови благодарность, няша :3
>Банальный парсер и тот таит в себе кучу всего с чем не сталкиваешь при банальном сайтоделании
Да ты что? Перечисли пожалуйста, чего у тебя там особенного такого. И почему ты решил, что бэкэнд делать просто? Студентов сделал уже? Покажи.
И почему парсеры на сайтах не используются вдруг?
>консольный же скрипт может работать неделями
PHP в принципе не создан для того, чтобы висеть в памяти. Тебе сперва надо это было знать, а не сортировки-сортировочки. Для резидентных программ есть более удобные языки.
>сохранение состояния при падении
Есть куча готовых либ и софта для этого, но Чингачгук у нас всё сам.
у соседа есть, чем я хуже?
Предлагаю на проверку свободный от сайд-эффектов, строго типизированный вектор, включая антикризисные меры: https://codesandbox.io/s/github/kubk/vector-fp/tree/build/?expanddevtools=1&hidenavigation=1&module=/index.ts&view=editor
Например, если в тип Employee добавить новую должность, то код не скомпилируется, так как для новой должности не описаны все необходимые характеристики (ЗП, кофе и т.д). Тоже самое если добавить новый ранг. Если в демо навести курсор над любой переменной, то можно увидеть тип, который вывел тайпскрипт. Знания ФП у меня поверхностные, только то что в статьях-туториалах почерпнул. Думаю какую книгу взять, интересует возможность доказывать корректность программы на стадии компиляции.
Многомерный массив может содержать различные объекты в качестве значений.
Мне надо обойти этот массив и создать массив с такой же структурой, но в качестве значений использовав свои значения.
Никаких - свистоперделка. Используешь ОРМ - всеравно пишешь методы-обертки для своих задач, точно также как на чистом мускуле
Почему вкладка браузера с этим говносайтом жрет у меня 30% процессора? Чтобы у тупых жс-блядей печень отсохла блядь
А, ну самое главное - исходный массив изменять нельзя.
array_walk_recurcive ($arr, function (&$value){$value = 'hui';}) не катит
>И почему ты решил, что бэкэнд делать просто?
По опыту
>Студентов сделал уже?
Я не делал ни одной задачи из ОП поста
>PHP в принципе не создан для того, чтобы висеть в памяти
Тем не менее с задачей висения в памяти он справляется и причин юзать другой язык я не вижу - все задачи, которые возникают вполне себе решает пыха.
>Есть куча готовых либ и софта
Нету
Специально открыл. 800мб памяти и 10% скайлейка в ПРОСТОЕ. Прелесть какая.
Там в браузере запускается полноценный редактор кода с автокомплитом/go to definition и прочим: https://medium.com/@compuives/whats-unique-about-codesandbox-f1791d867e48
IDE на Java тоже много отъедают. Если тебе просто текст, то в левом верхнем углу есть ссылка на гитхаб репозиторий, из которого создан codesandbox.
Шукал по поводу работы с тегами, набрёл на https://ru.stackoverflow.com/questions/148204/Организация-тегов-в-бд-и-запросах
Подаскажите, нафига столбец `tag_count`?
По схеме, что на stackoverflow выходит, что чтобы сохранить запись с тегами, нужно сохранить саму запись, сохранить новые теги (если такие будут), сделать n записей (где n - кол-во тегов) в таблицу связи тег-запись.
Чтобы найти записи по тегу, достаточно узнать id тега и сделать выборку по нему в таблице связей. Смысла `tag_count` по-прежнему не понимаю.
ЗЫ Many to many погуглил, не помогло.
ЗЗЫ https://toster.ru/q/250728 - тут тоже в таблице связей нет третьего столбца...
напишу как только вкачусь
>Я не делал ни одной задачи из ОП поста
Я не сомневаюсь.
>Тем не менее с задачей висения в памяти он справляется
Конечно - с твоими-то костылями. Сам себе проблемы создаёшь на ровном месте и сам же их героически решаешь.
>Нету
Конкретно сохранение состояния можно реализовать через кэширование на Redis\Memcached, но ты же у нас настоящий индеец и всё сам делаешь.
Тебя к реальным проектам на пушечный выстрел лучше не подпускать - такого наворотишь со своими алгоритмами.
Классическая задача по рекурсивному обходу дерева. Гугли по этому словосочетанию.
Бамп, мне до понедельника надо подготовиться
Разве пшп умеет задавать вопросы в консоли? Типа, открываешь скрипт, а он тебе предлагает соснуть хуйца или сделать бочку, и тебе нужно в консоль букву напечатать
конечно
<?php
$answer = '';
while ($answer != 'da' . PHP_EOL) {
echo 'Sosnut\'? ( da ): ';
$answer = fgets(STDIN);
}
echo 'Pristupaj' . PHP_EOL;
Есть класс будильник и у него есть массив-объектов тревог.Как лучше сделать?
1. Передавать объекты тревог в методы класса будильник
2. Просто прописать методы класса Тревога и вызывать их для каждой тревоги
заранее ивиняюсь если расписал все непонятно
Чем задавать тупые вопросы в 10000 раз ,зайди на хедхантер и посмотри вакансии по разным языкам
>можно реализовать
>Есть куча готовых либ и софта для этого
Предлагает пердолить свой костыль с редиской как готовое решение. Ясно
>пердолить свой костыль
Лучше известные решения, чем костыли очередного хеллоуворлдщика.
Алсо, с каких это пор кэширование является костылём?
В конструктор будильника передать массив тревог.Создать метод у будильника который пробежит по тревогам и будетвызывать нужные тревоги
Госпади. Какой же ты даун блядь.
ЭТО НЕ ГОТОВОЕ РЕШЕНИЕ, долбоеб. Испанский стыд от таких знатоков-советчиков
1. При клонировании примитивные типы копируются по значению.
2. При клонировании, если член является объектом, копируется ссылка на него.
3. При этом массивы всегда копируются по значению в пхп.
А что с массивами объектов?
Я где-то читал, что для объектов в массиве вызывается метод clone, но походу нихуя не вызывается.
Мне что, при клонировании вручную копировать члены, являющиеся массивами?
При клонировании клонируются примитивы и копируются ссылки, потом вызывается __clone у клонированного объекта. В случае массива просто скопировался весь массив, а там только ссылки, так что ничего не поменялось. clone на массиве конечно не вызывается, с чего вдруг, делай сам в классе А.
При копировании объекта в переменную помещается ссылка на него, а вот при клонировании создается новый объект. А чего именно ты хочешь добиться я так и не понял.
Хочу установить mySQL для apache на компьютер (32 разрядная система). И хотя во всех мануалах просят скачать zip-архив, последние версии имеют zip-архив только для 64 разрядных систем, поэтому мне пришлось скачать установщик. В установщике я выбрал установить только сервер (Server only). Нажимая далее, установщик пишет следующее: mysql installer did not find packages in the current bundle suitable for installation. Что делать?
Разве это не ООП в функционалном стиле? Там так же есть "объекты" Департамента или СтавкиРабочего.
Смотря что считать объектом. Если исходить из определения Гради Буча, то у объекта есть поведение и изменяемое состояние: http://www.helloworld.ru/texts/comp/other/oop/ch03.htm
В моём случае Департамент это просто неизменяемая структура данных без поведения. Возможность создавать такие структуры данных существовала задолго до появления ООП, тут есть примеры структур данных на чисто функциональных языках: https://en.wikipedia.org/wiki/Record_(computer_science)#Examples
- проверить соответствие ОС требованиям MySQL, может эта ОС не поддерживается
- попробовать взять более старую версию mysql
Первое это классический подход к организации модели с бд без всяких орм и шаблонов.
Второе я придумал на основе статьи ОПа по шаблонам проектирования (в частности Active Record)
Третье я увидел в видосе, где мужик писал свой фреймворк. ERepository это класс, где Е - название сущности типа Е1, Е2 и Е3. Зачем здесь нужен репозиторий, я не знаю.
Расскажите, пожалуйста, как должна выглядеть структура модели, чтобы она соответствовала всем канонам активной записи.
Есть, но только на английском, на русский уже год переводят и постоянно откладывают. Вроде на рутрекере было и на nnm-club.
лучше всего смотреть как кто-то применяет технологию и пытаться подражать
также нужно вчитываться в документацию на английском
Умеет, как и почти любой язык, почитай про stdin/stdout. В Windows в консоли может понадобиться использовать кодировку Windows-1251 или cp866, чтобы отображать и принимать кириллицу.
>>48579
> Как вообще запускать пхп на локалке, из консоли там?
Урок:
- https://github.com/codedokode/pasta/blob/master/soft/cli.md
- https://github.com/codedokode/pasta/blob/master/soft/php-install.md
> Как читать данные из файла построчно?
fopen + fgets + fclose
> Или как аргументы?
http://php.net/manual/ru/features.commandline.php
>>48839
> Конкретно сохранение состояния можно реализовать через кэширование на Redis\Memcached, но ты же у нас настоящий индеец и всё сам делаешь.
Сделать можно, но непонятно зачем, если можно просто запустить скрипт в консоли. Тем более, кеш плохо годится для сохранения состояния, он не для этого придуман (а для повышения производительности). Я бы использовал файлы или БД. Плюс файлов - простота, плюс БД - можно делать запросы.
PHP вполне подходит для консольных скриптов, там даже есть возможность упаковать весь код с зависимостями в phar архив. Я много раз писал консольные скрипты на PHP. Всякие импорты данных, крон-задачи и тд.
Смысл использовать другие языки не очень понятен, так как для PHP есть много готовых библиотек. Использовать низкоуровневые языки (Си++) неудобно из-за управления памятью и многословности, использовать другие динамические языки (JS, Питон) неудобно из-за более низкой производительности, отсутвия статической типизации, худшей поддержки на Windows.
Ну и наконец, если ты много лет работаешь с PHP, то очевидно, что на нем ты скрипт быстрее напишешь, чем на другом языке. Также, если основной проект написан на PHP, то глупо консольные скрипты к нему писать на другом языке и терять возможность переиспользовать код.
Менять язык только потому, что это не нравится какому-то анонимному эксперту с двача, довольно глупо.
Ну и вы тут флуд развели на 5 постов без единого примера кода или примера задачи, с которой PHP справляется хорошо или плохо.
Умеет, как и почти любой язык, почитай про stdin/stdout. В Windows в консоли может понадобиться использовать кодировку Windows-1251 или cp866, чтобы отображать и принимать кириллицу.
>>48579
> Как вообще запускать пхп на локалке, из консоли там?
Урок:
- https://github.com/codedokode/pasta/blob/master/soft/cli.md
- https://github.com/codedokode/pasta/blob/master/soft/php-install.md
> Как читать данные из файла построчно?
fopen + fgets + fclose
> Или как аргументы?
http://php.net/manual/ru/features.commandline.php
>>48839
> Конкретно сохранение состояния можно реализовать через кэширование на Redis\Memcached, но ты же у нас настоящий индеец и всё сам делаешь.
Сделать можно, но непонятно зачем, если можно просто запустить скрипт в консоли. Тем более, кеш плохо годится для сохранения состояния, он не для этого придуман (а для повышения производительности). Я бы использовал файлы или БД. Плюс файлов - простота, плюс БД - можно делать запросы.
PHP вполне подходит для консольных скриптов, там даже есть возможность упаковать весь код с зависимостями в phar архив. Я много раз писал консольные скрипты на PHP. Всякие импорты данных, крон-задачи и тд.
Смысл использовать другие языки не очень понятен, так как для PHP есть много готовых библиотек. Использовать низкоуровневые языки (Си++) неудобно из-за управления памятью и многословности, использовать другие динамические языки (JS, Питон) неудобно из-за более низкой производительности, отсутвия статической типизации, худшей поддержки на Windows.
Ну и наконец, если ты много лет работаешь с PHP, то очевидно, что на нем ты скрипт быстрее напишешь, чем на другом языке. Также, если основной проект написан на PHP, то глупо консольные скрипты к нему писать на другом языке и терять возможность переиспользовать код.
Менять язык только потому, что это не нравится какому-то анонимному эксперту с двача, довольно глупо.
Ну и вы тут флуд развели на 5 постов без единого примера кода или примера задачи, с которой PHP справляется хорошо или плохо.
php -i, phpcs не провереряют
phpmd не уверен если проверяет оцените в пример? Но на сколько я вижу - нет.
Проблема с иммутабельностью может частично решаться изменением схемы, например, можно попробовать хранить в задаче лишь id исполнителя. Также, иммутабельность может быть и полезна для более быстрого обнаружения изменений без проверки объекта целиком, это может пригодиться на клиенте при реализации MVC. А также при необходимости "запомнить" данные в определенный момент, даже если они позже поменяются (например: условия банковского вклада или параметры товара на момент заказа). Ну вообще, ты судя по коду, умный, подумай-ка сам, как эти проблемы решать.
>>48806
Спрашивать надо у автора, а не у нас. Наверно, это поле показывает, сколько раз использован тег, это денормализация (прочитай, что такое нормализация БД) с целью оптимизировать, например, выборку самых популярных тегов. Хотя автора это делать не просили, и ты можешь это поле просто не делать.
>>50524
Убеждаешься, что ты знаешь базовые вещи (ООП, MVC, ActiveRecord, шаблонизация, проектирование БД). Если не знаешь - почитай статьи, например, тут: https://github.com/codedokode/pasta/ или где-то еще.
Дальше ищешь туториал "создание сайта на Laravel", в идеале - официальный английский туториал или его перевод. Читаешь, выполняешь, по каждому классу и фукнции, который там использован, читаешь документацию, и разбираешься, как все работает, а не бездумно переписываешь код. Потом пройдя туториал, делаешь еще пару доработок сайта самостоятельно. Этого хватит для базового знакомства с фреймворком.
Вот для начала совсем уж простой туториал: https://laravel.com/docs/5.1/quickstart
Проблема с иммутабельностью может частично решаться изменением схемы, например, можно попробовать хранить в задаче лишь id исполнителя. Также, иммутабельность может быть и полезна для более быстрого обнаружения изменений без проверки объекта целиком, это может пригодиться на клиенте при реализации MVC. А также при необходимости "запомнить" данные в определенный момент, даже если они позже поменяются (например: условия банковского вклада или параметры товара на момент заказа). Ну вообще, ты судя по коду, умный, подумай-ка сам, как эти проблемы решать.
>>48806
Спрашивать надо у автора, а не у нас. Наверно, это поле показывает, сколько раз использован тег, это денормализация (прочитай, что такое нормализация БД) с целью оптимизировать, например, выборку самых популярных тегов. Хотя автора это делать не просили, и ты можешь это поле просто не делать.
>>50524
Убеждаешься, что ты знаешь базовые вещи (ООП, MVC, ActiveRecord, шаблонизация, проектирование БД). Если не знаешь - почитай статьи, например, тут: https://github.com/codedokode/pasta/ или где-то еще.
Дальше ищешь туториал "создание сайта на Laravel", в идеале - официальный английский туториал или его перевод. Читаешь, выполняешь, по каждому классу и фукнции, который там использован, читаешь документацию, и разбираешься, как все работает, а не бездумно переписываешь код. Потом пройдя туториал, делаешь еще пару доработок сайта самостоятельно. Этого хватит для базового знакомства с фреймворком.
Вот для начала совсем уж простой туториал: https://laravel.com/docs/5.1/quickstart
Первый подход имхо это и есть ActiveRecord: объект, который умеет сам себя сохранять в БД. Или же TableDataGateway: класс, который собрал в себе методы работы с одной таблицей (разница: объект AR соответствует 1 строчке в таблице и их может быть много, а TDG - существует в 1 экземпляре и соответствует таблице, а не строчке в ней).
> Третье я увидел в видосе, где мужик писал свой фреймворк. ERepository это класс, где Е - название сущности типа Е1, Е2 и Е3. Зачем здесь нужен репозиторий, я не знаю.
Репозиторий - это объект, который представляет собой некое "хранилище" сущностей. Их туда можно класть, искать, удалять. При этом репозиторий может использовать для хранения БД, а может, например, использовать какое-то другое хранилище (например, просто хранить их в памяти в массиве - это полезно в тестах). Или вообще передавать/получать данные из REST API. Ты можешь заметить, что репозиторий похож на TDG, но TDG - явно предназначен для работы с БД, а репозиторий - это просто хранилище, не обязательно в БД.
Репозиторий, как и другие паттерны, описан в книге Фаулера: https://www.martinfowler.com/eaaCatalog/repository.html Там в примере используется "двухслойная" схема, репозиторий является лишь "фронтендом", к которому может быть прикреплен "бекенд" - бекенд для сохранения в БД, или бекенд для сохранения куда-то еще.
Репозитории есть в ORM Doctrine, работающем по принципу Data Mapper.
Статья на хабре: https://habr.com/ru/post/248505/
Вот еще картинка https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/media/image18.png из статьи майкрософта: https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design
Там используются понятия "домен", "доменная модель" - домен здесь значит "предметная область задачи", а модель - сущность из этой области: https://ru.wikipedia.org/wiki/Доменный_объект
В третьем подходе, который ты описал, есть что-то похожее на Data Mapper. Я не очень понимаю, как ActiveRecord совмещается с репозиторием: суть "активной записи" в том, что объект, представляющий строку в таблице, умеет сам себя сохранять в БД. Соответственно, репозитории при таком подходе не требуются.
Т.е. ключевое отличие AR от других паттернов:
Active Record:
$user = new User;
$user->setName(...);
$user->save();
Репозиторий/Data Mapper:
$user = new User;
$user->setName(...);
$userRepository->save($user);
Для проверки ты можешь сам поискать у Фаулера все эти паттерны, вот например, ActiveRecord: https://www.martinfowler.com/eaaCatalog/activeRecord.html
При этом не имеет значения, наследуешь ли ты модель от базового класса ActiveRecord, или подключаешь его как трейт - это не меняет сути паттерна, что модель умеет сама себя сохранять.
> Расскажите, пожалуйста, как должна выглядеть структура модели, чтобы она соответствовала всем канонам активной записи.
Как описано у Фаулера или в других статьях.
Первый подход имхо это и есть ActiveRecord: объект, который умеет сам себя сохранять в БД. Или же TableDataGateway: класс, который собрал в себе методы работы с одной таблицей (разница: объект AR соответствует 1 строчке в таблице и их может быть много, а TDG - существует в 1 экземпляре и соответствует таблице, а не строчке в ней).
> Третье я увидел в видосе, где мужик писал свой фреймворк. ERepository это класс, где Е - название сущности типа Е1, Е2 и Е3. Зачем здесь нужен репозиторий, я не знаю.
Репозиторий - это объект, который представляет собой некое "хранилище" сущностей. Их туда можно класть, искать, удалять. При этом репозиторий может использовать для хранения БД, а может, например, использовать какое-то другое хранилище (например, просто хранить их в памяти в массиве - это полезно в тестах). Или вообще передавать/получать данные из REST API. Ты можешь заметить, что репозиторий похож на TDG, но TDG - явно предназначен для работы с БД, а репозиторий - это просто хранилище, не обязательно в БД.
Репозиторий, как и другие паттерны, описан в книге Фаулера: https://www.martinfowler.com/eaaCatalog/repository.html Там в примере используется "двухслойная" схема, репозиторий является лишь "фронтендом", к которому может быть прикреплен "бекенд" - бекенд для сохранения в БД, или бекенд для сохранения куда-то еще.
Репозитории есть в ORM Doctrine, работающем по принципу Data Mapper.
Статья на хабре: https://habr.com/ru/post/248505/
Вот еще картинка https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/media/image18.png из статьи майкрософта: https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design
Там используются понятия "домен", "доменная модель" - домен здесь значит "предметная область задачи", а модель - сущность из этой области: https://ru.wikipedia.org/wiki/Доменный_объект
В третьем подходе, который ты описал, есть что-то похожее на Data Mapper. Я не очень понимаю, как ActiveRecord совмещается с репозиторием: суть "активной записи" в том, что объект, представляющий строку в таблице, умеет сам себя сохранять в БД. Соответственно, репозитории при таком подходе не требуются.
Т.е. ключевое отличие AR от других паттернов:
Active Record:
$user = new User;
$user->setName(...);
$user->save();
Репозиторий/Data Mapper:
$user = new User;
$user->setName(...);
$userRepository->save($user);
Для проверки ты можешь сам поискать у Фаулера все эти паттерны, вот например, ActiveRecord: https://www.martinfowler.com/eaaCatalog/activeRecord.html
При этом не имеет значения, наследуешь ли ты модель от базового класса ActiveRecord, или подключаешь его как трейт - это не меняет сути паттерна, что модель умеет сама себя сохранять.
> Расскажите, пожалуйста, как должна выглядеть структура модели, чтобы она соответствовала всем канонам активной записи.
Как описано у Фаулера или в других статьях.
Действительно, непонятно описал.
> 1. Передавать объекты тревог в методы класса будильник
Не очень понятно, зачем их передавать, если они в нем уже хранятся.
> 2. Просто прописать методы класса Тревога и вызывать их для каждой тревоги
Не очень понял.
Традиционно такие вещи делают так: делаем объект Тревога, и делаем Будильник, который хранит в себе список Тревог и умеет делать вещи вроде поиска ближайшей тревоги:
$alarm = new Alarm(12, 00, ...);
$clock->addAlarm($alarm);
$clock->deleteAlarm($alarm);
$nextAlarm = $clock->getNextPlannedAlarm();
При желании, можно запретить создавать Тревоги в обход будильника, если в этом есть какой-то профит:
$alarm = $clock->createAlarm(12, 00, ....);
$clock->deleteAlarm($alarm);
$nextAlarm = $clock->getNextPlannedAlarm();
>>49334
При клонировании все работает так же, как при присваивании:
- массивы клонируются (но не объекты внутри них)
- дочерние объекты (в полях или в массивах) не клонируются, просто копируется ссылка на них:
class A
{
public B $b;
public $list; // B[]
}
При клонировании этого объекта $b не будет склонирован, $list будет скопирован (будет создана независимая копия массива), но ссылки в нем останутся ссылками на те же объекты.
Если тебя это не устраивает, то определи метод __clone и в нем клонируй руками все вложенные объекты.
Действительно, непонятно описал.
> 1. Передавать объекты тревог в методы класса будильник
Не очень понятно, зачем их передавать, если они в нем уже хранятся.
> 2. Просто прописать методы класса Тревога и вызывать их для каждой тревоги
Не очень понял.
Традиционно такие вещи делают так: делаем объект Тревога, и делаем Будильник, который хранит в себе список Тревог и умеет делать вещи вроде поиска ближайшей тревоги:
$alarm = new Alarm(12, 00, ...);
$clock->addAlarm($alarm);
$clock->deleteAlarm($alarm);
$nextAlarm = $clock->getNextPlannedAlarm();
При желании, можно запретить создавать Тревоги в обход будильника, если в этом есть какой-то профит:
$alarm = $clock->createAlarm(12, 00, ....);
$clock->deleteAlarm($alarm);
$nextAlarm = $clock->getNextPlannedAlarm();
>>49334
При клонировании все работает так же, как при присваивании:
- массивы клонируются (но не объекты внутри них)
- дочерние объекты (в полях или в массивах) не клонируются, просто копируется ссылка на них:
class A
{
public B $b;
public $list; // B[]
}
При клонировании этого объекта $b не будет склонирован, $list будет скопирован (будет создана независимая копия массива), но ссылки в нем останутся ссылками на те же объекты.
Если тебя это не устраивает, то определи метод __clone и в нем клонируй руками все вложенные объекты.
>Я бы использовал файлы или БД
>использовать другие динамические языки (JS, Питон) неудобно из-за более низкой производительности
Ну-ну. Файлы у нас пишутся быстро, а JS с Питоном медленно работают.
Ясно всё.
>Тем более, кеш плохо годится для сохранения состояния
Алсо, тот же редис можно подключит в php.ini и просто переназначить на него сессии. И не надо костылить бесконечные скрипты.
Ну вы даётё блин.
Спасибо тебе за такой всеобъемлющий пост.
>Я не очень понимаю, как ActiveRecord совмещается с репозиторием: суть "активной записи" в том, что объект, представляющий строку в таблице, умеет сам себя сохранять в БД. Соответственно, репозитории при таком подходе не требуются.
Я читал, что там вся разница в методе save.
Классический AR этот метод вызывает прям в сущности, а репозиторий в связке с AR сохранение и обновление берет на себя, и логика из сущности содержится в нем. Читал, что сам по себе AR это плохо. AR с репозиторием это не дата маппер, потому что нужен еще один слой адаптера.
Подожди, то есть все это выше мною прочитанное это ложь?
Редис твой говнецо.
А как они из AR объекта получают объект репозитория? Через какой-то глобальный реестр? Сути это не меняет, это все равно AR, если сущность умеет сама себя сохранять.
>>50726
Там вроде речь шла про состояние вообще а не сессии.
>>50716
Для 5.7 туториала что-то нет. Ну пусть анон тогда сам по документации узнает, что изменилось в сравнении с 5.1.
>>50725
Типизации все равно нет. Хотя я Питон успешно использую в Jupyter Notebook. Ну и еще PHP вроде как проще в использовании и фреймворков под него много.
>Типизации все равно нет
В /б это называют манёврами.
По факту у нас есть один персонаж, который костылит скрипты и алгоритмы, когда есть понятные и очевидные решения, с минимумом костыльного кода.
И есть второй персонаж, который любыми способами пытается убедить себя в том, что ПХП универсален во всём. Причём не понимает разницы между работой в оперативке и на винте. Но зато про другие ЯП знает точно, что они медленные.
Теперь я даже начинаю понимать почему ПХПшников в массе своей макаками называют.
Можно сделать у тревоги, если у тебя Тревогу можно создать или получить из будильника. Так скорее всего будет удобнее. Но ты можешь для эксперимента попробовать сделать их у Будильника и посмотреть, что получится.
>А как они из AR объекта получают объект репозитория? Через какой-то глобальный реестр? Сути это не меняет, это все равно AR, если сущность умеет сама себя сохранять.
Что значит из AR-объекта? Из сущности, в которой используется трейт AR? Или из самого трейта?
Никак, наверное. Они подключают трейт к сущности, а в репозитории создают ее объект, где уже вызывают метод сейв и проводят с сущностью манипуляции.
Там еще каким-то боком Query Builder работает, но это наверное к вышеописанному не относится.
Предположим, у нас есть код, позволяющий вывести список групп товаров, а также товары, находящиеся в каждой группе. Задача заключается в том, что необходимо добавить к имеющемуся коду функциональность вложенных групп товаров.
В приложенном файле test_base.sql находится дамп базы данных MySQL, содержащий две таблицы:
1.groups – таблица групп товаров, содержит поля:
•id – идентификатор группы
•id_parent – идентификатор «родительской» группы
•name – название группы
2.products – таблица товаров, содержит поля:
•id – идентификатор товара
•id_group – идентификатор группы товаров
•name – название товара
Необходимо написать PHP-скрипт, удовлетворяющий следующим требованиям:
1.При запуске выводит список (ul) групп товаров первого уровня (groups.id_parent=0), название каждой группы является ссылкой, которая вызывает этот же скрипт с GET-параметром “group”, равным id группы. Возле названия должно быть написано общее количество товаров в группе (количество товаров в самой группе и во всех ее подгруппах). Пока не выбрана ни одна группа – также выводится список всех товаров.
2.При переходе по ссылке (выборе группы товаров первого уровня) – кроме списка групп товаров первого уровня выводится также список всех подгрупп выбранной группы, все имена подгрупп также являются ссылками, и возле названия подгруппы находится количество товаров, содержащихся в этой подгруппе. Также выводятся все товары, отнесенные к выбранной группе (и всем ее подгруппам).
3.Количество уровней вложенности групп не ограничено.
4.Набор используемых технологий ограничен: php, mysql, html, xslt (не обязательно). При реализации использование каких-либо библиотек или фреймворков разрешается только для шаблонизации (вывода информации).
5.Допустимо добавление новых полей в таблицы. Изменять логику работы или типы полей, удалять поля в любой таблице запрещено в целях сохранения обратной совместимости с имеющимся кодом (предполагаем что он есть). В случае добавления полей для всех вновь добавленных полей необходимо подготовить запрос/скрипт, заполняющий их данными, либо описать словами логику работы такого запроса/скрипта.
6.Никакое специальное оформление не требуется, оцениваться будет логика работы с вложенными группами товаров – sql-запросы и код php, реализующий эту логику, а также html код, реализующий вложенные списки.
Предположим, у нас есть код, позволяющий вывести список групп товаров, а также товары, находящиеся в каждой группе. Задача заключается в том, что необходимо добавить к имеющемуся коду функциональность вложенных групп товаров.
В приложенном файле test_base.sql находится дамп базы данных MySQL, содержащий две таблицы:
1.groups – таблица групп товаров, содержит поля:
•id – идентификатор группы
•id_parent – идентификатор «родительской» группы
•name – название группы
2.products – таблица товаров, содержит поля:
•id – идентификатор товара
•id_group – идентификатор группы товаров
•name – название товара
Необходимо написать PHP-скрипт, удовлетворяющий следующим требованиям:
1.При запуске выводит список (ul) групп товаров первого уровня (groups.id_parent=0), название каждой группы является ссылкой, которая вызывает этот же скрипт с GET-параметром “group”, равным id группы. Возле названия должно быть написано общее количество товаров в группе (количество товаров в самой группе и во всех ее подгруппах). Пока не выбрана ни одна группа – также выводится список всех товаров.
2.При переходе по ссылке (выборе группы товаров первого уровня) – кроме списка групп товаров первого уровня выводится также список всех подгрупп выбранной группы, все имена подгрупп также являются ссылками, и возле названия подгруппы находится количество товаров, содержащихся в этой подгруппе. Также выводятся все товары, отнесенные к выбранной группе (и всем ее подгруппам).
3.Количество уровней вложенности групп не ограничено.
4.Набор используемых технологий ограничен: php, mysql, html, xslt (не обязательно). При реализации использование каких-либо библиотек или фреймворков разрешается только для шаблонизации (вывода информации).
5.Допустимо добавление новых полей в таблицы. Изменять логику работы или типы полей, удалять поля в любой таблице запрещено в целях сохранения обратной совместимости с имеющимся кодом (предполагаем что он есть). В случае добавления полей для всех вновь добавленных полей необходимо подготовить запрос/скрипт, заполняющий их данными, либо описать словами логику работы такого запроса/скрипта.
6.Никакое специальное оформление не требуется, оцениваться будет логика работы с вложенными группами товаров – sql-запросы и код php, реализующий эту логику, а также html код, реализующий вложенные списки.
Помогите, молю
Обычное тестовое на работах. Решается элементарно, если знаешь запросы MySQL и PDO в PHP. Остается только сделать обработку GET параметров и соединить в контроллере с вызовами к PDO.
Шли json массивы через POST или используй разные имена параметров через GET, если они у тебя друг друга перебивают - например sort_by_direction, show_direction. Как у тебя по 3 штуки одинаковых выходит, не пойму, что-то ты не так в обработке видно делаешь. Простейший путь - ставь в скрипте переменную $sortDirection один раз и потом на ссылках по условию из нее выводи.
Есть смысл тут искать себе разраба? Нужен толковый чувак, веб-разработчик широкого профиля (фуллстак). Мне пофиг, какой у вас стиль одежды, откуда вы, в какое время суток предпочитаете работать (если работаете в целом, а не дрочите).
Удаленка, минимум контроля, можно делать быстро и ебланить большую часть дня (не перегружаю работой), можно делать дольше, учиться. Какой-никакой опыт работы над крупными проектами (крупнее лаба10.пхп и сокращателя ссылок).
Языки программирования: PHP (7.2+), JS, HTML/CSS, SQL (MySQL или MariaDB).
Фреймворки: Yii, jQuery.
Технологии и инструменты: scss(sass), gulp, git, PHPStorm.
Короче, ничего сверхъестественного.
ЗП 40-45 на руки. Минусы - сам проект так себе по интересности, иногда приходится переделывать некоторые вещи по паре раз, двигать туда сюда текстики-кнопочки, нежелательно уходить в запой и проёбываться.
Ну или пишите тележку, если удобнее, постучусь.
>>51497
Генерацию ссылок лучше всего вынести в какую-то функцию. Не надо лепить костыли и разбирать GET-запрос. Тебе надо учиться разделять код на части, а ты пока это сделать не можешь и не можешь выделить отдельно функцию генерации ссылок и объект состояния фильтра.
От чего зависит ссылка?
- от глобальных параметров фильтрации
- от добавленных к ним локальных параметров
Ну так давай так и сделаем. Сделам функцию, которая принимает все эти параметры и выдает ссылку:
getSomePageUrl(string $section, string $sortBy, string $sortDir, ...): string
Текущие глобальные параметры можно хранить в отдельных переменных, но гораздо удобнее сделать для них объект и использовать все преимущества ООП, включая инкапсуляцию, проверку значений и тд. Такой объект можно назвать, например, Filter или DisplayParams.
Соответственно, функция примет вид:
getSomePageUrl(Filter $filter, string $sortBy, string $SortDir)
Кстати, сортировку можно сделать одной переменной, добавляя к имени поля минус.
Для сбора query string от URL удобно использовать http_build_query - она еще и кодирует данные процентным кодированием (урок про URL: https://github.com/codedokode/pasta/blob/master/network/urls.md ).
>>51147
А что именно ты не понимаешь? Я, например, делать это задание целиком за тебя не буду. Задавай конкретные вопросы, и если ты не знаешь что-то из теории, может мы подскажем, что можно почитать.
Конкретно в задаче надо знать PHP и SQL.
>>51497
Генерацию ссылок лучше всего вынести в какую-то функцию. Не надо лепить костыли и разбирать GET-запрос. Тебе надо учиться разделять код на части, а ты пока это сделать не можешь и не можешь выделить отдельно функцию генерации ссылок и объект состояния фильтра.
От чего зависит ссылка?
- от глобальных параметров фильтрации
- от добавленных к ним локальных параметров
Ну так давай так и сделаем. Сделам функцию, которая принимает все эти параметры и выдает ссылку:
getSomePageUrl(string $section, string $sortBy, string $sortDir, ...): string
Текущие глобальные параметры можно хранить в отдельных переменных, но гораздо удобнее сделать для них объект и использовать все преимущества ООП, включая инкапсуляцию, проверку значений и тд. Такой объект можно назвать, например, Filter или DisplayParams.
Соответственно, функция примет вид:
getSomePageUrl(Filter $filter, string $sortBy, string $SortDir)
Кстати, сортировку можно сделать одной переменной, добавляя к имени поля минус.
Для сбора query string от URL удобно использовать http_build_query - она еще и кодирует данные процентным кодированием (урок про URL: https://github.com/codedokode/pasta/blob/master/network/urls.md ).
>>51147
А что именно ты не понимаешь? Я, например, делать это задание целиком за тебя не буду. Задавай конкретные вопросы, и если ты не знаешь что-то из теории, может мы подскажем, что можно почитать.
Конкретно в задаче надо знать PHP и SQL.
> Они подключают трейт к сущности, а в репозитории создают ее объект, где уже вызывают метод сейв и проводят с сущностью манипуляции.
Ты что-то сложное описываешь. Я думаю, это просто неправильное понимание паттернов (или ты неточно описал). Если что, эти паттерны подробно описаны в книге Фаулера "Проектирование архитектуры корпоративных приложений" (PoEAA), и ты можешь прочитать их описания и сравнить с кодом.
Репозиторий обычно создает объекты только при загрузке данных. Если надо добавить запись в БД, то сущность передается снаружи в репозиторий. "Манипуляции" с объектами AR он не производит, так как он представляет собой хранилище.
> Там еще каким-то боком Query Builder работает, но это наверное к вышеописанному не относится.
Не относится. Он используется когда надо построить запрос в зависимости от разных условий, например, фильтров.
>>50715
Нужно:
- проверить, есть ли в вордпрессе уже "личный кабинет" (и что под этим имеют ввиду? Там вроде есть какие-то страницы для редактирования профиля)
- если нет, то найти плагин или сделать самому
- добавить в личный кабинет страницу для загрузки PDF файлов и, возможно, просмотра списка и удаления. Либо самому, либо найти готовый плагин.
Как "добавить страницу в личный кабинет" можно, наверно, нагуглить. Я сделал поиск по "wordpress member area" или "wordpress allow file upload for users" и там выдаются статьи по этой теме.
Там даже кто-то гайд нарисовал: https://chrislema.com/wp-content/uploads/chrislema-guide-membership-plugins.png - но естественно, тебе надо тщательно проверить, подойдет ли плагин для твоих целей.
В программы проверки кода можно добавлять свои правила. Но проверка переменных потребует полноценный синтаксический анализ кода. Так что, не знаю. IDE вроде PhpStorm вроде это умеют делать.
dirname(__FILE__)
Вместо того, чтобы написать вот так:
__DIR__
Это болезнь?
Кто так пишет? Я видел только dirname(__DIR__) и просто __DIR__. Наверное просто кто-то не знает, что есть такая константа или дело привычки.
>>51740
>Я думаю, это просто неправильное понимание паттернов (или ты неточно описал).
Еще я задал этот вопрос на тостере, а мне ответили, мол, сущность не должна сама себя сохранять, ибо это противоречит принципам SOLID, то есть, нарушается принцип единственной ответственности. Поэтому создается репозиторий от каждой сущности, куда передается логика сохранения и прочего. И я вот думаю, правильно ли эти люди понимают шаблоны проектирования, или это я неправильно тебе объясняю.
Книгу-то я не читал, но на сайте его смотрел описания. Эти шаблоны еще у Зандстры вроде описываются в последних главах, но я еще не дошел до них.
А еще тот же человек на тостере ответил, что он "против AR", лол.
Ну, зп раза в 2 выше медианной по какому-нибудь Омску, причем на руки, а не по бумажкам. А так да, по меркам ДС/Европ не густо.
Я уже к этому решению и пришел, но все равно спасибо. Еще не начинал писать функцию, потому твоя информация мне очень поможет
У нас на такую не проживешь, тупо денег не хватит после оплаты квартиры и коммунальных расходов. Минималка в крупном городе это тысяч 70.
>У нас на такую не проживешь
>Минималка в крупном городе это тысяч 70
У вас это где? Средняя (не медианная, не модальная) по Москве около этой суммы или чуть выше (Мосгорстат как-то, в 2017 что ли, насчитал 90, а потом его поправили как раз до 70).
К слову, я в ДС, в районе рядом с ТТК, трачу на
>платы квартиры и коммунальных расходов
значительно меньше 45.
Я удаленщик из провинции, сейчас работаю за 60к и без всяких фулкаков, а на чистом пых-беке.
Чет ты реально мало предлагаешь.
<?php
error_reporting(-1);
$random=0;
echo 'pull';
$random = mt_rand(1,6);
echo 'PC pulled $random';
?>
WHERES THE MISTAKE ANON?
Ну извините.
Смысл в чем. Из одного файла вызывается эта функция и передает текст. А во втором файле сама эта функция.
1 файл
MessageSend ('Поле "Ваш Ник" пустое.');
2 файл
function MessageSend($p1){
header('Location: '.$_SERVER['HTTP_REFERER']);
$Massage = 'Ошибка: '.$p1.' !!!';
echo $Massage;
}
Вот в чем проблема, после вызова "header('Location: '.$_SERVER['HTTP_REFERER']);", дальнейшие команды "echo" не срабатывают.
Как принудить их сработать?
А никак. Все, что после хедера вызывается, исполнено не будет, ты ведь очищаешь $_SERVER и передаешь новые заголовки.
Хотя вроде бы переменная массаж инициализируется, но у тебя не будет к ней доступа. Тут даже трюки с ob_start и ob_get_clean не сработают, потому что заголовки превыше всего.
А есть варианты, как сделать такую конструкцию другим способом?
Строка в одинарных ковычках не парсится на предмет наличия переменных.
Хуяндексе
Пытаюсь спарсить сайт CURlом, на сайте штук 15-20 тегов <a> под одним классом, а курл видит только половину из них. Есть идеи почему так происходит?
Потомучто в xdebug стоит ограничение на вывод символов в консоль?
Лан поясняю.
ПХП был немодным за бугром до ООП и вообще до 7 версии. Он объективно был непригодным. Но до местных пидорах, этот тренд начал доходить только недавно, поэтому существует парадокс - пыха - ацтой, но почему - никто не может объяснить. Пидораха кукарекает, что на швитом жападе так скозали, а то что сказали это 100500 лет назад ему неведомо.
Пыха в тренде нынче везде. Как за бугром так и в рашке. Язык занял свою нишу и стабильно ее удерживает.
я с ide игрался вообще только, но заметил что при наведении мышкой на класс ide его не ищет, а в том же сублиме можно кликнуть и он сам по неймспейсу находит нужный класс, или хз, там можно как-то включить.
Вообще, у Нетбинса такие же возможности, чем лучше, чем хуже, его можно так же кастомизировать? И еще нет карты документа чтобы быстро скроллить
После JS современный PHP мне вполне нравится. В Питоне например я бугуртил от лямб в одну строку, В JS в колбэк пол-программы завернуть можно.
Единственно в PHP какая то кривая система области видимости переменных. В JS как то более естественно чтоли.
И пишут что с 7 версии быстрее Питона.
А вообще конечно рыночек решает. Если человеку нужен магазин - то нахуя ему на Node/Jango например городить, если с той же эффективностью он реализует это на ПХП, на котором разработчиков гораздо больше.
>пыха - ацтой, но почему - никто не может объяснить
мне на ебаное ит сказали, что у погромил есть своя иерархия
похописты - пидоры ёпта
>PHP мне вполне нравится
а я когда на пыхе чё-нить пишу представляю что кодю не на нём, а на жаваскрэп или на пайтхон
т.е. это когда тню ебёт какой-нить карлан, а она представляет у ся в башке своей сраной, што в пизде у неё хуй альфача, а не омеги
вот точно так же у меня дела обстоят с пиэйчпи
...
представляю, что вместо знаков доллара я вижу вары
вместо точек плюсы
вместо стрелочек точки
а вместо фигурных скобок мне мерещиться индентация
Пишу в нетбинс онли. Пробовал штор - не зашел.
Нетбинс обвешал плагинами и вуаля. Все есть и дебагер и хуягер и карту поставил. Мне нравица
зачем качать на рутрекере, если можно скачать с офф сайта и ввести просто сервак активации левый, который тебе на год мб и навсегда активирует его?
они правда так представляют??? не может быть...
ответьте пожалуйста, скажите что это не так
Да никуда не надо. Серваки блять уже лопаются от ваших бесполезных велосипедов и учебных задач, которые не только никому, они даже вам нахуй не сдались.
У тебя спросить забыли
P.S. Скрипт на куки я написал.
>Как закрыть доступ к html странице
Через .htaccess.
>не знаю как его прикрутить к html документу
Если js, то <script></script>
Если php, то меняешь расширение с .html на .php и вставляешь скрипт в <?php ... ?>
теперь при открытии этого html у которого поменял расширение на php просто в текстовом виде строки с разметкой html и вставленным кодом
под закрыв доступ я имею ввиду вход только для авторизованных/зарегистрированных пользователей, правильно ли я понимаю, что это нужно делать через .htaccess?
>>52425
В нетбинс тоже форматтер кода есть, по PSR настраивается. Карта навигации по классу там есть. Переходы по названию класса тоже. В PHPStorm есть конечно пара штук, каких в нетбинс нет вроде этих неймспейсов, но они не особо ценные и работу как-то существенно не ускоряют. В нетбинс повседневная работа с кодом вполне комфортна, у нас на фирме на нем работают с кучей проектов без проблем. Phpstorm имхо оверхайпнут, за такие бабки, какие они там за него требуют, он особых преимуществ перед бесплатным нетбинсом не дает.
Дополню.
Меня перегоняли постоянно на пхпшторм, мол там можно настроить работу с удаленным сервером. Поковыряся и оказалось в нетбинсе такая шляпа тоже есть.
Я если честно хз что еще там надо. Форматирование кстати там неоче настраивается, например or и and не понимает и плохо перенос строк настраивается. Ебался с этим
бамп вопросу, заебался голову ломать. Уже нихуя не понимаю.
После верной авторизации пользователь получает куки, как написать скрипт проверки кук и если не совпадает/или их нет, то соответственно кикать посетителя со страницы
у тебя есть страница:
index.php
показывать ее нужно только авторизованным пользователям, поэтому, ты в начале этой страницы, делаешь проверку на куки:
<?php
if huiv и т.д, и если что-то не так, делаешь переадресацию, все, дело закрыто
>как написать скрипт проверки
ну мануалов дохуя в интернете, первое что тебе нужно научится - гуглить
Нетбис это ведь та же идея, только кастрированная. Такое чувство, что нетбинс это такой тестировочный полигон для остальных платных продуктов джетбрейнс. Туда запиливают всякие штуки новички, только-только пришедшие в эту компанию. Как только они надрочатся с кодом, их уже берут работать с платными средами разработок.
>>52813
>>52806
Ну нихуясе теперь. Сравнили жопу с небом.
Разумеется phpstorm гораздо лучше.
>есть форматтер и автопереход, хуле еще надо епта бля
Да вы охуели?
СТАТИЧЕСКИЙ АНАЛИЗ. Запусти 1 раз пых-шторм на своем говнокоде и ты охуеешь от количества хуйни, которую ГОЛЫЙ шторм там нашел ну просто сходу.
ПРОДВИНУТЫЙ АВТОКОМПЛИТ И PHPDOC.
Пых-шторм умеет то, чего не умеет нетбинс. Например, слабо переименовать несуществующий, описанный в пых-доке метод в 25 разных файлах?
ПЕРЕМЕЩЕНИЕ КЛАССОВ И ИЗМЕНЕНИЕ НЕЙМСПЕЙСОВ.
В нетбинсе это целая трагедия. Там тупо нет возможности одной сука кнопкой переместить корректно класс с изменением его неймспейсов (в том числе в овердохуя других файлов, что его импортируют).
А тут CTRL+M и готово.
ПЛАГИНЫ. Если ты думаешь "хмм, было бы круто, если бы был такой плагин для иде..." - для продуктов жид-бреинс он почти точно есть. А вот для всяких остальных помоек - не уверен.
С помощью плагинов ты можешь допердолить иде так, что она даже под конкретный фрейморк будет заточена и вообще писать половину кода за тебя.
ЕДИНАЯ ЭКОСИСТЕМА INTELLIJ
Все иде жид-бреинсов очень похожи. 1 раз привыкнув, ты можешь вообще легко менять иде под нужный язык и все настройки будут в точно тех же местах, что и в другой иде. Интерфейс тот же. Более того, все проблемы и баги тоже там везде едины.
phpstorm-сектант
точнее, какой актуален и быстр в освоении?
я делал на laravel по гайдам
https://www.youtube.com/watch?v=cEYLjsEKyy8&list=PLfdtiltiRHWGGxaR6uFtwZnnbcXqyq8JD
спасибо, посмотрю. Олсо, читал в одной статье что ларавел глючит иногда, типа может не распознать некоторые методы, хотя они есть. Такое может быть?
А что это такое? Я читал, что это просто особенность фреймворков такая. Я вот даже сейчас пишу свой фрейм и вижу, что код из контроллеров, который я пишу, вызывается в совершенно другом месте. Код вдругих классах тоже вызывается в других классах и его результат передается в другие классы, где уже подтягивается другой мой код.
Это оно?
И причем тут Inversion of Control?
Сектанство какое-то точно, все это в работе ни разу не нужно было. Классы рефакторил в нетбинсе, пока хватало. Автокомплитом не пользуюсь, напечатать быстрее бывает, чем тыкать там в нем. Для статического анализа тулзы есть специальные, у нас в интеграционных тестах подключаются. Phpdoc в нетбинсе есть с автозаполнением из типизированных параметров, пока тоже хватало.
Переводили с тимлидом проект на Ларавел, че-то говно сложное и мутное оказалось, документация малопонятная, джунов пытались подключить - им вообще темный лес, потом пересели на Симфонию - все просто, логично и понятно, стандартам соответствует, все новые фишки там, дока понятная, джунов достаточно быстро подтянулись, еще вроде как и побыстрее, на ней и остановились. До Yii2 не дошло, симфонии на все хватило. Теперь на новых проектах ее ставим.
Dependency injection с ней связан.
Ioc-контейнер получает тип аргументов метода с помощью рефлексии.
Нет, трюков с рефлексией в коде обычных сайтов быть не должно, так как она позволяет извлечь внутренности объекта, поменять приватные свойства/методы на публичные и не только, то есть программа может менять себя по ходу выполнения. Рефлексия может использоваться в библиотеках для генерации документации по коду, либо библиотеках для обнаружения багов в коде (PHPStan, Psalm). Нужно понимать как работает рефлексия (почитать мануал на php.net), так как будешь часто натыкаться на неё в коде библиотек, но в своих проектах стоит её избегать.
>>53538
IoC это один из подходов для организации слабой связанности между частями системы: https://martinfowler.com/bliki/InversionOfControl.html
К рефлексии это не имеет никакого отношения, ты путаешь с autowiring - там да, на рефлексии: https://symfony.com/doc/current/service_container/autowiring.html
>>53649
Никак.
>>53348
Поставь EAP версию (месяц бесплатно) и просто переустанавливай каждый месяц, до тех пор пока не начнёшь зарабатывать программированием деньги. Если студент - можешь отправить фото студбилета, дадут лицензию на год (я так 4 года продлевал). Ещё у них бывают скидки на день дружбы 40%. В общем, не воруй, лучше поддержи отечественного производителя.
В обычном классе у тебя в конструкторе будет написано куча $var = new SomeClass($arg1, $arg2, ...). При инверсии контроля у тебя в phpdoc класса будет написано что-то вроде @inject SomeClass.
Дальше работа контейнера зависимостей будет в том, чтобы при создании классов через него эти строки через рефлексию понаходить, подбирать нужные аргументы/объекты/классы и инжектить их в конструктор класса. При всем этом часто нужно бывает посмотреть в методы и phpdoc класса до его инстанциирования через рефлексию.
Я сегодня-завтра постараюсь ответить на неотвеченные посты, но вы можете так же напомнить о себе в новом треде, хуже от этого не будет.
1. Не понимаю в чем профит сервис контейнера? Уже пересмотрел много видео и статей и примеры. Но я не понимаю через сервис провайдеры мы как бе можем подменять реализации интерфейсов того что будет храниться в сервис контейнере, но мы как бы можем сделать это и без него в чем профит использовать именно его? Да реализация через него синглтона довольна удобно и ясна, но она не так часто нужна, так для чего еще?. Так что вопрос зачем?
2. Заодно вопрос какая структура папок должна быть для контрактов и их реализации.
3. Если бороться с жирными контроллерами через сервисный слой то какую выбрать структуру папок чтоб можно было вернуться к проекту через месяц?
Объясните, как писать код с HTML и PHP одновременно? В одном файле хранить код или отдельно?
Прочитал про шаблоны ОПа, но че то не понял.
Сначала обрабатываешь данные которые пришли от пользователя, потом работаешь с базой данных и только потом делаешь шаблон страницы на ХТМЛ с вкраплениями ПХП кода для вывода динамического содержимого страницы.
можно все писать в одном файле, но нахуя? тебе жалко места в папке для еще одного файла?
Это копия, сохраненная 11 марта 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.