Hi Olle,

On 11 July 2020 15:06:13 BST, "Olle Härstedt" <olleharst...@gmail.com> wrote:
>I'd like to discuss the concept of ownership in PHP, from the point of
>view of a new interface UniqueInterface (or SplUniqueInterface or
>something), which will throw a UniqueException if refcount > 1.

It's an intriguing idea, but I'm not sure how well it would work in practice. 
Maintaining a strict refcount of one means never passing the value to another 
function or scope, which seems very limiting. 

It would also run into the usual problem PHP has that everything is determined 
at run-time, so every time you pass an object anywhere, the engine would need 
to check it wasn't marked in this way. That could be avoided if instead of a 
special type of value, this was a special type of variable; then it could 
probably be determined at compile time that you were passing a "local only" 
variable to another scope.


>Use-case: Mutable objects that cannot be shared (without (deep)
>cloning).

This is another tricky aspect - like enforcing deep immutability, it implies 
some recursive constraints which are easy to enforce for scalars, but tricky 
once you look at things like arrays, which can contain references, objects, 
other arrays, etc.


As described, the user would have to manually perform a clone whenever the 
object was passed anywhere, even if they weren't mutating it anywhere. If you 
let the language do that automatically, you can use an automatic copy-on-write 
system, like PHP already does for arrays (and, funnily enough, PHP 4 did for 
objects).

Alternatively, you can make the object purely immutable once it has passed out 
of its initial scope, or once a special function has been called to "freeze" 
it. This would be an interesting solution to the "modified clone" problem of 
full immutability (how to implement withFoo methods), since any "frozen" object 
could be cloned to get a mutable copy, which would be frozen before passing on.

Regards,


-- 
Rowan Tommins
[IMSoP]

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to