Re: Revisiting case-sensitivity in PHP
| From: | youkidearitai | 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
-----------------------------