Включение файлов в скрипты PHP из любого каталога с абсолютным путем
Возможный дубликат:
PHP требует файл из верхнего каталога
Я давно использую PHP, но я всегда просто писал его, чтобы выполнить работу, теперь я пытаюсь изучить лучшие практики и улучшить свои навыки. Прямо сейчас мне интересно, как лучше всего включить файлы в скрипты PHP из любого каталога.
Я всегда делал следующее:
<?php
// From settings.php
define('ABSPATH', '/home/dalyn/public_html/');
// Then I put this at he top of all of my other files
include 'includes/settings.php';
include ABSPATH . 'includes/db.php';
include ABSPATH . 'includes/functions.php';
?>
Но если мои файлы находятся в подкаталоге, мне нужно сделать что-то вроде:
<?php
include '../includes/settings.php';
include ABSPATH . 'includes/db.php';
include ABSPATH . 'includes/functions.php';
?>
Есть ли лучший способ сделать это? Я начинаю изучать ООП, поэтому, если есть решение ООП, которое применимо, я весь слух.
Спасибо.
4 ответа
Ты пробовал автозагрузку? http://php.net/manual/en/language.oop5.autoload.php.. Извините, у меня пока нет прав для написания комментариев..
Обновлено.. Уэсли прав, вам нужно, чтобы имя класса совпадало с именем файла, чтобы автозагрузка работала. Мне жаль предположить, что вы делаете OOP-PHP. Если автозагрузка не будет работать, вам придется делать это традиционным способом
function __autoload($class) {
require ABSPATH. $class .".php";
}
Любой файл внутри ABSPATH с classname = filename будет загружен автоматически.
Если у вас есть различные пути с разными файлами, вам придется создать несколько константных переменных с именем пути. А потом вызывать их внутри автозагрузки с определенным путем.
например,
class Myprogram{
public function __construct(){
define('ABSPATH', '/home/dalyn/public_html/');
define('ABSPATH_1', '/home/dalyn/public_html/includes');
define('ABSPATH_2', '/home/dalyn/public_html/some_other_folder');
}
function __autoload($class) {
require ABSPATH. $class .".php";
require ABSPATH_1. $class .".php";
require ABSPATH_2. $class .".php";
}
}
//Some other file
$myProg = new Myprogram(); // this will define your constants as well as autoload all the required files
и если вы не используете ООП. Чем вам придется определять разные пути как константы и включать файлы так, как вы это делаете сейчас. и если вы хотите автоматизировать этот процесс
этот код будет полезен
if ($handle = opendir(ABSPATH)) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
include_once ABSPATH . $entry;
}
}
closedir($handle);
}
это будет включать в себя все файлы, присутствующие в папке ABSPATH. Вы можете создать функцию и вызывать ее по любому пути, который вы хотите указать.
Надеюсь это поможет.
Dins
У меня обычно есть что-то подобное в моем приложении /Bootstrap.php (для приложения Zend Framework).
define( 'BASE_PATH' , dirname( __DIR__ ) . '/' ); //!< application root directory: note this file is not in the root directory
define( 'VAR_PATH' , BASE_PATH . 'var/' ); //!< optional system generated config files
define( 'CACHE_PATH' , BASE_PATH . 'cache/' ); //!< caches in the filesystem. See ISV_CacheManager
define( 'APPLICATION_PATH' , BASE_PATH . 'application/' ); //!< where the modules live
define( 'MODEL_PATH' , APPLICATION_PATH . 'models/' ); //!< path to models
define( 'FORM_PATH' , APPLICATION_PATH . 'forms/' ); //!< path to forms
define( 'CONTROLLER_PATH' , APPLICATION_PATH . 'modules/default/controllers/' ); //!< path to default module controllers
define( 'HELPER_PATH' , APPLICATION_PATH . 'helpers/' ); //!< global zend view helpers
define( 'INCLUDE_PATH' , APPLICATION_PATH . 'include/' ); //!< useful support classes
define( 'DOCUMENT_ROOT' , $_SERVER['DOCUMENT_ROOT'] ); //!< http root directory. note _no_ trailing slash.
define( 'IMAGE_PATH' , '/image/' ); //!< from the http document root
define( 'SCRIPT_PATH' , '/js/' ); //!< from the http DOCUMENT_ROOT
Некоторые из них загружаются в автозагрузчик, другие я использую для путей прямого включения, таких как require_once MODEL_PATH . 'Справочник / Справочник /IncludeFile.php';
set_include_path('.'.PATH_SEPARATOR.'your path to includes folder'
. PATH_SEPARATOR . './library/'
);
Когда я включаю что-то, я использую dirname(__FILE__)
чтобы получить путь к файлу, который пытаются включить.
<?php
include dirname(__FILE__).'/includes/db.php';
Но если вы используете ООП, я предлагаю вам взглянуть на некоторый загрузчик классов, который будет автоматически включать этот файл при использовании вами класса. Есть некоторые уже закодированные, которые существуют, например, с Doctrine и с Composer.