включать вложенные файлы php

У меня есть header.php в корне/lib, который включает header_sub.php в том же каталоге. Обычно файлы в корне могут напрямую включать их с помощью этого кода:

include_once('lib/header.php');

но теперь у меня есть example.php в подкаталоге /blog, если я использую их

include_once(../'lib/header.php');  or 
include_once($_SERVER['DOCUMENT_ROOT'].'/lib/header.php');  or 
include_once(dirname(__FILE__).'/lib/header.php');

header_sub.php не будет правильно включен.

Есть ли способ включить header.php и header_sub.php без их изменения?


person Andrew    schedule 24.06.2013    source источник
comment
попробуйте поставить require_once вместо include_once, сообщите нам, какую ошибку вы получаете..   -  person Rajeev Ranjan    schedule 24.06.2013


Ответы (1)


Измените код в файле заголовка, чтобы использовать абсолютные пути, как вы пытались сделать с файлом misc, используйте:

include_once($_SERVER['DOCUMENT_ROOT'].'/header_sub.php');

в вашем заголовочном файле, таким образом, включение не зависит от текущего местоположения файловой системы, оно абсолютно не относительно.

Хорошо, нашел другое решение, которое должно подойти вам лучше, которое не требует изменения header.php, а просто любого файла, содержащего заголовок.

<?php 
    $oldcwd = getcwd(); // Save the old working directory
    chdir("../"); // Moves up a folder, so from /blog to /
    include("header.php"); // Include the file with the working directory as if the header file were being loaded directly, from it's folder
    chdir($oldcwd); // Set the working directory back to before
?>

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

person Alex Coleman    schedule 24.06.2013
comment
спасибо, Алекс, в большинстве случаев это хорошее решение, но в моем случае у меня есть два идентичных сайта соответственно в среде разработки и живой среде, лучше не изменять исходные файлы в каталоге lib. - person Andrew; 24.06.2013
comment
это именно тот метод, который я ожидал, но он почему-то не работает на моем сайте. на самом деле у меня есть эти ‹?php echo getcwd(); chdir(../); эхо getcwd(); include_once('lib/emocean-navbar.php'); эхо getcwd(); ?› и я вижу, что эхо-результаты относятся к корневому каталогу, но include_once по-прежнему включает подкаталог. это супер странно - person Andrew; 24.06.2013