php:声明函数的参数类型

问题描述 投票:0回答:9

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

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

错在哪里?

php function arguments
9个回答
61
投票

根据PHP5文档

类型提示只能是对象和数组(自 PHP 5.1 起)类型。不支持使用 int 和 string 的传统类型提示。

由于

string
int
不是类,因此您无法在函数中“键入提示”它们。

从 PHP 7.0 开始,支持将参数类型声明为 string、int、float、bool。


37
投票

这对于自 PHP 7 发布以来看到这篇文章的任何人来说可能很有用

使用 PHP 7,现在可以声明类型。您可以参考以下链接了解更多信息。

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

function(string $name, bool $is_admin) {
    //do something
}

5
投票

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

对于字符串

function setData($Name=""){ }

这强制名称为字符串,它不会检查它是否是字符串

对于数值

function setData($age=0){ }

这强制年龄为数字,如果传递字符串,则该值为 0

对于数组值,有两种变化

function setData(array $data){ } 

如果没有传递数组,则会抛出错误

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

这将传递一个空数组,没有为

$data

给出任何值

5
投票

根据 PHP 手册,您可以对

PHP 5.1
及更高版本上的 array 以及
PHP 7
及更高版本上的
string
int 类型执行此操作。看看:

  • 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
投票

string
int
和其他内置类型不是classes,在参数中指定参数的class。唯一支持的内置类型是
array


0
投票

您不能将类型定义为

string
int
。 PHP“不知道”它们是什么。


0
投票

如果您没有使用 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
投票

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

<?php 
declare(strict_types=1);

0
投票

从 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

© www.soinside.com 2019 - 2024. All rights reserved.