Pull to refresh

Comments 19

Почему нельзя в родной функции getParam провести аналогичное приведение типов?
return isset($_GET[$name]) ? $_GET[$name] : (isset($_POST[$name]) ? $_POST[$name] : $defaultValue);

а-ля:
return isset($_GET[$name]) ? (ctype_digit($_GET[$name]) ? (int)$_GET[$name] : $_GET[$name]) : (isset($_POST[$name]) ? (ctype_digit($_POST[$name]) ? (int)$_POST[$name] : $_POST[$name]) : $defaultValue);
Потому что кроме getParam есть еще getPost и getQuery, которые тоже используются в проекте.
Про функцию ctype_digit не знал. Думаю лучше использовать вместо работы с регулярками. Спасибо!
Это был лишь пример одной функции, никто не мешает экстендить и остальные таким же образом.
А суть в том, что для mysql нет разницы [select * from data where id = 1] или [select * from data where '1'].

Это опечатка, или я чего-то не понимаю?
В первом случае вернет запись с id=1, во втором вернет все записи.
Похоже опечатка, видимо имелось ввиду select * from data where id='1'
Такие данные не используются. По этому тут нет такого. Но добавить не сложно
Ну это просто несерьёзный подход. Вы публикуете статью «Приведение к типам», а в результате демонстрируете довольно сомнительное приведение к int и ничего более.
Я хотел ознакомить людей с возможной проблемой и решением, которое я применил. Я же не писал расширение для каталога Yii extensions, а показал часть кода нашего проекта.
Тем не менее, люди хотят ознакомиться с более качественным подходом. Я не использую Yii, но как раз в данный момент работаю над аналогичной задачей в более широком спектре использования. От вашей публикации я ожидал как минимум демонстрации нескольких типов данных и более-менее готового решения, которое чему-то учит. Всё-таки данный ресурс — не личный дневник с заметками на полях.

Не говоря уже о том, что ваш код угробит значение '123456789876546548786546875468'.
Согласен. В следующий раз буду более требовательно подходить к написанию статьи.
if (preg_match("/^[\d]+$/", $prop)) $prop = (int)$prop;

Замечательно. А теперь скажите, пожалуйста, что мы получим, если исходным значением будет строка '0001234'?
Т.е. получается, что нельзя использовать строковые поля, в которых содержатся только цифры?
У нас не возникает ситуаций, когда число нужно передать в виде строки, по этому данное решение полностью покрыло потребности проекта

Каюсь, с первого раза это не увидел, но всё же надо такие моменты учитывать тем, кто захочет перенять подобный способ
Да, согласен с вами, что метод требует доработок.
Была, кстати, пробема с одним фреймворком из-за того, что он самостоятельно пытался принимать решение о типе данных основываясь на содержимом. Там была функция ctype_digit вместо регулярки, но суть та же. Как вы написали в статье, для MySQL особой разницы нет (если включен соответствующий режим), но ведущие нули обрезались, что неправильно
Использовал просто функцию с сигнатурой вроде

public function getParam($name, $defaultValue=null, $type = 'string')


У нас не возникает ситуаций, когда число нужно передать в виде строки

Очень редкий случай, по-моему, когда в требованиях написано что-то вроде «логин не может быть 123».

P.S. Использование тут регулярок — из пушки по воробmям, имхо. is_numeric($prop) и/или strval(intval($prop)) === $prop

P.P.S. DRY — даже если использовать — не повторяйтесь

  public function parseData(&$data)
    {
        if (is_array($data)) {
            foreach ($data as &$prop) {
                  $this->parseData($prop);
        } else {
            if (preg_match("/^[\d]+$/", $data)) $data = (int)$data;
        }
    }


И зачем функция public?
Метод для приведения типов вообще в другом классе у нас, так как используется и для других задач. Для внес этот метод в представленный класс. Сейчас сделаю правку здесь на protected
Внес изменения в работу метода. Спасибо за совет.
Sign up to leave a comment.

Articles