【问题标题】:PHP Type hinting to allow Array or ArrayAccessPHP 类型提示以允许 Array 或 ArrayAccess
【发布时间】:2013-01-26 05:35:57
【问题描述】:

是否可以允许实现 ArrayAccess 的 Array 或对象?

例如:

class Config implements ArrayAccess {
    ...
}

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

我希望能够传入 Array 或 ArrayAccess。

除了手动检查参数类型之外,还有其他干净的方法吗?

【问题讨论】:

    标签: php type-hinting union-types arrayaccess


    【解决方案1】:

    不,没有“干净”的方法。

    array 类型是原始类型。实现ArrayAccess 接口的对象基于类,也称为复合类型。没有包含两者的类型提示。

    由于您使用 ArrayAccess 作为数组,您可以直接转换它。例如:

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

    如果这不是一个选项(您想按原样使用Config 对象),那么只需删除类型提示并检查它是数组还是ArrayAccess。我知道你想避免这种情况,但这没什么大不了的。这只是几行话,说到底,无关紧要。

    【讨论】:

    • 不是我希望的答案,但转换为数组实际上是一个好主意。谢谢
    • 这是一种不好的做法,客户不应该做图书馆可以做的事情。
    • 将对象转换为数组并不关心是否实现了 ArrayAccess。 AFAIK 唯一会改变转换功能的就是继承 ArrayObject 类。希望wiki.php.net/rfc/union_types 有朝一日能成功(显然与选角无关,但与 OP 的问题有关);)
    • 这太可悲了:(
    • 此答案可能无法满足所有情况。例如,我有一个 ArrayIterator 调用 getter 而不是属性,如果接收数组的函数尝试访问没有属性的 getter,它将找不到它。在这种情况下,我会删除 typehint 并使用 $test instanceof ArrayAccess or is_array($test) 执行手动检查
    【解决方案2】:

    PHP 8.0+

    您可以使用arrayArrayAccess 的并集。

    class I_Use_A_Config
    {
        public function __construct(array|ArrayAccess $test)
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 2013-06-23
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多