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

    @Vitsliputsli
    Какие еще классы разных API? REST API - это механизм взаимодействия, это внутренняя реализация, которая почему-то вытащена на верхний уровень, до уровня контроллеров. У вас должны быть бизнесовые сущности, и к объектам этих сущностей применяйте Принципы. А уже на более низком уровне для передачи данных бизнесовых сущностей используйте объект класса RestAPI, в котором, разумеется, не должно быть никаких завязок на специфику выше стоящих бизнесовых сущностей.
    Ваш метод send выглядит странно, зачем он вообще нужен? Динамические методы это очень неудобно, IDE по ним вам ничего не подскажет и придется разгадывать этот ребус самому, а ничего более этот метод не делает.
    Ответ написан
    Комментировать
  • Как на php будет выглядеть запись из JS "value = value || 0"?

    @Vitsliputsli
    если value существует, берем значение из value, иначе приравниваем 0.

    $value = $value ?? 0
    как уже предложили, но к
    value = value || 0
    это отношения не имеет. || - это оператор дизъюнкции, но в php он возвращает тип bool в отличии от js.
    Ответ написан
  • Целесообразно ли логирование выносить в отдельную базу?

    @Vitsliputsli
    Для разработки база должна разворачиваться из миграций, т.е. не должно быть никакой зависимости от прода. Если не используете их, то пора начать. Чтобы не писать их все с нуля, создайте дамп структуры и разворачивайте его, а новые изменения уже в миграциях. Необходимые для разработки и тестирования данные заполняйте фикстурами.
    Что касается логов в базе, то нужно понимать, как вы их используете, и уже исходя из этого выбирать решение.
    Ответ написан
    Комментировать
  • Как подключиться один раз к базе?

    @Vitsliputsli
    Можно ли подключиться один раз к базе mysql и дальше делать с этой базой любые запросы?

    Можно.

    Если "документы .php" - это файлы используемые одним процессом php, то только так и надо. Если нужно чтобы разные процессы использовали одно подключение к БД, то это вопрос не к php, а к тому кто будет поддерживать это соединение и шарить на процессы php. Есть persistent connection на стороне СУБД, но его лучше не использовать, т.к. не всегда оно корректно работает. Есть всякие ProxySQL которые могут это организовать, это и есть оптимальный вариант.
    Ответ написан
    Комментировать
  • Почему не работает итерация?

    @Vitsliputsli
    Как и написано в ошибке: An iterator cannot be used with foreach by reference - итератор не может использоваться в foreach через ссылку.
    mysqli_query возвращает итерируемый объект, т.е. объект, который имеет метод для получения итератора, который знает как итерировать объект. При итерации foreach обращается к соответствующему методу итератора, который возвращает нужное значение. Т.к. это просто значение, а не свойство объекта, обратиться по ссылке к нему не получится.
    Ответ написан
    Комментировать
  • Как присвоить вычисленное значение константе?

    @Vitsliputsli
    Это ограничение языка, возможно использование только простых выражений для объявления констант. Под простыми подразумеваются использующие операторы (например, конкатенация), но не функции (как в вашем примере). Хотя в документации об этом четко не сказано.
    Что касается остальных комментариев здесь, то нет, это не переменная, т.к. никто не пытался изменить значение. А использование других констант в объявлении константы вполне допустимо, в том числе и магических констант.
    Ответ написан
    Комментировать
  • Как настроить передачу данных между socket server и client?

    @Vitsliputsli
    Почему если fread() стоит раньше шем fwrite(), то консоль вообще ничего не показывает. А если fread поставить ниже fwite() то консоль выводит $msg.

    Вы запускаете сервер и он ждет подключения. Запускаете клиент он подключается к серверу. Затем сервер начинает слушать сокет $msg=fread($connect,1024). Если клиент после подключения сделает fwrite($socket_client,$ENQ), то отправит на сервер строку $ENQ, сервер примет ее, выведет на экран и закроет соединение. Если вместо fwrite напишите $msg= fread($socket_client, 1024), то клиент будет слушать сокет. В итоге, сервер и клиент оба слушают, оба ждут передачи, а так как никто из них ничего не шлет, то будут это делать до бесконечности.
    Ответ написан
    Комментировать
  • Где применяются key(), next(), current()?

    @Vitsliputsli
    Если мы говорим про итерирование стандартных массивов php, то эти массивы - двусвязные списки, и их перебор наиболее эффективен при использовании указателя, а не обращения по ключу. Поэтому перебирать их следует с помощью итераторов (либо foreach, либо ООП итераторы, либо процедурные итерационные функции next(), prev(), reset() и т.д.). В js простые массивы устроены иначе, поэтому и работать с ними рекомендуется по-другому.
    Для простого перебора слева направо всего массива достаточно foreach, но могут быть и более сложные варианты, тогда задействуются другие способы.
    Насчет while(key($user_ar)), уже написали: while проверяет условие на true/false, если key($user_ar) = 0, то после динамического преобразования в bool, это будет false.
    Ответ написан
    Комментировать
  • Везде ли нужно проверять на существование элемента в массиве?

    @Vitsliputsli
    Вы описываете 2 стандартных подхода:
    1) падаем в ошибку при любой непонятной ситуации;
    2) при непонятной ситуации пробуем продолжить работу, если это возможно.
    1 подход применяется в тех местах которые работают критически важными бизнесово данными. 2 подход для маловажных вещей, которые не способны исказить вещи из предыдущего предложения.
    Т.е. в большинстве случаев нужно падать в ошибку, и только если знаете, что ошибка не несет никакого серьезного аффекта (к примеру выводить текст на экран жирным шрифтом или нет), то можно продолжать работу.
    Ответ написан
    Комментировать
  • Как удалить элемент массива по значению с двумя одинаковыми ключами?

    @Vitsliputsli
    Как достичь результата Array ( [key] => 1 [key2] => 3 ) при исходных данных?

    Никак, на этапе создания массива $arrays = [ "key"=> 1, "key"=>2, "key2"=> 3 ], элемент с ключом key получил значение 1, а затем значение было переписано на 2, соответственно 1 значение безвозвратно потеряно.
    Опишите задачу которую решаете, а не только как решаете.
    Ответ написан
    Комментировать
  • Как настроить одновременный запуск include php?

    @Vitsliputsli
    То что вы описываете - это потоки, но нужен интерпретатор php с их поддержкой и навыки многопоточного программирования.
    Как вариант, асинхронные запросы к БД, если драйвер позволяет.
    Наиболее простой вариант, сделать независимые скрипты, которые будут забирать данные из БД параллельно, и на последнем этапе писать в 1 xls файл, разумеется, нужно добавить блокировку файла и ожидание ее снятия.
    Ответ написан
    Комментировать
  • Как запустить несколько php скриптов одновременно?

    @Vitsliputsli
    А в чем сложность? В php целый ворох команд, типа exec, для запуска внешних приложений. Используйте их.
    Хотя скорее всего этого и не нужно, но без описания задачи не угадаешь.
    Ответ написан
    Комментировать
  • Как работает генератор?

    @Vitsliputsli
    doubleArray ($arr, $callback):
    В $arr передали массив [1,2,3,4,5,6]
    В $callback передали функцию function($x) {return $x *2;}

    Далее в doubleArray работает foreach
    foreach ($arr as $v) {
    yield $callback ($v);
    }
    Т.е. для каждого значения из [1,2,3,4,5,6] запускается функция $x *2.
    Если заменить yield на return, то получится обычная функция, она возьмет первое значение массива, умножит его на 2 и вернет его, при повторном вызове тоже самое. Но у нас генератор, yield поступит также сначала, но при повторном вызове функции он начнет не сначала, а продолжит с того места, где остановился.
    Ответ написан
    Комментировать
  • Как предотвратить изменение переменной?

    @Vitsliputsli
    Но почему в переменной startTime значение изменилось?

    Потому что в startTime ссылка на объект полученный через $item->getStartTime();

    Потому что тут везде все работает по ссылкам?

    Не везде, но при работе с объектами применяются ссылки.

    Но как мне сделать, чтоб в startTime было постоянно 13:00

    Не изменяйте существующий объект startTime, создайте новый объект на основе времени в startTime. Что-то вроде:
    (new DateTime())
    ->setTimestamp($item->getStartTime()->getTimestamp())
    ->setTimezone($item->getStartTime()->getTimezone())

    Можно, конечно, и склонировать, но по сути это совсем другой объект, хоть вы и используете для его создания данные из startTime.
    Ответ написан
  • Почему при отправке данных с помощью fetch, они не приходят в PHP?

    @Vitsliputsli
    Документация:

    $_POST — Переменные HTTP POST
    Ассоциативный массив данных, переданных скрипту через HTTP методом POST при использовании application/x-www-form-urlencoded или multipart/form-data в заголовке Content-Type запроса HTTP.

    А у вас application/json, соответственно просто берите входные нераспарсенные данные.
    Ответ написан
    1 комментарий
  • Где расположить шаблоны модуля что ли?

    @Vitsliputsli
    Куда бы вы размещали шаблоны модуля админки? Вместе со всеми в папке views/layouts или в папке views/layouts/admin, то есть вот если несколько шаблонов для админки, то выделять ли их из шаблонов приложения отдельной папкой, как это сделано в контроллерах и вьюхах?

    В директории mymodule/views/layouts. Если это действительно модуль, т.е. отдельный, функционально независимый кусок кода.
    Ответ написан
  • Как исправить логическую ошибку в использовании флагов?

    @Vitsliputsli
    Или в операциях == и != что-то не так?

    Используйте операторы сравнения === и !==, и сравнивайте с учетом типа переменных.
    0 не равен false, но при динамичской типизации, будет произведено приведение типов и затем сравнение.
    Чтобы не возникало вопросов, таких как у вас сейчас, сравнивайте однотипные данные, а не предполагая, что будет после динамического приведения типов.
    Ответ написан
    7 комментариев
  • Как проверить массив на пустоту после array_diff?

    @Vitsliputsli
    но почему то под нулевым индексом что то есть

    Документация по explode:
    Если delimiter не содержится в string, и используется отрицательный limit, то будет возвращен пустой массив (array), иначе будет возвращен массив, содержащий string.
    Ответ написан
  • Как передать данные из базы в константу?

    @Vitsliputsli
    Цитата из мануала по PHP о константах:
    Значение должно быть неизменяемым выражением, а не (к примеру) переменной, свойством или вызовом функции.
    Ответ написан
    Комментировать
  • Как исправить (не выводит и не передаёт по сокету данные)?

    @Vitsliputsli
    Если вы ожидаете увидеть "OK" в переменной $read, то его там уже нет, он будет перезаписан пустой строкой (если больше нет данных, то возвращается пустая строка). Тем не менее, данные вы сохраняете в $fde, и соответственно там и надо искать "ОК".
    Ответ написан
    1 комментарий