Bug #49625 [Com]: spl_autoload and case sensitivity

From: Date: Mon, 05 Sep 2011 01:32:08 +0000
Subject: Bug #49625 [Com]: spl_autoload and case sensitivity
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-163288@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=49625&edit=1

 ID:                 49625
 Comment by:         blake dot soley at gmail dot com
 Reported by:        jo at feuersee dot de
 Summary:            spl_autoload and case sensitivity
 Status:             Bogus
 Type:               Bug
 Package:            SPL related
 Operating System:   Linux
 PHP Version:        5.3.0
 Block user comment: N
 Private report:     N

 New Comment:

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.


Previous Comments:
------------------------------------------------------------------------
[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] sjoerd@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.

------------------------------------------------------------------------
[2009-09-22 16:22:22] sjoerd@php.net

Thank you for your bug report.

Wontfix means: we agree that there is a bug, but there are reasons not to fix it. The reason here is
that is spl_autoload becomes case sensitive, it will break scripts which depend on spl_autoload
being case insensitive.

------------------------------------------------------------------------


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


Thread (23 messages)

« previous php.bugs (#163288) next »