php: объявить аргументы типа функции - PullRequest
21 голосов
/ 22 января 2012

Я пытаюсь создать функцию с объявленными типами аргументов, чтобы быстро проверить, имеют ли они правильный формат, но когда она возвращает строку, я выдаю эту ошибку:

Catchable fatal error: Argument 2 passed to myfunction() must be an instance of string, string given, called in path_to_file on line 69 and defined in path_to_file on line 49

Пример

function myfunction( array $ARRAY, string $STRING, int $INTEGER ) { 
    return "Args format correct"; 
}
myfunction(array("1",'2','3','4'), "test" , 1234);

Где ошибка?

Ответы [ 8 ]

41 голосов
/ 22 января 2012

Согласно документации PHP5 :

Тип Подсказки могут быть только типа объекта и массива (начиная с PHP 5.1). Подсказка традиционного типа с использованием int и string не поддерживается.

Поскольку string и int не являются классами, вы не можете "напечатать подсказку" в своей функции.

Начиная с PHP 7.0, объявление типа аргумента как string, int, float, bool поддерживается.

10 голосов
/ 21 июня 2017

Это может быть полезно для всех, кто видит этот пост с момента появления PHP 7

В PHP 7 теперь можно объявлять типы. Вы можете обратиться по следующей ссылке для получения дополнительной информации.

http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration

function(string $name, boolean $is_admin) {
    //do something
}
7 голосов
/ 30 декабря 2013

Вы можете сделать что-то подобное, что всегда работало для меня

для строки

function setData($Name=""){ }

это заставляет имя быть строкой, оно не проверяет, является ли оно строкой

для числовых значений

function setData($age=0){ }

это заставляет возраст быть числом, если передана строка, значение будет 0

для значений массива есть два варианта

function setData(array $data){ } 

если массив не передан, он выдаст ошибку

function setData($data=array()){ } 

Это передало бы пустой массив без значения для $data

3 голосов
/ 12 августа 2017

Согласно PHP Manual , вы можете сделать это для array на PHP 5.1 и выше и для string и int типов на PHP 7 и выше. Взгляните:

  • 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
1 голос
/ 22 января 2012

string, int и другие встроенные типы не являются классами , в качестве аргумента вы указываете класс аргумента.Единственный поддерживаемый встроенный тип, который нужно поместить, это array.

0 голосов
/ 21 августа 2017

когда мне нужно использовать подсказки типа, я делаю это:

<?php 
declare(strict_types=1);
0 голосов
/ 18 января 2016

Если вы не используете 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
0 голосов
/ 22 января 2012

Вы не можете определить тип как string и int.PHP «не знает», что они.

...