On 11 July 2020 22:47:21 BST, "Olle Härstedt" <olleharst...@gmail.com> wrote:
>You're misunderstanding. :) Yes, it should be shared, but not with the
>same access level as the owner. If a dependent class closes the
>connection it will cause spooky-action-at-a-distance somewhere else in
>the program. 


I think that particular example is solved adequately by destructors: if you 
know you hold the last reference to an object, you can unset() that reference 
and the destructor will fire.

You'd only need the ability to "unfreeze" an object if you were going to mutate 
it and then carry on using it.


> Sorry, it's related to refcount as ownership checking 


I still don't think those concepts map well. If you store two references to an 
object in an array, and then unset one of them at random, does it make sense to 
say the remaining reference "owns" that value, because the object now has a 
refcount of one?

As I understand it, ownership in Rust implies not just the *right* to free 
something, but the *obligation* to do so. That only works if ownership is 
explicitly assigned, rather than being a side effect of other references being 
released.


Thinking about destructors, a better description of how PHP currently works 
might be that the owner of an object is the object itself, and the refcount is 
a count of how many times it has been borrowed. So once the constructor 
completes, all we can say is that there is at least one "borrowed" reference 
somewhere in the code; once that stops being true, the "owner" is notified, and 
runs the code in the destructor.


You could create a wrapper object and have a way to check that its destructor 
had been called - anything from setting a global variable to holding a WeakRef 
and calling its valid() method - but if something *does* hold onto a reference, 
there's not much you can do about it. 

I can't think of a scenario where the code that wants to "own" the object 
wouldn't end up equivalent to either full immutability (don't mutate it after 
initialisation because you can't guarantee yours is the only reference) or an 
optimised copy-on-write (mutate if you happen to have the last reference, 
otherwise clone). It would be better for the language to implement those in a 
user-friendly way than exposing the implementation details of refcounting.

Regards,


-- 
Rowan Tommins
[IMSoP]

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

Reply via email to