В 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'; и так далее.

635   2  

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

    Ничего не найдено.