Ответы пользователя по тегу PHP
  • Как выбирать действие в зависимости от типа объекта?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    > Теперь объекты, которые создает фабрика имеют подтипы. Требуется разный алгоритм выбора действия в зависимости от подтипа созданного фабрикой объекта

    Значит фабрика у вас не должна ничего решать сама. Разные типы + разные действия = разные классы, фабрики.

    1. Может проще создать парочку отдельные фабрик для этих подклассов и в нужном месте вызывать нужную, не ожидая, что какая-то стратегия правильно сматчит вам фабрику?
    2. Если у вас еще одна фабрика появилась, то это не значит, что здесь супер узкое бутылочное горлышко и его нужно рефакторить. Тем более, если пока сами не знаете как лучше это сделать. Сделайте пару развилок через if. Когда появится больше запросов к этому коду, тогда и новое поведение подскажет, как всё-таки он должен выглядеть.
    3. Если всё-таки хотите как-то отрефакторить сейчас, то вариант от vilinyh подойдет на первое время. А возможно и на всегда.
    $object = Factory::create($id);
    $action = ActionFactory::create($status, $object);
    $action->run();

    Только для ясности я бы его переписал так:
    $factory = Factory::create($id);
    $result = $factory->run($status);

    Немного пояснений:
    Factory::create() – отдаст вам фабрику по объекту. Там сделаете пару if на проверку типа.
    $factory->run() – выполнит нужные действия уже в фабрике нужного класса.

    4. А еще можно сделать методы не статическими, обернуть интерфейсам, инжектить через контейнер, сделать промежуточный AggregateFactory, который будет делать if $subFactory->supports() цикле по всем фабрикам, которые реализуют уже логику, умно отлавливать ошибки, логировать результаты и всё в этом духе. Почти стратегию и реализовали таким способом. Но вот только нужно оно вам сейчас? :)
    Ответ написан
    2 комментария
  • Как лучше реализовать постоянный отсчёт времени и суммирование значений?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    > "Если в реляционной базе данных, то начисление 1000 пользователей с 4-5 карточками у каждого делается одним SQL-запросом"
    > да, так и планировал сделать.

    Не советую так делать, если не хотите зафакапить данные.
    Даже обход в цикле 5000 тысяч строк не займет больше 5 минут. Зависит от сетапа, конечно.

    Делайте поочередную выгрузку, последующее обновление с логированием куда-нибудь в файл, бд, stdout.
    В случае, когда что-то пойдет не так, можете заглянуть в логи и увидеть, что 1 и 5000 строчек не обновилась, вместо того, чтобы все 5000 строк не были затронуты.
    Если много памяти потреблять будет, то можно воспользоваться батч-запросами или курсором.
    Скрипт на 5 минут в день не повлияет на вашу производительность приложения. Делать 1 запросом может и быстрее, но только если вы уже всё отстроили и точно уверены в том, что этот запрос никогда сбоить не будет. Даже после изменения схемы БД другим программистом, который забудет поправить ваш скрипт ;)
    Ответ написан
    Комментировать
  • Как получить код во время работы PHP на фронте?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    То есть мне нужно получить echo в момент echo а не когда все сформируется. Как это можно сделать?


    В какой момент и что получить?

    ----------

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

    Я, честно говоря, ничего не понял, что вы написали в описании и отвечу на вопрос "Как сделать progress bar для долгого процесса на PHP":

    Для упрощения моих примеров, давайте расскажу про процесс доставки еды.
    У этого процесса мы сделаем 4 этапа:
    1. Отправить заказ и получить подтверждение от провайдера услуги – ресторан, который приготовит нам на вечер роллы и пиццу, да чтобы без сухой корочки.
    2. Найти курьера и отправить его в ресторан ждать заказ.
    3. Подождать пока ресторан приготовит заказ.
    4. Доставить заказ голодному клиенту.

    -----

    Вам нужно хранилище для логирования этапов выполнения процесса: SQL, NoSQL, файловое или другие хранилища.
    Советую выделить несколько свойств у процесса:
    1. Этап выполнения. Будем называть его State в дальнейшем.
    2. Общий прогресс. Его назовём Total progress.

    Дальше можете немного упороться и создать логирование выполнения каждого из этапов. Но уже без меня ;)

    После поступления запроса на выполнение вашего сложного процесса вам нужно создать новую запись в хранилище и отдать ID этой записи в ответ на запрос. На фронтенд, в вашем случае.

    Следующим этапом вам нужно подключить логирование переходов состояний в места их начала. Код будет примерно таким:
    $state->setState("first state");
    $storage->save($state);
    // Отправить запрос на готовку заказа
    // ...
    // Ответ положительный
    
    $state->setState("second state");
    $storage->save($state);
    // Найти курьера
    // ...
    // Курьер найден
    
    $state->setState("first state");
    $storage->save($state);


    Этапы логируются, теперь нужно на фротенде показать изменения процесса.
    Создаем новый endpoint, который будет:
    1. Принимать id процесса, который мы отдали фронту при создании процесса
    2. Идти в хранилище и смотреть текущий этап и сколько их всего. В нашем примере их всего 4.
    3. Делать нужный вам подсчет. Например, говорить "мы сейчас на 2 из 4 этапов" или 2 делить на 4 и говорить "50% процесса выполнено". Как вам больше понравится, так и делайте.

    ----------------

    Думаю, я неплохо ответил на свой вопрос, да еще и вам накинул идей :)
    Ответ написан
  • Как выдавать разные страницы по разным паролям?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    Я бы сделал это модификацией системы авторизации:
    1. Сделать мультипарольные аккаунты или разрешить одинаковые логины и возможность добавлять их (в бд)
    2. На каждую такую учетку добавить разные роли. RBAC-ов в интернете много, подойдет практически любая реализация.
    3. На странице авторизации проверять роль, а не пароль.
    Ответ написан
    Комментировать
  • Какой аналог функции строки python translate() в php?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    Прямых аналогов нет, но есть sprintf.
    Можете начать с неё, и дальше смотреть другие строковые функции по замене подстрок вида: substr_replace и т.п.
    Ответ написан
    Комментировать
  • Как правильно распарсить JSON?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    $images = $row['images'];
    $images_decode = json_decode($images, true);
    
    foreach ($images_decode as $i => $image) {
        echo "{$i}: {$image}\n";
    }
    Ответ написан
    Комментировать
  • Как написать приложение для фейсбука, учитывая сложности с получением доступа к расширений?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    Сделать на левой группе :)
    Ответ написан
    Комментировать
  • Как настроить связки nginx + apache и nginx + php-fpm на одном сервере?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    А зачем php-fpm присваивать порт 8081? у него и 9000 прекрасно работает.

    Покажите ваши конфиги.

    > почитал документацию и столкнулся с проблемой что nginx не отправляет по локахосту на другой порт

    Не совсем понятно, что вы имели ввиду. Для php-fpm есть fastcgi модуль.

    Вангую, что вы потеряли server_name site1.ru;
    Ответ написан
    Комментировать
  • Объясните мне как & $school ссылается на объект, а не на какую-то копию?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    Чтобы перейти к работе с объектами, давай попробуем поработать с другими типами данных, например, с массивом.
    $array = [1, 2, 3];

    Здесь мы задали переменной $array значение в виде массива с числами 1, 2 и 3.
    Далее создадим функцию, которая добавит в конец новый элемент со случайным значением.
    $array = [1, 2, 3];
    pushRandomInt($array);
    function pushRandomInt($collection)
    {
        $collection[] = rand(1, 1000);
    }


    Когда вызывается pushRandomInt, PHP копирует значение переменной и передает его в функцию. На текущий момент будут существовать 2 разных переменных, но значения у них будут идентичные ($array содержит массив из 1, 2 и 3, и $collection содержит массив из 1, 2 и 3).
    Функция добавляет в конец ($collection[]) новый элемент со случайным значением (rand(1, 1000)).
    Теперь значение переменной $collection будет массив из 1, 2, 3 и случайного числа в диапазоне от 1 до 1000. $array же не изменился.

    Функция pushRandomInt ничего не возвращает, так что ее работа сейчас совершенно бесполезна. Чтобы сделать ее работу полезной, есть 2 способа:
    1. Вернуть результат функции
    function pushRandomInt($collection)
    {
        $collection[] = rand(1, 1000);
        
        return $collection;
    }

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

    Разберем это на примере:
    $array = [1, 2, 3];
    $newArray = pushRandomInt($array);
    var_dump($array);
    var_dump($newArray);
    function pushRandomInt($collection)
    {
        $collection[] = rand(1, 1000);
    
        return $collection;
    }


    Результатом работы данной программы будет следующее:
    array() { 0 => 1, 1 => 2, 2 => 3 }
    array() { 0 => 1, 1 => 2, 2 => 3, 3 => {случайное число}}

    Как видим, переменная $array не была изменена и результат работы функции pushRandomInt был присвоен в новую переменную.

    2. Сделать передачу значения по ссылке
    function pushRandomInt(&$collection)
    {
        $collection[] = rand(1, 1000);
    }

    Такую функцию называют грязной функцией, потому что она имеет побочный эффект: функция изменяет значения оригинальных переменных (те, которые были переданы как аргументы функции (pushRandomInt($array);, здесь $array является аргументом функции pushRandomInt))

    Разберем это на примере:
    $array = [1, 2, 3];
    pushRandomInt($array);
    var_dump($array);
    function pushRandomInt(&$collection)
    {
        $collection[] = rand(1, 1000);
    }

    Теперь этот код выведет
    array() {0 => 1, 1 => 2, 2 => 3, 3 => {случайное число}}

    Как видим, оригинальная переменная $array после вызова функции pushRandomInt была изменена.

    ---------------

    С объектами в PHP работа всегда ведется с передачей значения по ссылке.

    Пример:
    $object = new \stdClass();
    setRandomId($object);
    function setRandomId($object)
    {
        $object->id = rand(1, 1000);
    }
    echo "ID объекта: {$object->id}\n";


    То есть не нужно указывать знак амперсанда, чтобы работать с объектом по ссылке. Это работает по умолчанию.
    Бывает моменты, когда не нужно работать со значение объекта по ссылке. Для этого применяют клонирование объекта.

    Пример:

    $object = new \stdClass();
    $newObject = setRandomId($object);
    function setRandomId($object)
    {
        $newObject = clone $object;
        $newObject->id = rand(1, 1000);
    
        return $newObject;
    }
    echo "ID объекта: {$newObject->id}\n";
    echo "ID объекта: {$object->id}\n";


    Результат будет следующий:
    ID объекта: {случайное число}
    <br />
    <b>Notice</b>:  Undefined property: stdClass::$id in <b>[...][...]</b> on line <b>12</b><br />
    ID объекта:


    Что произошло:
    Функция setRandomId принимает объект, создает его копию ($newObject) и в дальнейшем работает только с копией. У копии создается новое свойство id и присваивается случайное число.
    С оригинальным объектом ($object) никаких изменений не производится, и, соответственно, свойство id у него не создается.

    Надеюсь, смог донести информацию.
    Ответ написан
    3 комментария
  • Как найти url-адресс с помощью регулярок?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    Комментировать
  • Почему появляется ошибка?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    <?php for($=i; $i<=$pages; $i++): ?>
          <a href="?page=<?= $i;?>"><?= $i; ?></a>
    <?php endfor; ?>
    Ответ написан
  • Все значения массива в нижний регистр php?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    По данному моменту хотел спросить, может есть стандартная функция которая тримит и в нижний регистр массив приведет?

    Дак вы же их и используете: trim(strtolower($v))

    ---

    И да, а почему сначала array_map, а потом foreach?

    $maping = array_map(function ($value){
        return array_map(function ($value) {
            return trim(strtolower($value));
        }, $value);
    }, $raw);
    Ответ написан
  • Вытащить значение переменной с другого сайта?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    include 'https://google.com';
    
    echo $username

    :)

    ----

    А если без шуток, то получать текст (file_get_contents, curl, etc) и парсить его.

    Что-то вроде:
    preg_match('/const MyIntVariable = ([\d]+);/', $content, $mathes);
    Ответ написан
    Комментировать
  • Как подставить значение переменной?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type: application/json',
      'Authorization: bearer ' . $token,
          ));
    Ответ написан
    Комментировать
  • Как создать рандомную выборку?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    Последовательность должна быть жёсткой и не меняться после перезагрузки страницы

    мне нужно только чтобы были 5 рандомных цифр.


    А вы точно продумали тз?

    ------

    Есть массив из 5 элементов. Берете рандомный и удаляете его из этого массива. Теперь это массив из 4 элементов. Записываете рандомную строку в бд. Повторяете цикл.
    При заходе на страницу проверяете таблицу со сгенерированной последовательностью и достаете все данные.
    Ответ написан
    Комментировать
  • Как получить распознать пересланное сообщение?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    https://vk.com/dev/callback_api?f=2.1.%20%D0%A2%D0...
    https://vk.com/dev/groups_events
    После настройки Callback Server в настройках группы, будет приходить объект с типом message_new. В нем будут содержаться все необходимые вам данные https://vk.com/dev/objects/message
    Ответ написан
    Комментировать
  • Как обнаружить взаимосвязь в массиве чисел?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    Есть 10 чисел (1, 2, 3, 4, 5, 6, 7, 8, 9, 10).
    Есть фиксированное количество чисел, которые можно назвать "последовательностью" в текущей задаче. Это число 3, например.
    Разбиваете ваш набор чисел таким образом, что у вас получается следующие группы:
    [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10], [9, 10, 1], [10, 1, 2]
    Далее ищите одинаковые группы или похожие на некоторое количество.
    Смотрите следующие за ним цифры. Делаете выводы.

    ----
    Таких "кейсов" можно сделать множество. Описываете их и прогоняете на вашем наборе данных, и ищите закономерности в рядах.
    Так же можете посмотреть про математические ряды и их сходимость. Может оттуда подчерпнете для себя что-то дополнительное.
    Ответ написан
    1 комментарий
  • Как установить связь между мобильным PhoneGap приложением и php лежащем на сервере?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    Обычно связи между клиентом (так обычно называют приложение, которое у клиента) и сервером (так называю приложение, которое находится у вас на сервере) соединяются с помощью HTTP-сообщений.
    Клиент делает запрос на сервер, сервер что-то делает исходя из самого запроса и отдает ответ клиенту.
    Клиент исходя из запроса и ответа, делает нужные действия

    ----

    К - клиент, С - сервер

    Кейс: Пользователь хочет получить список всех пользователей.
    Схема запросов:
    К: Дай список пользователей
    С: Держи {список пользователей}
    К: Получает этот список и начинает построение таблицы или любых других действий.

    ---

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

    ---

    Для "быстрого старта" обычно используют библиотеки или фреймворки, которые обладают рядом плюсов по отношению к нативной постройке приложения.
    Например, на бекенде можете посмотреть в сторону Yii2 или Laravel.
    На клиенте в PhoneGap не знаю, что используется сейчас, но раньше там был jQuery :)

    ----

    Почитать:
    https://developer.mozilla.org/ru/docs/Web/HTTP/Overview
    https://developer.mozilla.org/ru/docs/Web/HTTP/Methods
    https://habr.com/ru/post/215117/
    Ответ написан
    Комментировать
  • Непонятная кодировка на странице входа?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    Скорее всего, что страница в кодировке windows-1251, а файл с версткой сохранен в utf-8 или какой-нибудь другой. Советую поставить charset utf-8 и все должно заработать
    Ответ написан
    6 комментариев