[PHP] Секс в библиотеке

Автор: BlackSilver
09.11.2009 13:05

Представьте, пишем мы небольшую библиотеку для очередной гениальной CMS, и встречаемся с вот такой задачкой. Библиотека работает с файлом, который надо как-то найти. Обычно для этого пишется относительный путь, но если библиотека вызывается из разных, иногда даже интимных, мест, то тут всё гораздо сложнее. Ведь каждый раз меняется активная директория, а чтоб искать файл по относительному пути, нужно знать, откуда мы ищем.

Очевидное решение

Как-то указывать библиотеке, откуда она вызывается. То есть в каждом из вызывающих скриптов устанавливать специальную константу, которую потом внимательно рассматривать в библиотеке. В зависимости от её значения пользоваться одним и относительных путей.

Минусы этого способа очевидны. Но не стоит отчаиваться, ведь появилось моё гениальное решение.

Моё гениальное решение

Оно заключается в том, чтобы заставить библиотеку узнать, где она. Да еще и так, чтобы было всё равно, откуда её вызвали. Для этого мы воспользуемся макросом __FILE__ - он возвращает абсолютный путь к файлу в котором он вызывается. А ещё функцией dirname, которая возвращает по имени файла папку, в которой он лежит.

То есть, если в библиотеке написать dirname(__FILE__), то мы получим абсолютный адрес папки, в которой лежит наша библиотека, независимо от того, откуда она подключена. Это островок стабильности, относительно которого уже можно строить пути и искать файлы.

А ещё лучше во всех скриптах, к которым может обращаться пользователь, при помощи chdir поменять активную директорию на одну и ту же. А ещё лучше завести конфиг-файл с адресами вообще всех папок, которые могут понадобиться. Но не всегда. Описанный мной метод хорош, когда вы влезли в большую кучу чужого кода и не хотите ничего менять. Например в плагине.

И, как всегда, вот тут пример, доказывающий что всё работает.

Поменьше вам секса с кодом!

Обновлено 07.05.2011 23:44

 

Комментарии  

 
#1 Гость 09.11.2009 14:32
Это первое решение. Но менять активную директорию - это довольно неявный подход, может проявится по прешествие времени, когда ты обратишься повторно к этому коду.

ИМХО, лучше пусть библиотека определяет для себя корневой путь, по которому лежит движок. А относительно него строит все остальные относительные пути. Например. когда настраивается Zend Framework, то определяется корневая директория, а далее она доступна всем скриптам из реестра настроек. Т.е., если мы хотим получить доступ к какому-то файлу, то пишем, приблизительно, такое:
$fileAbsolutePa th = $registry['root'].$filePath;
Цитировать
 
 
#2 Гость 09.11.2009 14:50
В случае с dirname(__FILE_ _) библиотека как раз сама всё для себя определяет.
Вероятно, нужно позаметнее сделать пометку, что это хорошо, когда мы влезли в большую кучу чужого кода.
Цитировать
 
 
#3 maniack 28.03.2013 17:33
В дельфе это выглядит гдето так extractfilepath (paramstr(0)); в нулевом параметре командной строки которой запускалась программа лежит полный путь к файлу программы и это пыщщет и для библиотеки то же ...
Цитировать
 

Добавить комментарий


Защитный код
Обновить