Ответы пользователя по тегу PHP
  • Пример паттерна стратегии на PHP?

    @sidni
    Php Developer
    Ну если по пропростому в целом идея такая (лень код писать)
    1) Создаешь кучу объектов класса где будет алгоритм обработки реквеста
    1.1)реализуешь в каждом этом объекте метод do($request) - сама обработка реквеста
    1.2)реализуешь в каждом этом объекте метод can($request) - можно не весь реквест а какой нибудь флаг этот метод будет возвращать true если этот объект подходит для обработки этого реквеста
    2) Создаешь объект класса обработки стратегий,
    2.2)в приватном поле опиши массив доступных классов стратегий (можно даже указать неймспейсами а тогда метод can сделать статическим)
    2.3)реализуешь метод do($request) где пробегаешься циклом по каждой стратегии вызывая метод can и у того которого вернула true вызываешь do($request)
    Ответ написан
  • Как в условие исключить число?

    @sidni
    Php Developer
    if($value[BanType] > '4' && ! \in_array((int)$value[BanType],[107,108], true)) {
    Ответ написан
    Комментировать
  • Как оптимально получить массив с данными для передачи на клиент?

    @sidni
    Php Developer
    а смысл такой конструкции?
    - Автокомплит от ИДЕ не работает,
    - возвращать null если свойства нет тоже такое себе не понятно толи свойства не передали толи оно и вправду null, ну и вообще сеттер и геттер = публичное поле
    - фактически тоже самое что и работа с массивом только через стрелочку (можно ArrayObject заюзать)
    Вариантов обработки много и на любой вкус чаще всего
    $maper->map($request, DTO::class);
    Ответ написан
    Комментировать
  • В чём смысл ContainerExceptionInterface в PSR-11?

    @sidni
    Php Developer
    что бы правильно обрабатывать ошибки.
    очень часто нужно писать различное поведение (обработку) для различных видов ошибок, есть ошибки системные, есть ошибки на уровне фреймеврка, библиотек, и Вашего приложения, иногда надо поставить try...catch и игнорировать исключение (просто залогировав), иногда на основе этого исключения нужно отобразить пользователю читаемое сообщение, иногда откатить транзакцию, или авайрийно завершить работу.
    И чем больше разнообразие исключений тем больше возможностей правильно его обработать.
    Ответ написан
    2 комментария
  • Класс для работы с определенной таблицой?

    @sidni
    Php Developer
    То что вы пытаетесь реализовать, является паттерном ActiveRecord гуглите реализации.
    А нюансы
    • почему класс называется Account и при этом вы используете магические гет и сет тут в принципе все ясно и вы знаете какие поля вам нужно сететить поэтому можно их просто объявить паблик полями
    • метод сохранения довольно странный как вы будете различать апдейт от инсерта (можно сделать флаг isInsert) и если модель получили через ваши методы поиска то выставить его false что означает апдейт
    • Для поиска сделайте свои методы статическими, и всегда возвращайте новый экзепляр (коллецию, массив) своего класса, тогда вы решите проблему с циклом
    • По современным правилам проектирования данный паттерн является антипаттерном тк берет на себя слишком много функциональности и привязан к конкретной бд

    Хорошие реализации этого паттерна смотрите фреймверки Yii2 и Laravel
    Ответ написан
    Комментировать
  • PhpSpreadsheet. Как правильно сохранять файл?

    @sidni
    Php Developer
    Помниться я как то не так делал..... скорее всего вам надо поменять save, тк как вы в браузере сразу же отдаете генерируемый файл без сохранения (точнее сохранение наверное есть только временного файла во временной дирректории).
    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
    
    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
    $sheet->fromArray($dataArray, null, 'A1', true);
    $writer = new Xlsx($spreadsheet);
    $writer->save($fileName);
    Ответ написан
    Комментировать
  • Функция PHP сохранила значение?

    @sidni
    Php Developer
    Это вам не "...мыслить агрегатами..."))))))))))))))))))))))))))
    function test() {
        static $res = null;
        if ($res === null) {
            $res = rand(1, 5);
        }
        return $res;
    }

    вообще-тo так не делают...
    Ответ написан
    Комментировать
  • Как получить номер после определенного символа?

    @sidni
    Php Developer
    $re = '/\№(\d+)/u';
    $str = 'Відділення №1: вул. Пирогівський шлях, 135';
    if(preg_match($re, $str, $matches)) {
    var_dump($matches[1]);
    }

    Только нюанс у Новой Почты не всегда есть отделения к примеру
    Пункт приема-выдачи (до 30 кг): ул. Франко, 134
    Ответ написан
    2 комментария
  • Узнать есть ли запись в таблице mysql?

    @sidni
    Php Developer
    SELECT EXISTS(SELECT `id`  FROM `table` WHERE `url` = 'link2' LIMIT 1) AS exist
    Ответ написан
    Комментировать
  • Как получить текущий месяц на эстонском языке?

    @sidni
    Php Developer
    Проверьте сам сервер установлена на нем данная локаль
    Ответ написан
    4 комментария
  • Как исправить ошибку?

    @sidni
    Php Developer
    О это же опенкарт нужно смириться и жить с этим))))))
    тут надо либо проверять на array_key_exists (isset) и/или зарание инцилизировать значение.
    скорее всего модуль расчитан на другую версию или сборку опенкарта и у вас не хватает полей в бд
    Ответ написан
    Комментировать
  • Как обойтись без trait в PHP 5.3?

    @sidni
    Php Developer
    вместо трейтов можно использовать магические методы.
    Сделать в классе метод attach который будет принимать обьект и реализовать метод __call в котором проверять есть ли данный метод в присоединенном объекте если есть то вызвать.
    Ответ написан
    Комментировать
  • Почему рекомендуется для каждой таблицы делать свой файл миграции?

    @sidni
    Php Developer
    Тут нужно понять сам принцип миграций. Первоначальный сетап базы можете запилить 100 таблиц (если у вас есть готовая структура и вы хотите просто перевести на ее миграции и не таскать все время дамп) в одном файле это дело вкусовщины если файл покажется длинным можете разбить его по функциональности в этом файле миграции все что связано с кастомерами в этом с продуктами и тд если и эти файлы тяжело просматривать тогда каждая таблица один класс миграции.
    Но потом класс миграции должен появляться на каждый чих в бд в частности пять человек пилят задачи и если в рамках задачи надо что то поменять в бд делают класс миграции. Чтоб после обновления локальных копий комманд не искать актуальную версию бд а выполнить миграцию.
    Ответ написан
    Комментировать
  • Логическое или тождественное?

    @sidni
    Php Developer
    Канонов нет нужно читать спецификацию функции тк в конкретном случае вернется false либо не пустая строка что всегда будет приведено к true, то тут все равно как вы напишите.
    Но надежней конечно приучить себя писать второй вариант тк бывают неоднозначные для компилятора возврат значения, см. функцию strpos
    Ответ написан
    Комментировать
  • Почему плохо писать код в шаблонах?

    @sidni
    Php Developer
    Все познается на больших проектах,
    в качестве примера возьмем методику MVC опенкарта где есть три слоя абстрации:
    1) если это запрос то для этого есть модель
    2) если это что-то из пхп кода то это контроллер
    3) если это хтмл то это шаблон
    Парни почистили от мусора код и "выкинули" в свет. Все просто красиво и самое главное бесплатно и без смс.
    Но, а теперь взглянем почему же все ненавидят опенкарт. А потому что разработчиками не предусмотрены моменты как можно расширять и кастомизировать код, и все пишут свои кастомайзы там где и предусмотренно, в контроллере и когда владельцы сайта начинают баловаться модулями то оказывается схожие по функционалу модули пытаются внедрить одновременно свой код в одно и то же место одного и тогоже контроллера и начинается чихорда когда одни функции используют данные которые будут получены двумя строками ниже или два разных модуля добавили свои параметры в стандартную функцию.
    многие умники догадались что можно весь треш перевести в шаблон где уже все данные получены, и контроллеры и шаблоны начинают разрастаться когда 3000-5000 строк в одном файле это норм и не такое видали, сайт начинает глючить, найти ошибку или добавить свой кастомайз становится просто невыносимым, я еще молчу про ocMod или vqMod (но это уже другая история)
    итог 3 версия опенкарта использует twig темплейты, где нельзя так просто "ворваться" со своим php кодом, но и основных проблем не решила.
    Ответ написан
    Комментировать
  • Можно ли в репозиторий использовать для сохранения обьектов?

    @sidni
    Php Developer
    CRUD есть CRUD, репозиторий есть репозиторий, как мухи и мед.
    может ли CRUD обращаться к репозиторию? Да
    можно ли заменить CRUD репозиторием? Нет
    Ответ написан
    Комментировать
  • Почему советуют не выбирать yii2 для разработки?

    @sidni
    Php Developer
    Yii не советуют только по двум простым причинам
    1) фреймверк делается "по фану" программистами в свободное от работы время (субботы и воскресения ))) )
    2) практически никто из разработчиков Yii не используют Yii в своих комерческих проектах.

    отсюда миллион выводов и заключений
    Ответ написан
  • Этот код сильно ужасен)?

    @sidni
    Php Developer
    Все зависит в рамках какой задачи Вы пишите.
    Как бы если этот скрипт написан за минимальный прайс и минимальный тайминг, на какой нибудь халтурке (фриланс), то ничего страшного другими словами "а на что Вы надеялись".
    Если Вы являетесь штатным программистом в конторе или этот проект долгосрочен для Вас и Вы потеряли кучу времени на реализацию этого кода, то Вам нужно пересмотреть свои взгляды на будущее, в современном пхп мире так уже никто не пишит.
    1) Сейчас стараются писать в ООП стиле Ваш код имеет вид процедурного кода больше перетекающий в "лапшекод".
    Как минимум необходимо находить независимые атомарные операции и обворачивать в классы
    например голый sql запрос не может быть на одном уровне бизнес логикой и проверкой входных данных (см. паттерн Репозиторий), так же нельзя тут же обращаться к апи телеграмма может быть стоить выделить в отдельный универсальный класс отправки сообщений (вдруг вам надо будет отправлять вместо телеграмма, в вайбер) (можно глянуть паттерн Декоратор) и т. д.
    2)
    include "bitrix.php";

    include "function.php";
    require_once '../src/db.php';

    Но при этом
    use Aura\Database;

    3) избегайте if else особенно когда они занимают пол экрана это очень ухудшает читаемость и дальнейшее расширение приложения
    4) используйте Exception правильное использования сократит количество if else
    можно дальше продолжать но начните с этого
    Ответ написан
  • Как узнать имя хоста сервера Mysql к которому мне подключаться?

    @sidni
    Php Developer
    Если ваш php скрипт находится на том же бесплатном хостинге то то скорее всего можно использовать localhost но лучше глянуть настройки панели хостинга или в крайнем случае урле phpmyadmin.
    Если Ваш скрипт находится на Вашем локальном компьютере то тут есть сложности обычно хостеры отключают удаленный доступ к базе, тут тоже надо внимательно смотреть в настройках панели хостинга
    Ответ написан
    Комментировать