我正在尝试创建一个带有声明的参数类型的函数,以快速检查它们是否采用正确的格式,但是当它返回一个字符串时,我出现此错误:
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);
错在哪里?
根据PHP5文档:
类型提示只能是对象和数组(自 PHP 5.1 起)类型。不支持使用 int 和 string 的传统类型提示。
由于
string
和 int
不是类,因此您无法在函数中“键入提示”它们。
从 PHP 7.0 开始,支持将参数类型声明为 string、int、float、bool。
这对于自 PHP 7 发布以来看到这篇文章的任何人来说可能很有用
使用 PHP 7,现在可以声明类型。您可以参考以下链接了解更多信息。
http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration
function(string $name, bool $is_admin) {
//do something
}
你可以做这样的事情,这对我一直有效
对于字符串
function setData($Name=""){ }
这强制名称为字符串,它不会检查它是否是字符串
对于数值
function setData($age=0){ }
这强制年龄为数字,如果传递字符串,则该值为 0
对于数组值,有两种变化
function setData(array $data){ }
如果没有传递数组,则会抛出错误
function setData($data=array()){ }
这将传递一个空数组,没有为
$data
给出任何值
根据 PHP 手册,您可以对
PHP 5.1及更高版本上的
array
以及 PHP 7及更高版本上的
string
和 int
类型执行此操作。看看:
Class/interface name
参数必须是给定类或接口名称的实例。 PHP 5.0.0self
参数必须是与定义方法的类相同的实例。这只能用于类和实例方法。 PHP 5.0.0参数必须是数组。 PHP 5.1.0array
callable
该参数必须是有效的可调用参数。 PHP 5.4.0bool
参数必须是布尔值。 PHP 7.0.0float
参数必须是浮点数。 PHP 7.0.0参数必须是整数。 PHP 7.0.0int
参数必须是字符串。 PHP 7.0.0string
iterable
参数必须是数组或 Traversable 实例。 PHP 7.1.0string
、int
和其他内置类型不是classes,在参数中指定参数的class。唯一支持的内置类型是 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
当我需要使用类型提示时,我这样做:
<?php
declare(strict_types=1);
从 PHP7 输入声明的变量参数
<?php
function total_intervals($unit, DateInterval ...$intervals) {
$time = 0;
foreach ($intervals as $interval) {
$time += $interval->$unit;
}
return $time;
}
$a = new DateInterval('P1D');
$b = new DateInterval('P2D');
echo total_intervals('d', $a, $b).' days';
// This will fail, since null isn't a DateInterval object.
echo total_intervals('d', null);
https://www.php.net/manual/en/functions.arguments.php#example-164