Browse Source

fixes #3974: Autoloader have to distinguish between files and directories

Marc Bennewitz 10 years ago
parent
commit
9455c49053

+ 4 - 4
src/Composer/Autoload/ClassLoader.php

@@ -351,7 +351,7 @@ class ClassLoader
             foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
                 if (0 === strpos($class, $prefix)) {
                     foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
-                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+                        if (is_file($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
                             return $file;
                         }
                     }
@@ -361,7 +361,7 @@ class ClassLoader
 
         // PSR-4 fallback dirs
         foreach ($this->fallbackDirsPsr4 as $dir) {
-            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+            if (is_file($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                 return $file;
             }
         }
@@ -380,7 +380,7 @@ class ClassLoader
             foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
                 if (0 === strpos($class, $prefix)) {
                     foreach ($dirs as $dir) {
-                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                        if (is_file($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                             return $file;
                         }
                     }
@@ -390,7 +390,7 @@ class ClassLoader
 
         // PSR-0 fallback dirs
         foreach ($this->fallbackDirsPsr0 as $dir) {
-            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+            if (is_file($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                 return $file;
             }
         }

+ 11 - 0
tests/Composer/Test/Autoload/ClassLoaderTest.php

@@ -9,6 +9,17 @@ use Composer\Autoload\ClassLoader;
  */
 class ClassLoaderTest extends \PHPUnit_Framework_TestCase
 {
+    public function testLoadClassDotPhp()
+    {
+        $loader = new ClassLoader();
+        $loader->add('DirDotPhp\\', __DIR__ . '/Fixtures');
+        $loader->addPsr4('DirDotPhp\\', __DIR__ . '/Fixtures/DirDotPhp/psr4');
+
+        $class = 'DirDotPhp\\Dir';
+        $loader->loadClass($class);
+        $this->assertTrue(class_exists($class, false), "->loadClass() loads '$class'.");
+    }
+
     /**
      * Tests regular PSR-0 and PSR-4 class loading.
      *

+ 6 - 0
tests/Composer/Test/Autoload/Fixtures/DirDotPhp/Dir.php

@@ -0,0 +1,6 @@
+<?php
+
+namespace DirDotPhp;
+
+class Dir {}
+

+ 6 - 0
tests/Composer/Test/Autoload/Fixtures/DirDotPhp/psr4/Dir.php/File.php

@@ -0,0 +1,6 @@
+<?php
+
+namespace DirDotPhp\Dir.php;
+
+class File {}
+