Skip to content

Commit 42772b3

Browse files
committed
RobotLoader is case sensitive (BC break)
1 parent 788ab3e commit 42772b3

File tree

2 files changed

+13
-20
lines changed

2 files changed

+13
-20
lines changed

src/RobotLoader/RobotLoader.php

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class RobotLoader
3232
/** @var array */
3333
private $scanPaths = [];
3434

35-
/** @var array of lowered-class => [file, time, orig] */
35+
/** @var array of class => [file, time] */
3636
private $classes = [];
3737

3838
/** @var bool */
@@ -73,8 +73,7 @@ public function register($prepend = FALSE)
7373
*/
7474
public function tryLoad($type)
7575
{
76-
$type = $orig = ltrim($type, '\\'); // PHP namespace bug #49143
77-
$type = strtolower($type);
76+
$type = ltrim($type, '\\'); // PHP namespace bug #49143
7877
$info = isset($this->classes[$type]) ? $this->classes[$type] : NULL;
7978

8079
if ($this->autoRebuild) {
@@ -100,9 +99,6 @@ public function tryLoad($type)
10099
}
101100

102101
if ($info) {
103-
if ($info['orig'] !== $orig) {
104-
trigger_error("Case mismatch on class name '$orig', correct name is '{$info['orig']}'.", E_USER_WARNING);
105-
}
106102
call_user_func(function ($file) { require $file; }, $info['file']);
107103
}
108104
}
@@ -126,8 +122,8 @@ public function addDirectory($path)
126122
public function getIndexedClasses()
127123
{
128124
$res = [];
129-
foreach ($this->classes as $info) {
130-
$res[$info['orig']] = $info['file'];
125+
foreach ($this->classes as $class => $info) {
126+
$res[$class] = $info['file'];
131127
}
132128
return $res;
133129
}
@@ -154,9 +150,9 @@ private function refresh()
154150
{
155151
$this->refreshed = TRUE; // prevents calling refresh() or updateFile() in tryLoad()
156152
$files = [];
157-
foreach ($this->classes as $info) {
153+
foreach ($this->classes as $class => $info) {
158154
$files[$info['file']]['time'] = $info['time'];
159-
$files[$info['file']]['classes'][] = $info['orig'];
155+
$files[$info['file']]['classes'][] = $class;
160156
}
161157

162158
$this->classes = [];
@@ -171,13 +167,12 @@ private function refresh()
171167
$files[$file] = ['classes' => [], 'time' => filemtime($file)];
172168

173169
foreach ($classes as $class) {
174-
$lower = strtolower($class);
175-
$info = &$this->classes[$lower];
170+
$info = &$this->classes[$class];
176171
if (isset($info['file'])) {
177172
throw new Nette\InvalidStateException("Ambiguous class $class resolution; defined in {$info['file']} and in $file.");
178173
}
179-
$info = ['file' => $file, 'time' => filemtime($file), 'orig' => $class];
180-
unset($this->missing[$lower]);
174+
$info = ['file' => $file, 'time' => filemtime($file)];
175+
unset($this->missing[$class]);
181176
}
182177
}
183178
}
@@ -239,15 +234,15 @@ private function updateFile($file)
239234

240235
$classes = is_file($file) ? $this->scanPhp(file_get_contents($file)) : [];
241236
foreach ($classes as $class) {
242-
$info = &$this->classes[strtolower($class)];
237+
$info = &$this->classes[$class];
243238
if (isset($info['file']) && @filemtime($info['file']) !== $info['time']) { // @ file may not exists
244239
$this->updateFile($info['file']);
245-
$info = &$this->classes[strtolower($class)];
240+
$info = &$this->classes[$class];
246241
}
247242
if (isset($info['file'])) {
248243
throw new Nette\InvalidStateException("Ambiguous class $class resolution; defined in {$info['file']} and in $file.");
249244
}
250-
$info = ['file' => $file, 'time' => filemtime($file), 'orig' => $class];
245+
$info = ['file' => $file, 'time' => filemtime($file)];
251246
}
252247
}
253248

tests/Loaders/RobotLoader.caseSensitivity.phpt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,4 @@ $loader->setTempDirectory(TEMP_DIR);
1616
$loader->addDirectory(__DIR__ . '/files');
1717
$loader->register();
1818

19-
Assert::error(function () {
20-
Assert::true(class_exists('testClass'));
21-
}, E_USER_WARNING, "Case mismatch on class name 'testClass', correct name is 'TestClass'.");
19+
Assert::false(class_exists('testClass'));

0 commit comments

Comments
 (0)