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