On Mon, Mar 18, 2024, at 9:13 AM, Lynn wrote:

> In regards to arrays, what about additional operations next to get/set? 
> I doubt this solution will cover all the use-cases or perhaps even 
> over-complicate things, just throwing the idea out there.
>
> ```php
> class Test {
>     private array $_myData = [];
>     public array $myData {
>         get => $this->_myData;
>         append => $this->_myData[] = $value;
>     }
> }
> ``` 
>
>  Thinking about the other post about offset and containers 
> (https://github.com/Girgias/php-rfcs/blob/master/container-offset-behaviour.md):
> ```php
> class Test {
>     private array $_myData = [];
>     public array $myData {
>         get => $this->_myData;
>         append => $this->_myData[] = $value;
>         write_dimension => $this->_myData[$offset] = $value;
>     }
> }
> ```

Those hooks  may be possible; we'd have to try it and see.  However, they also 
wouldn't be able to fully emulate arrays.  $foo->bar['baz'][] = 'beep' could 
get very weird.  Those wouldn't cover unsetting.  Array functions like 
array_splice() still wouldn't work.  Basically, there will never be a way to 
make arrays 100% transparent with hooks.  That's why the RFC recommends still 
using a method for array modification, as that's already a very well-understood 
and flexible approach.

Fortunately, as currently written (append and write_dimension are forbidden), 
those additional hooks could be considered and added in their own RFC in the 
future with no BC break.  Whether or not they make sense or cover "enough" use 
cases is a question that could be answered in the future, after Gina's RFC 
passes.

So on this one, I think "punt" is the best option for now.  It can be safely 
revisited in the future.

> Is this issue restricted to arrays only? From my understanding objects 
> functioning as arrays are already by reference and thus should not 
> suffer from this?
> ```php
> class Test {
>     private ArrayObject $_myData;
>     public ArrayObject $myData {
>         get => $this->_myData;
>     }
>
>     public function __construct() {
>         $this->_myData = new ArrayObject();
>     }
> }
>
> // would this work without issues?
> $obj = new Test();
> $obj->myData[] = 'test';
> ```

Mostly correct.  Objects pass by handle, not by reference.  (You can pass an 
object by reference instead, and it behaves subtly differently.)  But the net 
effect is the same.  Your sample code there would run fine.

--Larry Garfield

Reply via email to