Задать вопрос
  • Как выбрать "правильный путь" в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    например mysql_query, который показывается как единственный вариант работы с БД в абсолютном большинстве учебников


    Старых учебниках. Очень старых учебниках. Открываем документацию по PHP и видим:

    This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include:
    mysqli_query()
    PDO::query()


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

    www.phptherightway.com (есть перевод на русский старой версии, он обновляется но лучше почитать оригинал).
    Ответ написан
    7 комментариев
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

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

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

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

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

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

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

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Dependency Injector это магия?

    toxicmt
    @toxicmt
    кофаундер Хекслета
    Внедрение зависимостей может происходить не только через конструктор, но и, например, через сеттеры. А многие библиотеки для внедрения зависимостей используют рефлексию для того чтобы узнать "а что собственно требуется". Рефлексия это способность программ узнавать структуру самой себя во время выполнения. В php это php.net/manual/ru/intro.reflection.php.
    Ответ написан
    Комментировать
  • Как в sublime конвертировать индентацию 2 таба в 4?

    e_s_l
    @e_s_l
    Full-stack web developer
    Сделайте сперва конвертацию в табы, потом поставьте ширину таба 4. Я еще затем конвертирую табы в пробелы и получаю 4 пробела. Всегда так делаю, всё работает.
    Ответ написан
    Комментировать
  • Как подгрузить контент?

    @IceJOKER
    Web/Android developer
    Вот само меню, но если добавить ссылки в тег то это уже не будет MVC - чего чего? О_О можете объяснить почему не будет?
    Ответ написан
    4 комментария
  • Верстать без фреймвороков это значит быть не професионалом?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Быть профессионалом - значит знать и правильно применять необходимые инструменты для наиболее эффективного решения задачи. А также НЕ применять, если в этом нет необходимости.
    Ответ написан
    4 комментария
  • Объясните по-простому суть индексов в MySQL?

    - Анжела, где в нашей библиотеке искать посты с типом 15, статусом "опубликовано" от 13 марта 2015 года? А то читатели спрашивают, а перебирать все подряд я буду до конца следующей недели.
    - Без проблем, Вероника, сейчас скажу (заглядывает в индекс). Так, опубликованные посты с типом 15 начиная с февраля и заканчивая сентябрем 2015 лежат в третьем зале, 10-й шкаф, 5-я полка сверху. Конкретный пост сама найдешь, там на полке больше 20-ти штук все равно не помещается.
    - Благодарю!
    Ответ написан
    5 комментариев
  • Что значит "опыт верстки под битрикс, вордпресс и т. д."?

    Тут 2 варианта:

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

    Верстка - это когда макет превращается в набор html/css/js файлов.

    Да, могут быть вариации. Может быть сразу под движок: Smarty, Twig, Jade, или все шаблоны в Handlebars, или сразу чтобы всё под Angular было. Но это всё частные случаи, требующие более высокой квалификации, или находящиеся уже где-то во front-end разработке.

    2. Просят учесть особенности CMS.

    Маленьких нюансов может быть много.

    Вот Битрикс, например, и его Эрмитаж (тыкнул в блок - тут же его отредактировал если по простому). Где-то лишняя обертка элемента, чтобы в режиме редактирования не разваливалось. Везде - z-index меньше 1000, чтобы Эрмитаж не перекрывало.

    Wordpress вообще генерирует огромное количество своих классов. Взять те же навигационные меню. Использовать их = наплевать на все эти ваши БЭМ и прочее.
    И т.д.

    Если я верстал и без проблем натягивал свои макеты на Wordpress - могу ли сказать что у меня есть опыт верстки под Wordpress?

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

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

    Когда ему движок выдаст меню в виде
    .menu
        ul
            li

    Но я не считаю это своей проблемой.
    Когда понадобилось, оказалось нет ничего сложного 1 раз потратить время и написать свой вывод меню в Wordpress, чтобы можно было любую верстку натянуть. Почему так не может сделать тот кто натягивает? Почему в ТЗ об этом не предупредили?

    Уменьшает ли "опыт верстки под CMS" время верстки?
    Если не были оговорены нюансы (те же меню WP) - то нет.
    Может увеличиться время натягивания верстки на движок, но это уже проблемы заказчика, который не озвучил требования заранее.

    Таким образом, хотя в идеале на движок должно быть возможным натянуть любую верстку, действительно некоторые имеют CMS особенности.
    Об этих особенностях следует договариваться заранее. Должно быть конкретное ТЗ на верстку.
    В остальном как правило речь об "опыте верстки под %CMS%" - просто болтовня.
    Ответ написан
    Комментировать
  • Как получить макет в PSD из web-страницы (HTML)?

    victory_vas
    @victory_vas
    Сделать скрин и открыть в psd ))
    Ответ написан
    Комментировать
  • Тенденция к перехвату проектов/клиентов сотрудниками с последующим увольнением. Что делать?

    @Alexey_Kutepov
    Разработчик программного обеспечения
    У Вас довольно предприимчивые сотрудники, раз такое проворачивают. Мне кажется что дело в характере: если человек от Вас ушёл и организовал свой бизнес, то тут скорее всего Вы недосмотрели при подборе персонала.
    Есть люди, которым никогда не хватит смелости организовать свой бизнес или им просто это не нужно. Максимум что они могут - уйти к конкуренту. Вот таких и ищите)

    Тем чувакам которые от Вас ушли нужно пожелать удачи и поздравить с избавлением от рабства! Я такими всегда восхищаюсь
    Ответ написан
    Комментировать
  • Какой дистрибутив linux ставить для комфортного программирования?

    Olej
    @Olej
    инженер, программист, преподаватель
    что если бы был дистрибутив, который бы не требовал железа, на котором можно играть в самые современные игры и на котором бы не приходилось по несколько дней ставить обычный nodejs

    Ваш дистрибутив - Windows ;-)
    Ответ написан
    Комментировать
  • Можно ли сделать отдельный фавикон для поддомена?

    Lumore
    @Lumore
    Front-end developer
    Можно. Судя по вашему вопросу, вы не разбираетесь в веб разработке.
    Ответ написан
    Комментировать
  • Виновен ли я в самописном движке?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    СЕОшнику скажи спасибо: шеллы на рынке всегда нужны, лом, говорят, тоже вполне помогает двигать (Гугел только разборчивый стал, тематическое ему подавай)

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

    морально - можешь послать их нафиг и искать следующих, если условий ТЗ ты не нарушал - все остальное - личное мнение каждого
    Ответ написан
    1 комментарий
  • Виновен ли я в самописном движке?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    с одной стороны SEO-ник не прав, так как.. ну это очень глупое утверждение

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

    То есть притензия SEO-ника возможно была связана с тем что:

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

    Мораль: эксперементы в свободное время, набирайтесь опыта. Старайтесь использовать готовые решения. Помимо wordpress есть масса небольших и удобных CMS с базовыми штуками которые нужны SEOникам и удобны в допиливании программистами.
    Ответ написан
    4 комментария
  • Виновен ли я в самописном движке?

    Alexanevsky
    @Alexanevsky
    Любительская web-разработка
    Не беспокойтесь.
    Когда у них встанет вопрос поддержки и расширения функционала, они поймут, что вордпресс - очень ограниченный выбор, и пожалеют. К вам не вернутся, конечно, но им воздастся. :)

    А вообще я согласен: к чёрту CMS, они очень ограничивают. Сам я без них не очень могу, но если есть возможность работать без CMS - это правильное направление.
    Ответ написан
    4 комментария
  • Как вы думаете обман?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Без страхового платежа мы не имеем права Вам выслать задания.

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

    Собственно раз вы задали подобный вопрос, то лучше не ходите на фриланс - будете только расстраиваться. Лучше ищите постоянную работу.
    Ответ написан
    Комментировать
  • Как сделать, чтобы периодически на странице появлялась модульное окно?

    miraage
    @miraage
    Старый прогер
    Из лояльности к пользователям, специально не подскажу, как это сделать.
    Ненавижу эти тупые модалы.
    Ответ написан
    7 комментариев
  • Путь программиста.Стоит ли?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Не важен путь, который выберете вы. Важно то, как вы его пройдете.
    Самообразование - ключ к любой профессии. Никто и никогда вас не станет ничему учить. Забудьте об этом, все только сами.
    Как, по-вашему люди из самых запдрыпанных мест становятся великими? Трудом.
    Учитесь тому, что интересно. Хотите GameDev? Без проблем. Сейчас осень, впереди зима и весна. Садитесь за Java или Swift. Напишите к лету приложение и разместите его в магазине. Будет настоящий незаменимый опыт. Потом еще и еще. Не сразу, но начнете на этом зарабатывать. Было бы желание, остальное приложится.
    И к экзаменам тоже можно подготовиться. И сдать их на отлично самому. Не смотрите на ленивцев вокруг. Они вас кормить не станут. Они так и дальше будут сосать пиво из бутылочки и сидеть на шее у родителей до последнего.
    Или вы тоже хотите пойти на стройку, чтобы зарабатывать на пиво? Тогда вперед.
    Ответ написан
    Комментировать
  • Как правильно записать и в дальнейшем работать с датой?

    0x9d8e
    @0x9d8e
    Велосипедостроитель в терминальной стадии
    Стандартный подход это хранить таймштамп (количество секунд, прошедших с 01.01.1970) и перед выводом преобразовывать в нужный формат.
    Ответ написан
    Комментировать
  • В чем ошибка в php?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    1) На скриншоте не видно что такое 36 строчка.
    2) Могу догадаться что это global $connect
    a) внутри описания класса нельзя объявлять global. максимум можно объявить в конструкторе.
    б) не используйте global никогда! Почитайте про dependency injection и используйте его.
    Ответ написан
    2 комментария