Я пытаюсь сделать функцию с объявленными типами аргументов, чтобы проверить быстро, если они находятся в правильном формате, но когда строка всегда возвращает эту ошибку. Обманутая фатальная ошибка: аргумент 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);
где ошибка?
Согласно документации PHP5 :
Тип подсказки может быть только типа объекта и массива (начиная с PHP 5.1). Традиционный тип hinting с int и string не поддерживается.
Поскольку string
и int
не являются классами, вы не можете «набирать» их в своей функции.
Вы можете сделать что-то вроде этого, которое всегда работало для меня
для строки
function setData($Name=""){ }
это заставляет имя быть строкой, оно не проверяет, является ли его строка
для числовых значений
function setData($age=0){ }
это заставляет возраст быть числом, если строка передана, значение будет равно 0
для значений массива существует два варианта
function setData(array $data){ }
если массив не передан, он выдаст ошибку
function setData($data=array()){ }
Это передало бы пустой массив no value для $data
Это может быть полезно для тех, кто видит этот пост с момента появления PHP 7
С PHP 7 теперь можно объявлять типы. Для получения дополнительной информации вы можете сослаться на следующую ссылку.
http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration
function(string $name, boolean $is_admin) { //do something }
string
, int
и другие встроенные типы не являются классами , в аргументе, которые вы указываете для класса , аргумента. Единственным поддерживаемым встроенным типом, который должен быть установлен, является array
.
Вы не можете определить тип как string
и int
. PHP «не знает», каковы они.
Если вы не используете 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
когда мне нужно использовать Type Hints, я делаю это:
<?php declare(strict_types=1);
Согласно PHP Manual , в 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
Параметр должен быть либо массивом, либо instanceof Traversable. PHP 7.1.0