• Как называть классы, при использовании пространства имен?

    @Vitsliputsli

    Писать пространство имен полностью, что не очень красиво AnotherPHPProject\Strings()

    Не устаю писать, красиво это не когда мало букв, а когда все понятно с первого взгляда.
    IDE подставит за вас длинный namespace. А по нему отлично видно, что данный класс не внутренний, а подключенная внешняя зависимость.
    А вот алиасы часто использовать не очень хорошо, т.к. по нему сразу не видно, что это за класс.
    Ответ написан
    1 комментарий
  • Можно поменять терминал в phpstorm на tilix?

    @Vitsliputsli
    Потому что bash это консольное приложение, tilix GUI.
    Ответ написан
    Комментировать
  • Как правильно писать код, чтобы не было PHP Notice: Undefined index?

    @Vitsliputsli
    везде делать проверку на существование такого элемента с индексом?

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

    @Vitsliputsli
    При использовании ==, php перед сравнением выполнит неявные преобразования, если значения имеют разные типы, то одно из значений будет преобразовано к типу другого, и когда они будут иметь схожие типы будет выполнено сравнение. В мануле php вы можете найти правила преобразований.
    Ответ написан
  • Как написать многострочный скрипт в одну строку?

    @Vitsliputsli
    echo -e "echo 1 \n echo 2" | bash
    подготовить строку можно так:
    sed '/:a;N;$!ba;s/\n/\\n/g' test.sh
    но еще нужно сделать экранирование кавычек двойных, если встречаются.
    Ответ написан
    7 комментариев
  • Что делать, если не можешь понять?

    @Vitsliputsli
    В любом обучении должен быть системный подход. Сперва базис, простое, потом комплексное, сложное.
    Если результат нулевой, скорее всего пытаетесь изучать что-либо не имея представления о базисных вещах.
    Ответ написан
    Комментировать
  • Возможно ли вывести график из zabbix на свой сайт?

    @Vitsliputsli
    У Zabbix есть API пользуйтесь им, если почему-то хочется самому строить график по данным.
    Либо забирайте картинки и выводите на сайте их, для этого достаточно в url поменять charts.php на chart2.php и он вернет картинку.
    Ответ написан
    Комментировать
  • Создание классов в цикле?

    @Vitsliputsli
    Код простейшего генератора:
    $className = 'Home';
    $classFileName = __DIR__ . '/home.php';
    
    $template = <<<'EOD'
    <?php
      class <<CLASS_NAME>> {        
        function __construct(public $name, public $age){}	 
       
        function show_values(){
        echo "$this->name <br> $this->age <br><br>"; 	 	 
        }	 	 	        
      }
    EOD;
    
    $classCode = str_replace('<<CLASS_NAME>>', $className, $template);
    file_put_contents($classFileName, $classCode);

    Хотя пока неизвестна истинная задача, может нужно не это.
    Ответ написан
    5 комментариев
  • Readonly и объект?

    @Vitsliputsli
    readonly не следит за изменением свойств объекта, если вам нужен иммутабельный объект - делайте специальный объект, либо создавайте его особым образом.
    Ответ написан
  • Как поменять 2 функции в один класс?

    @Vitsliputsli
    ООП - это больше про объекты и их связи. Да, в какой-то степени боремся и с повторяемостью кода, но это не главное. Т.е. нужно смотреть на то, что это за объекты, если они родственные, то можно сделать абстрактный класс, но быть может больше подойдет инстанцирование в один класс разных объектов и вызов одноименной функции. А где-то вообще будет вызов динамический, а где-то быть может стоит и продублировать код. Все зависит от самих объектов и их связей.
    Ответ написан
    Комментировать
  • Добавление свойства без объявления свойства?

    @Vitsliputsli
    Это называется динамическое свойство, в php 8.2 признано устаревшим. Делать так не рекомендуется по очевидным причинам: мы описываем объекты классами для упорядочивания работы, чтобы точно знать, что и где лежит, когда в объекте свалено невесть что, работать с этим будет проблематично. И, к слову, напрямую в свойства тоже не рекомендуется писать.
    Ответ написан
    2 комментария
  • Как сделать дублер сервера?

    @Vitsliputsli
    Если делать самому, а не через облако в интернете, то самый простой способ - virtualIP для сервера приложений и standby сервер для СУБД.
    Ответ написан
    Комментировать
  • Какой тип для денежных данных?

    @Vitsliputsli
    Можно и float использовать, если вас не напрягает, когда вы добавляете 1 сатоши, а добавится 2. Прочитайте про числа с плавающей точкой.
    Как вариант использовать обычный int, decimal выглядит круто в базе, но в php вам придется использовать int и смысл decimal теряется.
    Ответ написан
  • Что может содержать DTO?

    @Vitsliputsli
    1) Цель использования DTO - это передать данные между двумя подсистемами. Причем, либо между ними нельзя передать поведение, либо мы хотим, чтобы они были независимы, а передача поведения увеличит зацепление.
    2) DTO - это специфика Java, там, объединить разнородные данные можно только в объекте. Поэтому был введен данный механизм - объект с искусственным ограничением, только данные и никакого поведения. Но, php не Java, здесь разнородные данные можно легко объединить в обычном массиве. Вы можете, конечно, массив завернуть в объект, но смысла в этом нет, т.к. мы передаем данные между независимыми подсистемами, ни одна из них не должна быть зацеплена на объекты другой.
    3) Как уже написали, сам DTO и механизм его формирующий - это разные вещи, подсистемы могут вообще на разных языках быть написаны, и все будет прекрасно работать, т.к. мы передаем только данные, а не поведение. Если же хочется туда запихнуть валидацию или иное поведение, стоит задуматься, а зачем здесь DTO? Не проще ли тогда сразу передавать полноценный объект.
    Ответ написан
  • Почему условие не выполеяется?

    @Vitsliputsli
    empty($var) - это "синтаксический сахар", т.е. это краткая запись следующей конструкции:
    !isset($var) || $var == false
    т.е. кроме того же самого isset, там еще и сравнение с false, причем с преобразованием типов
    Ответ написан
    Комментировать
  • Зачем дублировать сеттер и геттер?

    @Vitsliputsli
    Если уж говорить об едином методе, то скорее так:
    function getSetAge(?int $age=null): int
    {
        if (!is_null($age)) {
            $this->age = $age;
        }
        return $this->age;
    }}

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

    @Vitsliputsli
    Рассчитывать на лету. Курсы валют сохранять в отдельную таблицу и брать их оттуда для расчета. То же самое для скидок.
    Денормализация здесь не нужна, она ничего не даст, т.к. перемножить числа не проблема. А исторические данные все равно надо хранить.
    Ответ написан
    Комментировать
  • JSON в базе данных это норма для реляционных баз данных?

    @Vitsliputsli
    Можно, но с умом. При невысокой нагрузке, база данных скорее всего простит вам это. При высокой относитесь к json как к обычной строке, т.е. без всяких индексов и поисков по параметру внутри json, максимум когда выборка уже сделана, можно попросить СУБД выбрать нужный атрибут. Как бы PostgreSQL не агитировал за json, поиск по его внутренностям всегда будет хуже по производительности.
    Ответ написан
    Комментировать
  • Как из текстового файла вывести 15 случайных строк?

    @Vitsliputsli
    Накидал вариант для поиска случайных строк в очень больших файлах. Это не совсем оптимально для конкртеного случая автора, но может быть будет кому-то интересно в других случаях.
    $fileName = '1.csv';
    $lineLength = 1024;
    $linesCount = 15;
    
    $handle = fopen($fileName, "r");
    $fileSize = filesize($fileName);
    $data = [];
    if ($fileSize !== 0) {
       for ($num = 1; $num <= $linesCount; $num++) {
           $rand = rand(0, $fileSize);
           fseek($handle, $rand);
           $firstPointer = null;
           do {
               fgets($handle); // trash
               $pointer = ftell($handle);
               if ($pointer === $fileSize) {
                   fseek($handle, 0);
                   $pointer = 0;
               }
               if ($pointer === $firstPointer) { // loop detect
                   continue 2;
               }
               $firstPointer = $firstPointer ?? $pointer;
           } while (array_key_exists($pointer, $data));
           $data[$pointer] = fgets($handle);
       }
    }
    ksort($data); // sort by order in file
    var_dump($data);

    Я здесь не делал защиты от ошибок файловых функций, в этом случае результат может быть неожиданным. Для защиты нужно обернуть все файловые функции и при ошибке выкидывать Exception, а не эти тупые php-шные false. Ну и помнить про ограничение длины строки в $lineLength.
    Ответ написан
    Комментировать