On Friday, 14 June, 2024 г. at 00:04, Timo Tijhof <ttij...@wikimedia.org> wrote:
> Would this affect unserialize()? > > I ask because MediaWiki's main "text" database table is an > immutable/append-only store where we store the text of each page revision > since ~2004. It is stored as serialised blobs of a value class. There have > been a number of different implementations over the past twenty years of > Wikipedia's existence (plain text, gzip-compressed, diff-compressed, etc.). > > When we adopted modern autoloading in MediaWiki, we quickly found that > blobs originally serialized by PHP 4 actually encoded the class in > lowercase, regardless of the casing in source code. > > From https://3v4l.org/jl0et: > >> class ConcatenatedGzipHistoryBlob {…} >> print serialize($blob); >> # PHP 4.x: O:27:"concatenatedgziphistoryblob":… >> # PHP 5/7/8: O:27:"ConcatenatedGzipHistoryBlob":… > > > It is of course the application's responsibility to load these classes, > but, it is arguably PHP's responsiblity to be able to construct what it > serialized. I suppose anything is possible when announced as a breaking > change for PHP 9.0. I wanted to share this as something to take into > consideration as part of the impact. Potentially worthy of additional > communicating, or perhaps worth supporting separately. > > -- > Timo Tijhof, > Principal Engineer, > Wikimedia Foundation. > https://timotijhof.net/ > > Hi, Timo! Thank you very much for bringing up this important case. Here's how I see this. If PHP gets class case-sensitivity, unserialization of classes with lowercase names will fail. This is because the engine will start putting `MyClass` class entry with key `MyClass` (not `myclass`) into the loaded classes table and serialization will not be able to find it as `myclass`. Even if some deprecation layer is introduced (that puts both `myclass` and `MyClass` keys into the table), you will first have a ton of notices and then eventually end up with the same problem, when transition to case sensitivity is complete. Hence I propose no deprecation layer — it does not really help. However, you will be able to use `class_alias()` to solve your issue. If classes are case-sensitive, `class_alias(MyClass::class, 'myclass');` should work, since MyClass != myclass anymore. And serialization works perfectly with class aliases, see https://3v4l.org/1n1as . -- Valentin Udaltsov