Ответы пользователя по тегу PHP
  • Зачем (в наше время) везде писать phpdoc комменты?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если сгенерированная дока по коду публикуется, в этом может быть смысл
    Ответ написан
  • Обучение программированию, что делать если застрял?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Есть один хитрый способ, как это дело частично преодолеть. Решай задачу интересным для тебя способом.
    Ответ написан
    Комментировать
  • Как возвращать значение из PHP метода?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Что лучше возвращать из метода класса void или $this?

    Зависит от задачи. Для заполнения сущности например удобно пользоваться чейном вызовов, тут this себя оправдывает. Для логгера например лучше не стоит и тут лучше void.
    Лично я подхожу к подобному так: если мне нужен именно чейн вызовов, тогда возвращаю this. Если не нужен, или не особо нужен - void.
    Ответ написан
    1 комментарий
  • В чем проблема?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вы забыли точку с запятой после

    $result = $mysql->query("SELECT * FROM `users` WHERE `login` = `$login` and `pass` = `$pass`")


    Используйте плейсхолдеры. Подход: `login` = `$login` ведет к SQL инъекциям
    Ответ написан
    2 комментария
  • Как сделать вывод только определьного количества товара?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Юзайте LIMIT в sql.

    Ваш код довел до слез этого кота.
    c0ef47087edbb2ff747718af5f34c649.jpg
    Ответ написан
    2 комментария
  • Почему некорректно работает класс?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    У вас Company::__construct($company = null), $company может быть любой, и строка, и массив, и null, и объект исключения и т.д., вы ожидаете в проверке только строку, это не корректно.
    С Agre - то же самое.

    echo вы вообще зря используете, если что-то не так - бросайте исключение.

    При вводе любых значений в инпуты класа company name выдает ошибку.

    debug/var_dump в помощь
    Ответ написан
    7 комментариев
  • Почему советуют не выбирать yii2 для разработки?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Обращайте внимание только на конструктивную критику. Если аргументация базируется на фразах в стиле: удобно, мало кода, в пару строк... Это очень плохой маячок.
    По хорошему должны оцениваться: поддерживаемость, расширяемость, тестируемость, производительность и легкость чтения.
    Ответ написан
    2 комментария
  • Как разобрать зависимости без лямбда-замыканий, какая архитектурная ошибка допущена?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Может вам ValueObject стоит заюзать? В примерно таком виде:

    class Path
    {
        private $value;
    
        public __construct($path string)
        {
            // validate path here
           $this->value = $path;
        }
    
        public function getValue(): string
        {
            return $this->value;
        }
    }


    Дальше уже в этой обертке по вашему проекту может летать проверенный и корректный path.
    Обычно чем раньше найдены проблемные данные - тем раньше стоит бросить исключение.

    Я понимаю, что в моем случае - не про отложенность, может вы более подробно опишете, зачем оно вам надо?
    Ответ написан
  • Как собрать php файл исходя из такого JS по которому передаются вот такие переменные?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как собрать php файл исходя из такого JS по которому передаются вот такие переменные?

    Перефразирую ваш вопрос: у меня есть тарелка украинского борща, как мне собрать из этого сырые овощи и живого петуха?
    Ответ написан
    Комментировать
  • Стоит ли хранить зашифрованные данные пользователя в Local/Session Storage на клиенте?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1. Стоит ли так делать и почему;

    Нет. Проверка прав должна выполняться на сервере и не зависеть от внешних систем, к которым нет доверия (это я про фронт). Фактически вы контроль доступа хотите передать другой стороне.

    2. Какой будет прирост производительности

    Прирост то будет, но меньше, чем вы надеетесь. Но не делайте так, еще раз.

    3. Как Вы решаете подобные вопросы.

    Один раз разобрался с https://symfony.com/doc/current/security.html и пользуюсь.
    Ответ написан
    Комментировать
  • Как получить из static наследника к protected и public переменным?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Не используйте статику и подобных проблем у вас не будет.
    Ответ написан
    Комментировать
  • Где лучше написать обработчик исключений в самописном MVC?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    В контроллерах, в роутере, если не найден роут, или еще что-то, в апликейшне (у вас это бутстрап), на случай непредвиденных исключений.

    Я очень надеюсь, что вас сильно смущает год выпуска статьи (так уже не пишут),
    на всякий пожарный: https://github.com/index0h/php-conventions
    Ответ написан
  • Как подправить код?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Поменяйте имя функции на getEmailById и напишите отдельно функцию, получения по чему-то другому.

    Ваш код ужасен. Очень рекомендую к прочтению: https://github.com/index0h/php-conventions
    Что касается работы с БД, ознакомьтесь с паттерном Repository, в частности с его реализацией Doctrine и не плодите энтропию за зря.
    Ответ написан
  • Что нужно знать для PHP Developer?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Ответ написан
    Комментировать
  • Бросать исключение или возвращать коды ошибок/успеха? Является ли исключением то, что метод не может выполнить свою задачу?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Бросать исключение или возвращать коды ошибок/успеха?

    Бросать исключение.

    Является ли исключением то, что метод не может выполнить свою задачу?

    Конечно же.

    Но узнать является ли сумма(amount) корректной по-хорошему можно только в браузере/GUI или в Domain слое в самом методе transferMoney().

    К фронту не должно быть доверия, данные обязательно нужно проверять.
    Аргументы метода лучше проверять И на тип И на граничные значения. Например ваш amount по идее должен быть float + больше, или равен 0. Если amount таковым не является - бросайте исключение. Логика выше должна была это отсечь, еще на этапе валидации данных запроса.

    В transferMoney() нужно извлечь данные пользователя(который пересылает деньги) из БД и проверить есть ли у него такая сумма.

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

    Получается в методе transferMoney() есть одна причина неудачи, а что если добавится ещё одна причина, например, пользователю запрещено временно пересылать деньги?

    Тот же комментарий, что и про баланс.

    Поскольку они ожидаемые, то бросать исключения не логично.

    Почему же? Логика выше сможет обработать ваши ожидаемые исключения и через множественный catch определить, что не так. Это вполне нормально, и даже удобно.

    В случае если бы была одна причина неудачи, то можно было бы просто вернуть false.

    Очень хреновая практика. Как вы определите в вызывающем коде, что пошло не так? Что "false"? Баланса не хватает, нельзя делать покупки, или Меркурий в ретрограде?

    возвращать что-то на подобии [false, $error] и [true, null]

    Для php - это очень кривой подход. По двум причинам:
    1. Вы расширяете интерфейс метода, просто так.
    2. Вы нагружаете вызывающий код дополнительными обвязками проверок, опять же просто так.
    В этом нет смысла так как есть механизм try-catch, который отлично решает это задачу.
    Вот пример, допустим ваш transferMoney($amount, User $recipient) должен возвращать объект транзакции, пусть его сигнатура будет:
    transferMoney(float $amount, User $recipient): Transaction
    Вызывающий код знает, что он обязан в конце получить транзакцию, а если что-то пойдет не так - будет исключение, нет смысла в дополнительных проверках, а что если первый элемент массива false, а что если он true, но второй элемент не null, а что если второй элемент не тот, что ожидалось, а что если первый элемент - строка, и т.д.

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

    Верно

    То есть transferMoney() выбросит исключение, которое подымется до Controller'a, и на основе которого Controller отправит 400 Bad Request и причину неудачи.

    Угу

    Или всё таки первый подход к проблеме лучше(первый абзац)?

    Первый подход - это путь боли, ошибок и отчаянья.

    Вот вам еще чтива: https://github.com/index0h/php-conventions
    Ответ написан
    1 комментарий
  • Почему в контроллерах MVC-фреймворков на PHP несколько действий?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Обычно это просто удобно, так как в одном контроллере можно разместить действия с одной сущностью, либо объединить их по какому-то другому признаку. Бывает, что несколько экшнов юзают общий приватный метод, который нет смысла выносить в отдельный сервис, и дублировать между файлами не хочется.
    В случае вытягивания зависимостей контроллера из контейнера выигрыша от разделения контроллера на экшны нет, от слова "совсем".
    Если же зависимости контроллера вставляются через DI - выигрыш будет в том, что не нужно будет пробрасывать зависимости не нужные конкретно в этом экшне, а так же упростится unit тестирование.
    Ответ написан
    Комментировать
  • Сильные и слабые стороны PHP 7?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Чаще всего это буквально значит: знание назначения языка. Язык - это инструмент для ограниченного количества задач. Бывают случаи, когда инструмент выбирается не на основании объективных требований задачи, а на основании субъективных хотелок исполнителя. Php это, или что-то иное, не имеет значения.
    Ответ написан
    1 комментарий
  • Можете поревьюить?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Критерии оценки беру тут: https://github.com/index0h/php-conventions конечно часть по оформлению, от части вкусовщина, но хотя бы PSR уважать надо.

    1. В док блоках для свойств очень не плохо было бы указать типы и привести их к camelCase.
    2. Почему private методы вначале класса?))
    3. У вас отсутствует валидация аргументов в методах. Что будет, если в конструктор запихнуть не токен, а объект например, с остальными методами - тоже.
    4. В приватных статических методах нет смысла (если честно статика в принципе штука довольно вредная, по ссылке описано почему).
    5. filter* методы - не очень, откройте для себя array_shift и array_pop, вам в принципе нужны эти методы?
    6. В методе getReplyTimes заюзайте array_filter
    7. Я не знаю, что представляет собой $messages, но по хорошему - это должно быть что-то типа Entity с геттерами и сеттерами, с гарантиями структуры данных. Если это какой-то \stdClass - это очень печально.
    Ответ написан
    2 комментария