【发布时间】:2011-12-13 21:26:58
【问题描述】:
是否可以将函数参数定义为多种可能的类型?例如,一个函数可能需要一个字符串或一个整数来完成某事。有可能以某种方式这样定义吗?
function something(int|string $token) {}
或者每个参数只支持一种类型?
(请注意,我知道我可以稍后过滤输入,我只想输入我的参数)
【问题讨论】:
是否可以将函数参数定义为多种可能的类型?例如,一个函数可能需要一个字符串或一个整数来完成某事。有可能以某种方式这样定义吗?
function something(int|string $token) {}
或者每个参数只支持一种类型?
(请注意,我知道我可以稍后过滤输入,我只想输入我的参数)
【问题讨论】:
您可以做的最好的事情称为类型提示,并在此处进行解释:
http://php.net/manual/en/language.oop5.typehinting.php
特别是,您可以提示类类型或数组类型,但(如手册所述)“不支持使用 int 和字符串进行传统类型提示。”所以我猜你想要完成的事情在这个级别是不可能的。
但是,您可以创建自己的包装器等。可能有上千种方法来处理它。
【讨论】:
不,这是不可能的。
此外,PHP 5 中的类型提示现在仅适用于类和数组。 http://php.net/manual/en/language.oop5.typehinting.php
class Foo
{
}
function something(Foo $Object){}
【讨论】:
PHP 是动态类型的 - 但语言中已添加类型提示 - 因此,如果您没有提示参数,您可以传递任何您喜欢的类型:
function something($token)
{
if (is_numeric($token)) {
// its a float, double, integer
} else {
// its a string, array, object
}
}
(我不知道如何处理资源)。
但是,如果您想使用强类型语言进行编程,那么(恕我直言)您应该使用 PHP 以外的其他语言
【讨论】:
is_numeric 还包括数字字符串,但不包括资源。
联合类型在 PHP 8.0 中具有 finally been implemented,预计在 2020 年底发布。
它们可以这样使用:
class Number {
private int|float $number;
public function setNumber(int|float $number): void {
$this->number = $number;
}
public function getNumber(): int|float {
return $this->number;
}
}
【讨论】: