Re: Allow throwing from __toString()

From: Date: Fri, 01 Mar 2019 20:31:26 +0000
Subject: Re: Allow throwing from __toString()
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to internals+get-104541@lists.php.net to get a copy of this message
On Fr, 2019-03-01 at 18:28 +0100, Nikita Popov wrote: > made the same mistake there. So there's one more point to add to the > extension guidelines: Do we have a persistent space to keep those? The internals manual is limited ... :-) > I'm happy to find and fix these bugs, rather than leave the language > buggy by design ;) The "old man" in me is skeptical, especially since literally the second program variation I tried broke in a really subtle way which is hard to debug and understand for users. Also I claim that if a string conversion throws an error, it's probably no good idea to do that conversion in an implicit magic function. (but yeah, that architectural choice doesn't necessarily have to be a restriction in the language) The third thing I tried was around sort(), where we don't have exception guarantees specified and work on a reference: <?php $a = [   'a',   new throws,   'b', ]; try {   sort($a); } catch (Exception $e) { } print_r($a); ?> results in Array (     [0] => a     [1] => b     [2] => throws Object         (         ) ) Thus data is modified, while an exception is thrown. But I believe this case isn't bad, while I assume there might be other cases, where the effect has impact. (references should be avoided in idiomatic PHP anyways ...) Anyways, to help more productively with your young spirit: Years back, when we changed string length handling, I created a clang- analyzer plugin, which checks zend_parse_paramters() calls for the right type. https://github.com/johannes/clang-php-checker I assume it should be possible to create a clang-analyz (or clang-tidy) check which ensures that conversions are done properly and are checking for exceptions. This might help third-party extension authors (and if integrated with the build also long-term ...) with such requirements. johannes

« previous php.internals (#104541) next »