php:声明函数的参数类型

Posted

技术标签:

【中文标题】php:声明函数的参数类型【英文标题】:php: Declare arguments type of a Function 【发布时间】:2012-02-16 06:43:06 【问题描述】:

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

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 7.0 php.net/manual/en/… 【参考方案1】:

根据PHP Manual,您可以在PHP 5.1 及更高版本上为array 以及在PHP 7 上的stringint 类型执行此操作,以及超过。看看:

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

【讨论】:

从 PHP 5.1.0 起可以使用数组作为提示 当然,你是对的,我自己写错了,呵呵。【参考方案2】:

根据the PHP5 documentation:

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

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

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

【讨论】:

这个答案已经过时了,见php.net/manual/en/… 如果我有一个类 Person 并且我想接受一个 Person 数组作为我的函数的参数怎么办?我该怎么做?【参考方案3】:

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

<?php 
declare(strict_types=1);

【讨论】:

请添加更多关于您的答案的描述。【参考方案4】:

这对于自 PHP 7 可用以来看到此帖子的任何人可能有用

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

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

function(string $name, boolean $is_admin) 
    //do something

【讨论】:

是否总是建议包含参数类型? boolean 作为类型声明将检查 instanceof boolean 而不是检查布尔值。正确的类型声明是bool。例如function a(value: boolean); a(true) 将失败。 这个函数的返回类型的语法呢? @AlexLacayo 我认为这是一个很好的做法。 PHP 在变量类型和赋值方面一直非常宽松。但是过于开放总有一天会不可避免地导致挠头的错误。返回类型使用冒号声明,后跟返回类型。例如:函数 foo() : int return 0; 根据php.net/manual/en/language.types.declarations.php不应该是bool而不是boolean吗?【参考方案5】:

如果您不使用 PHP 7.x 或需要一些复杂的参数验证(例如“数组或 \Traversable”,因为您可以遍历数组但它们是原始类型并且不实现 \Traversable 接口),您可以使用args 模块来自Non-standard PHP library (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

【讨论】:

【参考方案6】:

你可以做一些对我一直有效的事情

对于字符串

function setData($Name="") 

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

对于数值

function setData($age=0) 

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

对于数组值,有两种变化

function setData(array $data)  

如果没有传递一个数组,它会抛出一个错误

function setData($data=array())  

这将传递一个没有为$data 提供值的空数组

【讨论】:

为参数指定默认值是一项重要的技术,但不应等同于类型提示。例如,指定func( $x=0 ) 会强制$x 的值是一个数字,这并不完全正确。相反,如果您的函数始终将$x 的值作为一个数字处理,那么巧合的是它可以解决。实际上,如果您传入一个恰好可以解析为数字的字符串,那么它将以这种方式处理。 func( '5' ) 很乐意使用 5 作为整数值。不可解析的字符串被解释为 0,因此您的 0 默认值是巧合。【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

它确实知道类型,it just doesn’t care。

以上是关于php:声明函数的参数类型的主要内容,如果未能解决你的问题,请参考以下文章

PHP7新功能及语法变化总结

C函数语法,在参数列表之后声明的参数类型

将React函数式组件作为函数的参数传递时,我应该如何用TS声明函数参数类型

A 缺少类型注释。A 是在函数类型中声明的类型参数

声明带参数的函数

PHP 7系列版本(7.07.17.27.37.4)新特性