Это кажется камнем преткновения для многих разработчиков 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 разберется с вами.