Php: объявлять аргументы типа функции
Я пытаюсь сделать функцию с объявленными типами аргументов, чтобы быстро проверить, находятся ли они в правильном формате, но когда строка всегда возвращает эту ошибку
Обрезаемая фатальная ошибка: аргумент 2, переданный myfunction(), должен быть экземпляром строки, заданной строки, вызываемой в path_to_file в строке 69 и определенной в файле path_to_file в строке 49
function myfunction( array $ARRAY, string $STRING, int $INTEGER ) {
return "Args format correct";
}
myfunction(array("1",'2','3','4'), "test" , 1234);
где ошибка?
Ответы
Ответ 1
Согласно документации PHP5:
Тип подсказки может быть только типа объекта и массива (начиная с PHP 5.1). Традиционный тип hinting с int и string не поддерживается.
Так как string
и int
не являются классами, вы не можете "называть их" в своей функции.
Начиная с PHP 7.0, объявляющего тип аргумента как строку, поддерживается int, float, bool.
Ответ 2
Вы можете сделать что-то вроде этого, которое всегда работало для меня
для строки
function setData($Name=""){ }
это заставляет имя быть строкой, оно не проверяет, есть ли строка
для числовых значений
function setData($age=0){ }
это заставляет возраст быть числом, если строка передана, значение будет 0
для значений массива существует две вариации
function setData(array $data){ }
если массив не передан, он выдаст ошибку
function setData($data=array()){ }
Это передаст пустой массив без значения для $data
Ответ 3
Это может быть полезно для всех, кто видит этот пост с момента появления PHP 7
С PHP 7 теперь можно объявлять типы. Для получения дополнительной информации вы можете сослаться на следующую ссылку.
http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration
function(string $name, boolean $is_admin) {
//do something
}
Ответ 4
string
, int
и другие встроенные типы не классы, в аргументе вы указываете аргумент class. Поддерживается только поддерживаемый встроенный тип array
.
Ответ 5
Вы не можете определить тип как string
и int
. PHP "не знает", что это такое.
Ответ 6
Если вы не используете PHP 7.x или вам нужны некоторые сложные проверки аргументов (например, "массив или \Traversable", потому что вы можете перемещать массивы, но они являются примитивными типами и не реализуют интерфейс \Traversable), вы можете использовать args модуль Нестандартная библиотека PHP (NSPL).
use const \nspl\args\numeric;
use function \nspl\args\expects;
function sqr($x)
{
expects(numeric, $x);
return $x * $x;
}
sqr('hello world');
Выходы:
InvalidArgumentException: Argument 1 passed to sqr() must be numeric, string given in /path/to/example.php on line 17
Call Stack:
0.0002 230304 1. {main}() /path/to/example.php:0
0.0023 556800 2. sqr() /path/to/example.php:17
Ответ 7
Согласно Руководство по PHP, в PHP 5.x вы не можете использовать array
как подсказку, но в PHP 7.x вы можете! Посмотрите:
-
Class/interface name
Параметр должен быть экземпляром данного класса или имени интерфейса. PHP 5.0.0
-
self
Параметр должен быть экземпляром того же класса, что и тот, на котором определен метод. Это можно использовать только для методов класса и экземпляра. PHP 5.0.0
-
array
Параметр должен быть массивом. PHP 5.1.0
-
callable
Параметр должен быть допустимым. PHP 5.4.0
-
bool
Параметр должен быть логическим значением. PHP 7.0.0
-
float
Параметр должен быть числом с плавающей запятой. PHP 7.0.0
-
int
Параметр должен быть целым числом. PHP 7.0.0
-
string
Параметр должен быть строкой. PHP 7.0.0
-
iterable
Параметр должен быть либо массивом, либо экземпляром из Traversable. PHP 7.1.0
Ответ 8
когда мне нужно использовать Type Hints, я делаю это:
<?php
declare(strict_types=1);