Re: Protected destructors
| From: | Rowan Tommins [IMSoP] | Date: | Tue, 01 Oct 2024 19:06:07 +0000 |
| Subject: | Re: Protected destructors | ||
| References: | 1 2 3 4 5 6 7 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-125715@lists.php.net to get a copy of this message | ||
On Tue, 1 Oct 2024, at 19:29, Larry Garfield wrote:
> I would have said with() would be neat in PHP. :-)
I have been considering for a while proposing Context Managers [Python's with(), not to be
confused with VisualBasic & JavaScript unrelated feature with the same keyword].
My primary example use case is safe database transactions, which I've seen implemented in PHP
in two ways:
1) Callback style, where the code to run in a transaction has to be wrapped in a function, usually
an anonymous closure. This is often cited as a use case for implicit capture in closures, but even
with that it adds a layer of indirection, and changes the meaning of "return" and
"yield" inside the wrapped block.
2) "Resource Acquisition Is Initialization" style, where the destructor rolls back the
transaction if it hasn't been committed or rolled back manually. This requires fewer changes to
the wrapped code, but as Arnaud points out, it's not 100% reliable / predictable in PHP, due to
details of the GC.
Context Managers present a third option, where the code in the transaction remains a normal sequence
of statements, but there is a more explicit guarantee about what will happen when the with{} block
is exited. The Python design document has interesting background on what they included and excluded:
https://peps.python.org/pep-0343/
C#'s "using statement" is similar, but explicitly designed for ensuring the correct
"disposal" of an object rather than hooking entry to and exit from a "context":
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/using
Regards,
--
Rowan Tommins
[IMSoP]