Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2010, 20:13   #1
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию каскадный импорт файлов

У меня есть некоторая библиотека, с множеством файлов, внутри библиотеки адекватная иерархия папок.

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

Импорт должен идти относительно текущего положения файла, который импортирует другой файл.

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

временно пришлось привинтить костыль вида:
Код:
include_once($GLOBALS['libroot'].'/util/Connection.class.php');
где $GLOBALS['libroot'] определена заранее в целевом скрипте, и все файлы в библиотеке используют $GLOBALS['libroot'] для импорта.

но костыль не нога...

собственно вопрос:
есть ли стандартные механизмы каскадного импорта по относительным путям?
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 19.03.2010, 03:44   #2
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Обычно для этого используется вспомогательная функция, которая передаёт полный путь до скрипта. Фактически, это тот же самый костыль, только правильно реализованный, а не через глобальные переменные двадцатого века.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 19.03.2010, 08:37   #3
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

А под __autoload нет возможности "подвести" библиотеку?
Была похожая ситуация, ресурс работал с __autoload, в библиотеке была другая форма записи имени файла, сделал "правила" для автозагрузки и проблем не было.
Цитата:
Connection.class.php
Судя по названию в примере, библиотека сделана под __autoload.
Стрелок-охотник

Последний раз редактировалось mv28jam; 19.03.2010 в 09:12.
mv28jam вне форума Ответить с цитированием
Старый 19.03.2010, 16:49   #4
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от mv28jam Посмотреть сообщение
А под __autoload нет возможности "подвести" библиотеку?
Была похожая ситуация, ресурс работал с __autoload, в библиотеке была другая форма записи имени файла, сделал "правила" для автозагрузки и проблем не было.
Интересно... благодарю за ссылку! только сомневаюсь что это актуально применять в массивных библиотеках(отжор времени на поиск в одной папке, потом в другой... и т.д.)
Цитата:
Сообщение от mv28jam Посмотреть сообщение
Судя по названию в примере, библиотека сделана под __autoload.
Нет, она просто сделана в стиле Java:
1 файл - 1 класс.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 19.03.2010, 19:43   #5
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Оформил свой костыль красиво, реализовав пакетную систему Java.

написал следующую функцию:
Код:
/**
 * this function imitate the keyword "import" in the Java.
 */
function import($classfilename){
	
	/**
	 * for edit in a project
	 */
	$classpath=realpath("../");
	
	/**
	 * replacing dot by slash
	 */
	$classfilename = str_replace('.','/',$classfilename);
	
	/**
	 * build full path
	 */
	$filename = $classpath."/".$classfilename.".class.php";
	
	if(file_exists($filename)){
		include_once($filename);
	}else{
		throw new Exception($filename." does not exists");
	}
}
любой импорт в библиотеке выглядит примерно так:
Код:
import('ru.wsdev.lmvcf.mvc.View');
import('ru.wsdev.сore.exceptions.UnsupportedOperationException');
и любой конечный скрипт, который использует библиотеку на прямую, либо через другие классы, включает файл с этой функцией:

Код:
require_once('../ru/wsdev/declare.php')
тему пока не закрываю, мб есть механизмы позволяющие полностью отказаться от костылей и удобные в использовании.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 19.03.2010 в 20:12.
alexinspir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт значений из внешних книг Excel по списку файлов Varen1k Microsoft Office Excel 14 14.08.2018 10:09
Импорт тегов из файлов формата mp3 в базу данных sqlite antonych SQL, базы данных 2 06.12.2009 21:06
Каскадный триггер _ares_ SQL, базы данных 3 19.05.2009 22:24
Импорт данных из *csv-файлов в БД bober Общие вопросы .NET 3 19.08.2008 17:20
Импорт doc и pdf файлов в базу omi БД в Delphi 3 30.06.2007 00:37