> On 16 Mar 2021, at 20:07, Jordi Boggiano <j.boggi...@seld.be> wrote:
> 
> Hey,
> 
> Here some perspective on this from the Composer side of things. To the best 
> of my knowledge the Composer autoloader is the default autoloader used by 
> most PHP projects at this point except for WordPress. I am sure there are a 
> few more outliers and people using custom autoloaders in addition of, or 
> instead of the Composer-generated one, but generally speaking it has 
> supplanted many custom implementations in frameworks over the years.
> 
> First of all big +1 here, if we can make things faster for non-preloaded 
> workloads it's great. The autoloader is definitely a big fixed 
> "infrastructure cost" in many such apps currently, and I don't think we can 
> squeeze any more perf from userland.
> 
> On 15/03/2021 19:32, Mark Randall wrote:
>> On 15/03/2021 17:59, Levi Morrison via internals wrote:
>>> IMO, these should be the defined case of the class, or we should be
>>> insensitive about it. It's one thing that our symbols are case
>>> insensitive; it is wholly another to _require_ it for this feature by
>>> requiring lowercase names. I assume there is some motivation for this;
>>> I would like to hear it.
>> 
>> EG(class_table) is stored lowercase, the case of the class name itself is 
>> only known once it has been found which could only occur after the 
>> autoloader has run.
>> 
>> By forcing lowercase we have a single key to lookup for any variation, 
>> without it we would have to either match the case exactly (which would be 
>> different from how internals currently works) or would have to iterate over 
>> every item in the classmap array each time, performing case a insensitive 
>> comparisons on every key until one was found, or in the worst case, the 
>> entire set.
> 
> - The Composer ClassLoader [1] uses a case-sensitive classmap which overall 
> has not caused major issues except when people do class_exists or new calls 
> with the wrong case. That said, if we were to support this new API we would 
> for sure be able to generate a lowercased classmap, we just haven't done it 
> until now because spl_register_autoload calls the callback with the original 
> case, and having to lowercase the passed class name on every call seemed 
> wasteful. If internals already does this anyway that sounds fine by me.
> 
> - It also uses `include` vs the proposed require_once in this RFC. I am not 
> entirely sure what the implications are here, nor if there are still 
> performance differences to one over the other, but IIRC we do include because 
> it's the fastest, and as a class never gets autoloaded twice a file does not 
> really risk being included again.
> 
> - Right now we have to run includes through a proxy function [2] to avoid 
> granting the included file access to $this and other in-scope variables. It's 
> not that much overhead but can quickly lead to a thousand extra function 
> calls within a request's lifecycle, so just for completeness I figured I'd 
> mention it.
> 
> - As Mike Schinkel mentioned, the proposed API should really support multiple 
> maps. Composer a prepend-autoloader option which controls whether the 
> generated autoloader will be prepended or appended when spl_autoload_register 
> is called. This is required in some cases where multiple autoloaders coexist. 
> So the ability to add multiple maps, including optionally prepending them 
> would be a must IMO. The ability to remove an autoloader and its associated 
> classmap would also be very welcome so one can unregister things cleanly.
> 
> So taking the above in consideration, and keeping consistency with existing 
> spl_* functions in mind, I would propose an API more like:
> 
>    autoload_register_classmap(array $map, bool $prepend = false)
>    autoload_unregister_classmap(array $map)
> 
> 
> P.S: While I am here looking at spl_* docs, it seems to me like 
> spl_autoload_call should be deprecated in favor of class_exists, and 
> spl_autoload_extensions + spl_autoload also probably should be deprecated or 
> at least marked as antiquated in the docs, and not migrated to autoload_* 
> like you suggested doing for spl_autoload_register/unregister in another RFC.
> 
> [1] 
> https://github.com/composer/composer/blob/b6826f352390b4c952be8fd75d60cfd4f6f39f11/src/Composer/Autoload/ClassLoader.php
> 
> [2] 
> https://github.com/composer/composer/blob/b6826f352390b4c952be8fd75d60cfd4f6f39f11/src/Composer/Autoload/ClassLoader.php#L478-L481
> 
> -- 
> Jordi Boggiano
> @seldaek - https://seld.be
> 
> -- 
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: https://www.php.net/unsub.php
> 


Edit: wrong sending address, again. Sending for list, apologies for the dupe.

I don’t have a huge amount of interest in this, except to say: If someone wants 
to add a core function to make Composer’s autoloader work faster, that’s fine 
and dandy, it doesn’t hurt to provide the building blocks for common patterns. 
But pushing your own biases about non-Composer class autoloading being 
“antiquated” or “deprecated” is a step too far. 

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to