[英]PHP Traversable type hint
我有一个使用foreach
的相对简单的功能
function foo($t) {
$result;
foreach($t as $val) {
$result = dosomething($result, $val);
}
return $result;
}
我想输入提示, Traversable
似乎是我需要的确切类型提示
function foo(Traversable $t) {
但是,这在使用数组时会给出E_RECOVERABLE_ERROR
(当然可以在foreach
): 示例
Argument 1 passed to foo() must implement interface Traversable, array given
有没有办法输入提示或这是不可能的?
PHP 7.1为此目的引入了iterable
类型声明 ,它接受了\\Traversable
数组和实例。
在以前的版本中,您必须省略类型声明。
有一个错误: #41942 。 关闭为'不是错误'。 由于PHP数组不是对象,因此无法实现接口,因此无法同时键入提示array
和Traversable
。
您可以使用iterator_to_array
, ArrayIterator
或省略类型提示。 请注意,iterator_to_array会将整个迭代器复制到一个数组中,因此可能效率低下。
// These functions are functionally equivalent but do not all accept the same arguments
function foo(array $a) { foobar($a); }
function bar(Traversable $a) { foobar($a); }
function foobar($a) {
foreach($a as $key => $value) {
}
}
$array = array(1,2,3)
$traversable = new MyTraversableObject();
foo($array);
foo(iterator_to_array($traversable));
bar(new ArrayIterator($array));
bar($traversable);
foobar($array);
foobar($traversable);
同样的问题。 我放弃了,我只需手动编写函数中的所有内容。
这应该为您提供所需的功能:
function MyFunction($traversable)
{
if(!$traversable instanceof Traversable && !is_array($traversable))
{
throw new InvalidArgumentException(sprintf(
'Myfunction($traversable = %s): Invalid argument $traversable.'
,var_export($traversable, true)
));
}
}
编辑
如果您只想显示$traversable
类型。 如果您希望在子类中继承该功能。
public function MyMethod($traversable)
{
if(!$traversable instanceof Traversable && !is_array($traversable))
{
throw new InvalidArgumentException(sprintf(
'%s::MyMethod($traversable): Invalid argument $traversable of type `%s`.'
,get_class($this)
,gettype($traversable)
));
}
}
问题是,数组不是对象,因此它们无法实现接口。 所以你不能输入提示, array
和Traversable
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.