Re: Asymmetric visibility is a BC break

From: Date: Tue, 15 Oct 2024 20:18:08 +0000
Subject: Re: Asymmetric visibility is a BC break
References: 1 2 3 4 5 6 7 8 9 10 11  Groups: php.internals 
Request: Send a blank email to internals+get-125806@lists.php.net to get a copy of this message
On Tue, Oct 15, 2024, at 19:11, Larry Garfield wrote: > On Mon, Oct 14, 2024, at 10:27 PM, Pierre Joye wrote: > > Hello, > > > > On Mon, Oct 14, 2024, 8:07 AM Bilge <bilge@scriptfusion.com> wrote: > >> On 14/10/2024 01:02, Valentin Udaltsov wrote: > >> > The problem is that in practice most of the PHP libraries consider > >> > themselves to be compatible with newer PHP versions. > >> > > >> > For instance, Symfony PropertyInfo uses "php": > >> > ">=8.2" constraint in > >> > its composer.json. > >> > >> That seems like a problem they have created for themselves. It seems an > >> error to me to declare software forward-compatible with PHP versions > >> that do not yet exist and thus have clearly not been tested against.. > >> Being as it is an error, we shouldn't consider it impinges on PHP's > >> definition of a BC break. > > > > > > As much as I like this new feature and I am more than thankful for the > > work behind it, if a test in codes using a x.y version of php works but > > fails in x.y+1, it is a BC break, no matter how we look at it. A php > > dependency targeting x.* is very common. While it tends to be used less > > frequently as the amount of issues increase, that's not necessarly a > > good thing. > > > > In some cases it is a necessary evil (extension deprecated adding > > warnings, security fix requiring a bc break, f.e.). > > > > However, I am very doubtful here. And I do not know if it can be > > avoided while keeping the new behaviors. > > > > All in all, it would be great to at least agree that there is a BC > > break issue, so it can be addressed according, whatever the final > > decision is. > > > > best, > > Pierre > > > I think folks are operating with different definitions of "BC Break". > > Consider: > > // Foreign.php > > class Foreign { > public function __construct(public string $name) {} > } > > // My code: > > $f = new Foreign('beep'); > $rProp = (new ReflectionObject($f))->getProperty('name'); > if ($rProp->isPublic()) { > $f->name = 'boop'; > } > > Under PHP 8.0, this code works. > Upgrading to PHP 8.1, this code *still works* exactly the same. Therefore, there is no BC > break. > Upgrading to PHP 8.4, this code *still works* exactly the same. Therefore, there is no BC > break. > > Now, someone edits Foreign.php in 8.1 to read: > > class Foreign { > public function __construct(public readonly string $name) {} > } > > Now, my code will fail, because isPublic() does not guarantee "is writeable" anymore. > > > Is this a BC break in PHP? > > I can see the argument either way, personally, but I tend toward no. One PHP version to the > next should always be safe to upgrade an *existing* code base. Just swap out the PHP binary and it > should still work the same. We want that. However, once you start modifying any part of the code > (including dependencies), all bets are off. > > Suppose some library switched from using annotations to using attributes. Any other code that > was looking for those annotations is now broken, but it would be ridiculous to accuse attributes of > having broken BC in PHP. Or ancient PHP 4 code that just assumed all properties were public (which > they were in PHP 4), now confronted with PHP 5 code that has private properties. Is that a PHP BC > break? Not at all. > > And again, the relevant change here happened in PHP 8.1. This is only tangentially related to > 8.4 at all, because isPublic() has not implicitly meant is-writeable anymore for three years. > > --Larry Garfield > Hey Larry, First, thank you for this feature. Second, attributes and annotations are a moot point. Adding attributes didn't render annotations broken and is still (unfortunately) used today in many codebases running 8.3. So, in other words, the deprecation of annotations is a framework/codebase/user-level issue and totally unrelated to attributes and PHP as a language. While attributes helped with that deprecation, it wasn't caused by them—people could have deprecated annotations without ever having attributes. According to Wikipedia (https://en.wikipedia.org/wiki/Backward_compatibility) > In compilers <https://en.wikipedia.org/wiki/Compiler>, > [and interpreters] backward compatibility may refer to the ability of a compiler [or interpreter] > for a newer version of the language to accept source code of programs or data that worked under the > previous version. I think this is all we need: just a proper definition. Looking at the issue at play, we can conclude that it isn't a BC break — code that worked in 8.3 will continue to work in 8.4. Will things have to be updated (or in my case, rewritten basically from scratch)? Sure! But there, it becomes a framework/codebase/user-level issue on whether they will remain backwards compatible with older versions of PHP. — Rob

« previous php.internals (#125806) next »