Включение файлов в скрипты 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.

http://www.doctrine-project.org/

http://getcomposer.org/

Другие вопросы по тегам