По умолчанию PHP устанавливает include_path
следующим образом:
On * nix систем
include_path=".:/php/includes"
В системах Widows
include_path=".;c:\php\includes"
Вы можете и должны переопределить эти значения по умолчанию, чтобы они соответствовали вашей среде, поскольку маловероятно, что вы разместите все соответствующие файлы в этих местах.
Использование.в пути включения допускаются относительные включения, так как это означает текущий каталог.Однако более эффективно явно использовать include «./file», чем когда PHP всегда проверяет текущий каталог для каждого include.
Для переопределения местоположений по умолчанию используйте set_include_path("/path/to/includes/")
и т. Д., Которые затемпозволяет простым вызовом включать файлы следующим образом:
set_include_path("/path/to/includes/");
include 'class.foobar.php';
require 'functions.php'; // etc
Если вам нужно загрузить файлы классов, можно использовать эквивалентный метод __autoload
и написать собственный обратный вызов для обработки загрузки файлов.Исходный метод __autoload
устарел, но для этого существует улучшенный класс spl_autoload
.
Следующие ссылки ALIASED_SITE_ROOT
и ROOT_PATH
, которые являются глобально определенными константами в моей системе, указывают на определенные каталоги, поэтомуне будет иметь отношения к вам и будет нуждаться в редактировании, если вы решите принять этот подход к загрузке классов.
Подробнее о "spl_autoload_register"
function autoloader( $classname=false ){
$included=get_included_files();
$classname=rtrim( $classname, '.php' );
$dirs = array(
'/path/to/includes/',
ALIASED_SITE_ROOT . '/inc/',
ALIASED_SITE_ROOT . '/inc/forms/',
ALIASED_SITE_ROOT . '/inc/lib/',
ROOT_PATH . '/inc/',
ROOT_PATH . '/'
);
/* add other locations to the above array */
foreach( $dirs as $dir ) {
$fullpath = $dir . $classname . '.php';
if ( file_exists( $fullpath ) ) {
if( !in_array( $fullpath, $included ) ) {
require_once( $fullpath );
clearstatcache();
break;
}
}
}
set_include_path( $dirs[ 0 ] );
}
spl_autoload_register( 'autoloader' );
С помощьювыше, зарегистрированный в общем включаемом файле, когда вам нужно загрузить класс, вам больше не нужно делать require '/path/to/includes/foobar.php';
, когда вам нужно работать с файлом, который вы можете просто сделать:
$foo=new foobar(); // no need to use `require` or `include` as it has been autoloaded
Так что вышеприведенное работает хорошос классами - последовательная стратегия именования очень поможет, если вы примете этот подход!Например, я стремлюсь найти все классы в том, что показано выше как ALIASED_SITE_ROOT . '/inc/'
, и использую соглашение об именах class.foobar.php
, поэтому в функции автозагрузки
$fullpath = $dir . $classname . '.php';
фактически
$fullpath = $dir . 'class.' . $classname . '.php';
Из этого следует, что имя класса должно соответствовать имени, данному $classname
, например:
class foobar{
public function __construct(){
/* etc */
}
}