php - 实现 PHP 接口(interface),以便对象实例可以作为数组类型参数传递?

标签 php interface

在 PHP 中,可以指定参数类型,尽管他们称之为类型提示。

我正在实现一个接口(interface),其中一个函数指定一个数组作为参数类型:

function myFunction(array $argument){
}

我想定义一个类,它的实例可以用作此函数的参数。换句话说,它将扩展 ArrayObject 或实现 ArrayAccess 或类似的东西。

是否有内置接口(interface)或抽象类可以用于此目的? (ArrayObject 没有)

最佳答案

这是不可能的。 array() 不是任何类的对象。因此,它无法实现任何 接口(interface)(参见here)。所以你不能互换使用对象和数组。解决方案很大程度上取决于您想要实现的目标。

为什么不更改函数签名以仅允许 ArrayObjectArrayIteratorArrayAccessIteratorAggregateIteratorTraversable(取决于您想在函数内执行的操作)?

如果您必须依赖所传递对象的交互功能,您应该使用 Traversable 作为类型提示。这将确保该对象可以与 foreach() 一起使用。如果您需要对对象进行类似数组的键访问(例如 $test['test']),您应该使用 ArrayAccess 作为类型提示。但如果您需要传递的对象属于特定的自定义类型,请使用自定义类型作为类型提示。

另一种选择是根本不使用类型提示,并确定函数体内传递的参数的类型并相应地处理参数(或抛出 InvalidArgumentException 或类似的东西) .

if (is_array($arg)) { ... }
else if ($arg instanceof Traversable) { ... }
else if ($arg instanceof ArrayAccess) { ... }
else {
    throw new InvalidArgumentException('...');
}

关于php - 实现 PHP 接口(interface),以便对象实例可以作为数组类型参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/944245/

相关文章:

javascript - 是否可以使用 typescript 映射类型来创建接口(interface)的非函数属性类型?

python:围绕第三方类编写包装器

interface - 抽象如何实现接口(interface)?

php - 如何使用 Laravel 5 获得人类可读格式的时间差异?

php - ORDER BY RAND()函数需要很长时间才能在mysql中执行

php - magento 付款流程.. 一般如何运作

c# - 通用列表的接口(interface)继承

Java:什么是接口(interface)不一致?

php - 如何实现像Facebook这样的通知系统?

php - 在php中连接mysql的两个字段