题
我有一个如下的目录结构;
脚本.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]/"
?
解决方案
这应该有效
$root = realpath($_SERVER["DOCUMENT_ROOT"]);
include "$root/inc/include1.php";
编辑: 额外的改进 澳洲维京人
其他提示
您可以使用相对路径。尝试 __FILE__
. 。这是一个 PHP 常量,它始终返回其所在脚本的路径/文件名。所以,在 soap.php
, ,你可以这样做:
include dirname(__FILE__).'/../inc/include.php';
文件的完整路径和文件名。如果在include内部使用,则返回随附的文件的名称。从 PHP 4.0.2 开始,
__FILE__
始终包含一个绝对路径,并可以解决符号链接,而在较旧的版本中,它在某些情况下包含相对路径。 (来源)
另一种解决方案是设置一个 包含路径 在您的 httpd.conf 或 .htaccess 文件中。
看一下 http://au.php.net/reserved.variables
我认为您正在寻找的变量是: $_SERVER["DOCUMENT_ROOT"]
您可以使用项目根目录的路径定义一个常量,然后将其放在路径的开头。
处理此问题的另一种方法是使用 自动加载 特征。包含脚本“以防万一”所需的所有内容可能会影响性能。如果您的包含内容都是类或接口定义,并且您只想在需要时加载它们,则可以重载 __autoload()
使用您自己的代码来查找适当的类文件并仅在调用时加载它。这是手册中的示例:
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
只要相应地设置 include_path 变量,您就不需要再次包含类文件。
与凯文相关的另一个选择是使用 __FILE__
, ,而是替换其中的 php 文件名:
<?php
$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');
?>
我已经使用这个有一段时间了。唯一的问题是有时你没有 $_SERVER['SCRIPT_NAME']
, ,但有时还有另一个类似的变量。
我发现这个效果非常好!
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');
?>
我认为最好的方法是将您的包含内容放入 PHP 包含路径中。根据您的设置,有多种方法可以执行此操作。
那么你可以简单参考一下
require_once 'inc1.php';
从任何文件内部,无论它位于何处,无论是在您的包含文件中还是在您的 Web 可访问文件中,或者任何级别的嵌套子目录中。
这允许您将包含文件放在 Web 服务器根目录之外,这是最佳实践。
例如
site directory
html (web root)
your web-accessible files
includes
your include files
另外,请查看 __autoload 来延迟加载类文件
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");
我使用这行代码。它返回到站点树的“顶部”,然后转到所需的文件。
例如,假设我有这个文件树:
域名.com/aaa/index.php
域名.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");
@Flubba,这是否允许我在包含目录中拥有文件夹?平面包含目录让我做噩梦。因为整个对象目录应该位于 inc 目录中。
哦,是的,绝对是。例如,我们使用单层子文件夹,一般:
require_once('library/string.class.php')
在真正高流量的站点中,您需要小心过度依赖包含路径,因为 php 必须搜索当前目录,然后搜索包含路径上的所有目录,以查看您的文件是否在那里,这可能会减慢速度如果你受到重击,事情就会变得糟糕。
例如,如果您正在执行 MVC,您可以将应用程序目录的路径放入包含路径中,然后指定引用表单中的内容
'model/user.class'
'controllers/front.php'
管他呢。
但一般来说,它只是让您可以在 PHP 中使用非常短的路径,可以在任何地方工作,并且比所有真实路径文档根目录更容易阅读。
其他人建议的基于脚本的替代方案的好处是它们可以在任何地方工作,甚至在共享机器上;设置包含路径需要更多的思考和努力,但正如我提到的,让您开始使用最酷的 __autoload 。
如果您要在应用程序的大多数文件中包含特定路径,请为您的根文件夹创建一个全局变量。
define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));
现在这个全局变量“应用程序路径" 可用于包含所有文件,而不是每次包含新文件时都调用 realpath()。
前任:
include(APPLICATION_PATH ."/config/config.ini";
希望能帮助到你 ;-)