php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #38579 require_once() distinguishes backslashes from forward slashes
Submitted: 2006-08-24 10:27 UTC Modified: 2006-09-20 08:06 UTC
Votes:1
Avg. Score:4.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: frank at procurios dot nl Assigned: dmitry (profile)
Status: Closed Package: Scripting Engine problem
PHP Version: 5.1.5 OS: Windows
Private report: No CVE-ID: None
 [2006-08-24 10:27 UTC] frank at procurios dot nl
Description:
------------
When including a file, require_once() will make a destinction between path/file strings containing forward slashes and backslashes. 

Reproduce code:
---------------
(example)
function __autoload($className){
    $basePath = 'C:/htdocs';
    $classPath= $basePath . '/classes';
    require_once($classPath . "/$className.class.php");
}

// Some function that doesn't resolves paths
function getPath($file){
   $path = realpath('./$file');
   return $path;
}   

// Autoload
$A = new Foo;

// Explicit require of class
require_once(getPath(Foo.class.php));
$B = new Foo;

Expected result:
----------------
One would expect the require_once to notice that Foo has already been loaded and not include the file a second time.

Actual result:
--------------
Fatal error: Cannot redeclare class foo in c:\htdocs\classes\Foo.class.php on line n

(or something like that)

Whatever the actual result, the file is loaded twice, as the slashes produced by realpath are distinguished from the slashes used in the defined __autoload() function. 

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-08-24 10:30 UTC] frank at procurios dot nl
For sake of clarity, a minor typo needs to be corrected:

// Some function that doesn't resolves paths

Should be

// Some function that doesn't do anything but resolve paths
 [2006-08-30 12:29 UTC] taco at procurios dot nl
I'm experiencing this bug too. Besides the slashes also differences in drive letter case seem to interfere with the require_once cache: requiring the path C:/path/file.php in the __autoload function will not prevent the file c:/path/file.php from being required a second time using require_once.
 [2006-09-05 15:52 UTC] iliaa@php.net
This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.


 [2006-09-06 06:39 UTC] dmitry@php.net
The problem is not in slashes, but in case-sensitivity.

The patch doesn't fix anything. I reverted it.
 [2006-09-20 08:06 UTC] dmitry@php.net
Fixed in CVS HEAD and PHP_5_2.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Mon Dec 30 14:01:28 2024 UTC