Re: Revisiting case-sensitivity in PHP

From: Date: Tue, 11 Jun 2024 14:31:25 +0000
Subject: Re: Revisiting case-sensitivity in PHP
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to internals+get-123583@lists.php.net to get a copy of this message
2024年6月11日(火) 23:18 Levi Morrison <levi.morrison@datadoghq.com>: > > On Mon, Jun 10, 2024 at 9:40 PM Ben Ramsey <ramsey@php.net> wrote: > > > > > On Jun 10, 2024, at 20:35, Valentin Udaltsov <udaltsov.valentin@gmail..com> > > > wrote: > > > > > > Hi, internals! > > > > > > 9 years have passed since the last discussions of case sensitive PHP: > > > https://externals.io/message/79824 and > > > https://externals.io/message/83640. > > > Here I would like to revisit this topic. > > > > > > What is case-sensitive in PHP 8.3: > > > - variables > > > - constants (all since > > > https://wiki.php.net/rfc/case_insensitive_constant_deprecation) > > > - class constants > > > - properties > > > > > > What is case-insensitive in PHP 8.3: > > > - namespaces > > > - functions > > > - classes (including self, parent and static relative class types) > > > - methods (including the magic ones) > > > > > > Pros: > > > 1. no need to convert strings to lowercase inside the engine for name lookups (a > > > small performance and memory gain) > > > 2. better fit for case sensitive platforms that PHP code is mostly run on (Linux) > > > 3. uniform handling of ASCII and non-ASCII symbols (currently non-ASCII symbols in > > > names are case sensitive: https://3v4l.org/PWkvG) > > > 4. PSR-4 compatibility > > > (https://www.php-fig.org/psr/psr-4/#:~:text=All%20class%20names%20MUST%20be%20referenced%20in%20a%20case%2Dsensitive%20fashion) > > > > > > Cons: > > > 1. pain for users, obviously > > > 2. a backward compatibility layer might be difficult to implement and/or have a > > > performance penalty > > > > > > On con 1. I think today PHP users are much more prepared for the change: > > > - more and more projects adopted namespaces and PSR-4 autoloading via Composer that > > > never supported case-insensitivity (https://github.com/composer/composer/issues/1803, > > > https://github.com/composer/composer/issues/8906) which forced to > > > mind casing > > > - static analyzers became more popular and they do complain about the wrong casing > > > (see https://psalm.dev/r/fbdeee2f38 and > > > https://phpstan.org/r/1789a32d-d928-4311-b02e-155dd98afbd4) > > > - Rector appeared (it can be used to automatically prepare the codebase for the next > > > PHP version) > > > > > > On con 2. While considering different transition options proposed in prior > > > discussions (compilation flag, ini option, deprecation notice) I stumbled upon Nikita's comment > > > (https://externals.io/message/79824#79939): > > > May I recommend to only target class and class-like names for an initial RFC? Those > > > have the strongest argument in favor of case-sensitivity given > > > how current autoloader implementations work - essentially the case-insensitivity > > > doesn't properly work anyway in modern code....I'd also appreciate having a voting option > > > for removing case-insensitivity right away, as opposed to throwing E_STRICT/E_DEPRECATED. If we want > > > to change this, I personally would rather drop it right away than start throwing E_STRICT warnings > > > that would make the case-insensitive usage impossible anyway. > > > It makes a lot of sense to me: a fairly simple change in the core and no performance > > > penalty. At the same time, a gradual approach will reduce the stress. > > > > > > So the plan for 8.4 might be to just drop case insensitivity for class names and > > > that's it... Let's discuss that! > > > > > > I’m not saying I agree with or support this, but I think your proposal has a better > > chance of being accepted if you target PHP 9.0 instead of 8.4. > > > > Cheers, > > Ben > > > > In fact, it's definitely a BC break I would not personally vote for in > 8.4. This isn't some minor thing squirreled away in a library--this is > the core language, with wide impact. For this reason, I believe it > should target 9.0. > > I will happily vote for this feature, as long as the patch is reasonable. > > The most obvious implementation is not very good, though. The engine > uses lowercase names for case insensitivity. Namespaces are embedded > into the type names. To lowercase the namespace but not the type name, > one could do a reverse scan for a namespace separator on the type > name, and then lowercase from the start to the index of the namespace > separator. For example, " Psr\Log\LoggerInterface" needs to become > "psr\log\LoggerInterface". The problem with this is that it's not > really going to save CPU nor memory because it still has to lowercase > the namespace. > > We could refactor the engine to store the namespace separately from > the type name. This is a lot more work and will increase the size of > some types, which might be difficult at a technical level. > > I can't think of other implementations right now. If nobody can come > up with a better implementation, I think we should consider going with > split-sensitivity on namespaces where it matches the sensitivity of > the thing it is attached to. A namespaced class would have a case > sensitive namespace but a namesped function would still have a case > insensitive one. Hi I'm worried that have an impact on Windows (case-insensitive file system). Even if it's only the Class name. Looks like need to more discussion. Regards Yuya -- --------------------------- Yuya Hamada (tekimen) - https://tekitoh-memdhoi.info - https://github.com/youkidearitai -----------------------------

« previous php.internals (#123583) next »