PHP类型提示允许阵列或ArrayAccess接口(PHP Type hinting to allo

2019-07-19 17:05发布

是否有可能让一个数组或者实现了ArrayAccess对象?

例如:

class Config implements ArrayAccess {
    ...
}

class I_Use_A_Config
{
    public function __construct(Array $test)
    ...
}

我希望能够在数组或ArrayAccess接口通过。

有没有干净的方式比人工检查参数类型做到这一点其他的?

Answer 1:

不,没有做不“干净”的方式。

array类型是原始类型 。 实现该对象ArrayAccess接口是基于类,也称为复合类型 。 有没有类型暗示涵盖。

由于您使用ArrayAccess为一个数组,你可以只投它。 例如:

$config = new Config;
$lol = new I_Use_A_Config( (array) $config);

如果这不是一个选项(您想使用的Config对象,因为它是)则只是删除了类型提示,并检查它是数组或一个ArrayAccess 。 我知道你想避免,但它不是一个大问题。 这是短短的几行,当一切都说过和做过的无关紧要的。



Answer 2:

他们在PHP 7.1真正解决问题。

http://php.net/manual/en/migration71.new-features.php#migration71.new-features.iterable-pseudo-type

可迭代伪类型是你想要的。 任何阵列或Traversable的类型,(这是迭代器的基本接口)将通过该检查。

现在,为了明确这一点的人谁想要得到深入超强,是的,有将是边缘情况。 你应该考虑这些边缘情况和自己解决这些问题,但如果你想确保,如果有人通过在无法通过一键访问的穿越元素,你可以做到这一点。

http://php.net/manual/en/function.iterator-to-array.php

现在,无论他们在类型提示通过什么,你将有一个数组,但可以删除使用生成的存储量减少的好处。 这应该是显而易见的,但显然它不是,所以在这儿呢。 你,程序员,负责找出您的特定使用案例的代码和你如何计划使用它,什么适当使用情况的代码。

因为这仍然是不够清楚,比方说,你想的东西是类型hintable通过,并期待一个特定的方法或变量存在,那么你是做不好的编程。 你应该实施有你正在寻找,并通过在,而不是一个泛型类型的返回类型的合同。 如果你只想做一些通用的如循环,这就是可迭代的类型是。 该提示是在名称:迭代。



Answer 3:

那么PHP支持类型提示数组/对象。 所以阵列应该能正常运行。 但是通过只允许数组类型可能会引发错误的方法了ArrayAccess对象。 了ArrayAccess主要用于迭代了ArrayAccess对象在方法状阵列等使用的foreach的目的。



文章来源: PHP Type hinting to allow Array or ArrayAccess