• Сделать карьеру на PHP: Symphony vs Zend?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос, как всегда, поставлен жутко неграмотно, так сказать, по деревенски: без какого бы то ни было видения перспективы, хотя бы на 5 лет вперёд.

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

    Это, я не знаю, как спросить "хочу быть столяром, какую отвёртку мне изучать, крестовую или шлицевую?".

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

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

    И кстати для изучения принципов симфони подходит лучше

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

    Да, и самое главное я тоже забыл сказать. Коллега xfg в самую точку написал в комментарии:

    Фреймоворк - это на самом деле тонюсенькая прослойка над приложением. Это, по сути, система подай-принеси, принять запрос с фронта и отправить ответ. А что именно будет в ответе - решает не фреймворк, он здесь уже не при делах.

    Очень на эту тему прочищают мозги доклады и видео Дмитрия Елисеева. У него на сайте как раз появился доклад с PHP Russia 2019, который я горячо рекомендую.

    На ту же тему был и доклад Томаша Вотрубы, кстати. Что фреймворки, по сути, можно менять как перчатки, при желании. И у него есть даже инструмент для этого. Но в данном случае речь не об инструменте а о том, что фреймворк- далеко не главная часть приложения, и упираться в изучение фреймворков это все равно что в изучение отверток.
    Ответ написан
    4 комментария
  • В чем суть облачных сервисов?

    DevMan
    @DevMan
    облако - это гибкое управление инфраструктурой.
    автоматическое создание нужных инстансов когда они нужны (и удаление их когда они не нужны) с автоматическими балансерами; изменение параметров сервера налету; беспроблемная миграция между разными локациями; всякие сервер-лесс'ы/и т.п./т.д.
    трендово: потому что люди лепят этот термин зачастую даже не понимая что он значит.
    по факту: хомякам вообще без разницы.
    Ответ написан
    Комментировать
  • Почему PHP теряет популярность?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    Никогда не ведитесь на уговоры разрабатывать какой то веб проект на каком то экзотичном языке, например Питоне или Яве, в результате вы получите костыльный долгострой и дефицит программистов которые будут готовы над ним работать.
    Это как в моде - есть всякое эпатажное дерьмо для показов на подиуме, а есть повседневные джинсы с рубашкой, все любят обсуждать эпатаж но носят джинсы.
    Ответ написан
    26 комментариев
  • Почему PHP теряет популярность?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    PHP не мода, php - классика, а классика никогда не умирает. Если умрет php, то умрут все остальные языки backend разработки потому что появится что-то такое, что сможет в разы превзойти пхп в простоте, скорости и удобстве, на данный момент что джава, что питон, что руби +- одинаковые, каждый подходит для своих целей. Тот же питон выбирают из-за простоты интеграции нейронных сетей, но если говорить не о узких, а о главных параметрах (функционал, скорость и тд) все популярные бэк языки более или менее одинаковые смотрите те же сухие графики.
    А о уменьшении вакансий - глупость несусветная. трын тут приведена статистика за 2018 год и обоих графиках по вакансиям лидирует в сравнении с java/python PHP, при том на первых двух пишут как бэкэнд, так и миллион других штук. А на втором графике и вовсе пхп опережает js (единственный язык в самой популярной сфере разработки).

    А вот если речь идет о реально крупных компаниях (amazon, google...) там как раз предпочитают python из-за выше упомянутой простоты интеграции нейросетей, а java из-за стабильной поддержки сверх высоких нагрузок.

    Меньше слушайте диванных экспертов, пхп предрекают смерть с 00-х годов, что то он слишком долго дергается для мертвеца.
    Ответ написан
    1 комментарий
  • Как реализовать такую архитектуру на Eloquent laravel?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Подписался на вопрос, но точно скажу что:

    1. null'и ненужные поля, они не занимают много места. Будет хлам в таблице, но если в коде разбить одну таблицу на несколько моделек - будет уже лучше и спокойней.
    2. json - не очень вариант, только если как-то это абстрагируешь и будешь все из json'а пихать назад в аттрибуты, что бы с этим было удобно работать в коде. Но это тоже так себе вариант.
    3. если использовать uuid и морф связи без foreign ключей - да, как вариант
    4. не создавать профили кому не нужно и все)
    5. нет, хрень. Даже хуже чем второй вариант.

    В этом конкретном случае я бы выбирал между вариантами 1 и 3, ибо привязывать примитивку "специализация" к какому-то отдельному энтити - такое себе удовольствие. 1-ый не такой плохой как кажется, а с третим теоретически сложнее работать, хотя это неплохая идея.
    Ответ написан
    Комментировать
  • Как расшифровать эту строку в коде?

    IgorPI
    @IgorPI
    document - текущий документ
    getElementById() - метод получения элемента используя id
    onchange  - свойство элемента для обработчика события
    function (event){} - анонимная функция (обработчик события)
    
    event - локальная переменная в контексте анонимной функции
    target - таргет он и в африке таргет (целевой элемент, где происходит туса)
    parentNode - родительская нода
    childNodes[1] - у родителя есть дети
    data - у детей есть данные
    slice(1) - отхренашить кусочек
     
    currentKey - отхренашеный кусочек
    Ответ написан
    Комментировать
  • Как исправить ошибку of undefined 'x'?

    @afanasiyz
    Javascript-разработчик
    У вас тут что то страшноватое :(
    Как минимум, настройте, пожалуйста, отступы.

    1. Вы вызываете функцию loadGame, она берется из из Game.prototype.
    2. loadGame вызывает функцию this.knight - она тоже выбирается из Game.prototype (пустая функция)
    3. Вызывается функция draw, там используется this.size.x - а this.size - не существует, это поле не заполнено.

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

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

    Лаг (задержка, иногда пинг) -- время ожидания ответа, особенно сильно влияет при большом количестве последовательных соединений, каждое из которых будет ждать своего ответа. Например, при открытии сайта: ДНС-запрос, установка защищённого соединения, запрос контента, загрузка тела страницы, загрузка какого-нибудь скрипта, загрузка графики, загрузка данных на страницу каким-нибудь AJAX-запросом. Если лаг соединения будет 500 мс, то только на ожиданиях каждого из этапов мы в таком сценарии потеряем 3,5 секунды. А ведь количество нераспараллеливаемых запросов может быть на порядки больше. Часто так и бывает. Например, главная страница Тостера у меня грузится в 45 запросов, не все они последовательные, но всё же.

    Качество соединения тоже немаловажно. Если происходит потеря пакета, то в протоколах с обеспечением доставки, например, TCP, по которому и осуществляются HTTP-соединения, данные придётся запрашивать заново. А все остальные подождут, пока потерянный пакет всё-таки не придёт. А в худшем случае может произойти и обрыв соединения, который может привести вообще к необходимости полного рестарта всего процесса загрузки данных.

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

    Проверяйте эти показатели.
    Ответ написан
    Комментировать
  • Перестал загружаться пк после артефактов?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    С чем может быть связана проблема?
    С неустранимой неисправностью видео-карты.
    Ответ написан
    5 комментариев
  • Где лучше взять VPS?

    Astrohas
    @Astrohas
    Python/Django Developer
    Из всей троицы OVH, DO и Hetzner, могу порекомендавать последнего, из за соотношения цены/ресурсов.
    К примеру 2GB Ram/70GB SSD /1Cpu обходиться в 4.5 Euro, 2GB Ram/20 SSD /1Cpu - 2.79 Euro
    Ответ написан
    5 комментариев
  • Где лучше взять VPS?

    profesor08
    @profesor08
    OVH, Hetzner, все остальное на свой страх и риск.
    Ответ написан
    Комментировать
  • Какие выбрать платные курсы по изучению php?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Никакие.
    Порядок самообучения для любого языка:
    1. Учим базу по официальной документации.
    2. Практикуемся (LOOP: 5-10)
    3. Учим следующий более сложный раздел
    4. Смотрим исходный код лидирующих и актуальных проектов для понимания правильной организации кода (код микрофреймворка для разработки или код простого приложения).
    5. Пробуем сделать похожую структуру кода сами.
    6. GOTO 2
    Ответ написан
    7 комментариев
  • Как объявлять компоненты в React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Классовые компоненты никуда не уходят. Для них осталось несколько удобных кейсов. Например:
    1. Удобное получение предыдущих значений свойств и состояний в componentDidUpdate.
    2. Доступ к экземпляру компонента в хандлерах, передаваемых в браузерные API.
    3. Сложные компоненты с большим количеством методов. Например VideoPlayer.

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

    Оптимизация это отдельный вопрос, которому стоит посвятить время. Сейчас разве стоит предупредить вас, что преждевременная оптимизация - зло.

    Попробуйте использовать в коде преимущественно функциональные компоненты и хуки. Сейчас почти все популярные библиотеки имеют в API довольно удобные в использовании хуки. Там, где покажется, что будет удобней использовать класс, не бойтесь использовать классы.
    Ответ написан
    1 комментарий
  • Для чего нужен динамический импорт React?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    1. Динамические импорты.
    2. Это разные вещи, изучай.

    Документацию, поди, не открывал вообще?
    Ответ написан
    Комментировать
  • Как расширить существующую модель на PHP?

    serginhold
    @serginhold
    как бы сначала надо ответить на вопрос "где это нужно и зачем"

    Вариант 1
    Не надо делать ооп ради ооп, просто в класс Message добавь метод getUrl()

    Вариант 2
    Message это какой-то сторонний класс, и нет возможности его изменить, по этому делаем над ним декоратор.

    class MessageDecorator
    {
        private $message;
    
        public function __construct(Message $message)
        {
            $this->message = $message;
        }
    
        public function getTitle()
        {
            return $this->message->getTitle();
        }
        
        public function getText()
        {
            return $this->message->getText();
        }
    
        public function getUrl()
        {
            // create url
            return 'url';
        }
    }
    
    $message = new MessageDecorator(new Message($title, $text));
    $url = $message->getUrl();


    Вариант 3
    Выносим генерацию url в отдельный сервис

    class UrlService
    {
        public function getMessageUrl(Message $message)
        {
            // create url
            return 'url';
        }
    }
    
    $message = new Message($title, $text);
    $urlService = new UrlService();
    $url = $urlService->getMessageUrl($message);
    Ответ написан
    2 комментария
  • Чем плохо написание кода функциями?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Зачем нужен ООП?
    Кратко зачем ооп вместо функций:
    1) Снижение сложности кода(да, звучит странно, но на самом деле именно так и есть - сложные вещи пишутся 1 раз, а далее вы пользуетесь практически предложениями естественного языка и описываем реально существующие манипуляции с реальными объектами, например $user->getName(), $image->rotateLeft()...)
    2) Инкапсуляция - все что делает объект изолированно внутри одного инстанса, вы работаете по сути с отображением реальных объектов в цифровой мир(+ этот объект может быть сколь угодно сложным внутри, наружу он смотрит простыми методами для возможности операций над ним).
    3) Снижение затрат памяти - классы подгружаются только в необходимом объеме и в нужно месте, в процедурном подходе все функции грузятся сразу.
    4) Локализация кода - всегда логика одной сущности доступна в одном месте, не размазана по функциям и коду. Это такой нехилый бонус к инкапсуляции, и при рефакторинге вам не надо переписывать кучу кода, если объект был изначально правильно построен, максимум поменять немного логику внутренней обработки данных.

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

    Я понимаю что это плохо и не правильно, но оно работает, хотел бы попросить у Вас совета, насколько это плохо, и можно ли использовать данный подход?
    Почему нельзя?
    Оно работает?
    Оно решает проблему бизнеса на сейчас?
    Бизнес устраивает решение которое "будет работать только здесь и сейчас, а стоимость погашения технического долга и расширения будет равна написанию приложения с нуля, но это будет потом"?
    Если все ответы - "да" значит все не так уж плохо на сегодняшний день, и билет на само в порядке, по крайней мере пока вы работаете там.
    Но я бы серьезно задумался о будущем в плане развития.
    Ответ написан
    Комментировать
  • В чем смысл передачи данных таким образом?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    я про то что данные передаются через конструктор . Ведь можно просто в самом коде их определить того же файла
    В конструктор в данном случае передаются на данные, а объект, который будет строить запросы. Это же класс репозитория - он инкапсулирует запросы к БД, но пользуется при этом моделями Eloquent.

    class PortfoliosRepository extends Repository {
      public function __construct(Portfolio $portfolio) {
        $this->model = $portfolio;
      }
    
      // Этот метод, скорее всего, есть в базовом классе
      public function find(int $id): ?Portfolio
      {
        return $this->model->find($id);
      }
    
      // А это пример инкапсуляции сложной логики
      public function featured(): Collection
      {
        return $this->model
          ->with(['some', 'relations'])
          ->where('field', 'value')
          ->orWhere('other_field', 'value')
          ->orderBy('created_at')
          ->limit(42)
          ->get()
          ->each
          ->append('mutated_attribute');
      }
    }


    Используется этот класс так:
    $repository = new PortfoliosRepository(
      new Portfolio // <- не какое-то существующее портфолио из БД, а "пустой" объект
    );
    
    $repository->featured();
    Ответ написан
    Комментировать
  • Как привязать footer к низу экрана в Twitter Bootstrap?

    @web11
    для bootstrap 3 есть отдельный пример с прижатым footer
    getbootstrap.com/examples/sticky-footer

    в файл стилей нужно добавить
    html {
      position: relative;
      min-height: 100%;
    }
    body {
      /* Margin bottom by footer height */
      margin-bottom: 60px;
    }
    #footer {
      position: absolute;
      bottom: 0;
      width: 100%;
      /* Set the fixed height of the footer here */
      height: 60px;
      background-color: #f5f5f5;
    }
    Ответ написан
    6 комментариев
  • Поиск 2х вариаций слов тексте с помощью регулярных выражений?

    @elliot
    Вот такая регулярка подойдет:
    /[\b\s](ban|бан)[\b\s]/i

    [\b\s] - это 1 любой из этих токенов \b (граница слова) или \s (whitespace символы).
    Дальше все верно было написано: (ban|бан).
    И после также [\b\s].
    Вконце модификатор i - это нечувствительность к регистру, чтобы BaN тоже совпало.
    Если тебе не хотя бы 1 один, а несколько ban/бан нужно искать, то можно добавить модификатор g рядом с i вконце.
    Ответ написан
    3 комментария