PHP类型提示允许Array或ArrayAccess

Sup*_*icy 10 php type-hinting arrayaccess

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

例如:

class Config implements ArrayAccess {
    ...
}

class I_Use_A_Config
{
    public function __construct(Array $test)
    ...
}
Run Code Online (Sandbox Code Playgroud)

我希望能够传入Array或ArrayAccess.

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

Sve*_*sen 13

不,没有"干净"的方式.

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

由于您使用的ArrayAccess是数组,您可以将其强制转换.例如:

$config = new Config;
$lol = new I_Use_A_Config( (array) $config);
Run Code Online (Sandbox Code Playgroud)

如果这不是一个选项(你想要按Config原样使用对象),那么只需删除类型提示并检查它是一个数组还是一个ArrayAccess.我知道你想避免这种情况,但这不是什么大问题.它只是几行而且,当说完所有时,无关紧要.

  • 将对象转换为数组并不关心 ArrayAccess 是否实现。AFAIK 唯一会改变转换功能的是 ArrayObject 类的子类化。希望 https://wiki.php.net/rfc/union_types 有一天能够实现(显然与转换无关,但与OP的问题有关);) (2认同)

Hen*_*rik 6

PHP 8.0+

您可以使用array和的并集ArrayAccess

class I_Use_A_Config
{
    public function __construct(array|ArrayAccess $test)
    ...
}
Run Code Online (Sandbox Code Playgroud)