On 23/11/2024 20:27, Rob Landers wrote:
Interesting! I actually found it to be intuitive.

Think of it like this:

function increment(array $array) {
  $array[0]++;
}

$arr = [0];
increment($arr);
echo $arr[0]; // is 0

We don't expect $arr to be any different outside of the function because $arr is a value, not a reference.


My mental model, rightly or wrongly, is that passing to a parameter is a bit like an assignment to a local variable:

function increment(array) {
   $array = $__args[0];
   $array[0]++;
}

(This is explicitly how subroutine parameters work in Perl; I don't know if that's affected my mental model, or just means Larry Wall pictured it the same way.)

You can even assign a new value to it, like any other variable:

function whatever(array $array) {
   $array = 'not even an array any more';
}

But in PHP, $this isn't a parameter, and it's never possible to assign a new value to $this; so it feels completely alien to have a method where $this stops referring to the current object, and becomes a local variable.


I think it would be clearer to prevent direct modification of $this:


Not that I disagree (see the records RFC), but at that point, why not make data classes implicitly readonly?


I'm only suggesting restricting mutation on $this, not on the object itself. $foo->x++ would still work, and have automatic copy-on-write; but $this->x++ would be an error on a data class, just as $this=$bar is an error on all existing objects.


That would still be compatible with Ilija's suggestion, which was to add special "mutating methods":

I actually find this appealing, but it is strange to me to allow this syntax on classes. Is there precedent for that? Or is there a way we can do it using "regular looking PHP"; or are structs the way to go?


The way I see it, it's just a third type of method, to add to the two we already have:

- instance methods: $this refers to the current instance
- static methods: $this is forbidden
- mutating methods: $this refers to the desired result of the mutation

In fact, it's a bit like __construct or __clone, where $this refers to the newly created/copied object, before anything else points to it.


--
Rowan Tommins
[IMSoP]

Reply via email to