В PHP пространства имен и SPL реестр Автозагрузка
У меня был spl_autoload_register, работающий нормально, но затем я решил добавить некоторое пространство имен, чтобы привести в соответствие PSR2, и, кажется,не могу заставить его работать.
Каталог strcuture:
-index.php
-classes/
-Class1.class.php
-Class2.class.php
-Class3.class.php
Каждый класс начинается с:
namespace Foo;
Class ClassX {
Индекс.php:
<?php
spl_autoload_register(function($class) {
include 'classes/' . $class . '.class.php';
});
$myObj = new Class1();
echo $myObj->doSomething();
Это порождает ошибку Fatal error: Class 'Class1' not found in /var/www/myApp/index.php on line X
Моей первой мыслью было, что мне нужно использовать пространство имен с моим экземпляром, поэтому я изменил index.php на:
$myObj = new FooClass1();
Однако, тогда я получаю
Warning: include(classes/FooClass1.class.php): failed to open stream: No such file or directory in /var/www/myApp/index.php on line 6
Если я делаю руководство включает в себя все работает нормально, include 'classes/Class1.class.php'; и так далее.
2 ответов:
Таким образом, проблема заключалась в том, что
$class, возвращаемое вspl_autoload_register, было именем пространства имен\класса, с неповрежденной обратной косой чертой. Поэтому, когда я создавал новый объект:$myObj = new Foo\Class1();Путь включения стал
Я реализовал это, чтобы исправить обратную косую черту, и теперь это работает, хотя я не знаю, зачем это нужно./var/www/myApp/classes/Foo\Class1.php, обратная косая черта ломает путь.spl_autoload_register(function($class) { include 'classes/' . str_replace('\\', '/', $class) . '.class.php'; });
Попробуйте использовать константу DIR перед вашим путем, например:
Это гарантирует, что относительный путь всегда будет одним и тем же.spl_autoload_register(function($class) { include __DIR__.'/classes/' . $class . '.class.php'; });Вы должны использовать "правильную" структуру папок:
myproject/ -loader.php -class/ -- Namespace1/ --- Class1.class.php --- Class2.class.php -- Namespace2/ --- Class3.class.php
Comments