Начальная директория в PEAR-именовании

Духовность™

Продвинутый новичок
В общем, суть такова, что система использует PEAR-стиль Именования_Классов. Классы именуются примерно так:

PHP:
Base_Model
Mapper_Abstract
Module_Common_Model_Common
всё это лежит в директории DirWithMySuperFramework

На данный момент подгрузчик выглядит так:
PHP:
define('FRAMEWORK_PATH', 'path/to/DirWithMySuperFramework');

function __autoload($class_name)
{
    $realpath = FRAMEWORK_PATH . DIRECTORY_SEPARATOR.
                str_replace('_', DIRECTORY_SEPARATOR, $class_name) . '.php';

    if (file_exists($realpath)) {
        require($realpath);
    } else {
        throw new RuntimeException('Не найден подключаемый файл по адресу: ' . $realpath);
    }
}
естественно, это было в свое время временное решение, когда система использовала исключительно файлы только своего фреймворка.

Теперь вопрос стоит о том, как сделать погрузку пакетов других разработчиков?
Есть несколько вариантов:

1. Прописать include_path для директории фреймворка и для каждой(?) директории с либами.
2. Переименовать все классы фреймворка, добавив уникальную приставку к имени класса (наименование фреймворка) и хранить и фреймворк и либы в одной директории.

???
 

AmdY

Пью пиво
Команда форума
Духовность™
через spl_autoload_register регистрируешь несколько лодеров, если файл не найден. то return false а не исключение
 

Духовность™

Продвинутый новичок
Духовность™
через spl_autoload_register регистрируешь несколько лодеров, если файл не найден. то return false а не исключение
Что в этих лоадерах должно быть? Меня фактически интересует способ физического хранения классов PEAR-стиля.
 

AmdY

Пью пиво
Команда форума
Духовность™
каждый лодер может быть написан в своём стиле, в этом и заключается фишка. можно одновременно использовать и pear стиль, и symfony, и любой другой. главное, чтобы они не конфликтовали.
 

Духовность™

Продвинутый новичок
AmdY
Я понимаю. Но сейчас вопрос в другом - как физически хранить PEAR-стиль классы, что бы автоподгрузка была максимально элегантной, без определения родительского каталога пакета с помощью substr функции?
 

Koc

Новичок
PHP:
$loader->registerPrefixes(array(
  'Zend' => 'vendors/zend/',
  'Foo' => 'lib/Foo'
));
 

Духовность™

Продвинутый новичок
Блин, все не то. Сейчас глянул в симфони, там тоже не то, что мне надо. Там так сделано в UniversalLoader:

PHP:
	/**
	 * Loads PEAR-like class
	 *
	 * @param string $className
	 */
	private function loadPearLikeClass($className)
	{
		foreach ($this->prefixes as $prefix => $directory) {
			if (0 === strpos($className, $prefix)) {
		    	$file = $directory . DIRECTORY_SEPARATOR
						. str_replace('_', DIRECTORY_SEPARATOR, $className)
						. '.php';

		        if (file_exists($file)) {
		           	require_once $file;
		        }

		        return;
			}
		}
	}
но я не хочу для PEAR стиля смотреть в имени класса наименование пакета/фреймворка. PEAR стиль для того и создан, что бы заменить символ _ на / и сделать file_exists -> include.

Я опишу проблему ещё раз. Есть классы, которые именуются так:

Db_Mysql_Base
Mapper_Abstract
Module_Category_Model_Category

и т.д. Если я подключу сторонний пакет, то мне его нужно засунуть в директорию с фреймворком, но могут быть коллизии в наименовании и директорий.

Неужели придется переписывать все классы и добавлять префикс - имя моего фреймворка??
 

Духовность™

Продвинутый новичок
блин, это получается у мменя имена классов будут вот такие - MyPrefix_Module_Common_Controller_Common

это же очленеть можно будет с таким работать!!
 

craz

Нестандартное звание
блин, это получается у мменя имена классов будут вот такие - MySuperFrameworkName_Module_Common_Controller_Common

это же очленеть можно будет с таким работать!!
зенд же видел не раз, очленевают и ниче)
зато блин один раз прописал пути к ресурсам в конфиге и все юзай по всему проекту свои хелперы.
 

craz

Нестандартное звание
я зенд не видел, там что, тоже такие длиннющие имена классов?
там в разы длинее, и иерархичность - ты просто глянь тебя же не заставляют его использовать - его можно хвалить или ненавидеть но посмотреть стоит, а вдруг ты его пишешь)))))
 

Духовность™

Продвинутый новичок
Духовность™, пришло время для namespaces?
нет, я полгода работал с неймспейсами. Такие кодЫ меня убивают:

PHP:
<?php
namespace Cue\Application\ChildrenClub;

use Cue\Utility\Validator\ValidatorHelper,
	Cue\Core\Request,
	Cue\Model\Contest\Contest,
	Cue\Model\Contest\ContestItem,
	Cue\Model\Contest\ContestRating,
	Cue\Model\Person\User;

class CitationContestController extends BaseContestController
{ ....
т.е. прописывать каждый раз путь к файлу - это мрак. В чем удобство, я не пойму? В том, что мы можем в самом сценарии писать не
PHP:
new Cue_Model_Person_User
как это было бы с PEAR, а просто
PHP:
new User
?

Так объявление путей к файлам в use все портит напрочь. Потом, PEAR стиль в коде явно показывает, что за класс мы инстанцируем, а неймспейсы это скрывают.
 
Сверху