PHP Фатальная ошибка: класс ‘External \ xBBCode \ Xbbcode \ Xbbcode’ не найден

#php #namespaces #autoloader

#php #пространства имен #автозагрузчик

Вопрос:

У меня реальные проблемы с пространствами имен PHP =_=

Итак, место проекта /home/hosting//htdocs/

Файл /home/hosting//htdocs/Components/News.php это похоже на:

 <?php

namespace Components;

use ExternalxBBCodeXbbcode as Xbbcode;

class News extends ComponentsComponentHelper
{
    const NEWS_DEFAULT_LIMIT = 39; // news per page
    const NEWS_ON_PAGE_LIMIT = 10; // news per page

    public function __construct()
    {
        return true;
    }

    public static function desc_sort ($a, $b)
    {
        return (int)$a < (int)$b;
    }

    public static function Run($_config)
    {
        /*
            data for routing
        */
        $routeData = $_config['route_data'];
        $routeDataCount = count($routeData);

        $newsData = false;
        $newsList = false;
        $db = new EngineDB($_config);
        $tpl = new EngineTemplateEngine($_config);

        $parser = new XbbcodeXbbcode();

        $newsYear = 0;
        $newsMonth = 0;
        $newsID = 0;
        $newsFriendlyTitle = '';
        $template = '';
  

И у меня есть необходимые файлы:

 /home/hosting/<proj_title>/htdocs/External/xBBCode/Xbbcode/Xbbcode.php
/home/hosting/<proj_title>/htdocs/External/xBBCode/Xbbcode/Attributes.php
/home/hosting/<proj_title>/htdocs/External/xBBCode/Xbbcode/Tag/
/home/hosting/<proj_title>/htdocs/External/xBBCode/Xbbcode/resources/
  

У меня ошибка в строке

 $parser = new XbbcodeXbbcode();
  

Но файл

 /home/hosting/<proj_title>/htdocs/External/xBBCode/Xbbcode/Xbbcode.php
  

существует и запускается как:

 <?php

namespace Xbbcode;

use XbbcodeTagTag;


/**
 * Class Xbbcode
 */
class Xbbcode
{
  

И я использую собственный автозагрузчик, который размещен в каталоге htdocs, его код:

 <?php
/**
 * Файл с автозагрузчиком файлов
 * 
 * PHP Version 5
 * 
 * @category Class
 */

/**
 * Автозагрузчик классов
 * 
 * @category Class
 */
class Autoloader
{
    private static $_loadFile;

    /**
     * Загрузчик
     * 
     * @param string $className - имя класса
     * 
     * @return resuorce
     */
    public static function loadPackages($className)
    {
        $pathParts = explode('\', $className);
        self::$_loadFile = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $pathParts) . '.php';

        if (file_exists(self::$_loadFile) amp;amp; is_readable(self::$_loadFile)) {
            require_once self::$_loadFile;
        } else {
            throw new Exception('File "' . self::$_loadFile . '" is not found!');
        }
    }

    /**
     * Загрузчик с логированием
     * 
     * @param unknown $className - имя класса
     * 
     * @return resuorce
     */
    public static function loadPackagesAndLog($className)
    {
        try {
            self::loadPackages($className);
            printf("<p>%s: class %s was loaded from %s</p>n", __METHOD__, $className, self::$_loadFile);
        } catch (Exception $e) {
            printf("<p>%s return exception: %s</p>n", __METHOD__, $e->getMessage());
        }
    }
}

spl_autoload_register(array('Autoloader', 'loadPackages'));
// spl_autoload_register(array('Autoloader', 'loadPackagesAndLog'));

?>
  

Пожалуйста, кто-нибудь скажет, что я делаю не так.

Ответ №1:

Вы загружаете файл класса правильно, но он существует в Xbbcode пространстве имен. Это неверно. Это должно быть (в Xbbcode.php ):

 namespace ExternalxBBCodeXbbcode;

class Xbbcode {
    ...
  

Как правило, вы хотите, чтобы ваши пространства имен представляли, где в файлах вашего проекта находится класс.

Комментарии:

1. Спасибо, это работает, но здесь новые проблемы… Когда я редактирую Xbbcode.php понравилось <?php namespace ExternalxBBCodeXbbcode; use XbbcodeTagTag; /** * Class Xbbcode */ class Xbbcode { new errors is appear: PHP Fatal error: Uncaught exception ‘Exception’ with message ‘File «/home/hosting/<proj_title>/htdocs/Xbbcode/Tag/A.php» не найден!’ в /Home/таких/<proj_title>/htdocs в/автозагрузчика.в PHP:34 что я должен написать в заявлении?

2. Я делаю это, в каждом файле компонента xBBCode я редактирую пространство имен и use-операторы, и это работает!