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

Azz*_*zzo 22 php .htaccess

通常我们使用以下代码将php文件包含在彼此内:

<?php 

include_once 'include/config.php';
// OR
include 'include/config.php'; 
// OR 
include_once $_SERVER['DOCUMENT_ROOT'].'include/config.php';
// ect...
?>
Run Code Online (Sandbox Code Playgroud)

但上述代码仅适用于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...
?>
Run Code Online (Sandbox Code Playgroud)

我所说的是当我们将php文件移动到子文件夹中时,include_once希望看到子文件夹名称如(include_once 'subfolder/include/config.php';).这是一个具有挑战性的情况,因为我们需要在许多文件中为包含的页面执行此操作.

比如我包括include_once $_SERVER['DOCUMENT_ROOT'].'/functions/includes.php';index.php和也包括在此includes.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]
Run Code Online (Sandbox Code Playgroud)

.我的责任是,我们如何包含没有子文件夹名称的php文件?

anu*_*ava 15

您可以auto_prepend_file在.htaccess中使用指令在.php所有php文件之前包含一个文件.

如果你正在使用,mod_php那么在你的.htaccess中有这一行:

php_value auto_prepend_file "/Applications/MAMP/htdocs/script/env.php"
Run Code Online (Sandbox Code Playgroud)

请注意,PHP-FPM您需要在.user.ini文件中包含以下等效行:

auto_prepend_file = "/Applications/MAMP/htdocs/script/env.php"
Run Code Online (Sandbox Code Playgroud)

然后env.php在项目基目录中创建一个只有一行的新文件:

<?php
   $baseDir = __dir__ . '/';
?>
Run Code Online (Sandbox Code Playgroud)

此行设置一个$baseDir具有项目基目录值的变量,即/Applications/MAMP/htdocs/script/ OR /Applications/MAMP/htdocs/subdir/script/

然后$baseDir在任何需要包含其他文件的地方使用此变量,例如:

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

include_once $baseDir.'functions/get.php';
Run Code Online (Sandbox Code Playgroud)

  • 我认为你的答案会帮助很多人.非常感谢你.你是我最好的 (3认同)

Vla*_*pak 6

您必须set_include_path()在您的某个地方使用函数bootstrap.phpindex.php添加下一个代码:

<?php
$path = '/usr/pathToYourDir';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
Run Code Online (Sandbox Code Playgroud)

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

include_once 'include/config.php';
// or
include_once 'include/db/index.php';
// etc
Run Code Online (Sandbox Code Playgroud)

如果您需要将代码移动到另一个目录中 - 您只需将path varibalbe的值更改$path = '/usr/pathToYourDir';为目录的新路径.


R. *_*ith 5

好吧,我不喜欢这样做,但它会按照要求完成工作:

$newpath="";

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

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

glob('*') 
Run Code Online (Sandbox Code Playgroud)

glob('includes/*')  or glob('includes' . DIRECTORY_SEPARATOR . '*')
Run Code Online (Sandbox Code Playgroud)

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

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

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


Del*_*rce 5

__DIR__肯定是你在找什么.使用它为所需文件提供相对路径.我强烈建议使用require_onceinclude_once用于所有库文件.

include_once dirname(dirname(__DIR__))."/include/config.php";
Run Code Online (Sandbox Code Playgroud)


Art*_*nix 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';
Run Code Online (Sandbox Code Playgroud)

然后当您更改它时,您只需更新

if(!defined("CONFIG_PATH")) define("PATH_CONFIG", __DIR__."/include/subfolder/");
Run Code Online (Sandbox Code Playgroud)

我会说这是做到这一点的“传统”方式,为此使用全局常量完全没问题。这不是您想要在运行时更改的内容。您可能需要在许多地方访问它。您可以检查您的文件是否被正确访问......等。

许多许多 MVC 框架正是以这种方式做到这一点的。