Как включить php файлы без указания пути вложенной папки

Обычно мы используем следующий код для включения php файлов друг в друга:

<?php 

include_once 'include/config.php';
// OR
include 'include/config.php'; 
// OR 
include_once $_SERVER['DOCUMENT_ROOT'].'include/config.php';
// ect...
?>

Но приведенные выше коды применяются только в том случае, если файлы php находятся в корневом файле. Я имею в виду, если мы переместим наши файлы в подпапку. Нам нужно внести изменения в код, который мы включили в php файлы. Например, например:

<?php 
    include_once 'subfolder/include/config.php';
    // OR
    include 'subfolder/include/config.php'; 
    // OR 
    include_once $_SERVER['DOCUMENT_ROOT'].'/subfolder/include/config.php';
    // ect...
?>

Я говорю, что когда мы перемещаем наши php файлы во вложенную папку, тогда include_once хочет видеть имя подпапки, например (include_once 'subfolder/include/config.php';). Это сложная ситуация, потому что нам нужно сделать это для включенной страницы во многих файлах.

Например, я включаю include_once $_SERVER['DOCUMENT_ROOT'].'/functions/includes.php'; из index.php а также включил этот файл header.php, posts.php, and ajax_post.php из всех php файлов, таких как header.php, posts.php, and ajax_post.php. Он отлично работает в корневой папке, но если мы перемещаем файлы в подпапке, то файл include.php не включается без имени подпапки.

Возможно, это также возможно сделать с помощью .htaccess.

Я сделал этот код htaccess, возможно, у вас есть решение с htaccess. Должен сказать, что я попытался использовать RewriteBase/subfoldername/ но включить файлы не удалось.

Options +FollowSymLinks -MultiViews
RewriteEngine On 
RewriteBase /

RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=302,NE,L]

RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^(.*)index\.php$ /$1 [L,R=302,NC,NE]

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

RewriteRule ^group/([\w-]+)/?$ sources/group.php?group_username=$1 [L,QSA]  
RewriteRule ^profile/([\w-]+)/?$ sources/user_profile.php?username=$1 [L,QSA]
RewriteRule ^profile/(followers|friends|photos|videos|locations|musics)/([\w-]+)/?$ sources/$1.php?username=$2 [L,QSA]     

RewriteRule ^admin/(.*)$ admin/index.php?page=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]  

RewriteRule ^(.+?)/?$ index.php?pages=$1 [L,QSA]

Моя ответственность заключается в том, как включить php файлы без имени подпапки?

Ответ 1

Вы можете использовать директиву auto_prepend_file в своем.htaccess, чтобы сделать .php файл включенным перед всеми вашими файлами php.

Если вы используете mod_php, введите эту строку в свой.htaccess:

php_value auto_prepend_file "/Applications/MAMP/htdocs/script/env.php"

Обратите внимание, что для PHP-FPM вам нужно иметь эквивалентную строку в файле .user.ini:

auto_prepend_file = "/Applications/MAMP/htdocs/script/env.php"

Затем создайте новый файл env.php в базовом каталоге проекта только с одной строкой:

<?php
   $baseDir = __dir__ . '/';
?>

Эта строка устанавливает переменную $baseDir которая имеет значение вашего базового каталога проекта, т.е. /Applications/MAMP/htdocs/script/ OR /Applications/MAMP/htdocs/subdir/script/

Затем используйте эту переменную $baseDir где угодно, чтобы включить другие файлы, такие как:

include_once $baseDir.'functions/includes.php';

include_once $baseDir.'functions/get.php';

Ответ 2

__DIR__ - это, безусловно, то, что вы ищете. Используйте его для предоставления относительных путей для требуемых файлов. Я бы предложил использовать require_once или include_once для всех файлов библиотеки.

include_once dirname(dirname(__DIR__))."/include/config.php";

Ответ 3

Вы должны использовать функцию set_include_path() и где-нибудь в вашем bootstrap.php или index.php добавить следующий код:

<?php
$path = '/usr/pathToYourDir';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

теперь везде ниже вы можете написать это:

include_once 'include/config.php';
// or
include_once 'include/db/index.php';
// etc

И в случае, если вам нужно переместить свой код в другой каталог - вам нужно только изменить значение пути varibalbe $path = '/usr/pathToYourDir'; на новый путь к вашему каталогу.

Ответ 4

Хорошо, я не поклонник этого, но он выполнит эту работу, как просили:

$newpath="";

$dirs = array_filter(glob('*'), 'is_dir');
foreach ($dirs as $location) {
    $newpath .= PATH_SEPARATOR . $location; 
}
set_include_path(get_include_path() . $newpath);

Вышеприведенный код найдет все вложенные папки, из которых этот файл запущен, и добавьте их в текущий путь include. изменив glob из:

glob('*') 

к

glob('includes/*')  or glob('includes' . DIRECTORY_SEPARATOR . '*')

Вы можете ограничить его только подпапками под включенными.

Вышеописанное не проверено, я просто добавил код вместе, но он иллюстрирует способ делать то, о чем вы просите.

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

Ответ 5

Вот как я это сделаю.

//----- some global location like index.php

if(!defined("CONFIG_PATH")) define("PATH_CONFIG", __DIR__."/include/");

//------------ then later in some other file

if(!defined("CONFIG_PATH"))die("Config path is not defined.");

include_once CONFIG_PATH.'config.php';

Затем, когда вы меняете его, вы просто обновляете

if(!defined("CONFIG_PATH")) define("PATH_CONFIG", __DIR__."/include/subfolder/");

Я бы сказал, что это "традиционный" способ сделать это, и отлично использовать глобальную константу для этого. Это не то, что вы хотите изменить во время выполнения. Возможно, вам нужен доступ к нему во многих местах. Вы можете проверить, правильно ли доступны ваши файлы.. и т.д.

Многие многие, MVC-фреймворки делают это именно так.

Ответ 7

Вот пример подхода, который требует ваших файлов с помощью директивы auto_prepend_file.

bootstrap.php:

<?php

$require_upfront = function($dir) {
    require_once $dir . '/one.php';
    require_once $dir . '/two.php';
};

$require_upfront(__DIR__ . '/inc');

Добавить в php config, здесь .htaccess example:

php_value auto_prepend_file "/abs/path/to/bootstrap.php"

Ответ 8

Если у вас есть имя файла, уникальное на всем сервере, вы можете провести исследование этого, используя исследование, например .

Я думаю, что это решение не лучше, когда этот script запускает много, но вы можете включить, если функция include не работает, используя try и поймать (если вы используете этот метод для просмотра версии php) или если вы знаете, что этот путь меняется один раз в день, вы можете создать файл, который запускается с помощью процедуры.

Если вы это сделаете, вам нужно сохранить этот путь, но я не знаю, существует ли метод для создания глобальной переменной. Мое решение - хранить или в БД или в файле.

Надеюсь, я помог вам.

Ответ 9

Насколько я понимаю из ответа fooobar.com/questions/1274054/..., вам нужно включить файлы на основе каталога сценария точки входа.

Решением для этого без использования Apache или php.ini auto_prepend_file может быть использование getcwd(). Он возвращает текущую рабочую директорию, которая должна быть путём сценария entrypoint/main, даже при вызове входящих файлов.

Можете ли вы попробовать, если просто использовать getcwd() вместо $baseDir?

include_once getcwd().'/functions/includes.php';

include_once getcwd().'/functions/get.php';

Ответ 10

Использование Apache для исправления вашего приложения решает его на неправильном уровне.

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

Определите, где ваши включенные живут в одном месте, а затем, когда это необходимо, обновите это место соответственно.

Один из способов сделать это - установить константу в корне вашего приложения. Это предполагает, что у вас есть немного кода в корне вашего приложения, которое вызывается на каждой странице. Скорее всего, это index.php или скрипт, включенный index.php:

// index.php or a file included by index.php
const MY_INCLUDE_PATH = __DIR__ . '/path/to/subfolder'

Тогда ваши другие сценарии могут вызвать include using константа:

// some other script included to handle the page
include MY_INCLUDE_PATH . '/config.php';
include MY_INCLUDE_PATH . '/some-other-include.php';

Хотя если все хотят включить файл config.php, возможно, просто включите его в свой index.php.

Это не "плохой" мир, которого вы хотите избежать. Он использует константы, поскольку они предназначены. Константы являются частью пространства имен, если вы используете пространство имен для своего приложения.

Это предполагает, что есть одна вложенная папка, которая иногда меняет места и скрипт где-то, что является частью каждого запроса. Это верно? Если нет, отправьте свою структуру каталогов.

Функция также будет работать и может включать логику, основанную на таких вещах, как путь вызывающего скрипта:

// index.php or a file included by index.php
my_include_function($path) {
  //do stuff
}

Другие скрипты могут вызвать эту функцию следующим образом:

// some other script included to handle the request
my_include_function(__FILE__);

Затем, когда ситуация меняется, вы просто обновляете одну функцию в одном файле.

Все это предполагает, что у вас есть index.php или аналогичный скрипт, который обрабатывает каждый запрос и может быть единственной точкой управления для определения функции или константы. Если это не так, то должно быть!

Обновление кода для использования маршрутизатора (вот он) займет около 10 минут и, возможно, упростит этот gnarly.htaccess файл, который вы опубликовали.