как включить файл в php и при этом уважать относительные ссылки из этого включенного файла - PullRequest
0 голосов
/ 14 ноября 2011

Я экспериментирую на PHP и мне было интересно, как я могу сделать что-то подобное

if (site is wordpress)
    include wordpress index.php;

в файле WordPress есть строка

require('./wp-blog-header.php');

, который не будет работать, потому что он выдает мне ошибку «файл не найден», но все равно будет работать, если я изменю это на

require('wp-blog-header.php');

тогда у меня не возникает проблем, и страница загружается (ну, в некоторой степени, потому что wp-blog-header.php загружает в некоторые другие файлы, относящиеся к wp-blog-header.php, поэтому те не получить включены или загружены).

Есть ли способ заставить PHP хранить и уважать относительные файлы?

РЕДАКТИРОВАТЬ: Включил мой код для лучшего контекста моего вопроса

if ($app['framework']['type'] && $app['cms']['type']) {    
    echo "Only a Framework or CMS can be loaded at a time...";    
} else {    
    if (is_file("./app/" . $cfg['application']['name'] . "/index.php")) {
        require_once "./app/" . $cfg['application']['name'] . "/index.php";
    } else {    
        if ($app['framework']['type']) {            
            echo "framework";
            //require_once "./app/" . $cfg['application']['name'] . "/" . $app['framework']['type'] . "/index.php";         
        } else if ($app['cms']['type']) {               
            if ($admin) {
                require_once "./app/" . $cfg['application']['name'] . "/" . $app['cms']['type'] . "/wp-admin/index.php";
            } else {                        
                $old_working_dir = getcwd();   // Remember where we are now.
                chdir("./app/" . $cfg['application']['name'] . "/" . $app['cms']['type'] . "/");            // 'Go into' the Wordpress directory.
                //include("index.php");          // Include the index.php file (no need for 'wordpress/')
                chdir($old_working_dir); 
                require_once "index.php";
            }
        } else {    
            echo "There is no index in your project directory, if your going to use a Framework or CMS please choose one from the following, thank you (list of cms's and frameworks)";
        }
    }    
    exit;
}

Ответы [ 3 ]

1 голос
/ 14 ноября 2011

Вы можете использовать функцию getcwd() для получения текущего рабочего каталога и chdir() для его установки.В вашем случае это выглядело бы примерно так:

$old_working_dir = getcwd();   // Remember where we are now.
chdir("wordpress");            // 'Go into' the Wordpress directory.
include("index.php");          // Include the index.php file (no need for 'wordpress/')
chdir($old_working_dir);       // Go back to the previous directory.

Или:

chdir("wordpress");
include("index.php");
chdir("../");                  // Go back up one level.
0 голосов
/ 14 ноября 2011

Вы изучили магическую константу PHP __DIR__?

Каталог файла.Если используется внутри включения, возвращается каталог включенного файла.Это эквивалентно dirname ( FILE ).Это имя каталога не имеет косой черты, если только оно не является корневым каталогом.(Добавлено в PHP 5.3.0.)

Если вы используете более старую версию PHP, вы можете использовать dirname(__FILE__)

Вот небольшой пример использования:

/** 
 * file hierarchy
 * ./index.php
 * ./foo/bar.php
 * ./foo/baz.php
 */

// ./foo/bar.php
include __DIR__.'baz.php';

// ./index.php
include __DIR__.'/foo/bar.php';

Теперь вы можете включить index.php, и теоретически эти включения должны работать.Это также менее хакерское решение по сравнению с другими ответами.

0 голосов
/ 14 ноября 2011

Вам лучше определить константу, содержащую путь к вашему приложению, и добавить его к каждому включенному вами:

define("APP_PATH", "/var/www/app/");

...

include(APP_PATH . 'foo/bar.php');
...