Extract ArrayAccessRead from ArrayAccess
| From: | Valentin Udaltsov | Date: | Mon, 27 May 2024 04:13:33 +0000 |
| Subject: | Extract ArrayAccessRead from ArrayAccess | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-123433@lists.php.net to get a copy of this message | ||
Hello, internals!
Recently I was implementing some collections and realized that I cannot use
ArrayAccess for immutable collections without throwing
BadMethodCallException in offsetSet and offsetUnset. I also
cannot
have an interface ReadonlyCollection extends ArrayAccess, because
offsetSet and offsetUnset are mutators and have TValue in a
contravariant position.
Here's the idea: let's extract ArrayAccess::offsetExists and
ArrayAccess::offsetGet methods into a separate ArrayAccessRead
interface (name can be different) and allow read operations `$exists =
isset($object['key']) and $value = $object['key']` for objects of
classes
that implement this interface. ArrayAccess will then extend
ArrayAccessRead and add the remaining 2 methods. Looks like this change
should not break backward compatibility.
```
interface ArrayAccessRead
{
public function offsetExists(mixed $offset): bool;
public function offsetGet(mixed $offset): mixed;
}
interface ArrayAccess extends ArrayAccessRead
{
public function offsetSet(mixed $offset, mixed $value): void;
public function offsetUnset(mixed $offset): void;
}
// then interfaces of the doctrine/collections package might look like this:
namespace Doctrine\Common\Collections;
interface ReadableCollection extends Countable, IteratorAggregate,
ArrayAccessRead {}
interface Collection extends ReadableCollection, ArrayAccess {}
```
--
Regards, Valentin Udaltsov