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
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php