Это невозможно. array()
не является объектом какого-либо класса. Следовательно, он не может реализовать какие-либо
интерфейс (см. здесь ). Таким образом, вы не можете использовать объект и массив взаимозаменяемо. Решение сильно зависит от того, чего вы хотите достичь.
Почему бы вам не изменить сигнатуру функции, чтобы разрешить только ArrayObject
с, ArrayIterator
с, ArrayAccess
с, IteratorAggregate
с, Iterator
с или Traversable
с (в зависимости от того, что вы ' хотел бы сделать внутри функции)?
Если вам приходится полагаться на возможности взаимодействия переданного объекта, вы должны использовать Traversable
в качестве подсказки типа. Это обеспечит возможность использования объекта с foreach()
. Если вам нужен доступ к объекту в виде массива (например, $test['test']
), вы должны использовать ArrayAccess
в качестве подсказки типа. Но если вам нужно, чтобы переданный объект имел определенный пользовательский тип, используйте пользовательский тип в качестве подсказки типа.
Другой вариант - вообще не использовать подсказку типа и определять тип передаваемого аргумента в теле функции и обрабатывать аргумент соответствующим образом (или генерировать InvalidArgumentException
или что-то в этом роде).
if (is_array($arg)) { ... }
else if ($arg instanceof Traversable) { ... }
else if ($arg instanceof ArrayAccess) { ... }
else {
throw new InvalidArgumentException('...');
}