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

    @smple
    можно это сделать с помощью eval конечно, но такой способ я не рекомендую, вот так например
    <?php
    $a = 5;
    $b = 6;
    $c = '+';
    
    echo eval("return $a $c $b;");

    Более правильно сделать интерфейс OperationInterface и для каждого действия сделать свою реализацию (например OperationPlus, OperationMinux, OperationMultiply и тд)
    Ну соответсвенно сделать выбор нужную реализацию, это по сути будет паттерн стратегия https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D...

    Как еще один вариант можно просто сделать массив функций, которые будут принимать аргументом два параметра и делать операцию вот так:
    <?php
    $a = 5;
    $b = 6;
    
    $operation = [];
    $operation['+'] = function ($a, $b) {
        return $a + $b;
    };
    $operation['*'] = function ($a, $b) {
        return $a * $b;
    };
    // тд на все варианты
    
    $c = '+';
    echo $operation[$c]($a, $b) . PHP_EOL;
    
    $c = '*';
    echo $operation[$c]($a, $b) . PHP_EOL;
    Ответ написан
    4 комментария
  • Стоит ли передавать в исключения дополнительную информацию?

    @smple
    не проще ли в тексте исключения указывать `Name` is unknown column (вместо Name указывать имя колонки что не нашлось)
    Получается в классе где создается исключение определяется неверная колонка и текст сообщения говорит что в таком то месте обращение идет к такой то колонке, которой нет в бд, текст всего запроса видеть не надо.

    можно поступить еще проще и писать что не могу выполнить запрос в бд и писать текст запроса, но имхо его потом разбирать и тд за пределами объекта работы бд.
    Ответ написан
    Комментировать
  • Как взять с ответа json только одно значение, и вернуть его на страницу?

    @smple
    Вот так:

    <?php
    
    $p_url = $_POST['p_url'];
    $url = 'https://site.ru/?url='.$p_url.'';
    
    $result = file_get_contents($url);
    echo json_decode($result, true)['media_id'];
    Ответ написан
    3 комментария
  • Composer autoload как работает?

    @smple
    он подгружает только то что требуется в коде
    там загрузчик добавляется через php.net/manual/ru/function.spl-autoload-register.php
    Ответ написан
    Комментировать
  • Как на php пересохранить html-файл в UTF-8?

    @smple
    с помощью php.net/manual/ru/function.mb-convert-encoding.php

    например:
    $value = file_get_contents('path');
    $result = mb_convert_encoding($value, 'целевая кодировка в твоем случае utf8 найди название под каким она на сервере', 'из какрой кодировки, опять же имя лучше взять как в ОС она называется');
    file_put_content('путь для результата', $result);


    эта штука использует mb string его надо поставить отдельно php.net/manual/ru/book.mbstring.php обычно в debian based apt install php-mbstring
    Ответ написан
    1 комментарий
  • Как улучшить архитектуру сервиса отложенных задач?

    @smple
    Создать консольное приложение с бесконечным циклом.
    Которое ждет наступление следующего события, как только оно наступает оно делает http запрос и берет следующее событие.

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

    Технологии для написания демонов https://daemon.io/ или reactphp.org можно еще почитать про создание демонов на php, но для этой задачи php не лучший язык, задача небольшая можно реализовать на чем угодно.
    Ответ написан
  • Как вывести массив в twig?

    @smple
    {{result[1]['name']}}

    но в твоем случае лучше использовать цикл for. twig.sensiolabs.org/doc/tags/for.html
    Ответ написан
    Комментировать
  • Как лучше использовать инфраструктурный код?

    @smple
    Указанные тобой варианты имеют право на существование, также я бы дополнил список
    5. использовать Proxy объект
    6. Использовать di и на основе настроект di подсовывать реализацию и параметры из конфигов

    Например у твоего MailServer есть interface MailServerInterface от который будет использоваться тобой везде, у тебя есть эталонная реализация MailServer и тебе надо сделать логирование методов.
    ```php
    MailServerProxy implements MailServerInterface {
    public function __construct (LoggerInterface $logger, MailServerInterface $server) {
    $this->setLogger($logger);
    $this->setMailServer($server);
    }
    public function __call($name, $args) {
    $this->logger->info('called method ' . $name);
    return call_user_func_array([$this->mailServer, $name], $args);
    }
    }
    ```
    Примерный шаблон кода.

    Тогда там где нужен MailServerInterface его будет создавать di, а уже di в зависимости от настроек системы будет создавать зависимости, например если надо логировать, то будет создавать MailServerProxy которому аргументами нужен Logger(тут любые параметры могут быть) и MailServer (а ему нужны аргументы $host, $login, $password которые в конфиге лежат и их читать будет di)

    А в случае если логирование не нужно станет, достаточно в настройках di при запросе MailServerInterface создавать MailServer сразу, ну или использовать NullLogger какой нибудь который ничего не пишет.

    также есть еще аспектно ориентированное программирование https://github.com/goaop/framework
    но оно работает медленнее так как надо прочитать анотации через reflection но тоже может быть не плохо.
    Ответ написан
    Комментировать
  • Что не так с моими тестами на PHP?

    @smple
    после добавления записи с psr может ты забыл сделать composer update ?
    выложи файлы:
    autoload_classmap.php
    autoload_namespaces.php
    autoload_psr4.php
    autoload_real.php

    посмотри там объявлены ли твои namespace и где их композер ищет.
    Ответ написан
    Комментировать