#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-операторы, и это работает!