通常我们使用以下代码将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)
您必须set_include_path()在您的某个地方使用函数bootstrap.php或index.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';为目录的新路径.
好吧,我不喜欢这样做,但它会按照要求完成工作:
$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)
您可以将其限制为仅包含在子文件夹下的子文件夹.
上面没有经过测试,我只是把代码放在一起,但它说明了一种方法来做你想要的.
我仍然建议将文件放在确定的位置,而不是试图从任何地方包含它们.
__DIR__肯定是你在找什么.使用它为所需文件提供相对路径.我强烈建议使用require_once或include_once用于所有库文件.
include_once dirname(dirname(__DIR__))."/include/config.php";
Run Code Online (Sandbox Code Playgroud)
这就是我要做的。
//----- 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 框架正是以这种方式做到这一点的。
| 归档时间: |
|
| 查看次数: |
754 次 |
| 最近记录: |