Ответы пользователя по тегу PHP
  • Twig и два автолоадера, как разрулить?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Любопытства ради, а как вы свой автолоадер регистрируете? Надеюсь через spl_register_autoload? Если так - то нужно просто в нужном порядке это дело разруливать и проблем не должно быть.
    Ответ написан
  • Хороший пример чпу? Может у кого-то есть готовы вариант?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вы путаете "ЧПУ" и маршрутизатор.

    Лучше взять готовое решение: https://github.com/nikic/FastRoute например. Или чего попроще найти.

    Ну или посмотрите как оно реализовано.
    Ответ написан
  • Когда использовать protected, private, public и static методы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Есть такая штука в ООП как инкапсуляция. С этого стоит начать и в принципе можно было бы закончить, если бы не static и не protected.

    public
    Публичные методы класса. Логично да? Какие методы у нас должны быть публичными - те которые составляют интерфейс класса. То есть для, например, класса кеширования у нас должен быть такой интерфейс:
    interface Cache {
        public function get($name);
        public function set($name, $value);
        public function has($name);
        public function remove($name);
        public function removeAll();
    }


    Давайте введем понятие "клиентский код". Это тот код который будет использовать ваш код, ваши объекты. Что он должен знать о реализации ваших классов? Да ничего он знать не должен. Он должен знать только как им пользоваться. Это как раз таки интерфейс и регламентирует. Мол "этот объект позволяет вам брать/сохранять/удалять данные в/из кэша. Клиентский код не знает где кэш находится, есть ли он вообще... да и ему и не нужно.

    private
    Внутренние методы классов. Те которые не входят в интерфейс но нужны, скажем, для уменьшения дублирования реализации.

    class FileCache implements Cache{
        public function has($name) {
              return is_file($this->getCacheFilePath($name));
        }
    
        public function get($name) {
             if (!$this->has($name)) {
                  return null;
             }
     
             return unserialize(file_get_contents($this->getCacheFilePath($name)));
        }
    
        private function getCacheFilePath($name) {
             return $this->cacheDir . '/' . $name;
        }
    }


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

    static
    Статические методы, это всяческие методы хелперы. Например в языках типа Java есть такое понятие как именованные конструкторы. Мол когда для конструирования объектов нужно много данных переделать или что-то еще, для удобства заводят статический метод какой а в нем уже реализуют какую-то логику. Желательно вообще что бы статический метод не содержал много логики, но... всякое бывает. Вообще тут стоит еще поподробнее почитать о том как себя ведут статические методы и свойства, в чем их особенность и т.д. Попробуйте тот же сингелтон сделать к примеру.

    class Template($content) {
        public static fromFile($path) {
             return new static(file_get_contents($path));
        }
    }


    Вот... Возможно человеки вроде FanatPHP разгромят мой ответ, или дополнят его...

    Так же если вам хочется научиться правильно составлять интерфейсы классов, следует почитать про low coupling и high cohesion. Эти два принципа должны заставить вас соблюдать баланс и держать в интерфейсе класса только то, что там должно быть. Так же к вопросу о наследовании можно подключить принцип подстановки Барбары Лисков. Даже на той же википедии почитайте. А там если станет интересно в принципе можно поискать интересные материалы по GRASP и SOLID.
    Ответ написан
    4 комментария
  • Продолжит ли работать скрипт php если клиент закрыл бразуер ?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вы можете оборвать запрос со стороны сервера, сказав клиенту что мол данных от вас больше не поступит и соединение можно закрывать. А скрипт после этого продолжит работать и может делать какие-нибудь тяжелые задачи. К сожалению это умеет только php-fpm.

    php.net/manual/ru/function.fastcgi-finish-request.php

    Эту функцию использует Symfony/HttpFoundation при отправке запроса. Сам же Symfony из коробки отправляет почту к примеру только после этого, так что время отправки сообщений пользователю не влияют на время запроса между клиентом и сервером.

    Если же вам нужно как-то отследить что пользователь закрыл TCP сессию (закрыл вкладку, ребутнул комп или просто нажал "стоп"), то PHP об этом узнает, как и сказал xmoonlight, только при попытке записи (по flush). Что бы все было лучше можно делать проверку используя функцию connection_aborted().

    Так же есть особенности работы web-server-а. Скажем nginx будет держать соединение сколько вы того пожилаете. А вот apache убьет соединение через минуту вне зависимости от настроек PHP (могу ошибаться, давно не имел дела с апачем).
    Ответ написан
    Комментировать
  • Как при помощи php добавить новое значение в json строку?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) json_decode
    2) манипуляции
    3) json_encode
    4) профит
    Ответ написан
    3 комментария
  • Как настроить единую точку входа в связке nginx - php-fpm?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Берете тот же конфиг, который делает это для всего сайта (для любого фреймворка популярного с одной точкой входа) и просто прописываете location правильный.
    Ответ написан
    Комментировать
  • Как быстро войти в основы php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я думаю вам сразу можно начать с getjump.github.io/ru-php-the-right-way а дальше по мере необходимости обращаться к официальному мануалу.
    Ответ написан
    Комментировать
  • Эмулирование многопоточности в php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    pthread еще.

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Возможно потому что short_open_tag = off
    Ответ написан
    1 комментарий
  • PHP. Упрощенный язык для записи регулярных выражений пользователями?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Пользователь пишет "*." equal " "


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

    шаблон "Interpreter"

    Чта?

    Вообще реализовать свой простенький DSL не сильно проблема. Вопрос что вам нужно делать. В целом же регулярные выражения проще чем они есть не опишешь. Вопрос только в реализации примеров, превью изменений и т.д.
    Ответ написан
  • Как рассчитать размер кластера жесткого диска ?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Что вы собираетесь расчитывать? Есть физический размер класстера. Есть тот, который установлен для файловой системы. Если файлы мелкие - выбирают минимальный размер кластера равный физическому. Если файлы большие - побольше.
    Ответ написан
    8 комментариев
  • Как передать параметром интерфейс?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Интерфейс - никак. Объект реализующий интерфейс - легко. Поймите в чем разница и будет вам счастье.
    Ответ написан
    Комментировать
  • В чем проблема с mcrypt?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Module compiled with module API=20090626
    PHP compiled with module API=20121212


    как не странно. Вы поставили модуль не для той версии PHP.
    Ответ написан
  • Какие есть книги/статьи (большие) на тему разработки движка (CMS) сайта?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    CMS это конечный продукт. В основе CMS должно быть ядро, или фреймворк. Можно взять готовый, можно писать очередной велосипед.

    Я рекомендую вам взять Silex и Doctrine DBAL (не ORM) + PHP-DI и баловаться.

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

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вы видимо еще не меняли батарейку на материнской плате... Есть такая штука как RTC, которые сейчас интегрированы в южный мост материнки.
    Ответ написан
  • Где найти пример хорошего кода?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    gist.github.com например или смотрите реализацию популярных фреймворков и инструментов. Например Symfony2, Laravel.

    В целом же, как правильно подметил Виктор Выскребенцев, правильного решения не бывает.
    Ответ написан
    Комментировать
  • Как реализовать клиент-серверное приложение?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Сокеты, постоянные соединения.... можно просто за основу чатики сделать. Есть сервисы push-уведомлений типа pusher.com и т.д. Ну а дальше слишком много вариантов.
    Ответ написан
    Комментировать
  • Дайте совет по поводу языка программирования?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Если вы разберетесь с Java - разобраться с Php проблем не составит. А еще есть c#, который похож на Java только лучше. Да и с учетом того что есть mono с кросплатформенностью проблем не будет.

    Что по поводу мелких сайтов на Java - почти не встречаются, слишком это... дорого. В основном это какие-то web-сервисы для каких-то мобильных приложений или внутренние системы.

    Если захотите попрактиковаться - перепишите Jenkins.
    Ответ написан
  • Стоит ли на 100% доверять мнению PageSpeed Insights?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Каждый пункт их рекомендаций неплохо так аргументирован. Рекомендую ознакомитсья подробнее почему они это все рекомендуют.

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

    Так же добрая половина их советов поддается автоматизации. Начиная выделением этих "критических мест в css" и оптимизацией доставки css и откладывания выполнения jS, до всевозможных минификаций. Естественно если проект старый и изначально не закладывались в него такие вещи то будет тяжко.
    Ответ написан
  • Как через foreach выводить определенное количество записей?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Лучше делать эти ограничения до форичей, что бы было меньше проблем.
    $data = range(0, 100);
    $first15Entities = array_slice($data, 0, 15);
    
    foreach ($first15Entities as $entity) {
        echo $entity;
    }


    Почему? Да что бы упростить логику. Можно конечно проверять текущий индекс и в for и в foreach и стопать выполнение, но это не удобно банально и если у вас в будущем поменяется количество элементов которые нужно обрабатывать или еще что - то начнется веселье. А так вы не завязываете на это вот "правило" код который отвечает только за обход массива и вывод его значений.
    Ответ написан
    Комментировать