Edit report at https://bugs.php.net/bug.php?id=49625&edit=1
ID: 49625 Comment by: david at panmedia dot co dot nz Reported by: jo at feuersee dot de Summary: spl_autoload and case sensitivity Status: Not a bug Type: Bug Package: SPL related Operating System: Linux PHP Version: 5.3.0 Block user comment: N Private report: N New Comment: Please fix this Previous Comments: ------------------------------------------------------------------------ [2011-09-05 01:32:08] blake dot soley at gmail dot com I agree, this bug is not bogus. In fact, it's actually quite serious. Just because spl_autoload was designed poorly doesn't mean it has to remain broken. Several fixes have been proposed, please consider implementing one of them to make this function cross-platform, and therefore useful. ------------------------------------------------------------------------ [2011-08-10 01:13:40] bram048 at gmail dot com I agree with Simon. There is absolutely no reason not to fix this, while keeping backwards compatibility. Two years ago the reason for not fixing it was "breaking BC is not an option". There are plenty of alternatives, and to be honest, PHP has broken BC alot of times in the last few versions (which is a good thing in my opinion, as long as the language becomes cleaner/stricter). Having all the files in lowercase makes them alot harder to read. Having a custom autoloader function is slower and more complicated to get right, and just makes code more ugly and harder to understand. At the very least case sensitivity of the SPL autoloader should be configurable, or available by the use of an extra suffix. I would love to see this in the new 5.4 release; shouldn't take more than a few lines of code. ------------------------------------------------------------------------ [2011-03-08 13:08:42] simon at systemparadox dot co dot uk Why is this bug marked as bogus? Even if spl_autoload itself isn't fixed, at the very least a version that does it correctly could be added (although in this case it seriously could just be fixed by trying the correct case first). Implementing one in PHP is all very well, but that means that it's non-standard and likely incompatible with what each programmer might expect. It's also slower. ------------------------------------------------------------------------ [2009-09-23 07:11:47] sjo...@php.net Trying both lowercased and original case could solve this without breaking backwards compatibility. However, you could as well supply your own autoload function defined in PHP to solve this. ------------------------------------------------------------------------ [2009-09-22 19:37:20] jo at feuersee dot de >The reason here is that is spl_autoload becomes case >sensitive, it will break scripts which depend on spl_autoload being >case insensitive. spl_autoload() was introduced in PHP 5.1.2 which is case sensitive concerning class names. This implies that if an operation on an unknown class is done, spl_autoload() is triggered and executed with the case sensitive name of the class. Thus we have 4 different possibilities: 1) The class name all lower case, the file containing the class definition is all lower case (eg. $foo = system::bar(); system.php) This will work independent wether spl_autoload() is lowercasing or not, since all is lowercased. Note that if the class defined in the file system.php is actually named System it wouldn't have ever worked because the class system is still not defined, which would trigger an error. 2) The class name all lower case, the file containing the class definition is uppercased (eg. $foo = system::bar(); System.php) This wouldn't work anymore on file systems which are case sensitive if spl_autoload() would skip lowercasing. Note that this would only have worked if the file system is case insensitive and the class definition in System.php would define a class "system". 3) The class name contains upper case letters, the file containing the class definition is lowercased (eg. $foo = System::bar(); system.php) This is what currently isn't working at all but would work at least for case insensitive file systems if lowercasing would be dropped. Note that if the class defined in the file system.php is actually named system it wouldn't have ever worked because the class System is still not defined. 4) The class name contains upper case letters, the file containing the class definition is uppercased (eg. $foo = System::bar(); System.php) This is what should (and would) work, but currently doesn't. Conclusion: The only problem might be (2): Class name: sample Filename: Sample.php Class definition in Sample.php: class sample { ... } Note: this does work on case insensitive file systems only. I really can't see any reason for maintaining the "Worse is better" principle here, I really doubt that there is much code around relying on the tolowercase feature/bug of spl_autoload(). As a compromise I propose the following: 1) spl_autoload() additionally tries to find a file _not_ lowercased. 2) Throw a E_DEPRECATED in case the filename had to be lowercased to match. Until then: I really don't know why this lowercasing thing was introduced into slp_autoload() to begin with, all it ever did was preventing classes to be named with upper case letters on file systems which are case sensitive. In other words: the only compatibility issue is that code which currently works on platforms like Windows only would suddenly work on UN*X like platforms too. Pls confirm if this is the compatibility issue you are talking about. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=49625 -- Edit this bug report at https://bugs.php.net/bug.php?id=49625&edit=1