Это кажется камнем преткновения для многих разработчиков php, поэтому давайте рассмотрим его как следует. Большинство приложений PHP засоряют свой код include '../../library/someclass.php.class'
. Это никому не годится, потому что его очень легко сломать, и никому не нравится выполнять работу по уборке пути, когда вы должны писать код. Это также немного похоже на построение карточного домика и закрепление стыков из опасения каких-либо изменений. Итак, хорошо, может быть, мы могли бы просто создать константу и использовать полный путь?
define('PATH', '/home/me/webroot/Application');
include(PATH . '/Library/someclass.php.class');
Что ж, это неплохо, но что, если мы развернем в Windows? Кроме того, собираемся ли мы определять путь для каждой точки входа в скрипт? Не очень СУХОЕ, если вы спросите меня. Кроме того, перемещение развертываний будет огромной проблемой. Ясно, что пока мы ближе, это не особый прогресс.
К счастью, PHP предоставляет несколько волшебных функций, которые могут нам немедленно помочь.
Итак, давайте просто скажем, что у вас есть одна точка входа для вашего приложения или, по крайней мере, общий файл заголовка. Мы можем довольно быстро получить наш корень развертывания, если мы знаем, где наш заголовочный файл связан с корнем кода. IE, в /home/me/webroot/Application/Init/set_paths.php
define('PATH_SITE', realpath(dirname(__FILE__) . '/../../'));
Отлично, это корень нашего документа. Он не зависит от ОС, и его довольно легко адаптировать, если вы измените место проживания set_paths.php
. Теперь мы можем поговорить о некоторых других местах в нашем приложении просто потому, что константы удобны:
define('PATH_APPLICATION', realpath(PATH_SITE . "/Application"));
define('PATH_LIBRARY', realpath(PATH_SITE . "/Application/Library"));
define('PATH_CONFIG', realpath(PATH_SITE . "/Config"));
define('PATH_WRITE', realpath(PATH_SITE . "/Volatile"));
Все это очень хорошо, но не намного лучше, чем наше предыдущее решение. Введите путь включения PHP. Добавляя соответствующие константы к нашему пути, нам не нужно определять их каждый раз. Порядок путей во включаемом пути на самом деле очень важен для скорости, поэтому мы прилагаем все усилия, чтобы привести их в порядок использования.
$paths['inc'] = array_flip(explode(PATH_SEPARATOR, get_include_path()));
unset($paths['inc']['.']);
$paths['inc'] = array_flip($paths['inc']);
// The first item on the path the external
// libs that get used all the time,
// then the application path, then the
// site path, and any php configured items.
// The current directory should be last.
$paths = array_merge(array(PATH_LIBRARY, PATH_APPLICATION, PATH_SITE), $paths['inc'], array("."));
set_include_path(implode(PATH_SEPARATOR, $paths));
Теперь все критические места в нашем приложении находятся в пути, и вы можете включить в них свое содержание, независимо от того, где вы решите хранить свои библиотеки, настройки и т. Д.
include('someclass.php.class');
Еще один шаг
Если вы работаете с довольно хорошо разработанным ООП-приложением, мы можем пойти немного дальше. Если вы подписываетесь на один файл, один класс, тогда соглашение об именах PEAR делает жизнь очень простой.
Соглашения об именах PEAR диктуют соотношение 1: 1 между файловой системой и классом. Например, класс Foo_Bar_Baz можно найти в файле «Foo / Bar / Baz.php» на вашем include_path. источник
Когда у вас есть предсказуемое сопоставление файлов с классами, вы можете реализовать spl_autoload_register А можно заменить
include('someclass.php.class');
new SomeClass();
Просто
new SomeClass();
И пусть PHP с этим справится за вас.
person
jhogendorn
schedule
07.01.2011
public_html
. Благодаря этому у вас также будет дом для ваших демонов и cronjobs (если они у вас есть). Т.е.d:\mysite\cronjobs
- person Christian Joudrey   schedule 07.01.2011.htaccess
отрицать типичныйincludes
илиclasses
каталог. Удаление их из корневого каталога документов - это в основном способ скрыть его, но все файлы остаются доступными по относительным путям. Часто более целесообразно перемещать каталоги данных. Запускайте потенциально небезопасные приложения через старый добрый mod_php, а не через suexec / fastcgi. - person mario   schedule 07.01.2011