PHP: объявление «числового» типа

С современными версиями PHP, мы можем объявить много разных типов, типами объединения или даже mixed. Однако я работаю с Magento 2, и часто невозможно узнать, собираетесь ли вы получить идентификатор 7 или '7', переданный вашему методу.

Моя цель - проверить, используя объявление типа, если это возможно, может ли входное значение быть успешно преобразовано в целое число или уже является целым числом. Поскольку условия MySQL WHERE одинаково обрабатывают целые числа и строки, содержащие только числа, многие приложения LAMP не являются строгими в отношении передачи целых и строк методам, которые имеют дело с идентификаторами. Однако, если я просто объявлю тип объединения int|string, тогда он примет значение «пример», которое не является числовым, и выдаст ошибку, как только попадет в MySQL. Итак, я не могу найти способ проверить ввод в объявлении.

Есть ли чистый способ объявить числовой тип, если я не могу контролировать то, что отправляется моему методу?

Есть float или int. Немного непонятно, в чем именно проблема

ADyson 30.03.2022 02:57

Так что подтвердите свои входные данные. Какова ваша конкретная проблема? 3v4l.org/bIF5F

Sammitch 30.03.2022 03:03

Скорее всего, вам придется создать собственную логику проверки внутри вашего метода/функции, которая вызывает ошибку при недопустимых входных данных. Обновлено: Или используйте PHP 8: stackoverflow.com/a/58826132/61795 или php.net/manual/en/…

Scuzzy 30.03.2022 03:10

Я удивлен отношением в этих ответах. Весь смысл объявления требований к типу в структуре кода заключается в том, что сам PHP-движок и даже IDE могут проверять ввод/вывод метода, а также более тонкие вещи, такие как сигнатура методов дочернего класса. «Просто проверить свои входные данные самостоятельно» полностью упускает смысл.

Tyler V. 30.03.2022 18:58

Ну какой является смысл тогда, собственно? Вы спросили «могу ли я объявить числовой тип», на что прямой ответ: «да, есть float или int». Разве это не то, что вам было нужно? Вы на самом деле не объяснили точный контекст, не привели пример или не показали конкретную проблему в каком-то коде, который вы писали, поэтому, возможно, неудивительно, что люди либо расплывчаты в своих ответах, либо задают вам вопросы в ответ. Так что да, возможно, мы упустили то, к чему именно вы клоните. Кто-то закрыл его как дубликат, но я не совсем уверен, релевантны ли они ссылкам из вашего поста.

ADyson 30.03.2022 19:02

Моя цель - проверить, используя объявление типа, если это возможно, может ли входное значение быть успешно преобразовано в целое число или уже является целым числом. Поскольку условия MySQL WHERE одинаково обрабатывают целые числа и строки, содержащие только числа, многие приложения LAMP не являются строгими в отношении передачи целых и строк методам, которые имеют дело с идентификаторами. Однако, если я просто объявлю тип объединения int|string, тогда он примет значение «пример», которое не является числовым, и выдаст ошибку, как только попадет в MySQL. Итак, я не могу найти способ проверить ввод в декларации.

Tyler V. 30.03.2022 21:34

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

ADyson 30.03.2022 23:25

В любом случае вы можете просто объявить int, и PHP автоматически примет строковое число, например. '7' и превратить его в int, но попытка передать любую другую строку вызовет исключение — демо: 3v4l.org/LnQvW. Это помогает?

ADyson 31.03.2022 16:32

@ADyson Я понятия не имел, что PHP попытается привести тип перед проверкой ввода. Это отличные новости. Это ответ, который я искал.

Tyler V. 01.04.2022 21:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
9
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете просто объявить 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

Другие вопросы по теме