我有一个如下目录结构;
的script.php
INC / include1.php
INC / include2.php对象/ object1.php
对象/ object2.php皂/ soap.php
现在,我在script.php
和/soap/soap.php
使用这些对象,我可以移动它们,但出于特定原因,我想要这样的目录结构。执行script.php
时,包含路径为inc/include.php
,执行/soap/soap.php
时../inc
,绝对路径有效,/mnt/webdev/[project name]/inc/include1.php...
但如果我想要的话,这是一个难看的解决方案将目录移动到其他位置。
那么有没有办法使用相对路径,或者以编程方式生成"/mnt/webdev/[project name]/"
的方法?
答案 0 :(得分:145)
这应该有效
$root = realpath($_SERVER["DOCUMENT_ROOT"]);
include "$root/inc/include1.php";
修改:按aussieviking
添加了改进答案 1 :(得分:43)
您可以使用相对路径。试试__FILE__
。这是一个PHP常量,它总是返回它所在脚本的路径/文件名。因此,在soap.php
中,你可以这样做:
include dirname(__FILE__).'/../inc/include.php';
的完整路径和文件名 文件。如果在包含内使用,则 返回包含文件的名称。 从PHP 4.0.2开始,
__FILE__
总是如此 包含绝对路径 符号链接解决了,而在旧的 它包含相对路径的版本 在某些情况下。 (source)
另一种解决方案是在httpd.conf或.htaccess文件中设置包含路径。
答案 2 :(得分:6)
查看http://au.php.net/reserved.variables
我认为您要查找的变量是:$_SERVER["DOCUMENT_ROOT"]
答案 3 :(得分:5)
您可以使用项目根目录的路径定义常量,然后将其放在路径的开头。
答案 4 :(得分:5)
另一种处理此问题的方法是删除对包含的任何需求,即使用autoload功能。包括脚本需要的所有内容“Just in Case”会阻碍性能。如果您的包含所有类或接口定义,并且您只想在需要时加载它们,则可以使用您自己的代码重载__autoload()
函数以查找相应的类文件,并仅在调用它时加载它。以下是手册中的示例:
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
只要相应地设置include_path变量,就不需要再次包含类文件了。
答案 5 :(得分:2)
另一个与Kevin相关的选项是使用__FILE__
,而是替换其中的php文件名:
<?php
$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');
?>
我已经使用了一段时间了。唯一的问题是有时你没有$_SERVER['SCRIPT_NAME']
,但有时会有另一个类似的变量。
答案 6 :(得分:2)
我发现这很好用!
function findRoot() {
return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}
使用:
<?php
function findRoot() {
return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}
include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');
include(findRoot() . 'includes/head.php');
for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
$posts[$i]->displayArticle();
}
include(findRoot() . 'includes/footer.php');
?>
答案 7 :(得分:1)
我认为最好的方法是将您的包含在PHP包含路径中。根据您的设置,有多种方法可以执行此操作。
然后你可以简单地参考
require_once 'inc1.php';
来自任何文件内部,无论是在您的包含位置还是在您的Web可访问文件或任何级别的嵌套子目录中。
这允许您将包含文件放在Web服务器根目录之外,这是最佳做法。
e.g。
site directory
html (web root)
your web-accessible files
includes
your include files
另外,请查看__autoload是否延迟加载类文件
答案 8 :(得分:1)
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");
我使用这行代码。它返回到站点树的“顶部”,然后转到所需的文件。
例如,假设我有这个文件树:
domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php
我可以从任何地方包含functions.php文件,只需复制粘贴
即可require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");
如果您需要多次使用此代码,您可以创建一个返回str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))
部分的函数。然后只需在您包含的第一个文件中插入此函数。我有一个“initialize.php”文件,我包含在每个php页面的最顶层,其中包含此功能。下次我必须包含文件时,我实际上只是使用函数(名为path_back
):
require(path_back()."/_resources/another_php_file.php");
答案 9 :(得分:0)
@Flubba,这是否允许我在include目录中包含文件夹?平包括目录让我做恶梦。因为整个对象目录应该在inc目录中。
哦,是的,绝对的。例如,我们使用单层子文件夹,通常是:
require_once('library/string.class.php')
在真正高流量的网站中,你需要小心依赖包含路径,因为php必须通过当前目录搜索,然后搜索包含路径上的所有目录,以查看你的文件是否在那里如果你受到重创,这可能会减慢速度。
因此,例如,如果您正在进行MVC,那么您可以在include路径中将应用程序的路径直接放入,然后指定引用表单中的内容
'model/user.class'
'controllers/front.php'
或其他什么。
但一般来说,它只是让你可以在你的PHP中使用非常短的路径,它可以在任何地方工作,并且它比所有的真实路径文档根malarkey更容易阅读。
其他人建议的基于脚本的替代品的好处是它们可以在任何地方工作,即使在共享盒子上也是如此;设置包含路径需要更多的思考和努力,但正如我所提到的,让你开始使用最酷的__autoload。
答案 10 :(得分:0)
如果要在应用程序的大多数文件中包含特定路径,请在根文件夹中创建一个全局变量。
define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));
现在这个全局变量&#34; APPLICATION_PATH &#34;可以用来包含所有文件,而不是每次包含新文件时调用realpath()。
EX:
include(APPLICATION_PATH ."/config/config.ini";
希望它有所帮助; - )