|
Author: Blacksilver
|
|
09.11.2009 13:05 |
[PHP] Секс в библиотеке
Представьте, пишем мы небольшую библиотеку для очередной гениальной CMS, и встречаемся с вот такой задачкой. Библиотека работает с файлом, который надо как-то найти. Обычно для этого пишется относительный путь, но если библиотека вызывается из разных, иногда даже интимных, мест, то тут всё гораздо сложнее. Ведь каждый раз меняется активная директория, а чтоб искать файл по относительному пути, нужно знать, откуда мы ищем.
Очевидное решение
Как-то указывать библиотеке, откуда она вызывается. То есть в каждом из вызывающих скриптов устанавливать специальную константу, которую потом внимательно рассматривать в библиотеке. В зависимости от её значения пользоваться одним и относительных путей.
Минусы этого способа очевидны. Но не стоит отчаиваться, ведь появилось моё гениальное решение.
Моё гениальное решение
Оно заключается в том, чтобы заставить библиотеку узнать, где она. Да еще и так, чтобы было всё равно, откуда её вызвали. Для этого мы воспользуемся макросом __FILE__ - он возвращает абсолютный путь к файлу в котором он вызывается. А ещё функцией dirname, которая возвращает по имени файла папку, в которой он лежит.
То есть, если в библиотеке написать dirname(__FILE__), то мы получим абсолютный адрес папки, в которой лежит наша библиотека, независимо от того, откуда она подключена. Это островок стабильности, относительно которого уже можно строить пути и искать файлы.
А ещё лучше во всех скриптах, к которым может обращаться пользователь, при помощи chdir поменять активную директорию на одну и ту же. А ещё лучше завести конфиг-файл с адресами вообще всех папок, которые могут понадобиться. Но не всегда. Описанный мной метод хорош, когда вы влезли в большую кучу чужого кода и не хотите ничего менять. Например в плагине.
И, как всегда, вот тут пример, доказывающий что всё работает.
Поменьше вам секса с кодом!
|
|
Обновлено 09.11.2009 23:45 |
Комментарии
ИМХО, лучше пусть библиотека определяет для себя корневой путь, по которому лежит движок. А относительно него строит все остальные относительные пути. Например. когда настраивается Zend Framework, то определяется корневая директория, а далее она доступна всем скриптам из реестра настроек. Т.е., если мы хотим получить доступ к какому-то файлу, то пишем, приблизительно, такое:
$fileAbsolutePa th = $registry['root'].$filePath;
Вероятно, нужно позаметнее сделать пометку, что это хорошо, когда мы влезли в большую кучу чужого кода.
RSS лента комментариев этой записи.