如何在不指定子文件夹路径的情况下包含php文件

时间:2017-12-13 20:54:00

标签: php .htaccess

通常我们使用以下代码将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';的{​​{1}},并且还包括来自所有php文件的include.php文件,例如index.php。它从根文件夹工作正常,但如果我们移动子文件夹中的文件,则include.php文件不包括子文件夹名称。

也许也可以使用header.php, posts.php, and ajax_post.php执行此操作。

我已经制作了这个htaccess代码,也许你有一个htaccess的解决方案。我必须说我已经尝试使用.htaccess,但包含的文件并没有效果。

RewriteBase /subfoldername/

我的责任是,如何在不包含子文件夹名称的情况下包含php文件?

10 个答案:

答案 0 :(得分:15)

您可以在.htaccess中使用auto_prepend_file指令在所有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/ /Applications/MAMP/htdocs/subdir/script/

然后在您必须包含其他文件的地方使用此变量$baseDir,例如:

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

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

答案 1 :(得分:6)

您必须在set_include_path()bootstrap.php添加下一个代码的地方使用[{1}}功能:

index.php

现在到处都可以写下这个:

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

如果您需要将代码移动到另一个目录中 - 您只需要将路径varibalbe include_once 'include/config.php'; // or include_once 'include/db/index.php'; // etc 的值更改为目录的新路径。

答案 2 :(得分:5)

好的,我不是这样做的粉丝,但它会按照要求完成工作:

$newpath="";

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

上面的代码将找到运行此文件的所有子文件夹,并将它们全部添加到当前包含路径中。通过改变来自:

的glob
glob('*') 

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

您可以将其限制为仅包含的子文件夹。

上面没有经过测试,我只是把代码放在一起,但它说明了一种方法来做你想要的。

我仍然建议将文件放在确定的位置,而不是试图从任何地方包含它们。

答案 3 :(得分:5)

__DIR__肯定是您正在寻找的。使用它为所需文件提供相对路径。我强烈建议您对所有库文件使用require_onceinclude_once

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

答案 4 :(得分:4)

我就是这样做的。

//----- 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/");

我会说这是&#34;传统&#34;这样做的方法,使用全局常量完全没问题。它不是你想要在运行时改变的东西。您可能需要在许多地方访问它。您可以检查您的文件是否被正确访问..等等。

许多人,MVC框架都是这样做的。

答案 5 :(得分:3)

参考此链接希望它有所帮助 http://www.geeksengine.com/article/php-include-path.html

答案 6 :(得分:2)

以下是通过auto_prepend_file指令预先要求您的文件的方法示例。

Select to_char('300.5' + '100') From Dual; Select to_char(300.5 + 100) From Dual;

bootstrap.php

添加到php配置,这里.htaccess示例:

<?php

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

$require_upfront(__DIR__ . '/inc');

答案 7 :(得分:2)

如果您的文件名在所有服务器中都是唯一的,则可以使用this之类的研究对此进行研究。

我认为当这个脚本运行很多时,这个解决方案并不是更好,但你可以使用try and catch (if you use this method watch the php version)来包括如果include函数失败,或者如果你知道这条路径每天改变一次你可以创建一个用例程启动的文件。

如果你这样做,你需要存储这条路径,但我不知道是否有一个make全局变量的方法。我的解决方案是存储在数据库中或文件中。

我希望我能帮到你。

答案 8 :(得分:1)

从答案Imagee中我了解到,您需要根据入口点脚本的目录包含文件。

为此不需要Apache或php.ini auto_prepend_file的解决方案是使用getcwd()。它会返回当前的工作目录,即使在包含的文件中调用该目录也应该是入口点/主脚本的路径。

如果仅使用getcwd()而不是$baseDir是否可以尝试?

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

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

答案 9 :(得分:0)

使用Apache修复你的应用程序正在以错误的级别解决它。

如果您必须在文件位置发生变化时更新代码中的一堆文件,那么您的代码就会告诉您,您做出了糟糕的架构决策。所以解决实际问题并停止重复自己。

定义您的包含在一个地方的居住地点,然后在需要时,相应地更新该地点。

执行此操作的一种方法是在应用的根目录中设置常量。这假设您在每个页面上调用的应用程序根目录中都有一些代码。这可能是index.phpindex.php包含的脚本:

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

然后你的其他脚本可以使用常量调用include:

// 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中。

a&#34; bad&#34;全球你想避免。它正在使用常量。如果您正在为应用程序使用命名空间,则常量是命名空间的一部分。

这假定有一个包含子文件夹有时会更改位置,而某个脚本位于每个请求的一部分。那是对的吗?如果没有,请发布您的目录结构。

一个函数也可以工作,并且可以包含基于事物的逻辑,例如调用脚本的路径:

// 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或类似的脚本来处理每个请求,并且可以作为定义函数或常量的单一控制点。如果情况并非如此,那应该是!

更新代码以使用路由器(here is one)可能需要10分钟,并可能简化您发布的那个粗糙的.htaccess文件。