php:声明函数的参数类型

php:声明函数的参数类型,php,function,arguments,Php,Function,Arguments,我试图用声明的参数类型创建一个函数,以快速检查它们的格式是否正确,但当它返回一个字符串时,我发现以下错误: Catchable致命错误:传递给myfunction()的参数2必须是字符串的实例,字符串给定,在第69行的路径到文件中调用,并在第49行的路径到文件中定义 范例 function myfunction( array $ARRAY, string $STRING, int $INTEGER ) { return "Args format correct"; } myfunct

我试图用声明的参数类型创建一个函数,以快速检查它们的格式是否正确,但当它返回一个字符串时,我发现以下错误:

Catchable致命错误:传递给myfunction()的参数2必须是字符串的实例,字符串给定,在第69行的路径到文件中调用,并在第49行的路径到文件中定义

范例

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

错误在哪里?

您不能将类型定义为
string
int
。PHP“不知道”它们是什么。

string
int
和其他内置类型不是参数的类。唯一支持的内置类型是
数组

,根据:

类型提示只能是object和array(从PHP5.1开始)类型。不支持使用int和string的传统类型提示

由于
string
int
不是类,因此不能在函数中“键入提示”它们


从PHP7.0开始,支持将参数类型声明为string、int、float和bool

你可以做这样的事情,这对我来说一直都很有效

对于字符串

function setData($Name=""){ }
这会强制名称为字符串,而不会检查其是否为字符串

对于数值

function setData($age=0){ }
这将强制年龄为数字,如果传递字符串,则该值将为0

对于数组值,有两种变体

function setData(array $data){ } 
如果未传递数组,它将抛出一个错误

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

如果您不使用PHP7.x或需要一些复杂的参数验证(如“数组或\Traversable”,因为您可以遍历数组,但它们是基本类型,并且不实现\Traversable接口),那么这将传递一个空数组,该数组没有为
$data

提供值

产出:

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

这可能对自从PHP7可用以来看到这篇文章的任何人都有用

使用PHP7,现在可以声明类型了。有关更多信息,请参阅以下链接

根据,您可以在PHP5.1和更高版本上对
array
执行此操作,在PHP7和更高版本上对
string
int
类型执行此操作。看一看:

  • 类/接口名称
    该参数必须是给定类或接口名称的实例PHP5.0.0
  • self
    参数必须是与定义方法的类相同的类的实例。这只能用于类和实例方法PHP5.0.0
  • array
    参数必须是数组PHP5.1.0

  • callable
    该参数必须是有效的可调用参数PHP5.4.0
  • bool
    参数必须是布尔值PHP7.0.0
  • float
    参数必须是浮点数PHP7.0.0
  • int
    参数必须是整数PHP7.0.0

  • string
    参数必须是字符串PHP7.0.0

  • iterable
    参数必须是数组或可遍历的实例PHP7.1.0

当我需要使用类型提示时,我会这样做:

<?php 
declare(strict_types=1);

您不能为标量值提示。现在您可以使用PHP7.0,因为它确实知道类型。为参数指定默认值是一项重要技术,但不应等同于类型提示。例如,指定
func($x=0)
会强制
$x
的值为一个数字,这并不完全正确。相反,如果您的函数始终将
$x
的值作为一个数字进行处理,那么巧合的是,它会成功。实际上,如果您传入一个字符串,该字符串恰好可以作为一个数字进行分析,那么它将以这种方式进行处理
func('5')
很乐意使用5作为整数值。不可解析的字符串被解释为零,因此您的0默认值是巧合。此答案已过时,请查看如果我有一个类
Person
,并且我希望接受一个
Person
数组作为我函数的参数,该怎么办?我该怎么做?请添加更多关于您答案的描述。您可以使用数组作为提示,因为PHP 5.1.0当然,您是对的,我写错后自己写对了,呵呵。是否总是建议包含参数类型?
boolean
,因为类型声明将检查布尔值的实例
instanceof boolean
,而不是检查布尔值。正确的类型声明是
bool
。e、 g.
函数a(值:布尔值);(true)
将失败。该函数返回类型的语法如何?@AlexLacayo我认为这是一个很好的做法。PHP在变量类型和赋值方面一直非常宽松。但过于开放终有一天会不可避免地导致抓头。返回类型使用冒号声明,后跟返回类型。例如:函数foo():int{return 0;}
function(string $name, boolean $is_admin) {
    //do something
}
<?php 
declare(strict_types=1);