С современными версиями PHP, мы можем объявить много разных типов, типами объединения или даже mixed. Однако я работаю с Magento 2, и часто невозможно узнать, собираетесь ли вы получить идентификатор 7 или '7', переданный вашему методу.
Моя цель - проверить, используя объявление типа, если это возможно, может ли входное значение быть успешно преобразовано в целое число или уже является целым числом. Поскольку условия MySQL WHERE одинаково обрабатывают целые числа и строки, содержащие только числа, многие приложения LAMP не являются строгими в отношении передачи целых и строк методам, которые имеют дело с идентификаторами. Однако, если я просто объявлю тип объединения int|string, тогда он примет значение «пример», которое не является числовым, и выдаст ошибку, как только попадет в MySQL. Итак, я не могу найти способ проверить ввод в объявлении.
Есть ли чистый способ объявить числовой тип, если я не могу контролировать то, что отправляется моему методу?
Так что подтвердите свои входные данные. Какова ваша конкретная проблема? 3v4l.org/bIF5F
Скорее всего, вам придется создать собственную логику проверки внутри вашего метода/функции, которая вызывает ошибку при недопустимых входных данных. Обновлено: Или используйте PHP 8: stackoverflow.com/a/58826132/61795 или php.net/manual/en/…
Я удивлен отношением в этих ответах. Весь смысл объявления требований к типу в структуре кода заключается в том, что сам PHP-движок и даже IDE могут проверять ввод/вывод метода, а также более тонкие вещи, такие как сигнатура методов дочернего класса. «Просто проверить свои входные данные самостоятельно» полностью упускает смысл.
Ну какой является смысл тогда, собственно? Вы спросили «могу ли я объявить числовой тип», на что прямой ответ: «да, есть float или int». Разве это не то, что вам было нужно? Вы на самом деле не объяснили точный контекст, не привели пример или не показали конкретную проблему в каком-то коде, который вы писали, поэтому, возможно, неудивительно, что люди либо расплывчаты в своих ответах, либо задают вам вопросы в ответ. Так что да, возможно, мы упустили то, к чему именно вы клоните. Кто-то закрыл его как дубликат, но я не совсем уверен, релевантны ли они ссылкам из вашего поста.
Моя цель - проверить, используя объявление типа, если это возможно, может ли входное значение быть успешно преобразовано в целое число или уже является целым числом. Поскольку условия MySQL WHERE одинаково обрабатывают целые числа и строки, содержащие только числа, многие приложения LAMP не являются строгими в отношении передачи целых и строк методам, которые имеют дело с идентификаторами. Однако, если я просто объявлю тип объединения int|string, тогда он примет значение «пример», которое не является числовым, и выдаст ошибку, как только попадет в MySQL. Итак, я не могу найти способ проверить ввод в декларации.
Это гораздо лучшее объяснение, спасибо, но вам нужно добавить редактировать в свой вопрос, чтобы у него был шанс быть повторно открытым для ответов.
В любом случае вы можете просто объявить int, и PHP автоматически примет строковое число, например. '7' и превратить его в int, но попытка передать любую другую строку вызовет исключение — демо: 3v4l.org/LnQvW. Это помогает?
@ADyson Я понятия не имел, что PHP попытается привести тип перед проверкой ввода. Это отличные новости. Это ответ, который я искал.






Вы можете просто объявить int как тип входного параметра функции, и PHP автоматически примет строковое целое число (например, '7') и преобразует его в целое число, но попытка передать любую другую строку вызовет исключение.
Пример:
function foo(int $bar) {
var_dump($bar);
}
echo "These ones are all ok:".PHP_EOL;
foo(7);
foo('7');
foo("7345");
echo PHP_EOL."And now for a bad one...".PHP_EOL;
foo("sgjhdfkg");
Выходы:
These ones are all ok:
int(7)
int(7)
int(7345)
And now for a bad one...
Fatal error: Uncaught TypeError: foo(): Argument #1 ($bar) must be of type int, string given
Живая демонстрация: https://3v4l.org/LnQvW
Есть float или int. Немного непонятно, в чем именно проблема