Правильная автозагрузка родительского класса

$newProgrammer

Новичок
Добрый день. Помогите пожалуйста разобраться с проблемой. Делаю автозагрузку классов. Структура такая, в корне сайта есть index.php в нем с помощью require() подключается файл с настройками config.php и ниже создание экземпляра класса постов Post.
PHP:
require('./config.php');
$post = new \Vendor\Blog\Post();
В config.php есть настройки для подключения к БД, функция автозагрузки классов project_autoload() и ее регистрация через spl_autoload_register(). Подключаемые классы находятся /lib/Vendow/Blog/ относительно корневой папки сайта.
PHP:
function project_autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = $_SERVER['DOCUMENT_ROOT'].'/lib/';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  .= str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    require_once($fileName);
}
Класс DB.php содержит следующий код:
PHP:
namespace Vendor\Blog\DB;

class DB
{
//код
}
Класс Post.php содержит следующий код:
PHP:
namespace Vendor\Blog\Post;
use Vendor\Blog\DB;

class Post extends DB
{

}
Выдает ошибку:
Код:
Fatal error: Class 'Vendor\Blog\DB' not found in ....../public_html/lib/Vendor/Blog/Post.php on line 7
7 строка, это строка со скобкой { в начале:
PHP:
class Post extends DB
{
 

Andkorol

Новичок
namespace неправильно указан, в обоих классах.
В твоём случае должно быть namespace Vendor\Blog;
А уже в use указывай и namespace, и имя класса.
 

$newProgrammer

Новичок
Спасибо большое! Действительно напутал с namespace, надо еще раз перечитать
 

$newProgrammer

Новичок
В процессе работы возник вопрос, допустим в файле DB.php свой namespace, в этом же классе я обращаюсь к классу PDO через указание полного квалифицированного имени \PDO. Получается так нужно делать для всех глобальных классов? Или я что-то делаю не так?
 

AnrDaemon

Продвинутый новичок
Так строго рекомендуется делать. Добавление одного символа не сильно нагружает код, зато сильно разгружает блок use и явно демонстрирует читающему, откуда ноги растут.
 
Сверху