Подтвердить что ты не робот

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);

где ошибка?

4b9b3361

Ответ 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);